From 69887c99d4cd271fe6bf9b40e958c90e409120b1 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 27 Apr 2020 20:55:33 +0000 Subject: [PATCH 001/186] Allow a FROM clause in UPDATE statements. FossilOrigin-Name: f353a1a613bb7ad8cedcda377a7fe6fd05ee03b1f50665b00b84a868a71c5bec --- manifest | 32 +-- manifest.uuid | 2 +- src/build.c | 20 ++ src/delete.c | 2 +- src/parse.y | 8 +- src/select.c | 20 +- src/sqliteInt.h | 2 + src/update.c | 514 ++++++++++++++++++++++++++++--------------- test/fts4upfrom.test | 105 +++++++++ test/pg_common.tcl | 2 + test/upfrom1.tcl | 80 +++++++ test/upfrom1.test | 130 +++++++++++ 12 files changed, 717 insertions(+), 200 deletions(-) create mode 100644 test/fts4upfrom.test create mode 100644 test/upfrom1.tcl create mode 100644 test/upfrom1.test diff --git a/manifest b/manifest index e6fae833bc..78387769ab 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Yet\sanother\sattempt\sto\senhance\ssqlite3_load_extension()\sso\sthat\sit\sworks\nwith\sWindow-style\spathnames\susing\sa\sbackslash\sseparator\scharacter. -D 2020-04-26T22:04:48.458 +C Allow\sa\sFROM\sclause\sin\sUPDATE\sstatements. +D 2020-04-27T20:55:33.061 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -476,14 +476,14 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 02376eb7d49ccf31b53c2504f045ad74687c142a5c15ca837516e59e737867dc F src/btree.h 32672fa1aa74a7e9ab3aae822f94ffc8e732b1eb005988dc2283f91dc7573398 F src/btreeInt.h 887cdd2ea7f4a65143074a8a7c8928b0546f8c18dda3c06a408ce7992cbab0c0 -F src/build.c ec6c0bda1e43ef55e5f5121a77ba19fac51fc6585f95ce2da795bcedcf6e8f36 +F src/build.c 8debc951e3f7e5152bbb7e6b2f26cad7b00a1db068c69af7db4aab136486e541 F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 6a77ec9e0eb87aea929e002c816298907e337094a7b556898ae2d1e6be209f90 F src/date.c b29b349d277e3d579dcc295b24c0a2caed83fd8f090a9f7cbe6070c0fd662384 F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 793deaf88a0904f88285d93d6713c636d55ede0ffd9f08d10f4ea825531d367f -F src/delete.c 11000121c4281c0bce4e41db29addfaea0038eaa127ece02557c9207bc3e541d +F src/delete.c 6a4cbe008e8885eac5a0e0f9228ad716db92e3f9f2f0cb91a8ae276658d1f909 F src/expr.c d1e1d42cbdec08bb867a1ab43a59b401d82ff2bc88bdcb4af20e479a5facb6d8 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41 @@ -521,7 +521,7 @@ F src/os_win.c 035a813cbd17f355bdcad7ab894af214a9c13a1db8aeac902365350b98cd45a7 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 52cee2f72710be47b5b13ff66b339ca3855e5bc48e92a94114d2affedc70041f F src/pager.h 3b33619a90180e0874c7eca31d6f6ceb464d9322c6fb4e9a7bbb318c8a17bdb3 -F src/parse.y c8eff38606f443d5ba245263fa7abc05e4116d95656e050c4b78e9bfbf931add +F src/parse.y 5f2150bb4974e440924dfcc2e33cea7cf1895492b917464572efd258b0eab267 F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 6596e10baf3d8f84cc1585d226cf1ab26564a5f5caf85a15757a281ff977d51a @@ -532,12 +532,12 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c d36a2b1639e1c33d7b508abfd3452a63e7fd81737f6f3940bfef085fca6f21f4 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c c310de94bf67315054587c18a16e7a3e3dc3a98dc79168f0c2b776548d43f6cd +F src/select.c 7e56a58673d027ab7951559adfda752192baff7c6083a88e4dd8db3c84e465e8 F src/shell.c.in 1fc834b80c72dd37587ea87a4f4167cf5e6d98d12d143184ed2e732f529c0950 F src/sqlite.h.in fd6fcfe173accab8d9cb9a843856d9e9fb475f893b60a455e01d8739b5076f0e F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 -F src/sqliteInt.h 0f3848c46310d197246003f052985b72d1cdbfc0b31e069db76cb5231062fa1d +F src/sqliteInt.h bfed03b21bfa8fade8887a12d5bc0f5a349e98105aec675b9c1e027e9fd66f67 F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032 F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -599,7 +599,7 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c eee7bae3ec0bc4abee951554bf46a8ba567c0f7752ac90c820ed8afff4c612dc F src/treeview.c 82c6391a3ba76215d4185fd4719a56ec4caf186a40c8a7b6e6ba4ae4467c2742 F src/trigger.c 4ada1037cc99777f647a882cdacbd1a4deb6567b69daf02946286401b88cdc04 -F src/update.c 3eb778c42155d944377a4ee5e440b04520f07094804ed6ce63d2528f619614d9 +F src/update.c 72aae4f6198aca8290c1368f26f6f8b7d29e23d0d2bfbd4f773eaa8d9a9380a4 F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c 95fb6e03a5ca679045c5adccd05380f0addccabef5911abddcb06af069500ab7 F src/util.c 3b6cedf7a0c69bd6e1acce832873952d416212d6293b18d03064e07d7a9b5118 @@ -1003,6 +1003,7 @@ F test/fts4record.test a48508f69a84c9287c8019d3a1ae712f5730d8335ffaf8e2101e691d0 F test/fts4rename.test 15fd9985c2bce6dea20da2245b22029ec89bd4710ed317c4c53abbe3cfd0c880 F test/fts4umlaut.test fcaca4471de7e78c9d1f7e8976e3e8704d7d8ad979d57a739d00f3f757380429 F test/fts4unicode.test ceca76422abc251818cb25dabe33d3c3970da5f7c90e1540f190824e6b3a7c95 +F test/fts4upfrom.test 04ef3b150370e0083cf7c721928b79163b70d930f74ebc4b91bc382b8123f659 F test/full.test 6b3c8fb43c6beab6b95438c1675374b95fab245d F test/func.test f673822636fb8ed618dd2b80230d16e495d19c8f2e2e7d6c22e93e2b3de097ad F test/func2.test 772d66227e4e6684b86053302e2d74a2500e1e0f @@ -1234,7 +1235,7 @@ F test/pcache.test c8acbedd3b6fd0f9a7ca887a83b11d24a007972b F test/pcache2.test af7f3deb1a819f77a6d0d81534e97d1cf62cd442 F test/percentile.test 4243af26b8f3f4555abe166f723715a1f74c77ff F test/permutations.test c83339862d72b6272f957905205f874e6eefdbad2823380452c4f0128fd3d906 -F test/pg_common.tcl 222a1bad1c41c308fa366313cd7b51b3be7e9b21c8736a421b974ac941693b54 +F test/pg_common.tcl 3b27542224db1e713ae387459b5d117c836a5f6e328846922993b6d2b7640d9f F test/pragma.test 59becdfd720b80d463ab750f69f7118fde10dfd556aa5d554f3bf6b7e5ea7533 F test/pragma2.test e5d5c176360c321344249354c0c16aec46214c9f F test/pragma3.test 92a46bbea12322dd94a404f49edcfbfc913a2c98115f0d030a7459bb4712ef31 @@ -1615,6 +1616,8 @@ F test/unixexcl.test d936ba2b06794018e136418addd59a2354eeae97 F test/unordered.test ffeea7747d5ba962a8009a20b7e53d68cbae05b063604c68702c5998eb50c981 F test/update.test e906ca7cb1dc6f52af1ea243e08f727edfa79f924c2691f2f9e72481f847310d F test/update2.test 67455bc61fcbcf96923c45b3bc4f87bc72be7d67575ad35f134906148c7b06d3 +F test/upfrom1.tcl 62efddee869b3a6f3e076b2816793fec9422e38d10ea42b63da733cdd2b1ad8e +F test/upfrom1.test 543389b4eef43c7a21079df018cf95e29d7c2a4efd09b2597e54a03bbdbd30b9 F test/upsert1.test 88f9e258c6a0eeeb85937b08831e8daad440ba41f125af48439e9d33f266fb18 F test/upsert2.test 9c3cdbb1a890227f6504ce4b0e3de68f4cdfa16bb21d8641208a9239896c5a09 F test/upsert3.test 88d7d590a1948a9cb6eac1b54b0642f67a9f35a1fc0f19b200e97d5d39e3179c @@ -1861,7 +1864,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 57b16d8ca3d1ede3b411389256bec6686433aae716f47bca309ee7c8e5fe3128 -R cae58a18aebbf7b95fb40ba841d77f19 -U drh -Z a013006b51e7e5f259533e9a3800742b +P b73d9a7d6f7fec0ffc9640902a849289c305f8651e891388c01255c4da7a6c4b +R bbc1e04364e396384c0537dbe66bc52f +T *branch * update-from +T *sym-update-from * +T -sym-trunk * +U dan +Z 657e2dd1dadbea443cdb52f63d6f9883 diff --git a/manifest.uuid b/manifest.uuid index b3a75f3c82..b06346868b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b73d9a7d6f7fec0ffc9640902a849289c305f8651e891388c01255c4da7a6c4b \ No newline at end of file +f353a1a613bb7ad8cedcda377a7fe6fd05ee03b1f50665b00b84a868a71c5bec \ No newline at end of file diff --git a/src/build.c b/src/build.c index cf36766aef..f0136cbe80 100644 --- a/src/build.c +++ b/src/build.c @@ -4495,6 +4495,26 @@ void sqlite3SrcListIndexedBy(Parse *pParse, SrcList *p, Token *pIndexedBy){ } } +/* +** Append the contents of SrcList p2 to SrcList p1 and return the resulting +** SrcList. Or, if an error occurs, return NULL. In all cases, p1 and p2 +** are deleted by this function. +*/ +SrcList *sqlite3SrcListAppendList(Parse *pParse, SrcList *p1, SrcList *p2){ + if( p2 && p1 ){ + assert( p1->nSrc==1 ); + p1 = sqlite3SrcListEnlarge(pParse, p1, p2->nSrc, p1->nSrc); + if( p1 ){ + assert( p1->nSrc==1+p2->nSrc ); + memcpy(&p1->a[1], p2->a, p2->nSrc*sizeof(struct SrcList_item)); + sqlite3_free(p2); + }else{ + sqlite3SrcListDelete(pParse->db, p2); + } + } + return p1; +} + /* ** Add the list of function arguments to the SrcList entry for a ** table-valued-function. diff --git a/src/delete.c b/src/delete.c index 60efc9d569..5e73f76bb6 100644 --- a/src/delete.c +++ b/src/delete.c @@ -31,7 +31,7 @@ Table *sqlite3SrcListLookup(Parse *pParse, SrcList *pSrc){ struct SrcList_item *pItem = pSrc->a; Table *pTab; - assert( pItem && pSrc->nSrc==1 ); + assert( pItem && pSrc->nSrc>=1 ); pTab = sqlite3LocateTableItem(pParse, 0, pItem); sqlite3DeleteTable(pParse->db, pItem->pTab); pItem->pTab = pTab; diff --git a/src/parse.y b/src/parse.y index 09731eb99c..3616e3de24 100644 --- a/src/parse.y +++ b/src/parse.y @@ -637,7 +637,7 @@ as(X) ::= . {X.n = 0; X.z = 0;} // A complete FROM clause. // -from(A) ::= . {A = sqlite3DbMallocZero(pParse->db, sizeof(*A));} +from(A) ::= . {A = 0;} from(A) ::= FROM seltablist(X). { A = X; sqlite3SrcListShiftJoinType(A); @@ -867,18 +867,20 @@ where_opt(A) ::= WHERE expr(X). {A = X;} ////////////////////////// The UPDATE command //////////////////////////////// // %ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT -cmd ::= with UPDATE orconf(R) xfullname(X) indexed_opt(I) SET setlist(Y) +cmd ::= with UPDATE orconf(R) xfullname(X) indexed_opt(I) SET setlist(Y) from(F) where_opt(W) orderby_opt(O) limit_opt(L). { sqlite3SrcListIndexedBy(pParse, X, &I); + X = sqlite3SrcListAppendList(pParse, X, F); sqlite3ExprListCheckLength(pParse,Y,"set list"); sqlite3Update(pParse,X,Y,W,R,O,L,0); } %endif %ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT -cmd ::= with UPDATE orconf(R) xfullname(X) indexed_opt(I) SET setlist(Y) +cmd ::= with UPDATE orconf(R) xfullname(X) indexed_opt(I) SET setlist(Y) from(F) where_opt(W). { sqlite3SrcListIndexedBy(pParse, X, &I); sqlite3ExprListCheckLength(pParse,Y,"set list"); + X = sqlite3SrcListAppendList(pParse, X, F); sqlite3Update(pParse,X,Y,W,R,0,0,0); } %endif diff --git a/src/select.c b/src/select.c index 4b7ba37f9f..f6b48b5a0c 100644 --- a/src/select.c +++ b/src/select.c @@ -1154,11 +1154,11 @@ static void selectInnerLoop( break; } -#ifndef SQLITE_OMIT_SUBQUERY /* If we are creating a set for an "expr IN (SELECT ...)" construct, ** then there should be a single item on the stack. Write this ** item into the set table with bogus data. */ + case SRT_ISet: case SRT_Set: { if( pSort ){ /* At first glance you would think we could optimize out the @@ -1168,16 +1168,22 @@ static void selectInnerLoop( pushOntoSorter( pParse, pSort, p, regResult, regOrig, nResultCol, nPrefixReg); }else{ + int bITab = (eDest==SRT_ISet); int r1 = sqlite3GetTempReg(pParse); - assert( sqlite3Strlen30(pDest->zAffSdst)==nResultCol ); - sqlite3VdbeAddOp4(v, OP_MakeRecord, regResult, nResultCol, - r1, pDest->zAffSdst, nResultCol); - sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, r1, regResult, nResultCol); + sqlite3VdbeAddOp4(v, OP_MakeRecord, regResult+bITab, nResultCol-bITab, + r1, pDest->zAffSdst, 0 + ); + if( bITab ){ + sqlite3VdbeAddOp3(v, OP_Insert, iParm, r1, regResult); + }else{ + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, r1,regResult,nResultCol); + } sqlite3ReleaseTempReg(pParse, r1); } break; } +#ifndef SQLITE_OMIT_SUBQUERY /* If any row exist in the result set, record that fact and abort. */ case SRT_Exists: { @@ -4981,8 +4987,8 @@ static int selectExpander(Walker *pWalker, Select *p){ for(i=0, pFrom=pTabList->a; inSrc; i++, pFrom++){ Table *pTab; assert( pFrom->fg.isRecursive==0 || pFrom->pTab!=0 ); - if( pFrom->fg.isRecursive ) continue; - assert( pFrom->pTab==0 ); + if( pFrom->pTab ) continue; + assert( pFrom->fg.isRecursive==0 ); #ifndef SQLITE_OMIT_CTE if( withExpand(pWalker, pFrom) ) return WRC_Abort; if( pFrom->pTab ) {} else diff --git a/src/sqliteInt.h b/src/sqliteInt.h index aaa99a43a8..3cbc65cdd0 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3187,6 +3187,7 @@ struct Select { #define SRT_EphemTab 12 /* Create transient tab and store like SRT_Table */ #define SRT_Coroutine 13 /* Generate a single row of result */ #define SRT_Table 14 /* Store result as data with an automatic rowid */ +#define SRT_ISet 15 /* Store result as data with rowid */ /* ** An instance of this object describes where to put of the results of @@ -4204,6 +4205,7 @@ void *sqlite3ArrayAllocate(sqlite3*,void*,int,int*,int*); IdList *sqlite3IdListAppend(Parse*, IdList*, Token*); int sqlite3IdListIndex(IdList*,const char*); SrcList *sqlite3SrcListEnlarge(Parse*, SrcList*, int, int); +SrcList *sqlite3SrcListAppendList(Parse *pParse, SrcList *p1, SrcList *p2); SrcList *sqlite3SrcListAppend(Parse*, SrcList*, Token*, Token*); SrcList *sqlite3SrcListAppendFromTerm(Parse*, SrcList*, Token*, Token*, Token*, Select*, Expr*, IdList*); diff --git a/src/update.c b/src/update.c index d54a6cb9f0..7257b2c6f2 100644 --- a/src/update.c +++ b/src/update.c @@ -130,6 +130,93 @@ static int indexWhereClauseMightChange( aXRef, chngRowid); } +/* +** This function generates VM code to run the query: +** +** SELECT , pChanges FROM pTabList WHERE pWhere +** +** and write the results to the ephemeral table already opened as cursor +** iEph. None of pChanges, pTabList or pWhere are modified or consumed by +** this function, they must be deleted by the caller. +** +** Exactly how results are written to table iEph, and exactly what +** the in the query above are is determined by the type +** of table pTabList->a[0].pTab. +** +** If the table is a WITHOUT ROWID table, then argument pPk must be its +** PRIMARY KEY. In this case are the primary key columns +** of the table, in order. The results of the query are written to ephemeral +** table iEph as index keys, using OP_IdxInsert. +** +** If the table is actually a view, then are all columns of +** the view. The results are written to the ephemeral table iEph as records +** with automatically assigned integer keys. +** +** If the table is a virtual or ordinary intkey table, then +** is its rowid. For a virtual table, the results are written to iEph as +** records with automatically assigned integer keys For intkey tables, the +** rowid value in is used as the integer key, and the +** remaining fields make up the table record. +*/ +static void updatePopulateEphTable( + Parse *pParse, /* Parse context */ + int iEph, /* Cursor for open eph. table */ + Index *pPk, /* PK if table 0 is WITHOUT ROWID */ + ExprList *pChanges, /* List of expressions to return */ + SrcList *pTabList, /* List of tables to select from */ + Expr *pWhere /* WHERE clause for query */ +){ + int i; + sqlite3 *db = pParse->db; + SelectDest dest; + Select *pSelect = 0; + ExprList *pList = 0; + Table *pTab = pTabList->a[0].pTab; + SrcList *pSrc = sqlite3SrcListDup(db, pTabList, 0); + Expr *pWhere2 = sqlite3ExprDup(db, pWhere, 0); + int eDest; + + assert( pTabList->nSrc>1 ); + if( pSrc ){ + pSrc->a[0].iCursor = -1; + pSrc->a[0].pTab->nTabRef--; + pSrc->a[0].pTab = 0; + } + if( pPk ){ + for(i=0; inKeyCol; i++){ + pList = sqlite3ExprListAppend(pParse, pList, + sqlite3PExpr(pParse, TK_DOT, + sqlite3Expr(db, TK_ID, pTab->zName), + sqlite3Expr(db, TK_ID, pTab->aCol[pPk->aiColumn[i]].zName) + )); + } + eDest = SRT_Set; + }else if( pTab->pSelect ){ + pList = sqlite3ExprListAppend(pParse, pList, + sqlite3PExpr(pParse, TK_DOT, + sqlite3Expr(db, TK_ID, pTab->zName), + sqlite3PExpr(pParse, TK_ASTERISK, 0, 0) + )); + eDest = SRT_Table; + }else{ + pList = sqlite3ExprListAppend(pParse, pList, + sqlite3PExpr(pParse, TK_DOT, + sqlite3Expr(db, TK_ID, pTab->zName), + sqlite3Expr(db, TK_ID, "_rowid_") + )); + eDest = IsVirtual(pTab) ? SRT_Table : SRT_ISet; + } + for(i=0; inExpr; i++){ + pList = sqlite3ExprListAppend(pParse, pList, + sqlite3ExprDup(db, pChanges->a[i].pExpr, 0) + ); + } + pSelect = sqlite3SelectNew(pParse, pList, pSrc, pWhere2, 0, 0, 0, 0, 0); + sqlite3SelectDestInit(&dest, eDest, iEph); + sqlite3Select(pParse, pSelect, &dest); + sqlite3SelectDelete(db, pSelect); +} + /* ** Process an UPDATE statement. ** @@ -192,6 +279,7 @@ void sqlite3Update( i16 nPk = 0; /* Number of components of the PRIMARY KEY */ int bReplace = 0; /* True if REPLACE conflict resolution might happen */ int bFinishSeek = 1; /* The OP_FinishSeek opcode is needed */ + int nChangeFrom = 0; /* Register Allocations */ int regRowCount = 0; /* A count of rows changed */ @@ -207,7 +295,6 @@ void sqlite3Update( if( pParse->nErr || db->mallocFailed ){ goto update_cleanup; } - assert( pTabList->nSrc==1 ); /* Locate the table which we want to update. */ @@ -231,6 +318,8 @@ void sqlite3Update( # undef isView # define isView 0 #endif + nChangeFrom = (pTabList->nSrc>1) ? pChanges->nExpr : 0; + assert( nChangeFrom==0 || pUpsert==0 ); #ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT if( !isView ){ @@ -302,7 +391,9 @@ void sqlite3Update( */ chngRowid = chngPk = 0; for(i=0; inExpr; i++){ - if( sqlite3ResolveExprNames(&sNC, pChanges->a[i].pExpr) ){ + /* 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++){ @@ -461,7 +552,7 @@ void sqlite3Update( ** an ephemeral table. */ #if !defined(SQLITE_OMIT_VIEW) && !defined(SQLITE_OMIT_TRIGGER) - if( isView ){ + if( nChangeFrom==0 && isView ){ sqlite3MaterializeView(pParse, pTab, pWhere, pOrderBy, pLimit, iDataCur ); @@ -473,7 +564,7 @@ void sqlite3Update( /* Resolve the column names in all the expressions in the ** WHERE clause. */ - if( sqlite3ResolveExprNames(&sNC, pWhere) ){ + if( nChangeFrom==0 && sqlite3ResolveExprNames(&sNC, pWhere) ){ goto update_cleanup; } @@ -500,105 +591,118 @@ void sqlite3Update( sqlite3VdbeAddOp2(v, OP_Integer, 0, regRowCount); } - if( HasRowid(pTab) ){ + if( nChangeFrom==0 && HasRowid(pTab) ){ sqlite3VdbeAddOp3(v, OP_Null, 0, regRowSet, regOldRowid); }else{ - assert( pPk!=0 ); - nPk = pPk->nKeyCol; + assert( pPk!=0 || HasRowid(pTab) ); + nPk = pPk ? pPk->nKeyCol : 0; iPk = pParse->nMem+1; pParse->nMem += nPk; + pParse->nMem += nChangeFrom; regKey = ++pParse->nMem; if( pUpsert==0 ){ + int nEphCol = nPk + nChangeFrom + (isView ? pTab->nCol : 0); iEph = pParse->nTab++; - sqlite3VdbeAddOp3(v, OP_Null, 0, iPk, iPk+nPk-1); - addrOpen = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iEph, nPk); - sqlite3VdbeSetP4KeyInfo(pParse, pPk); + if( pPk ) sqlite3VdbeAddOp3(v, OP_Null, 0, iPk, iPk+nPk-1); + addrOpen = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iEph, nEphCol); + if( pPk ) sqlite3VdbeSetP4KeyInfo(pParse, pPk); + if( nChangeFrom ){ + updatePopulateEphTable(pParse, iEph, pPk, pChanges, pTabList, pWhere); +#ifndef SQLITE_OMIT_SUBQUERY + if( isView ) iDataCur = iEph; +#endif + } } } - if( pUpsert ){ - /* If this is an UPSERT, then all cursors have already been opened by - ** the outer INSERT and the data cursor should be pointing at the row - ** that is to be updated. So bypass the code that searches for the - ** row(s) to be updated. - */ - pWInfo = 0; - eOnePass = ONEPASS_SINGLE; - sqlite3ExprIfFalse(pParse, pWhere, labelBreak, SQLITE_JUMPIFNULL); - bFinishSeek = 0; + if( nChangeFrom ){ + sqlite3MultiWrite(pParse); + eOnePass = ONEPASS_OFF; }else{ - /* Begin the database scan. - ** - ** Do not consider a single-pass strategy for a multi-row update if - ** there are any triggers or foreign keys to process, or rows may - ** be deleted as a result of REPLACE conflict handling. Any of these - ** things might disturb a cursor being used to scan through the table - ** or index, causing a single-pass approach to malfunction. */ - flags = WHERE_ONEPASS_DESIRED|WHERE_SEEK_UNIQ_TABLE; - if( !pParse->nested && !pTrigger && !hasFK && !chngKey && !bReplace ){ - flags |= WHERE_ONEPASS_MULTIROW; - } - pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, 0, 0, flags, iIdxCur); - if( pWInfo==0 ) goto update_cleanup; - - /* A one-pass strategy that might update more than one row may not - ** be used if any column of the index used for the scan is being - ** updated. Otherwise, if there is an index on "b", statements like - ** the following could create an infinite loop: - ** - ** UPDATE t1 SET b=b+1 WHERE b>? - ** - ** Fall back to ONEPASS_OFF if where.c has selected a ONEPASS_MULTI - ** strategy that uses an index for which one or more columns are being - ** updated. */ - eOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass); - bFinishSeek = sqlite3WhereUsesDeferredSeek(pWInfo); - if( eOnePass!=ONEPASS_SINGLE ){ - sqlite3MultiWrite(pParse); - if( eOnePass==ONEPASS_MULTI ){ - int iCur = aiCurOnePass[1]; - if( iCur>=0 && iCur!=iDataCur && aToOpen[iCur-iBaseCur] ){ - eOnePass = ONEPASS_OFF; + if( pUpsert ){ + /* If this is an UPSERT, then all cursors have already been opened by + ** the outer INSERT and the data cursor should be pointing at the row + ** that is to be updated. So bypass the code that searches for the + ** row(s) to be updated. + */ + pWInfo = 0; + eOnePass = ONEPASS_SINGLE; + sqlite3ExprIfFalse(pParse, pWhere, labelBreak, SQLITE_JUMPIFNULL); + bFinishSeek = 0; + }else{ + /* Begin the database scan. + ** + ** Do not consider a single-pass strategy for a multi-row update if + ** there are any triggers or foreign keys to process, or rows may + ** be deleted as a result of REPLACE conflict handling. Any of these + ** things might disturb a cursor being used to scan through the table + ** or index, causing a single-pass approach to malfunction. */ + flags = WHERE_ONEPASS_DESIRED|WHERE_SEEK_UNIQ_TABLE; + if( !pParse->nested && !pTrigger && !hasFK && !chngKey && !bReplace ){ + flags |= WHERE_ONEPASS_MULTIROW; + } + pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, 0, 0, flags,iIdxCur); + if( pWInfo==0 ) goto update_cleanup; + + /* A one-pass strategy that might update more than one row may not + ** be used if any column of the index used for the scan is being + ** updated. Otherwise, if there is an index on "b", statements like + ** the following could create an infinite loop: + ** + ** UPDATE t1 SET b=b+1 WHERE b>? + ** + ** Fall back to ONEPASS_OFF if where.c has selected a ONEPASS_MULTI + ** strategy that uses an index for which one or more columns are being + ** updated. */ + eOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass); + bFinishSeek = sqlite3WhereUsesDeferredSeek(pWInfo); + if( eOnePass!=ONEPASS_SINGLE ){ + sqlite3MultiWrite(pParse); + if( eOnePass==ONEPASS_MULTI ){ + int iCur = aiCurOnePass[1]; + if( iCur>=0 && iCur!=iDataCur && aToOpen[iCur-iBaseCur] ){ + eOnePass = ONEPASS_OFF; + } + assert( iCur!=iDataCur || !HasRowid(pTab) ); } - assert( iCur!=iDataCur || !HasRowid(pTab) ); + } + } + + if( HasRowid(pTab) ){ + /* Read the rowid of the current row of the WHERE scan. In ONEPASS_OFF + ** mode, write the rowid into the FIFO. In either of the one-pass modes, + ** leave it in register regOldRowid. */ + sqlite3VdbeAddOp2(v, OP_Rowid, iDataCur, regOldRowid); + if( eOnePass==ONEPASS_OFF ){ + /* We need to use regRowSet, so reallocate aRegIdx[nAllIdx] */ + aRegIdx[nAllIdx] = ++pParse->nMem; + sqlite3VdbeAddOp2(v, OP_RowSetAdd, regRowSet, regOldRowid); + } + }else{ + /* Read the PK of the current row into an array of registers. In + ** ONEPASS_OFF mode, serialize the array into a record and store it in + ** the ephemeral table. Or, in ONEPASS_SINGLE or MULTI mode, change + ** the OP_OpenEphemeral instruction to a Noop (the ephemeral table + ** is not required) and leave the PK fields in the array of registers. */ + for(i=0; iaiColumn[i]>=0 ); + sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, + pPk->aiColumn[i], iPk+i); + } + if( eOnePass ){ + if( addrOpen ) sqlite3VdbeChangeToNoop(v, addrOpen); + nKey = nPk; + regKey = iPk; + }else{ + sqlite3VdbeAddOp4(v, OP_MakeRecord, iPk, nPk, regKey, + sqlite3IndexAffinityStr(db, pPk), nPk); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iEph, regKey, iPk, nPk); } } } - if( HasRowid(pTab) ){ - /* Read the rowid of the current row of the WHERE scan. In ONEPASS_OFF - ** mode, write the rowid into the FIFO. In either of the one-pass modes, - ** leave it in register regOldRowid. */ - sqlite3VdbeAddOp2(v, OP_Rowid, iDataCur, regOldRowid); - if( eOnePass==ONEPASS_OFF ){ - /* We need to use regRowSet, so reallocate aRegIdx[nAllIdx] */ - aRegIdx[nAllIdx] = ++pParse->nMem; - sqlite3VdbeAddOp2(v, OP_RowSetAdd, regRowSet, regOldRowid); - } - }else{ - /* Read the PK of the current row into an array of registers. In - ** ONEPASS_OFF mode, serialize the array into a record and store it in - ** the ephemeral table. Or, in ONEPASS_SINGLE or MULTI mode, change - ** the OP_OpenEphemeral instruction to a Noop (the ephemeral table - ** is not required) and leave the PK fields in the array of registers. */ - for(i=0; iaiColumn[i]>=0 ); - sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, - pPk->aiColumn[i], iPk+i); - } - if( eOnePass ){ - if( addrOpen ) sqlite3VdbeChangeToNoop(v, addrOpen); - nKey = nPk; - regKey = iPk; - }else{ - sqlite3VdbeAddOp4(v, OP_MakeRecord, iPk, nPk, regKey, - sqlite3IndexAffinityStr(db, pPk), nPk); - sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iEph, regKey, iPk, nPk); - } - } - if( pUpsert==0 ){ - if( eOnePass!=ONEPASS_MULTI ){ + if( nChangeFrom==0 && eOnePass!=ONEPASS_MULTI ){ sqlite3WhereEnd(pWInfo); } @@ -634,12 +738,32 @@ void sqlite3Update( sqlite3VdbeAddOp2(v, OP_IsNull, pPk ? regKey : regOldRowid, labelBreak); VdbeCoverageIf(v, pPk==0); VdbeCoverageIf(v, pPk!=0); - }else if( pPk ){ + }else if( pPk || nChangeFrom ){ labelContinue = sqlite3VdbeMakeLabel(pParse); sqlite3VdbeAddOp2(v, OP_Rewind, iEph, labelBreak); VdbeCoverage(v); - addrTop = sqlite3VdbeAddOp2(v, OP_RowData, iEph, regKey); - sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelContinue, regKey, 0); - VdbeCoverage(v); + addrTop = sqlite3VdbeCurrentAddr(v); + if( nChangeFrom ){ + if( !isView ){ + if( pPk ){ + for(i=0; i=0 ){ - sqlite3ExprCode(pParse, pChanges->a[j].pExpr, k); + if( nChangeFrom ){ + assert( eOnePass==ONEPASS_OFF ); + int nOff = (isView ? pTab->nCol : nPk); + sqlite3VdbeAddOp3(v, OP_Column, iEph, nOff+j, k); + }else{ + sqlite3ExprCode(pParse, pChanges->a[j].pExpr, k); + } }else if( 0==(tmask&TRIGGER_BEFORE) || i>31 || (newmask & MASKBIT32(i)) ){ /* This branch loads the value of a column that will not be changed ** into a register. This is done if there are no BEFORE triggers, or @@ -740,43 +870,45 @@ void sqlite3Update( sqlite3CodeRowTrigger(pParse, pTrigger, TK_UPDATE, pChanges, TRIGGER_BEFORE, pTab, regOldRowid, onError, labelContinue); - /* The row-trigger may have deleted the row being updated. In this - ** case, jump to the next row. No updates or AFTER triggers are - ** required. This behavior - what happens when the row being updated - ** is deleted or renamed by a BEFORE trigger - is left undefined in the - ** documentation. - */ - if( pPk ){ - sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelContinue,regKey,nKey); - VdbeCoverage(v); - }else{ - sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, labelContinue, regOldRowid); - VdbeCoverage(v); - } - - /* After-BEFORE-trigger-reload-loop: - ** If it did not delete it, the BEFORE trigger may still have modified - ** some of the columns of the row being updated. Load the values for - ** all columns not modified by the update statement into their registers - ** in case this has happened. Only unmodified columns are reloaded. - ** The values computed for modified columns use the values before the - ** BEFORE trigger runs. See test case trigger1-18.0 (added 2018-04-26) - ** for an example. - */ - for(i=0, k=regNew; inCol; i++, k++){ - if( pTab->aCol[i].colFlags & COLFLAG_GENERATED ){ - if( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ) k--; - }else if( aXRef[i]<0 && i!=pTab->iPKey ){ - sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, k); + if( !isView ){ + /* The row-trigger may have deleted the row being updated. In this + ** case, jump to the next row. No updates or AFTER triggers are + ** required. This behavior - what happens when the row being updated + ** is deleted or renamed by a BEFORE trigger - is left undefined in the + ** documentation. + */ + if( pPk ){ + sqlite3VdbeAddOp4Int(v, OP_NotFound,iDataCur,labelContinue,regKey,nKey); + VdbeCoverage(v); + }else{ + sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, labelContinue,regOldRowid); + VdbeCoverage(v); + } + + /* After-BEFORE-trigger-reload-loop: + ** If it did not delete it, the BEFORE trigger may still have modified + ** some of the columns of the row being updated. Load the values for + ** all columns not modified by the update statement into their registers + ** in case this has happened. Only unmodified columns are reloaded. + ** The values computed for modified columns use the values before the + ** BEFORE trigger runs. See test case trigger1-18.0 (added 2018-04-26) + ** for an example. + */ + for(i=0, k=regNew; inCol; i++, k++){ + if( pTab->aCol[i].colFlags & COLFLAG_GENERATED ){ + if( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL ) k--; + }else if( aXRef[i]<0 && i!=pTab->iPKey ){ + sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, i, k); + } } - } #ifndef SQLITE_OMIT_GENERATED_COLUMNS - if( pTab->tabFlags & TF_HasGenerated ){ - testcase( pTab->tabFlags & TF_HasVirtual ); - testcase( pTab->tabFlags & TF_HasStored ); - sqlite3ComputeGeneratedColumns(pParse, regNew, pTab); - } + if( pTab->tabFlags & TF_HasGenerated ){ + testcase( pTab->tabFlags & TF_HasVirtual ); + testcase( pTab->tabFlags & TF_HasStored ); + sqlite3ComputeGeneratedColumns(pParse, regNew, pTab); + } #endif + } } if( !isView ){ @@ -879,7 +1011,7 @@ void sqlite3Update( }else if( eOnePass==ONEPASS_MULTI ){ sqlite3VdbeResolveLabel(v, labelContinue); sqlite3WhereEnd(pWInfo); - }else if( pPk ){ + }else if( pPk || nChangeFrom ){ sqlite3VdbeResolveLabel(v, labelContinue); sqlite3VdbeAddOp2(v, OP_Next, iEph, addrTop); VdbeCoverage(v); }else{ @@ -982,69 +1114,101 @@ static void updateVirtualTable( addr= sqlite3VdbeAddOp2(v, OP_OpenEphemeral, ephemTab, nArg); regArg = pParse->nMem + 1; pParse->nMem += nArg; - regRec = ++pParse->nMem; - regRowid = ++pParse->nMem; - - /* Start scanning the virtual table */ - pWInfo = sqlite3WhereBegin(pParse, pSrc, pWhere, 0,0,WHERE_ONEPASS_DESIRED,0); - if( pWInfo==0 ) return; - - /* Populate the argument registers. */ - for(i=0; inCol; i++){ - assert( (pTab->aCol[i].colFlags & COLFLAG_GENERATED)==0 ); - if( aXRef[i]>=0 ){ - sqlite3ExprCode(pParse, pChanges->a[aXRef[i]].pExpr, regArg+2+i); - }else{ - sqlite3VdbeAddOp3(v, OP_VColumn, iCsr, i, regArg+2+i); - sqlite3VdbeChangeP5(v, OPFLAG_NOCHNG);/* Enable sqlite3_vtab_nochange() */ - } - } - if( HasRowid(pTab) ){ - sqlite3VdbeAddOp2(v, OP_Rowid, iCsr, regArg); + if( pSrc->nSrc>1 ){ + ExprList *pList = 0; if( pRowid ){ - sqlite3ExprCode(pParse, pRowid, regArg+1); + pList = sqlite3ExprListAppend(pParse, pList, sqlite3ExprDup(db,pRowid,0)); }else{ - sqlite3VdbeAddOp2(v, OP_Rowid, iCsr, regArg+1); + pList = sqlite3ExprListAppend(pParse, pList, + sqlite3PExpr(pParse, TK_DOT, + sqlite3Expr(db, TK_ID, pTab->zName), + sqlite3Expr(db, TK_ID, "_rowid_") + )); } + for(i=0; inCol; i++){ + if( aXRef[i]>=0 ){ + pList = sqlite3ExprListAppend(pParse, pList, + sqlite3ExprDup(db, pChanges->a[aXRef[i]].pExpr, 0) + ); + }else{ + pList = sqlite3ExprListAppend(pParse, pList, + sqlite3PExpr(pParse, TK_DOT, + sqlite3Expr(db, TK_ID, pTab->zName), + sqlite3Expr(db, TK_ID, pTab->aCol[i].zName) + )); + } + } + + updatePopulateEphTable(pParse, ephemTab, 0, pList, pSrc, pWhere); + sqlite3ExprListDelete(db, pList); + eOnePass = ONEPASS_OFF; }else{ - Index *pPk; /* PRIMARY KEY index */ - i16 iPk; /* PRIMARY KEY column */ - pPk = sqlite3PrimaryKeyIndex(pTab); - assert( pPk!=0 ); - assert( pPk->nKeyCol==1 ); - iPk = pPk->aiColumn[0]; - sqlite3VdbeAddOp3(v, OP_VColumn, iCsr, iPk, regArg); - sqlite3VdbeAddOp2(v, OP_SCopy, regArg+2+iPk, regArg+1); - } + regRec = ++pParse->nMem; + regRowid = ++pParse->nMem; - eOnePass = sqlite3WhereOkOnePass(pWInfo, aDummy); + /* Start scanning the virtual table */ + pWInfo = sqlite3WhereBegin(pParse, pSrc,pWhere,0,0,WHERE_ONEPASS_DESIRED,0); + if( pWInfo==0 ) return; - /* There is no ONEPASS_MULTI on virtual tables */ - assert( eOnePass==ONEPASS_OFF || eOnePass==ONEPASS_SINGLE ); + /* Populate the argument registers. */ + for(i=0; inCol; i++){ + assert( (pTab->aCol[i].colFlags & COLFLAG_GENERATED)==0 ); + if( aXRef[i]>=0 ){ + sqlite3ExprCode(pParse, pChanges->a[aXRef[i]].pExpr, regArg+2+i); + }else{ + sqlite3VdbeAddOp3(v, OP_VColumn, iCsr, i, regArg+2+i); + sqlite3VdbeChangeP5(v, OPFLAG_NOCHNG);/* For sqlite3_vtab_nochange() */ + } + } + if( HasRowid(pTab) ){ + sqlite3VdbeAddOp2(v, OP_Rowid, iCsr, regArg); + if( pRowid ){ + sqlite3ExprCode(pParse, pRowid, regArg+1); + }else{ + sqlite3VdbeAddOp2(v, OP_Rowid, iCsr, regArg+1); + } + }else{ + Index *pPk; /* PRIMARY KEY index */ + i16 iPk; /* PRIMARY KEY column */ + pPk = sqlite3PrimaryKeyIndex(pTab); + assert( pPk!=0 ); + assert( pPk->nKeyCol==1 ); + iPk = pPk->aiColumn[0]; + sqlite3VdbeAddOp3(v, OP_VColumn, iCsr, iPk, regArg); + sqlite3VdbeAddOp2(v, OP_SCopy, regArg+2+iPk, regArg+1); + } - if( eOnePass ){ - /* If using the onepass strategy, no-op out the OP_OpenEphemeral coded - ** above. */ - sqlite3VdbeChangeToNoop(v, addr); - sqlite3VdbeAddOp1(v, OP_Close, iCsr); - }else{ - /* Create a record from the argument register contents and insert it into - ** the ephemeral table. */ - sqlite3MultiWrite(pParse); - sqlite3VdbeAddOp3(v, OP_MakeRecord, regArg, nArg, regRec); + eOnePass = sqlite3WhereOkOnePass(pWInfo, aDummy); + + /* There is no ONEPASS_MULTI on virtual tables */ + assert( eOnePass==ONEPASS_OFF || eOnePass==ONEPASS_SINGLE ); + + if( eOnePass ){ + /* If using the onepass strategy, no-op out the OP_OpenEphemeral coded + ** above. */ + sqlite3VdbeChangeToNoop(v, addr); + sqlite3VdbeAddOp1(v, OP_Close, iCsr); + }else{ + /* Create a record from the argument register contents and insert it into + ** the ephemeral table. */ + sqlite3MultiWrite(pParse); + sqlite3VdbeAddOp3(v, OP_MakeRecord, regArg, nArg, regRec); #ifdef SQLITE_DEBUG - /* Signal an assert() within OP_MakeRecord that it is allowed to - ** accept no-change records with serial_type 10 */ - sqlite3VdbeChangeP5(v, OPFLAG_NOCHNG_MAGIC); + /* Signal an assert() within OP_MakeRecord that it is allowed to + ** accept no-change records with serial_type 10 */ + sqlite3VdbeChangeP5(v, OPFLAG_NOCHNG_MAGIC); #endif - sqlite3VdbeAddOp2(v, OP_NewRowid, ephemTab, regRowid); - sqlite3VdbeAddOp3(v, OP_Insert, ephemTab, regRec, regRowid); + sqlite3VdbeAddOp2(v, OP_NewRowid, ephemTab, regRowid); + sqlite3VdbeAddOp3(v, OP_Insert, ephemTab, regRec, regRowid); + } } if( eOnePass==ONEPASS_OFF ){ /* End the virtual table scan */ - sqlite3WhereEnd(pWInfo); + if( pSrc->nSrc==1 ){ + sqlite3WhereEnd(pWInfo); + } /* Begin scannning through the ephemeral table. */ addr = sqlite3VdbeAddOp1(v, OP_Rewind, ephemTab); VdbeCoverage(v); diff --git a/test/fts4upfrom.test b/test/fts4upfrom.test new file mode 100644 index 0000000000..4c72aff01a --- /dev/null +++ b/test/fts4upfrom.test @@ -0,0 +1,105 @@ +# 2020 February 24 +# +# 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. The +# focus of this script is testing UPDATE statements with FROM clauses +# against FTS4 tables. +# +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix fts4upfrom + +# If SQLITE_ENABLE_FTS3 is defined, omit this file. +ifcapable !fts3 { + finish_test + return +} + +foreach {tn create_table} { + 1 { CREATE VIRTUAL TABLE ft USING fts3(a, b, c) } + 2 { CREATE TABLE ft(a, b, c) } + 3 { + CREATE TABLE real(a, b, c); + CREATE INDEX i1 ON real(a); + CREATE VIEW ft AS SELECT rowid, a, b, c FROM real; + CREATE TRIGGER tr1 INSTEAD OF INSERT ON ft BEGIN + INSERT INTO real(rowid, a, b, c) VALUES(new.rowid, new.a, new.b, new.c); + END; + CREATE TRIGGER tr2 INSTEAD OF UPDATE ON ft BEGIN + UPDATE real SET rowid=new.rowid, a=new.a, b=new.b, c=new.c + WHERE rowid=old.rowid; + END; + } +} { + catchsql { DROP VIEW IF EXISTS changes } + catchsql { DROP TABLE IF EXISTS ft } + catchsql { DROP VIEW IF EXISTS ft } + execsql $create_table + + do_execsql_test 1.$tn.0 { + INSERT INTO ft(a, b, c) VALUES('a', NULL, 'apple'); + INSERT INTO ft(a, b, c) VALUES('b', NULL, 'banana'); + INSERT INTO ft(a, b, c) VALUES('c', NULL, 'cherry'); + INSERT INTO ft(a, b, c) VALUES('d', NULL, 'damson plum'); + } + + do_execsql_test 1.$tn.1 { + SELECT a, b, c FROM ft ORDER BY rowid; + } { + a {} apple + b {} banana + c {} cherry + d {} {damson plum} + } + + do_execsql_test 1.$tn.2 { + UPDATE ft SET b=o.c FROM ft AS o WHERE (ft.a == char(unicode(o.a)+1)) + } + + do_execsql_test 1.$tn.3 { + SELECT a, b, c FROM ft ORDER BY rowid; + } { + a {} apple + b apple banana + c banana cherry + d cherry {damson plum} + } + + do_catchsql_test 1.$tn.4 { + UPDATE ft SET c=v FROM changes WHERE a=k; + } {1 {no such table: changes}} + + do_execsql_test 1.$tn.5 { + create view changes(k, v) AS + VALUES( 'd', 'dewberry' ) UNION ALL + VALUES( 'c', 'clementine' ) UNION ALL + VALUES( 'b', 'blueberry' ) UNION ALL + VALUES( 'a', 'apricot' ) + ; + } + + do_execsql_test 1.$tn.6 { + UPDATE ft SET c=v FROM changes WHERE a=k; + } + + do_execsql_test 1.$tn.7 { + SELECT a, b, c FROM ft ORDER BY rowid; + } { + a {} apricot + b apple blueberry + c banana clementine + d cherry dewberry + } +} + +finish_test + diff --git a/test/pg_common.tcl b/test/pg_common.tcl index b3f35cd0ed..dd16659a67 100644 --- a/test/pg_common.tcl +++ b/test/pg_common.tcl @@ -18,6 +18,8 @@ sqlite3 sqlite "" proc execsql {sql} { + set sql [string map {{WITHOUT ROWID} {}} $sql] + set lSql [list] set frag "" while {[string length $sql]>0} { diff --git a/test/upfrom1.tcl b/test/upfrom1.tcl new file mode 100644 index 0000000000..5edbb94fe5 --- /dev/null +++ b/test/upfrom1.tcl @@ -0,0 +1,80 @@ +# 2020 April 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. +# +#*********************************************************************** +# + +source [file join [file dirname $argv0] pg_common.tcl] + +#========================================================================= + +start_test upfrom1 "2020 April 22" + +foreach {tn wo} { + 1 "WITHOUT ROWID" + 2 "" +} { +eval [string map [list %TN% $tn %WITHOUT_ROWID% $wo] { +execsql_test 1.%TN%.0 { + DROP TABLE IF EXISTS t2; + CREATE TABLE t2(a INTEGER PRIMARY KEY, b INTEGER, c INTEGER) %WITHOUT_ROWID%; + INSERT INTO t2 VALUES(1, 2, 3); + INSERT INTO t2 VALUES(4, 5, 6); + INSERT INTO t2 VALUES(7, 8, 9); + + DROP TABLE IF EXISTS chng; + CREATE TABLE chng(a INTEGER, b INTEGER, c INTEGER); + INSERT INTO chng VALUES(1, 100, 1000); + INSERT INTO chng VALUES(7, 700, 7000); +} + +execsql_test 1.%TN%.1 { + SELECT * FROM t2; +} + +execsql_test 1.%TN%.2 { + UPDATE t2 SET b = chng.b, c = chng.c FROM chng WHERE chng.a = t2.a; + SELECT * FROM t2 ORDER BY a; +} + +execsql_test 1.%TN%.3 { + DELETE FROM t2; + INSERT INTO t2 VALUES(1, 2, 3); + INSERT INTO t2 VALUES(4, 5, 6); + INSERT INTO t2 VALUES(7, 8, 9); +} + +execsql_test 1.%TN%.4 { + UPDATE t2 SET (b, c) = (SELECT b, c FROM chng WHERE a=t2.a) + WHERE a IN (SELECT a FROM chng); + SELECT * FROM t2 ORDER BY a; +} + +execsql_test 1.%TN%.5 { + DROP TABLE IF EXISTS t3; + CREATE TABLE t3(a INTEGER PRIMARY KEY, b INTEGER, c TEXT) %WITHOUT_ROWID%; + INSERT INTO t3 VALUES(1, 1, 'one'); + INSERT INTO t3 VALUES(2, 2, 'two'); + INSERT INTO t3 VALUES(3, 3, 'three'); + + DROP TABLE IF EXISTS t4; + CREATE TABLE t4(x TEXT); + INSERT INTO t4 VALUES('five'); + + SELECT * FROM t3 ORDER BY a; +} + +execsql_test 1.%TN%.6 { + UPDATE t3 SET c=x FROM t4; + SELECT * FROM t3 ORDER BY a; +} +}]} + +finish_test + diff --git a/test/upfrom1.test b/test/upfrom1.test new file mode 100644 index 0000000000..da873f16b4 --- /dev/null +++ b/test/upfrom1.test @@ -0,0 +1,130 @@ +# 2020 April 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. +# +#*********************************************************************** +# This file implements regression tests for SQLite library. +# + +#################################################### +# DO NOT EDIT! THIS FILE IS AUTOMATICALLY GENERATED! +#################################################### + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix upfrom1 + +do_execsql_test 1.1.0 { + DROP TABLE IF EXISTS t2; + CREATE TABLE t2(a INTEGER PRIMARY KEY, b INTEGER, c INTEGER) WITHOUT ROWID; + INSERT INTO t2 VALUES(1, 2, 3); + INSERT INTO t2 VALUES(4, 5, 6); + INSERT INTO t2 VALUES(7, 8, 9); + + DROP TABLE IF EXISTS chng; + CREATE TABLE chng(a INTEGER, b INTEGER, c INTEGER); + INSERT INTO chng VALUES(1, 100, 1000); + INSERT INTO chng VALUES(7, 700, 7000); +} {} + +do_execsql_test 1.1.1 { + SELECT * FROM t2; +} {1 2 3 4 5 6 7 8 9} + +do_execsql_test 1.1.2 { + UPDATE t2 SET b = chng.b, c = chng.c FROM chng WHERE chng.a = t2.a; + SELECT * FROM t2 ORDER BY a; +} {1 100 1000 4 5 6 7 700 7000} + +do_execsql_test 1.1.3 { + DELETE FROM t2; + INSERT INTO t2 VALUES(1, 2, 3); + INSERT INTO t2 VALUES(4, 5, 6); + INSERT INTO t2 VALUES(7, 8, 9); +} {} + +do_execsql_test 1.1.4 { + UPDATE t2 SET (b, c) = (SELECT b, c FROM chng WHERE a=t2.a) + WHERE a IN (SELECT a FROM chng); + SELECT * FROM t2 ORDER BY a; +} {1 100 1000 4 5 6 7 700 7000} + +do_execsql_test 1.1.5 { + DROP TABLE IF EXISTS t3; + CREATE TABLE t3(a INTEGER PRIMARY KEY, b INTEGER, c TEXT) WITHOUT ROWID; + INSERT INTO t3 VALUES(1, 1, 'one'); + INSERT INTO t3 VALUES(2, 2, 'two'); + INSERT INTO t3 VALUES(3, 3, 'three'); + + DROP TABLE IF EXISTS t4; + CREATE TABLE t4(x TEXT); + INSERT INTO t4 VALUES('five'); + + SELECT * FROM t3 ORDER BY a; +} {1 1 one 2 2 two 3 3 three} + +do_execsql_test 1.1.6 { + UPDATE t3 SET c=x FROM t4; + SELECT * FROM t3 ORDER BY a; +} {1 1 five 2 2 five 3 3 five} + +do_execsql_test 1.2.0 { + DROP TABLE IF EXISTS t2; + CREATE TABLE t2(a INTEGER PRIMARY KEY, b INTEGER, c INTEGER) ; + INSERT INTO t2 VALUES(1, 2, 3); + INSERT INTO t2 VALUES(4, 5, 6); + INSERT INTO t2 VALUES(7, 8, 9); + + DROP TABLE IF EXISTS chng; + CREATE TABLE chng(a INTEGER, b INTEGER, c INTEGER); + INSERT INTO chng VALUES(1, 100, 1000); + INSERT INTO chng VALUES(7, 700, 7000); +} {} + +do_execsql_test 1.2.1 { + SELECT * FROM t2; +} {1 2 3 4 5 6 7 8 9} + +do_execsql_test 1.2.2 { + UPDATE t2 SET b = chng.b, c = chng.c FROM chng WHERE chng.a = t2.a; + SELECT * FROM t2 ORDER BY a; +} {1 100 1000 4 5 6 7 700 7000} + +do_execsql_test 1.2.3 { + DELETE FROM t2; + INSERT INTO t2 VALUES(1, 2, 3); + INSERT INTO t2 VALUES(4, 5, 6); + INSERT INTO t2 VALUES(7, 8, 9); +} {} + +do_execsql_test 1.2.4 { + UPDATE t2 SET (b, c) = (SELECT b, c FROM chng WHERE a=t2.a) + WHERE a IN (SELECT a FROM chng); + SELECT * FROM t2 ORDER BY a; +} {1 100 1000 4 5 6 7 700 7000} + +do_execsql_test 1.2.5 { + DROP TABLE IF EXISTS t3; + CREATE TABLE t3(a INTEGER PRIMARY KEY, b INTEGER, c TEXT) ; + INSERT INTO t3 VALUES(1, 1, 'one'); + INSERT INTO t3 VALUES(2, 2, 'two'); + INSERT INTO t3 VALUES(3, 3, 'three'); + + DROP TABLE IF EXISTS t4; + CREATE TABLE t4(x TEXT); + INSERT INTO t4 VALUES('five'); + + SELECT * FROM t3 ORDER BY a; +} {1 1 one 2 2 two 3 3 three} + +do_execsql_test 1.2.6 { + UPDATE t3 SET c=x FROM t4; + SELECT * FROM t3 ORDER BY a; +} {1 1 five 2 2 five 3 3 five} + +finish_test From 9ed322d6c3c2562dffd590c59dfc8f83c31937ea Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 29 Apr 2020 17:41:29 +0000 Subject: [PATCH 002/186] Fix various bugs in new feature on this branch. FossilOrigin-Name: 823ba94e29dece1687e28711e503a1f56d392c306b0cbc0a20548180834530d1 --- manifest | 20 ++++---- manifest.uuid | 2 +- src/select.c | 31 +++++++----- src/sqliteInt.h | 4 +- src/update.c | 15 ++++-- test/upfrom2.test | 119 ++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 164 insertions(+), 27 deletions(-) create mode 100644 test/upfrom2.test diff --git a/manifest b/manifest index 78387769ab..f4a1a2e9dc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Allow\sa\sFROM\sclause\sin\sUPDATE\sstatements. -D 2020-04-27T20:55:33.061 +C Fix\svarious\sbugs\sin\snew\sfeature\son\sthis\sbranch. +D 2020-04-29T17:41:29.116 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -532,12 +532,12 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c d36a2b1639e1c33d7b508abfd3452a63e7fd81737f6f3940bfef085fca6f21f4 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 7e56a58673d027ab7951559adfda752192baff7c6083a88e4dd8db3c84e465e8 +F src/select.c 88ffd4e1a2b6bf221e3aaad026885485c7f2fe9291201f5e7d0656a3603b6bbe F src/shell.c.in 1fc834b80c72dd37587ea87a4f4167cf5e6d98d12d143184ed2e732f529c0950 F src/sqlite.h.in fd6fcfe173accab8d9cb9a843856d9e9fb475f893b60a455e01d8739b5076f0e F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 -F src/sqliteInt.h bfed03b21bfa8fade8887a12d5bc0f5a349e98105aec675b9c1e027e9fd66f67 +F src/sqliteInt.h 3caabf4700e4d98bf6d4d3d60fab71c808d43ca9a98ee9674342f99d1a96d382 F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032 F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -599,7 +599,7 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c eee7bae3ec0bc4abee951554bf46a8ba567c0f7752ac90c820ed8afff4c612dc F src/treeview.c 82c6391a3ba76215d4185fd4719a56ec4caf186a40c8a7b6e6ba4ae4467c2742 F src/trigger.c 4ada1037cc99777f647a882cdacbd1a4deb6567b69daf02946286401b88cdc04 -F src/update.c 72aae4f6198aca8290c1368f26f6f8b7d29e23d0d2bfbd4f773eaa8d9a9380a4 +F src/update.c 3dda0590ff4a87f29828cd21840f11e6ddc853061a94f4aebc2af8f37d0ba92c F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c 95fb6e03a5ca679045c5adccd05380f0addccabef5911abddcb06af069500ab7 F src/util.c 3b6cedf7a0c69bd6e1acce832873952d416212d6293b18d03064e07d7a9b5118 @@ -1618,6 +1618,7 @@ F test/update.test e906ca7cb1dc6f52af1ea243e08f727edfa79f924c2691f2f9e72481f8473 F test/update2.test 67455bc61fcbcf96923c45b3bc4f87bc72be7d67575ad35f134906148c7b06d3 F test/upfrom1.tcl 62efddee869b3a6f3e076b2816793fec9422e38d10ea42b63da733cdd2b1ad8e F test/upfrom1.test 543389b4eef43c7a21079df018cf95e29d7c2a4efd09b2597e54a03bbdbd30b9 +F test/upfrom2.test aba21e9988809b05de336bc882ad7318a0ca275c735c9a9c6688ebc01053ce29 F test/upsert1.test 88f9e258c6a0eeeb85937b08831e8daad440ba41f125af48439e9d33f266fb18 F test/upsert2.test 9c3cdbb1a890227f6504ce4b0e3de68f4cdfa16bb21d8641208a9239896c5a09 F test/upsert3.test 88d7d590a1948a9cb6eac1b54b0642f67a9f35a1fc0f19b200e97d5d39e3179c @@ -1864,10 +1865,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b73d9a7d6f7fec0ffc9640902a849289c305f8651e891388c01255c4da7a6c4b -R bbc1e04364e396384c0537dbe66bc52f -T *branch * update-from -T *sym-update-from * -T -sym-trunk * +P f353a1a613bb7ad8cedcda377a7fe6fd05ee03b1f50665b00b84a868a71c5bec +R ff3249230b7ba7b12347209dea6f6d16 U dan -Z 657e2dd1dadbea443cdb52f63d6f9883 +Z 37eb2f9d556f45297467e2642dd5f97e diff --git a/manifest.uuid b/manifest.uuid index b06346868b..8f74ee97ef 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f353a1a613bb7ad8cedcda377a7fe6fd05ee03b1f50665b00b84a868a71c5bec \ No newline at end of file +823ba94e29dece1687e28711e503a1f56d392c306b0cbc0a20548180834530d1 \ No newline at end of file diff --git a/src/select.c b/src/select.c index f6b48b5a0c..fdffe91634 100644 --- a/src/select.c +++ b/src/select.c @@ -117,6 +117,7 @@ static void clearSelect(sqlite3 *db, Select *p, int bFree){ void sqlite3SelectDestInit(SelectDest *pDest, int eDest, int iParm){ pDest->eDest = (u8)eDest; pDest->iSDParm = iParm; + pDest->iSDParm2 = 0; pDest->zAffSdst = 0; pDest->iSdst = 0; pDest->nSdst = 0; @@ -1154,11 +1155,24 @@ static void selectInnerLoop( break; } + case SRT_Upfrom: { + assert( pSort==0 ); + int i2 = pDest->iSDParm2; + int r1 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp3(v, OP_MakeRecord,regResult+(i2<0),nResultCol-(i2<0),r1); + if( i2<0 ){ + sqlite3VdbeAddOp3(v, OP_Insert, iParm, r1, regResult); + }else{ + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, r1, regResult, i2); + } + break; + } + +#ifndef SQLITE_OMIT_SUBQUERY /* If we are creating a set for an "expr IN (SELECT ...)" construct, ** then there should be a single item on the stack. Write this ** item into the set table with bogus data. */ - case SRT_ISet: case SRT_Set: { if( pSort ){ /* At first glance you would think we could optimize out the @@ -1168,22 +1182,17 @@ static void selectInnerLoop( pushOntoSorter( pParse, pSort, p, regResult, regOrig, nResultCol, nPrefixReg); }else{ - int bITab = (eDest==SRT_ISet); int r1 = sqlite3GetTempReg(pParse); - sqlite3VdbeAddOp4(v, OP_MakeRecord, regResult+bITab, nResultCol-bITab, - r1, pDest->zAffSdst, 0 - ); - if( bITab ){ - sqlite3VdbeAddOp3(v, OP_Insert, iParm, r1, regResult); - }else{ - sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, r1,regResult,nResultCol); - } + assert( sqlite3Strlen30(pDest->zAffSdst)==nResultCol ); + sqlite3VdbeAddOp4(v, OP_MakeRecord, regResult, nResultCol, + r1, pDest->zAffSdst, nResultCol); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, r1, regResult, nResultCol); sqlite3ReleaseTempReg(pParse, r1); } break; } -#ifndef SQLITE_OMIT_SUBQUERY + /* If any row exist in the result set, record that fact and abort. */ case SRT_Exists: { diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 3cbc65cdd0..34d6fea7ec 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3188,14 +3188,16 @@ struct Select { #define SRT_Coroutine 13 /* Generate a single row of result */ #define SRT_Table 14 /* Store result as data with an automatic rowid */ #define SRT_ISet 15 /* Store result as data with rowid */ +#define SRT_Upfrom 16 /* Store result as data with rowid */ /* ** An instance of this object describes where to put of the results of ** a SELECT statement. */ struct SelectDest { - u8 eDest; /* How to dispose of the results. On of SRT_* above. */ + u8 eDest; /* How to dispose of the results. One of SRT_* above. */ int iSDParm; /* A parameter used by the eDest disposal method */ + int iSDParm2; /* A second parameter for the eDest disposal method */ int iSdst; /* Base register where results are written */ int nSdst; /* Number of registers allocated */ char *zAffSdst; /* Affinity used when eDest==SRT_Set */ diff --git a/src/update.c b/src/update.c index 7257b2c6f2..80f07d3de4 100644 --- a/src/update.c +++ b/src/update.c @@ -190,7 +190,7 @@ static void updatePopulateEphTable( sqlite3Expr(db, TK_ID, pTab->aCol[pPk->aiColumn[i]].zName) )); } - eDest = SRT_Set; + eDest = SRT_Upfrom; }else if( pTab->pSelect ){ pList = sqlite3ExprListAppend(pParse, pList, sqlite3PExpr(pParse, TK_DOT, @@ -204,7 +204,7 @@ static void updatePopulateEphTable( sqlite3Expr(db, TK_ID, pTab->zName), sqlite3Expr(db, TK_ID, "_rowid_") )); - eDest = IsVirtual(pTab) ? SRT_Table : SRT_ISet; + eDest = IsVirtual(pTab) ? SRT_Table : SRT_Upfrom; } for(i=0; inExpr; i++){ pList = sqlite3ExprListAppend(pParse, pList, @@ -213,6 +213,7 @@ static void updatePopulateEphTable( } pSelect = sqlite3SelectNew(pParse, pList, pSrc, pWhere2, 0, 0, 0, 0, 0); sqlite3SelectDestInit(&dest, eDest, iEph); + dest.iSDParm2 = (pPk ? pPk->nKeyCol : -1); sqlite3Select(pParse, pSelect, &dest); sqlite3SelectDelete(db, pSelect); } @@ -878,7 +879,15 @@ void sqlite3Update( ** documentation. */ if( pPk ){ - sqlite3VdbeAddOp4Int(v, OP_NotFound,iDataCur,labelContinue,regKey,nKey); + int p3, p4; + if( nChangeFrom ){ + p3 = iPk; + p4 = nPk; + }else{ + p3 = regKey; + p4 = nKey; + } + sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelContinue, p3, p4); VdbeCoverage(v); }else{ sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, labelContinue,regOldRowid); diff --git a/test/upfrom2.test b/test/upfrom2.test new file mode 100644 index 0000000000..0c3cf31efb --- /dev/null +++ b/test/upfrom2.test @@ -0,0 +1,119 @@ +# 2020 April 29 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix upfrom2 + +if 0 { +do_execsql_test 0.0 { + CREATE TABLE t1 (a PRIMARY KEY, b, c) WITHOUT ROWID; +} +explain_i { REPLACE INTO t1 VALUES('one', 'two', 'three'); } +breakpoint +execsql { + REPLACE INTO t1 VALUES('one', 'two', 'three'); + REPLACE INTO t1 VALUES('one', 'two', 'four'); +} +do_execsql_test x { + SELECT * FROM t1 +} {one two four} +exit +} + +# Test cases: +# +# 1.*: Test that triggers are fired correctly for UPDATE FROM statements, +# and only once for each row. +# + +foreach {tn wo} { + 1 "" + 2 "WITHOUT ROWID" +} { + reset_db + + eval [string map [list %WO% $wo %TN% $tn] { + do_execsql_test 1.%TN%.0 { + CREATE TABLE log(t TEXT); + CREATE TABLE t1(x PRIMARY KEY, y, z UNIQUE) %WO%; + CREATE INDEX t1y ON t1(y); + + INSERT INTO t1 VALUES(1, 'i', 'one'); + INSERT INTO t1 VALUES(2, 'ii', 'two'); + INSERT INTO t1 VALUES(3, 'iii', 'three'); + INSERT INTO t1 VALUES(4, 'iv', 'four'); + + CREATE TRIGGER tr1 BEFORE UPDATE ON t1 BEGIN + INSERT INTO log VALUES(old.z || '->' || new.z); + END; + CREATE TRIGGER tr2 AFTER UPDATE ON t1 BEGIN + INSERT INTO log VALUES(old.y || '->' || new.y); + END; + } + + do_execsql_test 1.%TN%.1 { + WITH data(k, v) AS ( + VALUES(3, 'thirty'), (1, 'ten') + ) + UPDATE t1 SET z=v FROM data WHERE x=k; + + SELECT * FROM t1; + SELECT * FROM log; + } { + 1 i ten 2 ii two 3 iii thirty 4 iv four + one->ten i->i + three->thirty iii->iii + } + + do_execsql_test 1.%TN%.2 { + CREATE TABLE t2(a, b); + CREATE TABLE t3(k, v); + + INSERT INTO t3 VALUES(5, 'v'); + INSERT INTO t3 VALUES(12, 'xii'); + + INSERT INTO t2 VALUES(2, 12); + INSERT INTO t2 VALUES(3, 5); + + DELETE FROM log; + UPDATE t1 SET y=v FROM t2, t3 WHERE t1.x=t2.a AND t3.k=t2.b; + + SELECT * FROM t1; + SELECT * FROM log; + } { + 1 i ten 2 xii two 3 v thirty 4 iv four + two->two ii->xii + thirty->thirty iii->v + } + + do_execsql_test 1.%TN%.3 { + DELETE FROM log; + WITH data(k, v) AS ( + VALUES(1, 'seven'), (1, 'eight'), (2, 'eleven'), (2, 'twelve') + ) + UPDATE t1 SET z=v FROM data WHERE x=k; + + SELECT * FROM t1; + SELECT * FROM log; + } { + 1 i eight 2 xii twelve 3 v thirty 4 iv four + ten->eight i->i + two->twelve xii->xii + } +}] +} + + + +finish_test + From f2972b6083aef8bd57c2e1ff60d357c5b1ff7f88 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 29 Apr 2020 20:11:01 +0000 Subject: [PATCH 003/186] Fix problems with using LIMIT and FROM clauses as part of single UPDATE statement. FossilOrigin-Name: b717dc3c5fafb9b86a141e7ecffc030fd9b36aa57a0b3e5200d64ad23a0aa13d --- manifest | 20 +++++------ manifest.uuid | 2 +- src/resolve.c | 2 +- src/select.c | 32 ++++++++++++----- src/sqliteInt.h | 3 +- src/update.c | 47 +++++++++++++++++-------- test/upfrom2.test | 88 ++++++++++++++++++++++++++++++++++++++--------- 7 files changed, 140 insertions(+), 54 deletions(-) diff --git a/manifest b/manifest index f4a1a2e9dc..e0eba4c3f8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\svarious\sbugs\sin\snew\sfeature\son\sthis\sbranch. -D 2020-04-29T17:41:29.116 +C Fix\sproblems\swith\susing\sLIMIT\sand\sFROM\sclauses\sas\spart\sof\ssingle\sUPDATE\sstatement. +D 2020-04-29T20:11:01.860 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -530,14 +530,14 @@ F src/pragma.h 9473160d220416456b40f27323bb4b316d4e4e08ffbf8bf88c5f7045d49c38e5 F src/prepare.c 8d4d6c8aa6afefc48027c54b41cdf134b4d6bc2fc4badbe483ad7fd9e1728a28 F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c d36a2b1639e1c33d7b508abfd3452a63e7fd81737f6f3940bfef085fca6f21f4 +F src/resolve.c 05471a183504f72aedf249851d94ad6feeac4d02be044fefdb4b42a8a6e13e42 F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 88ffd4e1a2b6bf221e3aaad026885485c7f2fe9291201f5e7d0656a3603b6bbe +F src/select.c 51882f7b24503163414ddcdc33705ea4f74707da70d7d0545e52aa8dff9f8983 F src/shell.c.in 1fc834b80c72dd37587ea87a4f4167cf5e6d98d12d143184ed2e732f529c0950 F src/sqlite.h.in fd6fcfe173accab8d9cb9a843856d9e9fb475f893b60a455e01d8739b5076f0e F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 -F src/sqliteInt.h 3caabf4700e4d98bf6d4d3d60fab71c808d43ca9a98ee9674342f99d1a96d382 +F src/sqliteInt.h cea0d39df23798779db3cd0a2aa9cecc769ba9b13f58d5958e4a9e9325fa1b58 F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032 F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -599,7 +599,7 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c eee7bae3ec0bc4abee951554bf46a8ba567c0f7752ac90c820ed8afff4c612dc F src/treeview.c 82c6391a3ba76215d4185fd4719a56ec4caf186a40c8a7b6e6ba4ae4467c2742 F src/trigger.c 4ada1037cc99777f647a882cdacbd1a4deb6567b69daf02946286401b88cdc04 -F src/update.c 3dda0590ff4a87f29828cd21840f11e6ddc853061a94f4aebc2af8f37d0ba92c +F src/update.c 15c1e9b6191be56d0752235f38e8c4e0eddf7b8a26e31992631a848cf3a87517 F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c 95fb6e03a5ca679045c5adccd05380f0addccabef5911abddcb06af069500ab7 F src/util.c 3b6cedf7a0c69bd6e1acce832873952d416212d6293b18d03064e07d7a9b5118 @@ -1618,7 +1618,7 @@ F test/update.test e906ca7cb1dc6f52af1ea243e08f727edfa79f924c2691f2f9e72481f8473 F test/update2.test 67455bc61fcbcf96923c45b3bc4f87bc72be7d67575ad35f134906148c7b06d3 F test/upfrom1.tcl 62efddee869b3a6f3e076b2816793fec9422e38d10ea42b63da733cdd2b1ad8e F test/upfrom1.test 543389b4eef43c7a21079df018cf95e29d7c2a4efd09b2597e54a03bbdbd30b9 -F test/upfrom2.test aba21e9988809b05de336bc882ad7318a0ca275c735c9a9c6688ebc01053ce29 +F test/upfrom2.test 1c0f8d3b963304f0feb04ca172484942a15ffca975cd25463fdfd4614d1245d0 F test/upsert1.test 88f9e258c6a0eeeb85937b08831e8daad440ba41f125af48439e9d33f266fb18 F test/upsert2.test 9c3cdbb1a890227f6504ce4b0e3de68f4cdfa16bb21d8641208a9239896c5a09 F test/upsert3.test 88d7d590a1948a9cb6eac1b54b0642f67a9f35a1fc0f19b200e97d5d39e3179c @@ -1865,7 +1865,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P f353a1a613bb7ad8cedcda377a7fe6fd05ee03b1f50665b00b84a868a71c5bec -R ff3249230b7ba7b12347209dea6f6d16 +P 823ba94e29dece1687e28711e503a1f56d392c306b0cbc0a20548180834530d1 +R c7060e5765cacf17cc72ccb6e64f7f11 U dan -Z 37eb2f9d556f45297467e2642dd5f97e +Z 2cbbaf692ee6084a41961733ac9445a3 diff --git a/manifest.uuid b/manifest.uuid index 8f74ee97ef..d8889b7ff8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -823ba94e29dece1687e28711e503a1f56d392c306b0cbc0a20548180834530d1 \ No newline at end of file +b717dc3c5fafb9b86a141e7ecffc030fd9b36aa57a0b3e5200d64ad23a0aa13d \ No newline at end of file diff --git a/src/resolve.c b/src/resolve.c index 60fed0b109..76cdc8ccd7 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -756,7 +756,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ case TK_ROW: { SrcList *pSrcList = pNC->pSrcList; struct SrcList_item *pItem; - assert( pSrcList && pSrcList->nSrc==1 ); + assert( pSrcList && pSrcList->nSrc>=1 ); pItem = pSrcList->a; assert( HasRowid(pItem->pTab) && pItem->pTab->pSelect==0 ); pExpr->op = TK_COLUMN; diff --git a/src/select.c b/src/select.c index fdffe91634..757fa3265a 100644 --- a/src/select.c +++ b/src/select.c @@ -1006,7 +1006,8 @@ static void selectInnerLoop( testcase( eDest==SRT_Coroutine ); testcase( eDest==SRT_Output ); assert( eDest==SRT_Set || eDest==SRT_Mem - || eDest==SRT_Coroutine || eDest==SRT_Output ); + || eDest==SRT_Coroutine || eDest==SRT_Output + || eDest==SRT_Upfrom ); } sRowLoadInfo.regResult = regResult; sRowLoadInfo.ecelFlags = ecelFlags; @@ -1156,14 +1157,18 @@ static void selectInnerLoop( } case SRT_Upfrom: { - assert( pSort==0 ); - int i2 = pDest->iSDParm2; - int r1 = sqlite3GetTempReg(pParse); - sqlite3VdbeAddOp3(v, OP_MakeRecord,regResult+(i2<0),nResultCol-(i2<0),r1); - if( i2<0 ){ - sqlite3VdbeAddOp3(v, OP_Insert, iParm, r1, regResult); + if( pSort ){ + pushOntoSorter( + pParse, pSort, p, regResult, regOrig, nResultCol, nPrefixReg); }else{ - sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, r1, regResult, i2); + int i2 = pDest->iSDParm2; + int r1 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp3(v, OP_MakeRecord,regResult+(i2<0),nResultCol-(i2<0),r1); + if( i2<0 ){ + sqlite3VdbeAddOp3(v, OP_Insert, iParm, r1, regResult); + }else{ + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, r1, regResult, i2); + } } break; } @@ -1600,6 +1605,17 @@ static void generateSortTail( break; } #endif + case SRT_Upfrom: { + int i2 = pDest->iSDParm2; + int r1 = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp3(v, OP_MakeRecord,regRow+(i2<0),nColumn-(i2<0),r1); + if( i2<0 ){ + sqlite3VdbeAddOp3(v, OP_Insert, iParm, r1, regRow); + }else{ + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iParm, r1, regRow, i2); + } + break; + } default: { assert( eDest==SRT_Output || eDest==SRT_Coroutine ); testcase( eDest==SRT_Output ); diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 34d6fea7ec..c668e6bee3 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3187,8 +3187,7 @@ struct Select { #define SRT_EphemTab 12 /* Create transient tab and store like SRT_Table */ #define SRT_Coroutine 13 /* Generate a single row of result */ #define SRT_Table 14 /* Store result as data with an automatic rowid */ -#define SRT_ISet 15 /* Store result as data with rowid */ -#define SRT_Upfrom 16 /* Store result as data with rowid */ +#define SRT_Upfrom 15 /* Store result as data with rowid */ /* ** An instance of this object describes where to put of the results of diff --git a/src/update.c b/src/update.c index 80f07d3de4..5d4e5ae7db 100644 --- a/src/update.c +++ b/src/update.c @@ -164,7 +164,9 @@ static void updatePopulateEphTable( Index *pPk, /* PK if table 0 is WITHOUT ROWID */ ExprList *pChanges, /* List of expressions to return */ SrcList *pTabList, /* List of tables to select from */ - Expr *pWhere /* WHERE clause for query */ + Expr *pWhere, /* WHERE clause for query */ + ExprList *pOrderBy, + Expr *pLimit ){ int i; sqlite3 *db = pParse->db; @@ -174,6 +176,9 @@ static void updatePopulateEphTable( Table *pTab = pTabList->a[0].pTab; SrcList *pSrc = sqlite3SrcListDup(db, pTabList, 0); Expr *pWhere2 = sqlite3ExprDup(db, pWhere, 0); + Expr *pLimit2 = sqlite3ExprDup(db, pLimit, 0); + ExprList *pOrderBy2 = sqlite3ExprListDup(db, pOrderBy, 0); + ExprList *pGroupBy = 0; int eDest; assert( pTabList->nSrc>1 ); @@ -184,11 +189,16 @@ static void updatePopulateEphTable( } if( pPk ){ for(i=0; inKeyCol; i++){ - pList = sqlite3ExprListAppend(pParse, pList, - sqlite3PExpr(pParse, TK_DOT, - sqlite3Expr(db, TK_ID, pTab->zName), - sqlite3Expr(db, TK_ID, pTab->aCol[pPk->aiColumn[i]].zName) - )); + Expr *pNew = sqlite3PExpr(pParse, TK_DOT, + sqlite3Expr(db, TK_ID, pTab->zName), + sqlite3Expr(db, TK_ID, pTab->aCol[pPk->aiColumn[i]].zName) + ); + if( pLimit ){ + pGroupBy = sqlite3ExprListAppend(pParse, pGroupBy, + sqlite3ExprDup(db, pNew, 0) + ); + } + pList = sqlite3ExprListAppend(pParse, pList, pNew); } eDest = SRT_Upfrom; }else if( pTab->pSelect ){ @@ -199,19 +209,24 @@ static void updatePopulateEphTable( )); eDest = SRT_Table; }else{ - pList = sqlite3ExprListAppend(pParse, pList, - sqlite3PExpr(pParse, TK_DOT, - sqlite3Expr(db, TK_ID, pTab->zName), - sqlite3Expr(db, TK_ID, "_rowid_") - )); eDest = IsVirtual(pTab) ? SRT_Table : SRT_Upfrom; + pList = sqlite3ExprListAppend(pParse, pList, + sqlite3PExpr(pParse, TK_ROW, 0, 0) + ); + if( pLimit ){ + pGroupBy = sqlite3ExprListAppend(pParse, pGroupBy, + sqlite3PExpr(pParse, TK_ROW, 0, 0) + ); + } } for(i=0; inExpr; i++){ pList = sqlite3ExprListAppend(pParse, pList, sqlite3ExprDup(db, pChanges->a[i].pExpr, 0) ); } - pSelect = sqlite3SelectNew(pParse, pList, pSrc, pWhere2, 0, 0, 0, 0, 0); + pSelect = sqlite3SelectNew( + pParse, pList, pSrc, pWhere2, pGroupBy, 0, pOrderBy2, 0, pLimit2 + ); sqlite3SelectDestInit(&dest, eDest, iEph); dest.iSDParm2 = (pPk ? pPk->nKeyCol : -1); sqlite3Select(pParse, pSelect, &dest); @@ -323,7 +338,7 @@ void sqlite3Update( assert( nChangeFrom==0 || pUpsert==0 ); #ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT - if( !isView ){ + if( !isView && nChangeFrom==0 ){ pWhere = sqlite3LimitWhere( pParse, pTabList, pWhere, pOrderBy, pLimit, "UPDATE" ); @@ -608,7 +623,9 @@ void sqlite3Update( addrOpen = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, iEph, nEphCol); if( pPk ) sqlite3VdbeSetP4KeyInfo(pParse, pPk); if( nChangeFrom ){ - updatePopulateEphTable(pParse, iEph, pPk, pChanges, pTabList, pWhere); + updatePopulateEphTable( + pParse, iEph, pPk, pChanges, pTabList, pWhere, pOrderBy, pLimit + ); #ifndef SQLITE_OMIT_SUBQUERY if( isView ) iDataCur = iEph; #endif @@ -1148,7 +1165,7 @@ static void updateVirtualTable( } } - updatePopulateEphTable(pParse, ephemTab, 0, pList, pSrc, pWhere); + updatePopulateEphTable(pParse, ephemTab, 0, pList, pSrc, pWhere, 0, 0); sqlite3ExprListDelete(db, pList); eOnePass = ONEPASS_OFF; }else{ diff --git a/test/upfrom2.test b/test/upfrom2.test index 0c3cf31efb..2d8d51b82d 100644 --- a/test/upfrom2.test +++ b/test/upfrom2.test @@ -14,26 +14,14 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl set testprefix upfrom2 -if 0 { -do_execsql_test 0.0 { - CREATE TABLE t1 (a PRIMARY KEY, b, c) WITHOUT ROWID; -} -explain_i { REPLACE INTO t1 VALUES('one', 'two', 'three'); } -breakpoint -execsql { - REPLACE INTO t1 VALUES('one', 'two', 'three'); - REPLACE INTO t1 VALUES('one', 'two', 'four'); -} -do_execsql_test x { - SELECT * FROM t1 -} {one two four} -exit -} - # Test cases: # # 1.*: Test that triggers are fired correctly for UPDATE FROM statements, -# and only once for each row. +# and only once for each row. Except for INSTEAD OF triggers on +# views - these are fired once for each row returned by the join, +# including duplicates. +# +# 2.*: Test adding ORDER BY and LIMIT clauses with UPDATE FROM statements. # foreach {tn wo} { @@ -110,9 +98,75 @@ foreach {tn wo} { ten->eight i->i two->twelve xii->xii } + + do_test 1.%TN%.4 { db changes } {2} + + do_execsql_test 1.%TN%.5 { + CREATE VIEW v1 AS SELECT * FROM t1; + CREATE TRIGGER v1tr INSTEAD OF UPDATE ON v1 BEGIN + UPDATE t1 SET y=new.y, z=new.z WHERE x=new.x; + END; + + DELETE FROM log; + WITH data(k, v) AS ( + VALUES(3, 'thirteen'), (3, 'fourteen'), (4, 'fifteen'), (4, 'sixteen') + ) + UPDATE v1 SET z=v FROM data WHERE x=k; + } + + do_execsql_test 1.%TN%.6 { + SELECT * FROM v1; + SELECT * FROM log; + } { + 1 i eight 2 xii twelve 3 v fourteen 4 iv sixteen + thirty->thirteen v->v + thirteen->fourteen v->v + four->fifteen iv->iv + fifteen->sixteen iv->iv + } + }] } +ifcapable update_delete_limit { +foreach {tn wo} { + 1 "" + 2 "WITHOUT ROWID" +} { + reset_db + +eval [string map [list %WO% $wo %TN% $tn] { + do_execsql_test 2.%TN%.1 { + CREATE TABLE x1(a INTEGER PRIMARY KEY, b) %WO%; + INSERT INTO x1 VALUES + (1, 'one'), (2, 'two'), (3, 'three'), (4, 'four'), + (5, 'five'), (6, 'six'), (7, 'seven'), (8, 'eight'); + } + + do_execsql_test 2.%TN%.2 { + CREATE TABLE data1(x, y); + INSERT INTO data1 VALUES + (1, 'eleven'), (1, 'twenty-one'), (2, 'twelve'), (2, 'twenty-two'), + (3, 'thirteen'), (3, 'twenty-three'), (4, 'fourteen'), (4, 'twenty-four'); + } + + do_execsql_test 2.%TN%.3 { + UPDATE x1 SET b=y FROM data1 WHERE a=x ORDER BY a LIMIT 3; + SELECT * FROM x1; + } { + 1 eleven 2 twelve 3 thirteen 4 four 5 five 6 six 7 seven 8 eight + } + + do_execsql_test 2.%TN%.4 { + UPDATE x1 SET b=b||y FROM data1 WHERE a=x ORDER BY b LIMIT 3; + SELECT * FROM x1; + } { + 1 eleveneleven 2 twelve 3 thirteenthirteen 4 fourfourteen + 5 five 6 six 7 seven 8 eight + } + +}] +}} finish_test From 1e113844fc1e0cf88ca1967bc7b9581d773ec187 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 30 Apr 2020 15:49:56 +0000 Subject: [PATCH 004/186] Report an error if an UPDATE...FROM statement has an ORDER BY but no LIMIT clause. Add tests for multi-column primary keys. FossilOrigin-Name: ffcdb6689123bb871c9bd8f977197f86f37c42e9094e2d4bb187ff479f74cf65 --- manifest | 14 +++--- manifest.uuid | 2 +- src/update.c | 22 ++++++--- test/upfrom2.test | 121 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 145 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index e0eba4c3f8..f4649ed808 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sproblems\swith\susing\sLIMIT\sand\sFROM\sclauses\sas\spart\sof\ssingle\sUPDATE\sstatement. -D 2020-04-29T20:11:01.860 +C Report\san\serror\sif\san\sUPDATE...FROM\sstatement\shas\san\sORDER\sBY\sbut\sno\sLIMIT\sclause.\sAdd\stests\sfor\smulti-column\sprimary\skeys. +D 2020-04-30T15:49:56.938 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -599,7 +599,7 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c eee7bae3ec0bc4abee951554bf46a8ba567c0f7752ac90c820ed8afff4c612dc F src/treeview.c 82c6391a3ba76215d4185fd4719a56ec4caf186a40c8a7b6e6ba4ae4467c2742 F src/trigger.c 4ada1037cc99777f647a882cdacbd1a4deb6567b69daf02946286401b88cdc04 -F src/update.c 15c1e9b6191be56d0752235f38e8c4e0eddf7b8a26e31992631a848cf3a87517 +F src/update.c 0f27f4b1128a447df648ba458b08dc119d0974af052a555e038dcce27f7a4bf6 F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c 95fb6e03a5ca679045c5adccd05380f0addccabef5911abddcb06af069500ab7 F src/util.c 3b6cedf7a0c69bd6e1acce832873952d416212d6293b18d03064e07d7a9b5118 @@ -1618,7 +1618,7 @@ F test/update.test e906ca7cb1dc6f52af1ea243e08f727edfa79f924c2691f2f9e72481f8473 F test/update2.test 67455bc61fcbcf96923c45b3bc4f87bc72be7d67575ad35f134906148c7b06d3 F test/upfrom1.tcl 62efddee869b3a6f3e076b2816793fec9422e38d10ea42b63da733cdd2b1ad8e F test/upfrom1.test 543389b4eef43c7a21079df018cf95e29d7c2a4efd09b2597e54a03bbdbd30b9 -F test/upfrom2.test 1c0f8d3b963304f0feb04ca172484942a15ffca975cd25463fdfd4614d1245d0 +F test/upfrom2.test cbf5e1cb5066c9c04034ccb7a937f10a752ee7291670a1fdb4218aedcdaa960e F test/upsert1.test 88f9e258c6a0eeeb85937b08831e8daad440ba41f125af48439e9d33f266fb18 F test/upsert2.test 9c3cdbb1a890227f6504ce4b0e3de68f4cdfa16bb21d8641208a9239896c5a09 F test/upsert3.test 88d7d590a1948a9cb6eac1b54b0642f67a9f35a1fc0f19b200e97d5d39e3179c @@ -1865,7 +1865,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 823ba94e29dece1687e28711e503a1f56d392c306b0cbc0a20548180834530d1 -R c7060e5765cacf17cc72ccb6e64f7f11 +P b717dc3c5fafb9b86a141e7ecffc030fd9b36aa57a0b3e5200d64ad23a0aa13d +R 8112d214c23c0825cafbe3ae9671b4b5 U dan -Z 2cbbaf692ee6084a41961733ac9445a3 +Z 00088545d453cb111fa959dd326ff545 diff --git a/manifest.uuid b/manifest.uuid index d8889b7ff8..4460169f93 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b717dc3c5fafb9b86a141e7ecffc030fd9b36aa57a0b3e5200d64ad23a0aa13d \ No newline at end of file +ffcdb6689123bb871c9bd8f977197f86f37c42e9094e2d4bb187ff479f74cf65 \ No newline at end of file diff --git a/src/update.c b/src/update.c index 5d4e5ae7db..fa80a7da85 100644 --- a/src/update.c +++ b/src/update.c @@ -169,18 +169,28 @@ static void updatePopulateEphTable( Expr *pLimit ){ int i; - sqlite3 *db = pParse->db; SelectDest dest; Select *pSelect = 0; ExprList *pList = 0; - Table *pTab = pTabList->a[0].pTab; - SrcList *pSrc = sqlite3SrcListDup(db, pTabList, 0); - Expr *pWhere2 = sqlite3ExprDup(db, pWhere, 0); - Expr *pLimit2 = sqlite3ExprDup(db, pLimit, 0); - ExprList *pOrderBy2 = sqlite3ExprListDup(db, pOrderBy, 0); ExprList *pGroupBy = 0; + sqlite3 *db = pParse->db; + Table *pTab = pTabList->a[0].pTab; + SrcList *pSrc; + Expr *pWhere2; + Expr *pLimit2; + ExprList *pOrderBy2; int eDest; + if( pOrderBy && pLimit==0 ) { + sqlite3ErrorMsg(pParse, "ORDER BY without LIMIT on UPDATE"); + return; + } + + pSrc = sqlite3SrcListDup(db, pTabList, 0); + pWhere2 = sqlite3ExprDup(db, pWhere, 0); + pLimit2 = sqlite3ExprDup(db, pLimit, 0); + pOrderBy2 = sqlite3ExprListDup(db, pOrderBy, 0); + assert( pTabList->nSrc>1 ); if( pSrc ){ pSrc->a[0].iCursor = -1; diff --git a/test/upfrom2.test b/test/upfrom2.test index 2d8d51b82d..de9610e6af 100644 --- a/test/upfrom2.test +++ b/test/upfrom2.test @@ -125,6 +125,93 @@ foreach {tn wo} { fifteen->sixteen iv->iv } + #-------------------------------------------------------------- + + do_execsql_test 1.%TN%.7 { + CREATE TABLE o1(w, x, y, z UNIQUE, PRIMARY KEY(w, x)) %WO%; + CREATE INDEX o1y ON t1(y); + + INSERT INTO o1 VALUES(0, 0, 'i', 'one'); + INSERT INTO o1 VALUES(0, 1, 'ii', 'two'); + INSERT INTO o1 VALUES(1, 0, 'iii', 'three'); + INSERT INTO o1 VALUES(1, 1, 'iv', 'four'); + + CREATE TRIGGER tro1 BEFORE UPDATE ON o1 BEGIN + INSERT INTO log VALUES(old.z || '->' || new.z); + END; + CREATE TRIGGER tro2 AFTER UPDATE ON o1 BEGIN + INSERT INTO log VALUES(old.y || '->' || new.y); + END; + } + + do_execsql_test 1.%TN%.8 { + DELETE FROM log; + WITH data(k, v) AS ( + VALUES(3, 'thirty'), (1, 'ten') + ) + UPDATE o1 SET z=v FROM data WHERE (1+x+w*2)=k; + + SELECT * FROM o1; + SELECT * FROM log; + } { + 0 0 i ten 0 1 ii two 1 0 iii thirty 1 1 iv four + one->ten i->i + three->thirty iii->iii + } + + do_execsql_test 1.%TN%.9 { + DELETE FROM log; + UPDATE o1 SET y=v FROM t2, t3 WHERE (1+o1.w*2+o1.x)=t2.a AND t3.k=t2.b; + + SELECT * FROM o1; + SELECT * FROM log; + } { + 0 0 i ten 0 1 xii two 1 0 v thirty 1 1 iv four + two->two ii->xii + thirty->thirty iii->v + } + + do_execsql_test 1.%TN%.10 { + DELETE FROM log; + WITH data(k, v) AS ( + VALUES(1, 'seven'), (1, 'eight'), (2, 'eleven'), (2, 'twelve') + ) + UPDATE o1 SET z=v FROM data WHERE (1+w*2+x)=k; + + SELECT * FROM o1; + SELECT * FROM log; + } { + 0 0 i eight 0 1 xii twelve 1 0 v thirty 1 1 iv four + ten->eight i->i + two->twelve xii->xii + } + + do_test 1.%TN%.11 { db changes } {2} + + do_execsql_test 1.%TN%.12 { + CREATE VIEW w1 AS SELECT * FROM o1; + CREATE TRIGGER w1tr INSTEAD OF UPDATE ON w1 BEGIN + UPDATE o1 SET y=new.y, z=new.z WHERE w=new.w AND x=new.x; + END; + + DELETE FROM log; + WITH data(k, v) AS ( + VALUES(3, 'thirteen'), (3, 'fourteen'), (4, 'fifteen'), (4, 'sixteen') + ) + UPDATE w1 SET z=v FROM data WHERE (1+w*2+x)=k; + } + + do_execsql_test 1.%TN%.13 { + SELECT * FROM w1; + SELECT * FROM log; + } { + 0 0 i eight 0 1 xii twelve 1 0 v fourteen 1 1 iv sixteen + thirty->thirteen v->v + thirteen->fourteen v->v + four->fifteen iv->iv + fifteen->sixteen iv->iv + } + }] } @@ -165,6 +252,40 @@ eval [string map [list %WO% $wo %TN% $tn] { 5 five 6 six 7 seven 8 eight } + do_catchsql_test 2.%TN%.5 { + UPDATE x1 SET b=b||b ORDER BY b; + } {1 {ORDER BY without LIMIT on UPDATE}} + do_catchsql_test 2.%TN%.6 { + UPDATE x1 SET b=b||y FROM data1 WHERE a=x ORDER BY b; + } {1 {ORDER BY without LIMIT on UPDATE}} + + #----------------------------------------------------------------------- + + do_execsql_test 2.%TN%.6 { + DROP TABLE x1; + CREATE TABLE x1(u, v, b, PRIMARY KEY(u, v)) %WO%; + INSERT INTO x1 VALUES + (0, 1, 'one'), (1, 0, 'two'), (1, 1, 'three'), (2, 0, 'four'), + (2, 1, 'five'), (3, 0, 'six'), (3, 1, 'seven'), (4, 0, 'eight'); + } + + do_execsql_test 2.%TN%.7 { + UPDATE x1 SET b=y FROM data1 WHERE (u*2+v)=x ORDER BY u, v LIMIT 3; + SELECT * FROM x1; + } { + 0 1 eleven 1 0 twelve 1 1 thirteen 2 0 four + 2 1 five 3 0 six 3 1 seven 4 0 eight + } + + do_execsql_test 2.%TN%.8 { + UPDATE x1 SET b=b||y FROM data1 WHERE (u*2+v)=x ORDER BY b LIMIT 3; + SELECT * FROM x1; + } { + 0 1 eleveneleven 1 0 twelve 1 1 thirteenthirteen 2 0 fourfourteen + 2 1 five 3 0 six 3 1 seven 4 0 eight + } + + }] }} From 8b023cf5928f9c728ec8445144a47e1705546c24 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 30 Apr 2020 18:28:40 +0000 Subject: [PATCH 005/186] Add OOM tests for the new code on this branch. FossilOrigin-Name: e4a18601e5093896e5b323c21aec986b07259353d2ef9455d0a81c6846f40282 --- manifest | 17 ++++---- manifest.uuid | 2 +- src/build.c | 14 +++---- src/update.c | 11 +++-- test/upfrom2.test | 25 ++++++++++++ test/upfromfault.test | 94 +++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 143 insertions(+), 20 deletions(-) create mode 100644 test/upfromfault.test diff --git a/manifest b/manifest index f4649ed808..abb28b2640 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Report\san\serror\sif\san\sUPDATE...FROM\sstatement\shas\san\sORDER\sBY\sbut\sno\sLIMIT\sclause.\sAdd\stests\sfor\smulti-column\sprimary\skeys. -D 2020-04-30T15:49:56.938 +C Add\sOOM\stests\sfor\sthe\snew\scode\son\sthis\sbranch. +D 2020-04-30T18:28:40.716 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -476,7 +476,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 02376eb7d49ccf31b53c2504f045ad74687c142a5c15ca837516e59e737867dc F src/btree.h 32672fa1aa74a7e9ab3aae822f94ffc8e732b1eb005988dc2283f91dc7573398 F src/btreeInt.h 887cdd2ea7f4a65143074a8a7c8928b0546f8c18dda3c06a408ce7992cbab0c0 -F src/build.c 8debc951e3f7e5152bbb7e6b2f26cad7b00a1db068c69af7db4aab136486e541 +F src/build.c d43ee335c3efc4005b4dcd07aecd1f9e231c10320fe8f65b0bf81f0b4b98eace F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 6a77ec9e0eb87aea929e002c816298907e337094a7b556898ae2d1e6be209f90 @@ -599,7 +599,7 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c eee7bae3ec0bc4abee951554bf46a8ba567c0f7752ac90c820ed8afff4c612dc F src/treeview.c 82c6391a3ba76215d4185fd4719a56ec4caf186a40c8a7b6e6ba4ae4467c2742 F src/trigger.c 4ada1037cc99777f647a882cdacbd1a4deb6567b69daf02946286401b88cdc04 -F src/update.c 0f27f4b1128a447df648ba458b08dc119d0974af052a555e038dcce27f7a4bf6 +F src/update.c 2f63f9e13c34e4f9fc238e769d8879697d905e542d2e6f9a7a68ea1a5289c631 F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c 95fb6e03a5ca679045c5adccd05380f0addccabef5911abddcb06af069500ab7 F src/util.c 3b6cedf7a0c69bd6e1acce832873952d416212d6293b18d03064e07d7a9b5118 @@ -1618,7 +1618,8 @@ F test/update.test e906ca7cb1dc6f52af1ea243e08f727edfa79f924c2691f2f9e72481f8473 F test/update2.test 67455bc61fcbcf96923c45b3bc4f87bc72be7d67575ad35f134906148c7b06d3 F test/upfrom1.tcl 62efddee869b3a6f3e076b2816793fec9422e38d10ea42b63da733cdd2b1ad8e F test/upfrom1.test 543389b4eef43c7a21079df018cf95e29d7c2a4efd09b2597e54a03bbdbd30b9 -F test/upfrom2.test cbf5e1cb5066c9c04034ccb7a937f10a752ee7291670a1fdb4218aedcdaa960e +F test/upfrom2.test 1dded7ed03e8b335b7ac38f9d70b60380df9049ea13076832ab86fd5b78b4926 +F test/upfromfault.test 1e68cc570695a0f8cd16ce09c14210fc43928c7b47b3eda38a99abb0b80c9a65 F test/upsert1.test 88f9e258c6a0eeeb85937b08831e8daad440ba41f125af48439e9d33f266fb18 F test/upsert2.test 9c3cdbb1a890227f6504ce4b0e3de68f4cdfa16bb21d8641208a9239896c5a09 F test/upsert3.test 88d7d590a1948a9cb6eac1b54b0642f67a9f35a1fc0f19b200e97d5d39e3179c @@ -1865,7 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b717dc3c5fafb9b86a141e7ecffc030fd9b36aa57a0b3e5200d64ad23a0aa13d -R 8112d214c23c0825cafbe3ae9671b4b5 +P ffcdb6689123bb871c9bd8f977197f86f37c42e9094e2d4bb187ff479f74cf65 +R 9834e1157ceceff37925bd1917b38659 U dan -Z 00088545d453cb111fa959dd326ff545 +Z 98f1c8c70109f9d7189dd668536b4270 diff --git a/manifest.uuid b/manifest.uuid index 4460169f93..f197462623 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ffcdb6689123bb871c9bd8f977197f86f37c42e9094e2d4bb187ff479f74cf65 \ No newline at end of file +e4a18601e5093896e5b323c21aec986b07259353d2ef9455d0a81c6846f40282 \ No newline at end of file diff --git a/src/build.c b/src/build.c index f0136cbe80..c9396708dd 100644 --- a/src/build.c +++ b/src/build.c @@ -4501,15 +4501,15 @@ void sqlite3SrcListIndexedBy(Parse *pParse, SrcList *p, Token *pIndexedBy){ ** are deleted by this function. */ SrcList *sqlite3SrcListAppendList(Parse *pParse, SrcList *p1, SrcList *p2){ - if( p2 && p1 ){ - assert( p1->nSrc==1 ); - p1 = sqlite3SrcListEnlarge(pParse, p1, p2->nSrc, p1->nSrc); - if( p1 ){ - assert( p1->nSrc==1+p2->nSrc ); + assert( p1 && p1->nSrc==1 ); + if( p2 ){ + SrcList *pNew = sqlite3SrcListEnlarge(pParse, p1, p2->nSrc, 1); + if( pNew==0 ){ + sqlite3SrcListDelete(pParse->db, p2); + }else{ + p1 = pNew; memcpy(&p1->a[1], p2->a, p2->nSrc*sizeof(struct SrcList_item)); sqlite3_free(p2); - }else{ - sqlite3SrcListDelete(pParse->db, p2); } } return p1; diff --git a/src/update.c b/src/update.c index fa80a7da85..0b98e70174 100644 --- a/src/update.c +++ b/src/update.c @@ -229,10 +229,13 @@ static void updatePopulateEphTable( ); } } - for(i=0; inExpr; i++){ - pList = sqlite3ExprListAppend(pParse, pList, - sqlite3ExprDup(db, pChanges->a[i].pExpr, 0) - ); + assert( pChanges || db->mallocFailed ); + if( pChanges ){ + for(i=0; inExpr; i++){ + pList = sqlite3ExprListAppend(pParse, pList, + sqlite3ExprDup(db, pChanges->a[i].pExpr, 0) + ); + } } pSelect = sqlite3SelectNew( pParse, pList, pSrc, pWhere2, pGroupBy, 0, pOrderBy2, 0, pLimit2 diff --git a/test/upfrom2.test b/test/upfrom2.test index de9610e6af..e9bf5eb504 100644 --- a/test/upfrom2.test +++ b/test/upfrom2.test @@ -289,6 +289,31 @@ eval [string map [list %WO% $wo %TN% $tn] { }] }} +reset_db +do_execsql_test 3.0 { + CREATE TABLE data(x, y, z); + CREATE VIEW t1 AS SELECT * FROM data; + CREATE TRIGGER t1_insert INSTEAD OF INSERT ON t1 BEGIN + INSERT INTO data VALUES(new.x, new.y, new.z); + END; + CREATE TRIGGER t1_update INSTEAD OF UPDATE ON t1 BEGIN + INSERT INTO log VALUES(old.z || '->' || new.z); + END; + + CREATE TABLE log(t TEXT); + + INSERT INTO t1 VALUES(1, 'i', 'one'); + INSERT INTO t1 VALUES(2, 'ii', 'two'); + INSERT INTO t1 VALUES(3, 'iii', 'three'); + INSERT INTO t1 VALUES(4, 'iv', 'four'); +} + +do_execsql_test 3.1 { + WITH input(k, v) AS ( + VALUES(3, 'thirty'), (1, 'ten') + ) + UPDATE t1 SET z=v FROM input WHERE x=k; +} finish_test diff --git a/test/upfromfault.test b/test/upfromfault.test new file mode 100644 index 0000000000..2645857207 --- /dev/null +++ b/test/upfromfault.test @@ -0,0 +1,94 @@ +# 2020 April 29 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix upfromfault + +foreach {tn sql} { + 1 { + CREATE TABLE t1(x PRIMARY KEY, y, z UNIQUE); + CREATE INDEX t1y ON t1(y); + } + 2 { + CREATE TABLE t1(x PRIMARY KEY, y, z UNIQUE) WITHOUT ROWID; + CREATE INDEX t1y ON t1(y); + } + 3 { + CREATE TABLE t1(x, y, z UNIQUE, PRIMARY KEY(x,y)) WITHOUT ROWID; + } + 4 { + CREATE VIRTUAL TABLE t1 USING fts5(x, y, z); + } + 5 { + CREATE TABLE real(x, y, z); + CREATE VIEW t1 AS SELECT * FROM real; + CREATE TRIGGER t1_insert INSTEAD OF INSERT ON t1 BEGIN + INSERT INTO real VALUES(new.x, new.y, new.z); + END; + CREATE TRIGGER t1_update INSTEAD OF UPDATE ON t1 BEGIN + INSERT INTO log VALUES(old.z || '->' || new.z); + UPDATE real SET y=new.y, z=new.z WHERE x=old.x; + END; + } +} { +if {$tn<5} continue + reset_db + + ifcapable !fts5 { if {$tn==4} continue } + + execsql $sql + do_execsql_test 1.$tn.0 { + CREATE TABLE log(t TEXT); + + INSERT INTO t1 VALUES(1, 'i', 'one'); + INSERT INTO t1 VALUES(2, 'ii', 'two'); + INSERT INTO t1 VALUES(3, 'iii', 'three'); + INSERT INTO t1 VALUES(4, 'iv', 'four'); + } + if {$tn!=4 && $tn!=5} { + do_execsql_test 1.$tn.0b { + CREATE TRIGGER tr1 BEFORE UPDATE ON t1 BEGIN + INSERT INTO log VALUES(old.z || '->' || new.z); + END; + CREATE TRIGGER tr2 AFTER UPDATE ON t1 BEGIN + INSERT INTO log VALUES(old.y || '->' || new.y); + END; + } + } + + faultsim_save_and_close + + do_faultsim_test 1.$tn -prep { + faultsim_restore_and_reopen + execsql { SELECT * FROM t1 } + } -body { + execsql { + WITH data(k, v) AS ( + VALUES(3, 'thirty'), (1, 'ten') + ) + UPDATE t1 SET z=v FROM data WHERE x=k; + } + } -test { + faultsim_test_result {0 {}} {1 {vtable constructor failed: t1}} + if {$testrc==0} { + set res [execsql { SELECT * FROM t1 }] + if {$res!="1 i ten 2 ii two 3 iii thirty 4 iv four"} { + error "unexpected result: $res" + } + } + } +} + + +finish_test + From 7465787b97a0a09841e343630a07ba80f1399e4a Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 1 May 2020 18:43:49 +0000 Subject: [PATCH 006/186] Fix problems with UPDATE...FROM statements that modify rowid or primary-key values. FossilOrigin-Name: 623ab585d1aa1bdde2df17f1936aa4eec2d997b274acc5c7b291d9566a9ec2c5 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/update.c | 22 ++++++++++++---------- test/upfrom2.test | 31 +++++++++++++++++++++++++++++++ 4 files changed, 51 insertions(+), 18 deletions(-) diff --git a/manifest b/manifest index abb28b2640..7e5a049d97 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sOOM\stests\sfor\sthe\snew\scode\son\sthis\sbranch. -D 2020-04-30T18:28:40.716 +C Fix\sproblems\swith\sUPDATE...FROM\sstatements\sthat\smodify\srowid\sor\sprimary-key\svalues. +D 2020-05-01T18:43:49.018 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -599,7 +599,7 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c eee7bae3ec0bc4abee951554bf46a8ba567c0f7752ac90c820ed8afff4c612dc F src/treeview.c 82c6391a3ba76215d4185fd4719a56ec4caf186a40c8a7b6e6ba4ae4467c2742 F src/trigger.c 4ada1037cc99777f647a882cdacbd1a4deb6567b69daf02946286401b88cdc04 -F src/update.c 2f63f9e13c34e4f9fc238e769d8879697d905e542d2e6f9a7a68ea1a5289c631 +F src/update.c 9777ad958b979488ed2e04a7d226048179078916e32437bd633eb4cae191f1a9 F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c 95fb6e03a5ca679045c5adccd05380f0addccabef5911abddcb06af069500ab7 F src/util.c 3b6cedf7a0c69bd6e1acce832873952d416212d6293b18d03064e07d7a9b5118 @@ -1618,7 +1618,7 @@ F test/update.test e906ca7cb1dc6f52af1ea243e08f727edfa79f924c2691f2f9e72481f8473 F test/update2.test 67455bc61fcbcf96923c45b3bc4f87bc72be7d67575ad35f134906148c7b06d3 F test/upfrom1.tcl 62efddee869b3a6f3e076b2816793fec9422e38d10ea42b63da733cdd2b1ad8e F test/upfrom1.test 543389b4eef43c7a21079df018cf95e29d7c2a4efd09b2597e54a03bbdbd30b9 -F test/upfrom2.test 1dded7ed03e8b335b7ac38f9d70b60380df9049ea13076832ab86fd5b78b4926 +F test/upfrom2.test 79f2d3e4df214010011afdd588ce35410ea1416e0f87aadb48618864347f90a5 F test/upfromfault.test 1e68cc570695a0f8cd16ce09c14210fc43928c7b47b3eda38a99abb0b80c9a65 F test/upsert1.test 88f9e258c6a0eeeb85937b08831e8daad440ba41f125af48439e9d33f266fb18 F test/upsert2.test 9c3cdbb1a890227f6504ce4b0e3de68f4cdfa16bb21d8641208a9239896c5a09 @@ -1866,7 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P ffcdb6689123bb871c9bd8f977197f86f37c42e9094e2d4bb187ff479f74cf65 -R 9834e1157ceceff37925bd1917b38659 +P e4a18601e5093896e5b323c21aec986b07259353d2ef9455d0a81c6846f40282 +R 31d44a5c5eab4f547b6c4029493d0d87 U dan -Z 98f1c8c70109f9d7189dd668536b4270 +Z 8413be68bb1b4ef61cb95011e58e4ac0 diff --git a/manifest.uuid b/manifest.uuid index f197462623..68d268c748 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e4a18601e5093896e5b323c21aec986b07259353d2ef9455d0a81c6846f40282 \ No newline at end of file +623ab585d1aa1bdde2df17f1936aa4eec2d997b274acc5c7b291d9566a9ec2c5 \ No newline at end of file diff --git a/src/update.c b/src/update.c index 0b98e70174..7aa9fee51d 100644 --- a/src/update.c +++ b/src/update.c @@ -285,6 +285,7 @@ void sqlite3Update( u8 chngRowid; /* Rowid changed in a normal table */ u8 chngKey; /* Either chngPk or chngRowid */ Expr *pRowidExpr = 0; /* Expression defining the new record number */ + int iRowidExpr = -1; AuthContext sContext; /* The authorization context */ NameContext sNC; /* The name-context to resolve expressions in */ int iDb; /* Database containing the table being updated */ @@ -430,6 +431,7 @@ void sqlite3Update( if( j==pTab->iPKey ){ chngRowid = 1; pRowidExpr = pChanges->a[i].pExpr; + iRowidExpr = i; }else if( pPk && (pTab->aCol[j].colFlags & COLFLAG_PRIMKEY)!=0 ){ chngPk = 1; } @@ -452,6 +454,7 @@ void sqlite3Update( j = -1; chngRowid = 1; pRowidExpr = pChanges->a[i].pExpr; + iRowidExpr = i; }else{ sqlite3ErrorMsg(pParse, "no such column: %s", pChanges->a[i].zEName); pParse->checkSchema = 1; @@ -649,6 +652,8 @@ void sqlite3Update( if( nChangeFrom ){ sqlite3MultiWrite(pParse); eOnePass = ONEPASS_OFF; + nKey = nPk; + regKey = iPk; }else{ if( pUpsert ){ /* If this is an UPSERT, then all cursors have already been opened by @@ -810,7 +815,12 @@ void sqlite3Update( ** already populated. */ assert( chngKey || pTrigger || hasFK || regOldRowid==regNewRowid ); if( chngRowid ){ - sqlite3ExprCode(pParse, pRowidExpr, regNewRowid); + assert( iRowidExpr>=0 ); + if( nChangeFrom==0 ){ + sqlite3ExprCode(pParse, pRowidExpr, regNewRowid); + }else{ + sqlite3VdbeAddOp3(v, OP_Column, iEph, iRowidExpr, regNewRowid); + } sqlite3VdbeAddOp1(v, OP_MustBeInt, regNewRowid); VdbeCoverage(v); } @@ -909,15 +919,7 @@ void sqlite3Update( ** documentation. */ if( pPk ){ - int p3, p4; - if( nChangeFrom ){ - p3 = iPk; - p4 = nPk; - }else{ - p3 = regKey; - p4 = nKey; - } - sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelContinue, p3, p4); + sqlite3VdbeAddOp4Int(v, OP_NotFound,iDataCur,labelContinue,regKey,nKey); VdbeCoverage(v); }else{ sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, labelContinue,regOldRowid); diff --git a/test/upfrom2.test b/test/upfrom2.test index e9bf5eb504..c5df7116e2 100644 --- a/test/upfrom2.test +++ b/test/upfrom2.test @@ -315,5 +315,36 @@ do_execsql_test 3.1 { UPDATE t1 SET z=v FROM input WHERE x=k; } +foreach {tn sql} { + 2 { + CREATE TABLE x1(a INT PRIMARY KEY, b, c) WITHOUT ROWID; + } + 1 { + CREATE TABLE x1(a INTEGER PRIMARY KEY, b, c); + } + 3 { + CREATE TABLE x1(a INT PRIMARY KEY, b, c); + } +} { + + reset_db + execsql $sql + + do_execsql_test 4.$tn.0 { + INSERT INTO x1 VALUES(1, 1, 1); + INSERT INTO x1 VALUES(2, 2, 2); + INSERT INTO x1 VALUES(3, 3, 3); + INSERT INTO x1 VALUES(4, 4, 4); + INSERT INTO x1 VALUES(5, 5, 5); + CREATE TABLE map(o, t); + INSERT INTO map VALUES(3, 30), (4, 40), (1, 10); + } + + do_execsql_test 4.$tn.1 { + UPDATE x1 SET a=t FROM map WHERE a=o; + SELECT * FROM x1 ORDER BY a; + } {2 2 2 5 5 5 10 1 1 30 3 3 40 4 4} +} + finish_test From d3bf76612724f79616d6aba959af92b609b941c9 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 25 May 2020 01:31:09 +0000 Subject: [PATCH 007/186] Attempt to work around a false-positive warning in the CGo compiler. FossilOrigin-Name: d4bf60f464789935dc193ea99bf730c8fade448c7dca13eb3ce297965980f36e --- manifest | 15 +++++++++------ manifest.uuid | 2 +- src/select.c | 9 ++++----- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 4b5b59e03a..52af8c9c07 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Version\snumber\sto\s3.32.1. -D 2020-05-24T12:36:20.131 +C Attempt\sto\swork\saround\sa\sfalse-positive\swarning\sin\sthe\sCGo\scompiler. +D 2020-05-25T01:31:09.337 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -533,7 +533,7 @@ F src/printf.c c558075d06f0c83b0471499cebd30ef979e600709cde1e2b744abadcf52c7ba2 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c e2a59548681bf1c407132863ae87bf2444aca5543867c21d9d09aa07f44aef5d +F src/select.c 39a00a8bc89596dfb37c16afcbb1d33de5085b9963564b58aafe1566d08c0881 F src/shell.c.in cf2d24f54412c06e5fb34af7fabc748651125e1dceac29b740e91f06d23447b6 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1866,7 +1866,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 ad7bb70af9bb68d192137188bb2528f1e9e43ad164c925174ca1dafc9e1f5339 -R 9b4861350c19f604797570d532809e1e +P 56e5063c326ffbfd3e3cb6f2b05718412aca2cb183274bfe11f5666effdd04b9 +R 8b82e85659228458f67d774145dc6d1d +T *branch * cgo-warning-workaround +T *sym-cgo-warning-workaround * +T -sym-trunk * U drh -Z bbda9cc25034e5e4447ce8684480d98d +Z 9456cb6ba774169f54e2af5894cea4a0 diff --git a/manifest.uuid b/manifest.uuid index 4d5c18c3a9..e9a6b27414 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -56e5063c326ffbfd3e3cb6f2b05718412aca2cb183274bfe11f5666effdd04b9 \ No newline at end of file +d4bf60f464789935dc193ea99bf730c8fade448c7dca13eb3ce297965980f36e \ No newline at end of file diff --git a/src/select.c b/src/select.c index 534dfbc01b..7ff2b5d347 100644 --- a/src/select.c +++ b/src/select.c @@ -138,9 +138,9 @@ Select *sqlite3SelectNew( u32 selFlags, /* Flag parameters, such as SF_Distinct */ Expr *pLimit /* LIMIT value. NULL means not used */ ){ - Select *pNew; + Select *pNew, *pAllocated; Select standin; - pNew = sqlite3DbMallocRawNN(pParse->db, sizeof(*pNew) ); + pAllocated = pNew = sqlite3DbMallocRawNN(pParse->db, sizeof(*pNew) ); if( pNew==0 ){ assert( pParse->db->mallocFailed ); pNew = &standin; @@ -174,12 +174,11 @@ Select *sqlite3SelectNew( #endif if( pParse->db->mallocFailed ) { clearSelect(pParse->db, pNew, pNew!=&standin); - pNew = 0; + pAllocated = 0; }else{ assert( pNew->pSrc!=0 || pParse->nErr>0 ); } - assert( pNew!=&standin ); - return pNew; + return pAllocated; } From bdd4f7d91c7ee622c914d96f8f36e6b6d523f9df Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 26 May 2020 10:54:46 +0000 Subject: [PATCH 008/186] Innocuous changes to help Coverity avoid false-positives. FossilOrigin-Name: 4ec8a5a203f10d228d0b3389120638766cc343179dbe38d5dbf69b650765934c --- manifest | 17 +++++++---------- manifest.uuid | 2 +- src/expr.c | 1 + src/prepare.c | 11 ++++++----- 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index 306c86e783..23ea3b8f46 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Version\s3.32.1 -D 2020-05-25T16:19:56.155 +C Innocuous\schanges\sto\shelp\sCoverity\savoid\sfalse-positives. +D 2020-05-26T10:54:46.900 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -485,7 +485,7 @@ F src/date.c b29b349d277e3d579dcc295b24c0a2caed83fd8f090a9f7cbe6070c0fd662384 F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 793deaf88a0904f88285d93d6713c636d55ede0ffd9f08d10f4ea825531d367f F src/delete.c 88047c8e59878c920fce14582bc1dde4d81157d1ca5ffdf36c2907e6d41996c4 -F src/expr.c b46669d9fc9e0361dba6cc289901a013789e0b1dc629c4c1bc88ec9403633b38 +F src/expr.c 7a388ddfac396635f38630429a2777fa36e9c1604e48114cb53be7316487a868 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41 F src/func.c 2333eb4277f55a5efdc12ef754e7d7ec9105d257b2fd00301d23ce1e8fa67dc0 @@ -528,7 +528,7 @@ F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 6596e10baf3d8f84cc1585d226cf1ab26564a5f5caf85a15757a281ff977d51a F src/pragma.c 1b0db48177e52b256c003b8dc6ac708b1079a82cded944a23820574586a4731f F src/pragma.h 8168e588536bffd95319451f34e9a754dc37d205ebe433031a7813c5b286beae -F src/prepare.c 8d4d6c8aa6afefc48027c54b41cdf134b4d6bc2fc4badbe483ad7fd9e1728a28 +F src/prepare.c aeb3ba661e2666dab15c4b5c55f6eb816f01d20e35fa860bb807e4a3b36e1e27 F src/printf.c 94b5419ad0a17269f76a9e968ca19cf9fa37617abed2e246fc48844e511b6bc6 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d @@ -1866,10 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b1b182be2ab34cec1d94c5570bc361331a34f727eb9fa4aadfabb7f1ef79f83e -R 060d4022d9a6a2267bacd2bd89abcc90 -T +bgcolor * #d0c0ff -T +sym-release * -T +sym-version-3.32.1 * +P 0c1fcf4711a2e66c813aed38cf41cd3e2123ee8eb6db98118086764c4ba83350 +R 85d34056e1232590b03a0479ee5fb897 U drh -Z 2dade396208e30c3681b79baa530525b +Z 1828178303ff8f8ff8fc532baf643ec7 diff --git a/manifest.uuid b/manifest.uuid index 93007e9da7..715e3b3e2b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0c1fcf4711a2e66c813aed38cf41cd3e2123ee8eb6db98118086764c4ba83350 \ No newline at end of file +4ec8a5a203f10d228d0b3389120638766cc343179dbe38d5dbf69b650765934c \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index c5b6783871..69cd674efb 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2563,6 +2563,7 @@ int sqlite3FindInIndex( /* Code an OP_Transaction and OP_TableLock for . */ iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + assert( iDb>=0 && iDbtnum, 0, pTab->zName); diff --git a/src/prepare.c b/src/prepare.c index 228d14876e..2599546760 100644 --- a/src/prepare.c +++ b/src/prepare.c @@ -504,17 +504,18 @@ static void schemaIsValid(Parse *pParse){ ** attached database is returned. */ int sqlite3SchemaToIndex(sqlite3 *db, Schema *pSchema){ - int i = -1000000; + int i = -32768; - /* If pSchema is NULL, then return -1000000. This happens when code in + /* If pSchema is NULL, then return -32768. This happens when code in ** expr.c is trying to resolve a reference to a transient table (i.e. one ** created by a sub-select). In this case the return value of this ** function should never be used. ** - ** We return -1000000 instead of the more usual -1 simply because using - ** -1000000 as the incorrect index into db->aDb[] is much + ** We return -32768 instead of the more usual -1 simply because using + ** -32768 as the incorrect index into db->aDb[] is much ** more likely to cause a segfault than -1 (of course there are assert() - ** statements too, but it never hurts to play the odds). + ** statements too, but it never hurts to play the odds) and + ** -32768 will still fit into a 16-bit signed integer. */ assert( sqlite3_mutex_held(db->mutex) ); if( pSchema ){ From 47937cfd8defac2d926a863dabb3ec0232ca0eb5 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 26 May 2020 11:23:48 +0000 Subject: [PATCH 009/186] Increase the version number to 3.33.0 to begin the next release cycle. FossilOrigin-Name: 790badb390d59062cd2d8d1dec76cc6104c9425610a67503f6be38076b6a458e --- VERSION | 2 +- configure | 18 +++++++++--------- manifest | 15 +++++++-------- manifest.uuid | 2 +- 4 files changed, 18 insertions(+), 19 deletions(-) diff --git a/VERSION b/VERSION index 1367bf750d..949654dc3e 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.32.1 +3.33.0 diff --git a/configure b/configure index 854b2460a6..fb1d9cfaa8 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.32.1. +# Generated by GNU Autoconf 2.69 for sqlite 3.33.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.32.1' -PACKAGE_STRING='sqlite 3.32.1' +PACKAGE_VERSION='3.33.0' +PACKAGE_STRING='sqlite 3.33.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.32.1 to adapt to many kinds of systems. +\`configure' configures sqlite 3.33.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.32.1:";; + short | recursive ) echo "Configuration of sqlite 3.33.0:";; esac cat <<\_ACEOF @@ -1659,7 +1659,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -sqlite configure 3.32.1 +sqlite configure 3.33.0 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2078,7 +2078,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.32.1, which was +It was created by sqlite $as_me 3.33.0, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -12243,7 +12243,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.32.1, which was +This file was extended by sqlite $as_me 3.33.0, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -12309,7 +12309,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.32.1 +sqlite config.status 3.33.0 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/manifest b/manifest index aa56b2d7e2..2733dd6d6c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Changes\sto\ssqlite3SelectNew()\sto\swork\saround\sa\sfalse-positive\swarning\nfrom\sGCC-10.\s\sThe\scode\sis\svery\sslightly\slarger\sand\sslower\sas\sa\sresult. -D 2020-05-26T11:10:25.934 +C Increase\sthe\sversion\snumber\sto\s3.33.0\sto\sbegin\sthe\snext\srelease\scycle. +D 2020-05-26T11:23:48.742 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -7,7 +7,7 @@ F Makefile.in 376f53999defeb32b7ad2626fd58aae8f3694c38ab7ee30c2289e0d0525a9238 F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 F Makefile.msc 8d00aeba2609bb498dded5eead2890126321f02e292573bf29bf2d18487d37bd F README.md 1514a365ffca3c138e00c5cc839906108a01011a6b082bad19b09781e3aa498a -F VERSION 7d1da8465e06354a9ffb67a9ef3f933552767d8e239b507cb2a08ba417048322 +F VERSION 5db2ee2cfcc790af73775fa485c13b2e8ccaa5936c6e1f47aedeba7056041ca5 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 4705718305e176b707e65047b69dca834fe7bc5475584e30fe1f63c8e33751b8 x +F configure 5a2d453f527dcf969eecaac335d8261b3f1a8a6bd2c693a00dd7d18c29ccc7e4 x F configure.ac 798a24cee2879325ca5b688a618199eb32cc77ed8136edbaa43d9137b470d54e F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad F doc/F2FS.txt c1d4a0ae9711cfe0e1d8b019d154f1c29e0d3abfe820787ba1e9ed7691160fcd @@ -1866,8 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4ec8a5a203f10d228d0b3389120638766cc343179dbe38d5dbf69b650765934c d4bf60f464789935dc193ea99bf730c8fade448c7dca13eb3ce297965980f36e -R 4b76e75897c43803d6dbedd7b8f1a56e -T +closed d4bf60f464789935dc193ea99bf730c8fade448c7dca13eb3ce297965980f36e +P 04e1edd8e5821a377407263829ed0d87968c708c9aeb1282107ea6f39a11c1cc +R d32bbb281af1aa287830644a32a7b4c0 U drh -Z d313ebf5bd4e6feaaa94a16cfe06a420 +Z 05e8a4ff8d6715588483ef98172b1d7e diff --git a/manifest.uuid b/manifest.uuid index 51b60ae1bb..34217c129b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -04e1edd8e5821a377407263829ed0d87968c708c9aeb1282107ea6f39a11c1cc \ No newline at end of file +790badb390d59062cd2d8d1dec76cc6104c9425610a67503f6be38076b6a458e \ No newline at end of file From ed505ce3e47b971ced26b585506d0efa5efffc85 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 26 May 2020 20:31:17 +0000 Subject: [PATCH 010/186] Performance optimization in the transfer of error messages from statements to connections. FossilOrigin-Name: 0e898f4fed1c851cb90f940175110e632a20668a285d39f5f94f7358c3064882 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbeaux.c | 12 +++++++++--- 3 files changed, 16 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 2733dd6d6c..ea5d83cd5e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Increase\sthe\sversion\snumber\sto\s3.33.0\sto\sbegin\sthe\snext\srelease\scycle. -D 2020-05-26T11:23:48.742 +C Performance\soptimization\sin\sthe\stransfer\sof\serror\smessages\sfrom\sstatements\nto\sconnections. +D 2020-05-26T20:31:17.309 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -609,7 +609,7 @@ F src/vdbe.c e3dba0dee25bc92e871c13cac655260912b3be4abcc85b439259c9934b208da3 F src/vdbe.h 07b8c636a87df8b6e58f29d6badd7f10d5844353deff1d7c88ed1c2bfe3bbd35 F src/vdbeInt.h 571413068b5ac07e2ed8ca7a02fa529622fd5455ae6981498376e5e492d2e5ef F src/vdbeapi.c e467b75a710ea099f8d2d022abf601d2ccd05e28f63b44b12d93000b6a75f4a8 -F src/vdbeaux.c 80626786d21296d9e7936186850343afe5fc6368ad9724a172e151788425a063 +F src/vdbeaux.c 00746a04b3a1e917bab5e3846f0931820a5ded53cbe1648ba1ad57c0869c1ba3 F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 F src/vdbemem.c 39b942ecca179f4f30a32b54579a85d74ccaefa5af2a0ad2700abe5ef0768b22 F src/vdbesort.c 2be76d26998ce2b3324cdcc9f6443728e54b6c7677c553ad909c7d7cfab587df @@ -1866,7 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 04e1edd8e5821a377407263829ed0d87968c708c9aeb1282107ea6f39a11c1cc -R d32bbb281af1aa287830644a32a7b4c0 +P 790badb390d59062cd2d8d1dec76cc6104c9425610a67503f6be38076b6a458e +R abd22ed4e954a363c14f11187a7348c8 U drh -Z 05e8a4ff8d6715588483ef98172b1d7e +Z e7622c5a97ba4fe1a01d807db0ece61d diff --git a/manifest.uuid b/manifest.uuid index 34217c129b..ed41f32414 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -790badb390d59062cd2d8d1dec76cc6104c9425610a67503f6be38076b6a458e \ No newline at end of file +0e898f4fed1c851cb90f940175110e632a20668a285d39f5f94f7358c3064882 \ No newline at end of file diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 38dc7cd869..af4fa37894 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -3302,7 +3302,11 @@ int sqlite3VdbeReset(Vdbe *p){ */ if( p->pc>=0 ){ vdbeInvokeSqllog(p); - sqlite3VdbeTransferError(p); + if( db->pErr || p->zErrMsg ){ + sqlite3VdbeTransferError(p); + }else{ + db->errCode = p->rc; + } if( p->runOnlyOnce ) p->expired = 1; }else if( p->rc && p->expired ){ /* The expired flag was set on the VDBE before the first call @@ -3322,8 +3326,10 @@ int sqlite3VdbeReset(Vdbe *p){ for(i=0; inMem; i++) assert( p->aMem[i].flags==MEM_Undefined ); } #endif - sqlite3DbFree(db, p->zErrMsg); - p->zErrMsg = 0; + if( p->zErrMsg ){ + sqlite3DbFree(db, p->zErrMsg); + p->zErrMsg = 0; + } p->pResultSet = 0; #ifdef SQLITE_DEBUG p->nWrite = 0; From a3d6b8e5a78c5af92620f1d96001c046fa35d920 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 26 May 2020 20:33:18 +0000 Subject: [PATCH 011/186] Fix the cksumvfs extension so that it will not register itself more than once. FossilOrigin-Name: d5cdd57150db914b61b8b9c61c6caac9690fe7b647ee2c003e75b9b62be62752 --- ext/misc/cksumvfs.c | 2 +- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ext/misc/cksumvfs.c b/ext/misc/cksumvfs.c index 2cc8148b2e..80ace2ac8f 100644 --- a/ext/misc/cksumvfs.c +++ b/ext/misc/cksumvfs.c @@ -743,7 +743,7 @@ static int cksmRegisterFunc( static int cksmRegisterVfs(void){ int rc = SQLITE_OK; sqlite3_vfs *pOrig; - if( sqlite3_vfs_find("cksum")!=0 ) return SQLITE_OK; + if( sqlite3_vfs_find("cksmvfs")!=0 ) return SQLITE_OK; pOrig = sqlite3_vfs_find(0); cksm_vfs.iVersion = pOrig->iVersion; cksm_vfs.pAppData = pOrig; diff --git a/manifest b/manifest index ea5d83cd5e..ffe48d94fb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Performance\soptimization\sin\sthe\stransfer\sof\serror\smessages\sfrom\sstatements\nto\sconnections. -D 2020-05-26T20:31:17.309 +C Fix\sthe\scksumvfs\sextension\sso\sthat\sit\swill\snot\sregister\sitself\smore\sthan\nonce. +D 2020-05-26T20:33:18.026 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -285,7 +285,7 @@ F ext/misc/appendvfs.c 3777f22ec1057dc4e5fd89f2fbddcc7a29fbeef1ad038c736c54411bb F ext/misc/blobio.c a867c4c4617f6ec223a307ebfe0eabb45e0992f74dd47722b96f3e631c0edb2a F ext/misc/btreeinfo.c 26004b7a6be320ec08fc20ca8d0f01fccb00a98cbe0f3197446794ff2a506aa3 F ext/misc/carray.c 91e9a7f512fda934894bed30464552fffa7d3073b5be04189ae0bd0c59f26bfd -F ext/misc/cksumvfs.c b0d07f2e1bb08f8b6f311f4e454360b6a7f0021912c326428d74900020f29c31 +F ext/misc/cksumvfs.c a3271f5cc3f87d80897cca76d54220380aeae3448efd23fefe47853443ef1185 F ext/misc/closure.c dbfd8543b2a017ae6b1a5843986b22ddf99ff126ec9634a2f4047cd14c85c243 F ext/misc/completion.c a0efe03edfdc4f717c61e6c9b0bfe2708ff7878010dae3174980a68fdf76aabc F ext/misc/compress.c 3354c77a7c8e86e07d849916000cdac451ed96500bfb5bd83b20eb61eee012c9 @@ -1866,7 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 790badb390d59062cd2d8d1dec76cc6104c9425610a67503f6be38076b6a458e -R abd22ed4e954a363c14f11187a7348c8 +P 0e898f4fed1c851cb90f940175110e632a20668a285d39f5f94f7358c3064882 +R 72833d867a696e36a90b89db4d555cd5 U drh -Z e7622c5a97ba4fe1a01d807db0ece61d +Z 876d4518a5496ca7a456d49d64fbf19e diff --git a/manifest.uuid b/manifest.uuid index ed41f32414..e910202d57 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0e898f4fed1c851cb90f940175110e632a20668a285d39f5f94f7358c3064882 \ No newline at end of file +d5cdd57150db914b61b8b9c61c6caac9690fe7b647ee2c003e75b9b62be62752 \ No newline at end of file From 399062cccbb0d14ab16e175a565e2efc1b1d0c8f Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 27 May 2020 00:02:07 +0000 Subject: [PATCH 012/186] Change a datatype from i16 to int to appease Converity and help eliminate a false-positive. FossilOrigin-Name: 5b560ec49041d89c87ea3315d8fc17f7fb0e03a82091934be7373b290183f82e --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/expr.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index ffe48d94fb..031fcc6538 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\scksumvfs\sextension\sso\sthat\sit\swill\snot\sregister\sitself\smore\sthan\nonce. -D 2020-05-26T20:33:18.026 +C Change\sa\sdatatype\sfrom\si16\sto\sint\sto\sappease\sConverity\sand\shelp\seliminate\na\sfalse-positive. +D 2020-05-27T00:02:07.312 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -485,7 +485,7 @@ F src/date.c b29b349d277e3d579dcc295b24c0a2caed83fd8f090a9f7cbe6070c0fd662384 F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 793deaf88a0904f88285d93d6713c636d55ede0ffd9f08d10f4ea825531d367f F src/delete.c 88047c8e59878c920fce14582bc1dde4d81157d1ca5ffdf36c2907e6d41996c4 -F src/expr.c 7a388ddfac396635f38630429a2777fa36e9c1604e48114cb53be7316487a868 +F src/expr.c 4d5ca337ac207a15e647a1db2356d14282647afc8edca5ff577601048c88ceb4 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41 F src/func.c 2333eb4277f55a5efdc12ef754e7d7ec9105d257b2fd00301d23ce1e8fa67dc0 @@ -1866,7 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 0e898f4fed1c851cb90f940175110e632a20668a285d39f5f94f7358c3064882 -R 72833d867a696e36a90b89db4d555cd5 +P d5cdd57150db914b61b8b9c61c6caac9690fe7b647ee2c003e75b9b62be62752 +R e25f872a3296dd9d4a4620f30c7f47be U drh -Z 876d4518a5496ca7a456d49d64fbf19e +Z 7d2d03c71662193ff9282263dd7aee70 diff --git a/manifest.uuid b/manifest.uuid index e910202d57..1bb3e87e66 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d5cdd57150db914b61b8b9c61c6caac9690fe7b647ee2c003e75b9b62be62752 \ No newline at end of file +5b560ec49041d89c87ea3315d8fc17f7fb0e03a82091934be7373b290183f82e \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 69cd674efb..663c15e492 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2552,7 +2552,7 @@ int sqlite3FindInIndex( if( pParse->nErr==0 && (p = isCandidateForInOpt(pX))!=0 ){ sqlite3 *db = pParse->db; /* Database connection */ Table *pTab; /* Table
. */ - i16 iDb; /* Database idx for pTab */ + int iDb; /* Database idx for pTab */ ExprList *pEList = p->pEList; int nExpr = pEList->nExpr; From b639a2094a39d2e02acb4dbc912d9f3ebd988d09 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 27 May 2020 12:44:28 +0000 Subject: [PATCH 013/186] Small performance improvement and size reduction in the expression code generator. FossilOrigin-Name: eeb53e219551d8a05a87f1de9a7cd9af295d08a296f1f435a8509ea1252ccdcc --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/expr.c | 10 ++++------ 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 031fcc6538..b3792caebe 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\sa\sdatatype\sfrom\si16\sto\sint\sto\sappease\sConverity\sand\shelp\seliminate\na\sfalse-positive. -D 2020-05-27T00:02:07.312 +C Small\sperformance\simprovement\sand\ssize\sreduction\sin\sthe\sexpression\ncode\sgenerator. +D 2020-05-27T12:44:28.447 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -485,7 +485,7 @@ F src/date.c b29b349d277e3d579dcc295b24c0a2caed83fd8f090a9f7cbe6070c0fd662384 F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 793deaf88a0904f88285d93d6713c636d55ede0ffd9f08d10f4ea825531d367f F src/delete.c 88047c8e59878c920fce14582bc1dde4d81157d1ca5ffdf36c2907e6d41996c4 -F src/expr.c 4d5ca337ac207a15e647a1db2356d14282647afc8edca5ff577601048c88ceb4 +F src/expr.c 4750c6b63419eefb24c8a6158b9287dea2a9714b4e6e297e25805505c9f73b6c F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41 F src/func.c 2333eb4277f55a5efdc12ef754e7d7ec9105d257b2fd00301d23ce1e8fa67dc0 @@ -1866,7 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P d5cdd57150db914b61b8b9c61c6caac9690fe7b647ee2c003e75b9b62be62752 -R e25f872a3296dd9d4a4620f30c7f47be +P 5b560ec49041d89c87ea3315d8fc17f7fb0e03a82091934be7373b290183f82e +R 49a1e2497fcf7da09e39544b00e72660 U drh -Z 7d2d03c71662193ff9282263dd7aee70 +Z 247f47fe4deb86e087e29547910405d2 diff --git a/manifest.uuid b/manifest.uuid index 1bb3e87e66..4069128f8b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5b560ec49041d89c87ea3315d8fc17f7fb0e03a82091934be7373b290183f82e \ No newline at end of file +eeb53e219551d8a05a87f1de9a7cd9af295d08a296f1f435a8509ea1252ccdcc \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 663c15e492..496177a5c7 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3797,10 +3797,7 @@ int sqlite3ExprCodeTarget(Parse *pParse, Expr *pExpr, int target){ int p5 = 0; assert( target>0 && target<=pParse->nMem ); - if( v==0 ){ - assert( pParse->db->mallocFailed ); - return 0; - } + assert( v!=0 ); expr_code_doover: if( pExpr==0 ){ @@ -4630,9 +4627,10 @@ void sqlite3ExprCode(Parse *pParse, Expr *pExpr, int target){ assert( pExpr==0 || !ExprHasVVAProperty(pExpr,EP_Immutable) ); assert( target>0 && target<=pParse->nMem ); - inReg = sqlite3ExprCodeTarget(pParse, pExpr, target); assert( pParse->pVdbe!=0 || pParse->db->mallocFailed ); - if( inReg!=target && pParse->pVdbe ){ + if( pParse->pVdbe==0 ) return; + inReg = sqlite3ExprCodeTarget(pParse, pExpr, target); + if( inReg!=target ){ u8 op; if( ExprHasProperty(pExpr,EP_Subquery) ){ op = OP_Copy; From 56c65c92cb922039fe3edb4f624a79acdcc7a5c2 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 28 May 2020 00:45:16 +0000 Subject: [PATCH 014/186] When the sqlite_stat1 data is missing for some indexes of a table but is present for the table itself or for other indexes in the same table, then do not let the estimated number of rows in that table get too small, as doing so can deceive the query planner into ignoring a perfectly good index. FossilOrigin-Name: 98d4262018a81a9a36dd8beb4b02ff0e75cdcbb8a121d143157ffb37b228d60d --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/build.c | 24 ++++++++++++++++++------ test/cost.test | 4 ++-- test/index7.test | 12 ++++++++++++ 5 files changed, 41 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index b3792caebe..43afb8af6e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Small\sperformance\simprovement\sand\ssize\sreduction\sin\sthe\sexpression\ncode\sgenerator. -D 2020-05-27T12:44:28.447 +C When\sthe\ssqlite_stat1\sdata\sis\smissing\sfor\ssome\sindexes\sof\sa\stable\sbut\sis\npresent\sfor\sthe\stable\sitself\sor\sfor\sother\sindexes\sin\sthe\ssame\stable,\sthen\sdo\nnot\slet\sthe\sestimated\snumber\sof\srows\sin\sthat\stable\sget\stoo\ssmall,\sas\ndoing\sso\scan\sdeceive\sthe\squery\splanner\sinto\signoring\sa\sperfectly\sgood\sindex. +D 2020-05-28T00:45:16.053 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -477,7 +477,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c f14e415fcfd0b52b4e4ebd193ba5fadac5e8252c30f023389af682813af44025 F src/btree.h 989ef3c33413549e3e148f3dcb46c030f317dac130dc86809ba6b9aa4b16c72a F src/btreeInt.h 5c8b8749805787313ecf49eb5be3ced1e94bbf8ef54bb01470ce6bd0d5185c67 -F src/build.c ca9e7a33b74f1bf2eb3a5f37f9d07dfed335469f2d70c0bd350e0dd42a50183a +F src/build.c 1c3dec6d36ddc697dbc1df04100687cdbbed65aacfda067d1e9632e4102e9999 F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c e98518d2d3d4029a13c805e07313fb60c877be56db76e90dd5f3af73085d0ce6 @@ -782,7 +782,7 @@ F test/corruptJ.test 4d5ccc4bf959464229a836d60142831ef76a5aa4 F test/corruptK.test 5b4212fe346699831c5ad559a62c54e11c0611bdde1ea8423a091f9c01aa32af F test/corruptL.test 13ef74a93223af25015d223add0df4c2d375f0b958b546a2a72033f2fdab7a70 F test/corruptM.test 7d574320e08c1b36caa3e47262061f186367d593a7e305d35f15289cc2c3e067 -F test/cost.test 51f4fcaae6e78ad5a57096831259ed6c760e2ac6876836e91c00030fad385b34 +F test/cost.test 1d156ce9858780a966c062694687afe0343a0ed12d081d071fb57027e726bafc F test/count.test e0699a15712bc2a4679d60e408921c2cce7f6365a30340e790c98e0f334a9c77 F test/countofview.test e17d6e6688cf74f22783c9ec6e788c0790ee4fbbaee713affd00b1ac0bb39b86 F test/coveridxscan.test 5ec98719a2e2914e8908dc75f7247d9b54a26df04625f846ac7900d5483f7296 @@ -1067,7 +1067,7 @@ F test/index3.test 51685f39345462b84fcf77eb8537af847fdf438cc96b05c45d6aaca4e473a F test/index4.test ab92e736d5946840236cd61ac3191f91a7856bf6 F test/index5.test 8621491915800ec274609e42e02a97d67e9b13e7 F test/index6.test f172653b35b20233e59200e8b92a76db61bf7285437bf777b93b306ba26a47e7 -F test/index7.test 1d764c0cca45f5a76150b08e127ccc8d52492cfa788b5fafed4be784a351b020 +F test/index7.test b8a0ba2110fd517bb48c4e76d26d60f1ab2ed9e257b18d71f820d7e71e9f8570 F test/index8.test bc2e3db70e8e62459aaa1bd7e4a9b39664f8f9d7 F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7721 F test/indexedby.test a52c8c6abfae4fbfb51d99440de4ca1840dbacc606b05e29328a2a8ba7cd914e @@ -1866,7 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 5b560ec49041d89c87ea3315d8fc17f7fb0e03a82091934be7373b290183f82e -R 49a1e2497fcf7da09e39544b00e72660 +P eeb53e219551d8a05a87f1de9a7cd9af295d08a296f1f435a8509ea1252ccdcc +R 3d5c5e3daaf0dbc29f6c7d64057e20af U drh -Z 247f47fe4deb86e087e29547910405d2 +Z e68e2bba0e62e900331d67a29c0ab0bb diff --git a/manifest.uuid b/manifest.uuid index 4069128f8b..7248988b8e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -eeb53e219551d8a05a87f1de9a7cd9af295d08a296f1f435a8509ea1252ccdcc \ No newline at end of file +98d4262018a81a9a36dd8beb4b02ff0e75cdcbb8a121d143157ffb37b228d60d \ No newline at end of file diff --git a/src/build.c b/src/build.c index 6ff595c623..877db05084 100644 --- a/src/build.c +++ b/src/build.c @@ -4047,9 +4047,10 @@ exit_create_index: ** are based on typical values found in actual indices. */ void sqlite3DefaultRowEst(Index *pIdx){ - /* 10, 9, 8, 7, 6 */ - LogEst aVal[] = { 33, 32, 30, 28, 26 }; + /* 10, 9, 8, 7, 6 */ + static const LogEst aVal[] = { 33, 32, 30, 28, 26 }; LogEst *a = pIdx->aiRowLogEst; + LogEst x; int nCopy = MIN(ArraySize(aVal), pIdx->nKeyCol); int i; @@ -4058,10 +4059,21 @@ void sqlite3DefaultRowEst(Index *pIdx){ /* Set the first entry (number of rows in the index) to the estimated ** number of rows in the table, or half the number of rows in the table - ** for a partial index. But do not let the estimate drop below 10. */ - a[0] = pIdx->pTable->nRowLogEst; - if( pIdx->pPartIdxWhere!=0 ) a[0] -= 10; assert( 10==sqlite3LogEst(2) ); - if( a[0]<33 ) a[0] = 33; assert( 33==sqlite3LogEst(10) ); + ** for a partial index. + ** + ** 2020-05-27: If some of the stat data is coming from the sqlite_stat1 + ** table but other parts we are having to guess at, then do not let the + ** estimated number of rows in the table be less than 1000 (LogEst 99). + ** Failure to do this can cause the indexes for which we do not have + ** stat1 data to be ignored by the query planner. tag-20200527-1 + */ + x = pIdx->pTable->nRowLogEst; + assert( 99==sqlite3LogEst(1000) ); + if( x<99 ){ + pIdx->pTable->nRowLogEst = x = 99; + } + if( pIdx->pPartIdxWhere!=0 ) x -= 10; assert( 10==sqlite3LogEst(2) ); + a[0] = x; /* Estimate that a[1] is 10, a[2] is 9, a[3] is 8, a[4] is 7, a[5] is ** 6 and each subsequent value (if any) is 5. */ diff --git a/test/cost.test b/test/cost.test index 2922a0a054..592973ab56 100644 --- a/test/cost.test +++ b/test/cost.test @@ -230,10 +230,10 @@ do_test 9.2 { set L [list a=? b=? c=? d=? e=? f=? g=? h=? i=? j=?] foreach {tn nTerm nRow} { 1 1 10 - 2 2 9 + 2 2 10 3 3 8 4 4 7 - 5 5 6 + 5 5 7 6 6 5 7 7 5 8 8 5 diff --git a/test/index7.test b/test/index7.test index f57792e4c2..084e8c3c7d 100644 --- a/test/index7.test +++ b/test/index7.test @@ -339,5 +339,17 @@ do_execsql_test index7-7.1 { SELECT * FROM t6 WHERE y IS TRUE ORDER BY x; } {1 1} +# 2020-05-27. tag-20200527-1. +# Incomplete stat1 information on a table with few rows should still use the +# index. +reset_db +do_execsql_test index7-8.1 { + CREATE TABLE t1(x INTEGER PRIMARY KEY, y); + CREATE INDEX t1y ON t1(y) WHERE y IS NOT NULL; + INSERT INTO t1(x) VALUES(1),(2); + ANALYZE; + EXPLAIN QUERY PLAN SELECT 1 FROM t1 WHERE y=5; +} {/SEARCH TABLE t1 USING COVERING INDEX t1y/} + finish_test From c683573fd4530567b11f224fad7b209349d9e84e Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 28 May 2020 20:37:17 +0000 Subject: [PATCH 015/186] Enhance the ".quote" mode in the shell so that it honors .separator. FossilOrigin-Name: b5e33ed537e7d7dcabc9f6dc91d6838e0d1657f323440e09e2e24ffa2ba6141a --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 10 ++++++---- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 43afb8af6e..b57275c70f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sthe\ssqlite_stat1\sdata\sis\smissing\sfor\ssome\sindexes\sof\sa\stable\sbut\sis\npresent\sfor\sthe\stable\sitself\sor\sfor\sother\sindexes\sin\sthe\ssame\stable,\sthen\sdo\nnot\slet\sthe\sestimated\snumber\sof\srows\sin\sthat\stable\sget\stoo\ssmall,\sas\ndoing\sso\scan\sdeceive\sthe\squery\splanner\sinto\signoring\sa\sperfectly\sgood\sindex. -D 2020-05-28T00:45:16.053 +C Enhance\sthe\s".quote"\smode\sin\sthe\sshell\sso\sthat\sit\shonors\s.separator. +D 2020-05-28T20:37:17.793 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -534,7 +534,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 39a00a8bc89596dfb37c16afcbb1d33de5085b9963564b58aafe1566d08c0881 -F src/shell.c.in cf2d24f54412c06e5fb34af7fabc748651125e1dceac29b740e91f06d23447b6 +F src/shell.c.in 2bca5f1474b43e7c0c1bcd0537b854c2e8a0fac0de2bde473b8c1e919554dcc6 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 @@ -1866,7 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P eeb53e219551d8a05a87f1de9a7cd9af295d08a296f1f435a8509ea1252ccdcc -R 3d5c5e3daaf0dbc29f6c7d64057e20af +P 98d4262018a81a9a36dd8beb4b02ff0e75cdcbb8a121d143157ffb37b228d60d +R 6e7a8027469df73da3225b0c75827874 U drh -Z e68e2bba0e62e900331d67a29c0ab0bb +Z 824af62dceaa57c3d7f60896a599839b diff --git a/manifest.uuid b/manifest.uuid index 7248988b8e..6cbf3738cf 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -98d4262018a81a9a36dd8beb4b02ff0e75cdcbb8a121d143157ffb37b228d60d \ No newline at end of file +b5e33ed537e7d7dcabc9f6dc91d6838e0d1657f323440e09e2e24ffa2ba6141a \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 5858296420..9f960a745c 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -2205,14 +2205,14 @@ static int shell_callback( if( azArg==0 ) break; if( p->cnt==0 && p->showHeader ){ for(i=0; i0 ) raw_printf(p->out, ","); + if( i>0 ) fputs(p->colSeparator, p->out); output_quoted_string(p->out, azCol[i]); } - raw_printf(p->out,"\n"); + fputs(p->rowSeparator, p->out); } p->cnt++; for(i=0; i0 ) raw_printf(p->out, ","); + if( i>0 ) fputs(p->colSeparator, p->out); if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ utf8_printf(p->out,"NULL"); }else if( aiType && aiType[i]==SQLITE_TEXT ){ @@ -2234,7 +2234,7 @@ static int shell_callback( output_quoted_string(p->out, azArg[i]); } } - raw_printf(p->out,"\n"); + fputs(p->rowSeparator, p->out); break; } case MODE_Ascii: { @@ -8218,6 +8218,8 @@ static int do_meta_command(char *zLine, ShellState *p){ set_table_name(p, nArg>=3 ? azArg[2] : "table"); }else if( c2=='q' && strncmp(azArg[1],"quote",n2)==0 ){ p->mode = MODE_Quote; + sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Comma); + sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); }else if( c2=='a' && strncmp(azArg[1],"ascii",n2)==0 ){ p->mode = MODE_Ascii; sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit); From 30c54a01db1666c66b7c75d37cb2f287f1a2cd00 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 28 May 2020 23:49:50 +0000 Subject: [PATCH 016/186] Progress toward adding new output modes to the CLI: json, table, and markdown. FossilOrigin-Name: 14f55fafec11491e87e6526c72cf85c689d74ba18418a1ae9646586ec206767a --- manifest | 14 ++-- manifest.uuid | 2 +- src/shell.c.in | 197 +++++++++++++++++++++++++++++++++++++++++------ test/shell1.test | 12 +-- 4 files changed, 187 insertions(+), 38 deletions(-) diff --git a/manifest b/manifest index b57275c70f..68a02ab2e3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sthe\s".quote"\smode\sin\sthe\sshell\sso\sthat\sit\shonors\s.separator. -D 2020-05-28T20:37:17.793 +C Progress\stoward\sadding\snew\soutput\smodes\sto\sthe\sCLI:\s\sjson,\stable,\sand\nmarkdown. +D 2020-05-28T23:49:50.023 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -534,7 +534,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 39a00a8bc89596dfb37c16afcbb1d33de5085b9963564b58aafe1566d08c0881 -F src/shell.c.in 2bca5f1474b43e7c0c1bcd0537b854c2e8a0fac0de2bde473b8c1e919554dcc6 +F src/shell.c.in d135e500f2c84808f86e8113fd22852af4c89f69305f122d3c529cd698ccb396 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 @@ -1338,7 +1338,7 @@ F test/sharedA.test 49d87ec54ab640fbbc3786ee3c01de94aaa482a3a9f834ad3fe92770eb69 F test/sharedB.test 16cc7178e20965d75278f410943109b77b2e645e F test/shared_err.test 32634e404a3317eeb94abc7a099c556a346fdb8fb3858dbe222a4cbb8926a939 F test/sharedlock.test 5ede3c37439067c43b0198f580fd374ebf15d304 -F test/shell1.test 5bd10014ec494744f5e966a1521334e9d612119a0afcfa5251684a4e1f2ffc66 +F test/shell1.test 1c4713ccec468f9300100d5e1419b414b8dcccc742978ad8942e8bd31d2adc9c F test/shell2.test e242a9912f44f4c23c3d1d802a83e934e84c853b F test/shell3.test ac8c2b744014c3e9a0e26bfd829ab65f00923dc1a91ffd044863e9423cc91494 F test/shell4.test 1c6aef11daaa2d6830acaba3ac9cbec93fbc1c3d5530743a637f39b3987d08ce @@ -1866,7 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 98d4262018a81a9a36dd8beb4b02ff0e75cdcbb8a121d143157ffb37b228d60d -R 6e7a8027469df73da3225b0c75827874 +P b5e33ed537e7d7dcabc9f6dc91d6838e0d1657f323440e09e2e24ffa2ba6141a +R 65dafea1aa0e6dfee5aa69ebe4f5d82f U drh -Z 824af62dceaa57c3d7f60896a599839b +Z 8f810f781bfa2ede3701aac97fce45df diff --git a/manifest.uuid b/manifest.uuid index 6cbf3738cf..7d744d62ce 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b5e33ed537e7d7dcabc9f6dc91d6838e0d1657f323440e09e2e24ffa2ba6141a \ No newline at end of file +14f55fafec11491e87e6526c72cf85c689d74ba18418a1ae9646586ec206767a \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 9f960a745c..4795b832c5 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -1035,18 +1035,6 @@ struct OpenSession { }; #endif -/* -** Shell output mode information from before ".explain on", -** saved so that it can be restored by ".explain off" -*/ -typedef struct SavedModeInfo SavedModeInfo; -struct SavedModeInfo { - int valid; /* Is there legit data in here? */ - int mode; /* Mode prior to ".explain on" */ - int showHeader; /* The ".header" setting prior to ".explain on" */ - int colWidth[100]; /* Column widths prior to ".explain on" */ -}; - typedef struct ExpertInfo ExpertInfo; struct ExpertInfo { sqlite3expert *pExpert; @@ -1202,6 +1190,9 @@ struct ShellState { #define MODE_Ascii 10 /* Use ASCII unit and record separators (0x1F/0x1E) */ #define MODE_Pretty 11 /* Pretty-print schemas */ #define MODE_EQP 12 /* Converts EXPLAIN QUERY PLAN output into a graph */ +#define MODE_Json 13 /* Output JSON */ +#define MODE_Markdown 14 /* Markdown formatting */ +#define MODE_Table 15 /* MySQL-style table formatting */ static const char *modeDescr[] = { "line", @@ -1216,7 +1207,10 @@ static const char *modeDescr[] = { "explain", "ascii", "prettyprint", - "eqp" + "eqp", + "json", + "markdown", + "table" }; /* @@ -1893,6 +1887,43 @@ static int progress_handler(void *pClientData) { } #endif /* SQLITE_OMIT_PROGRESS_CALLBACK */ +/* +** Print N dashes +*/ +static void print_dashes(FILE *out, int N){ + const char zDash[] = "--------------------------------------------------"; + const int nDash = sizeof(zDash) - 1; + while( N>nDash ){ + fputs(zDash, out); + N -= nDash; + } + raw_printf(out, "%.*s", N, zDash); +} + +/* +** Print a markdown or table-style row separator +*/ +static void print_row_separator( + ShellState *p, + int nArg, + const char *zSep +){ + int i; + for(i=0; iactualWidth) ){ + w = p->actualWidth[i]; + if( w<0 ) w = -w; + }else{ + w = 10; + } + fputs(zSep, p->out); + print_dashes(p->out, w+2); + } + fputs(zSep, p->out); + fputs("\n", p->out); +} + /* ** This is the callback routine that the shell ** invokes for each row of a query result. @@ -1923,23 +1954,38 @@ static int shell_callback( } break; } + case MODE_Table: + case MODE_Markdown: case MODE_Explain: case MODE_Column: { static const int aExplainWidths[] = {4, 13, 4, 4, 4, 13, 2, 13}; const int *colWidth; int showHdr; char *rowSep; + char *colSep; + char *rowStart; int nWidth; if( p->cMode==MODE_Column ){ colWidth = p->colWidth; nWidth = ArraySize(p->colWidth); showHdr = p->showHeader; rowSep = p->rowSeparator; - }else{ + colSep = " "; + rowStart = ""; + }else if( p->cMode==MODE_Explain ){ colWidth = aExplainWidths; nWidth = ArraySize(aExplainWidths); showHdr = 1; rowSep = SEP_Row; + colSep = " "; + rowStart = ""; + }else{ + colWidth = p->colWidth; + nWidth = ArraySize(p->colWidth); + showHdr = p->showHeader; + rowSep = " |\n"; + colSep = " | "; + rowStart = "| "; } if( p->cnt++==0 ){ for(i=0; iactualWidth) ){ p->actualWidth[i] = w; } - if( showHdr ){ - utf8_width_print(p->out, w, azCol[i]); - utf8_printf(p->out, "%s", i==nArg-1 ? rowSep : " "); - } } if( showHdr ){ + if( p->cMode==MODE_Table ){ + print_row_separator(p, nArg, "+"); + } + fputs(rowStart, p->out); for(i=0; iactualWidth) ){ @@ -1972,14 +2018,34 @@ static int shell_callback( }else{ w = 10; } - utf8_printf(p->out,"%-*.*s%s",w,w, - "----------------------------------------------------------" - "----------------------------------------------------------", - i==nArg-1 ? rowSep : " "); + utf8_width_print(p->out, w, azCol[i]); + fputs(i==nArg-1 ? rowSep : colSep, p->out); + } + for(i=0; iactualWidth) ){ + w = p->actualWidth[i]; + if( w<0 ) w = -w; + }else{ + w = 10; + } + if( p->cMode==MODE_Table || p->cMode==MODE_Markdown ){ + char *zX = p->cMode==MODE_Markdown ? "|" : "+"; + fputs(zX, p->out); + print_dashes(p->out, w+2); + if( i==nArg-1 ){ + fputs(zX, p->out); + fputs("\n", p->out); + } + }else{ + print_dashes(p->out, w); + fputs(i==nArg-1 ? rowSep : colSep, p->out); + } } } } if( azArg==0 ) break; + fputs(rowStart, p->out); for(i=0; iactualWidth) ){ @@ -1997,7 +2063,7 @@ static int shell_callback( p->iIndent++; } utf8_width_print(p->out, w, azArg[i] ? azArg[i] : p->nullValue); - utf8_printf(p->out, "%s", i==nArg-1 ? rowSep : " "); + utf8_printf(p->out, "%s", i==nArg-1 ? rowSep : colSep); } break; } @@ -2201,6 +2267,50 @@ static int shell_callback( raw_printf(p->out,");\n"); break; } + case MODE_Json: { + if( azArg==0 ) break; + if( p->cnt==0 ){ + fputs("[{", p->out); + }else{ + fputs(",\n{", p->out); + } + p->cnt++; + for(i=0; iout, azCol[i]); + putc(':', p->out); + if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ + fputs("null",p->out); + }else if( aiType && aiType[i]==SQLITE_FLOAT ){ + char z[50]; + double r = sqlite3_column_double(p->pStmt, i); + sqlite3_uint64 ur; + memcpy(&ur,&r,sizeof(r)); + if( ur==0x7ff0000000000000LL ){ + raw_printf(p->out, "1e999"); + }else if( ur==0xfff0000000000000LL ){ + raw_printf(p->out, "-1e999"); + }else{ + sqlite3_snprintf(50,z,"%!.20g", r); + raw_printf(p->out, "%s", z); + } + }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){ + const void *pBlob = sqlite3_column_blob(p->pStmt, i); + int nBlob = sqlite3_column_bytes(p->pStmt, i); + putc('"', p->out); + output_hex_blob(p->out, pBlob, nBlob); + putc('"', p->out); + }else if( aiType && aiType[i]==SQLITE_TEXT ){ + output_c_string(p->out, azArg[i]); + }else{ + utf8_printf(p->out,"%s", azArg[i]); + } + if( iout); + } + } + putc('}', p->out); + break; + } case MODE_Quote: { if( azArg==0 ) break; if( p->cnt==0 && p->showHeader ){ @@ -2890,6 +3000,24 @@ static void bind_prepared_stmt(ShellState *pArg, sqlite3_stmt *pStmt){ sqlite3_finalize(pQ); } +#if 0 +/* +** Run a prepared statement and output the result in one of the +** table-oriented formats, either MODE_Markdown or MODE_Table. +** +** This is different from ordinary exec_prepared_stmt() in that +** it has to run the entire query and gather the results into memory +** first, in order to determine column widths, before providing +** any output. +*/ +static void exec_prepared_stmt_tablemode( + ShellState *pArg, /* Pointer to ShellState */ + sqlite3_stmt *pStmt /* Statment to run */ +){ + +} +#endif + /* ** Run a prepared statement */ @@ -2946,6 +3074,11 @@ static void exec_prepared_stmt( } } while( SQLITE_ROW == rc ); sqlite3_free(pData); + if( pArg->cMode==MODE_Table ){ + print_row_separator(pArg, nCol, "+"); + }else if( pArg->cMode==MODE_Json ){ + fputs("]\n", pArg->out); + } } } } @@ -8224,11 +8357,18 @@ static int do_meta_command(char *zLine, ShellState *p){ p->mode = MODE_Ascii; sqlite3_snprintf(sizeof(p->colSeparator), p->colSeparator, SEP_Unit); sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Record); + }else if( c2=='m' && strncmp(azArg[1],"markdown",n2)==0 ){ + p->mode = MODE_Markdown; + }else if( c2=='t' && strncmp(azArg[1],"table",n2)==0 ){ + p->mode = MODE_Table; + }else if( c2=='j' && strncmp(azArg[1],"json",n2)==0 ){ + p->mode = MODE_Json; }else if( nArg==1 ){ raw_printf(p->out, "current output mode: %s\n", modeDescr[p->mode]); }else{ raw_printf(stderr, "Error: mode should be one of: " - "ascii column csv html insert line list quote tabs tcl\n"); + "ascii column csv html insert json line list markdown " + "quote table tabs tcl\n"); rc = 1; } p->cMode = p->mode; @@ -10238,9 +10378,11 @@ static const char zOptions[] = " -help show this message\n" " -html set output mode to HTML\n" " -interactive force interactive I/O\n" + " -json set output mode to 'json'\n" " -line set output mode to 'line'\n" " -list set output mode to 'list'\n" " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n" + " -markdown set output mode to 'markdown'\n" #if defined(SQLITE_ENABLE_DESERIALIZE) " -maxsize N maximum size for a --deserialize database\n" #endif @@ -10260,6 +10402,7 @@ static const char zOptions[] = " -sorterref SIZE sorter references threshold size\n" #endif " -stats print memory stats before each finalize\n" + " -table set output mode to 'table'\n" " -version show SQLite version\n" " -vfs NAME use NAME as the default VFS\n" #ifdef SQLITE_ENABLE_VFSTRACE @@ -10661,6 +10804,12 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){ data.mode = MODE_Line; }else if( strcmp(z,"-column")==0 ){ data.mode = MODE_Column; + }else if( strcmp(z,"-json")==0 ){ + data.mode = MODE_Json; + }else if( strcmp(z,"-markdown")==0 ){ + data.mode = MODE_Markdown; + }else if( strcmp(z,"-table")==0 ){ + data.mode = MODE_Table; }else if( strcmp(z,"-csv")==0 ){ data.mode = MODE_Csv; memcpy(data.colSeparator,",",2); diff --git a/test/shell1.test b/test/shell1.test index c142ea7241..a900dc3e1d 100644 --- a/test/shell1.test +++ b/test/shell1.test @@ -199,10 +199,10 @@ do_test shell1-2.2.4 { } {0 {}} do_test shell1-2.2.5 { catchcmd "test.db" ".mode \"insert FOO" -} {1 {Error: mode should be one of: ascii column csv html insert line list quote tabs tcl}} +} {1 {Error: mode should be one of: ascii column csv html insert json line list markdown quote table tabs tcl}} do_test shell1-2.2.6 { catchcmd "test.db" ".mode \'insert FOO" -} {1 {Error: mode should be one of: ascii column csv html insert line list quote tabs tcl}} +} {1 {Error: mode should be one of: ascii column csv html insert json line list markdown quote table tabs tcl}} # check multiple tokens, and quoted tokens do_test shell1-2.3.1 { @@ -230,7 +230,7 @@ do_test shell1-2.3.7 { # check quoted args are unquoted do_test shell1-2.4.1 { catchcmd "test.db" ".mode FOO" -} {1 {Error: mode should be one of: ascii column csv html insert line list quote tabs tcl}} +} {1 {Error: mode should be one of: ascii column csv html insert json line list markdown quote table tabs tcl}} do_test shell1-2.4.2 { catchcmd "test.db" ".mode csv" } {0 {}} @@ -430,7 +430,7 @@ do_test shell1-3.13.1 { } {0 {current output mode: list}} do_test shell1-3.13.2 { catchcmd "test.db" ".mode FOO" -} {1 {Error: mode should be one of: ascii column csv html insert line list quote tabs tcl}} +} {1 {Error: mode should be one of: ascii column csv html insert json line list markdown quote table tabs tcl}} do_test shell1-3.13.3 { catchcmd "test.db" ".mode csv" } {0 {}} @@ -463,10 +463,10 @@ do_test shell1-3.13.11 { # don't allow partial mode type matches do_test shell1-3.13.12 { catchcmd "test.db" ".mode l" -} {1 {Error: mode should be one of: ascii column csv html insert line list quote tabs tcl}} +} {1 {Error: mode should be one of: ascii column csv html insert json line list markdown quote table tabs tcl}} do_test shell1-3.13.13 { catchcmd "test.db" ".mode li" -} {1 {Error: mode should be one of: ascii column csv html insert line list quote tabs tcl}} +} {1 {Error: mode should be one of: ascii column csv html insert json line list markdown quote table tabs tcl}} do_test shell1-3.13.14 { catchcmd "test.db" ".mode lin" } {0 {}} From 69c093da9830731a8399e7c0b6f2f870a0524136 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 29 May 2020 00:21:43 +0000 Subject: [PATCH 017/186] In the json output mode of the CLI, do correct quoting of escape characters. Also, show BLOBs as JSON strings, possibly with embedded \u0000 bytes. FossilOrigin-Name: 0278147a7d2b50bed9f59ed3d3a04ecc6d46f072eb510e463f6707df1d829020 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 42 +++++++++++++++++++++++++++++++++++++----- 3 files changed, 44 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 68a02ab2e3..bfb7f0bc9c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Progress\stoward\sadding\snew\soutput\smodes\sto\sthe\sCLI:\s\sjson,\stable,\sand\nmarkdown. -D 2020-05-28T23:49:50.023 +C In\sthe\sjson\soutput\smode\sof\sthe\sCLI,\sdo\scorrect\squoting\sof\sescape\scharacters.\nAlso,\sshow\sBLOBs\sas\sJSON\sstrings,\spossibly\swith\sembedded\s\\u0000\sbytes. +D 2020-05-29T00:21:43.757 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -534,7 +534,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 39a00a8bc89596dfb37c16afcbb1d33de5085b9963564b58aafe1566d08c0881 -F src/shell.c.in d135e500f2c84808f86e8113fd22852af4c89f69305f122d3c529cd698ccb396 +F src/shell.c.in f545fcc628411490e986e9f4fb9418f1eb25c85fd349924e852f7aac5da4fd0b F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 @@ -1866,7 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b5e33ed537e7d7dcabc9f6dc91d6838e0d1657f323440e09e2e24ffa2ba6141a -R 65dafea1aa0e6dfee5aa69ebe4f5d82f +P 14f55fafec11491e87e6526c72cf85c689d74ba18418a1ae9646586ec206767a +R 8c9c292833e7d437405039fbac69b62c U drh -Z 8f810f781bfa2ede3701aac97fce45df +Z 9c1cf56bec8bac52da07f5875b8a7be2 diff --git a/manifest.uuid b/manifest.uuid index 7d744d62ce..c5d0dc1504 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -14f55fafec11491e87e6526c72cf85c689d74ba18418a1ae9646586ec206767a \ No newline at end of file +0278147a7d2b50bed9f59ed3d3a04ecc6d46f072eb510e463f6707df1d829020 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 4795b832c5..891dfd641b 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -1578,6 +1578,40 @@ static void output_c_string(FILE *out, const char *z){ fputc('"', out); } +/* +** Output the given string as a quoted according to JSON quoting rules. +*/ +static void output_json_string(FILE *out, const char *z, int n){ + unsigned int c; + if( n<0 ) n = (int)strlen(z); + fputc('"', out); + while( n-- ){ + c = *(z++); + if( c=='\\' || c=='"' ){ + fputc('\\', out); + fputc(c, out); + }else if( c<=0x1f ){ + fputc('\\', out); + if( c=='\b' ){ + fputc('b', out); + }else if( c=='\f' ){ + fputc('f', out); + }else if( c=='\n' ){ + fputc('n', out); + }else if( c=='\r' ){ + fputc('r', out); + }else if( c=='\t' ){ + fputc('t', out); + }else{ + raw_printf(out, "u%04x",c); + } + }else{ + fputc(c, out); + } + } + fputc('"', out); +} + /* ** Output the given string with characters that are special to ** HTML escaped. @@ -2276,7 +2310,7 @@ static int shell_callback( } p->cnt++; for(i=0; iout, azCol[i]); + output_json_string(p->out, azCol[i], -1); putc(':', p->out); if( (azArg[i]==0) || (aiType && aiType[i]==SQLITE_NULL) ){ fputs("null",p->out); @@ -2296,11 +2330,9 @@ static int shell_callback( }else if( aiType && aiType[i]==SQLITE_BLOB && p->pStmt ){ const void *pBlob = sqlite3_column_blob(p->pStmt, i); int nBlob = sqlite3_column_bytes(p->pStmt, i); - putc('"', p->out); - output_hex_blob(p->out, pBlob, nBlob); - putc('"', p->out); + output_json_string(p->out, pBlob, nBlob); }else if( aiType && aiType[i]==SQLITE_TEXT ){ - output_c_string(p->out, azArg[i]); + output_json_string(p->out, azArg[i], -1); }else{ utf8_printf(p->out,"%s", azArg[i]); } From d31fcd4751745b1fe2e263cd31792debb2e21b52 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 29 May 2020 11:07:20 +0000 Subject: [PATCH 018/186] Expand upon a comment in os_unix.c. No changes to code. FossilOrigin-Name: 77933dc4dbe0e0af3b13a14293a8bd684edc5056f4ae9291c6f95d4433bf90ce --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/os_unix.c | 5 ++++- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index bfb7f0bc9c..0dafd7b725 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sthe\sjson\soutput\smode\sof\sthe\sCLI,\sdo\scorrect\squoting\sof\sescape\scharacters.\nAlso,\sshow\sBLOBs\sas\sJSON\sstrings,\spossibly\swith\sembedded\s\\u0000\sbytes. -D 2020-05-29T00:21:43.757 +C Expand\supon\sa\scomment\sin\sos_unix.c.\sNo\schanges\sto\scode. +D 2020-05-29T11:07:20.452 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -517,7 +517,7 @@ F src/os.c 669cc3839cc35d20f81faf0be1ab6d4581cea35e9d8f3a9d48a98d6571f7c285 F src/os.h 48388821692e87da174ea198bf96b1b2d9d83be5dfc908f673ee21fafbe0d432 F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 -F src/os_unix.c 13f983da988b6460ef3c4c22099c67ab0938291e543644ac4d99eccc8ba604f1 +F src/os_unix.c 03bad4eb1e13946cb967f3a6cc0a0d350df8ea4b8d2212d528024a5f9abc90ea F src/os_win.c e832e21e830c1f9409c9c54053939b6dcb14c1e92128b756204ce1e3e331d678 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 96436cb1920074d4ade120a1a8a9d0ae3f52df06651e21b7eccc5eae2f02b111 @@ -1866,7 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 14f55fafec11491e87e6526c72cf85c689d74ba18418a1ae9646586ec206767a -R 8c9c292833e7d437405039fbac69b62c -U drh -Z 9c1cf56bec8bac52da07f5875b8a7be2 +P 0278147a7d2b50bed9f59ed3d3a04ecc6d46f072eb510e463f6707df1d829020 +R 6168b01ac7944b1dec923e20df70ebab +U dan +Z 464f9a3c62e750102957cbf88d682eca diff --git a/manifest.uuid b/manifest.uuid index c5d0dc1504..87125d956b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0278147a7d2b50bed9f59ed3d3a04ecc6d46f072eb510e463f6707df1d829020 \ No newline at end of file +77933dc4dbe0e0af3b13a14293a8bd684edc5056f4ae9291c6f95d4433bf90ce \ No newline at end of file diff --git a/src/os_unix.c b/src/os_unix.c index d510711087..a72f0629fe 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -4836,7 +4836,10 @@ static int unixShmLock( ** ** In other words, if this is a blocking lock, none of the locks that ** occur later in the above list than the lock being obtained may be - ** held. */ + ** held. + ** + ** It is not permitted to block on the RECOVER lock. + */ #ifdef SQLITE_ENABLE_SETLK_TIMEOUT assert( (flags & SQLITE_SHM_UNLOCK) || pDbFd->iBusyTimeout==0 || ( (ofst!=2) /* not RECOVER */ From d6f252490e126360ddbd0185f450773679ae9efa Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 29 May 2020 12:31:53 +0000 Subject: [PATCH 019/186] Incremental improvements to tabular output modes in the CLI. The "markdown" and "table" modes no have headers turned on by default. FossilOrigin-Name: af28bff91ad7e2d69db0052323c9c05c75a41d4134974bd1305f1c4f579d3558 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c.in | 51 +++++++++++++++++++++++++++++--------------------- 3 files changed, 38 insertions(+), 29 deletions(-) diff --git a/manifest b/manifest index 0dafd7b725..4061939f7d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Expand\supon\sa\scomment\sin\sos_unix.c.\sNo\schanges\sto\scode. -D 2020-05-29T11:07:20.452 +C Incremental\simprovements\sto\stabular\soutput\smodes\sin\sthe\sCLI.\s\sThe\n"markdown"\sand\s"table"\smodes\sno\shave\sheaders\sturned\son\sby\sdefault. +D 2020-05-29T12:31:53.495 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -534,7 +534,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 39a00a8bc89596dfb37c16afcbb1d33de5085b9963564b58aafe1566d08c0881 -F src/shell.c.in f545fcc628411490e986e9f4fb9418f1eb25c85fd349924e852f7aac5da4fd0b +F src/shell.c.in 17fff6834b839d684371a436f6c863dfbb8cb82ea8e4210b6090d9e8a6829dc3 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 @@ -1866,7 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 0278147a7d2b50bed9f59ed3d3a04ecc6d46f072eb510e463f6707df1d829020 -R 6168b01ac7944b1dec923e20df70ebab -U dan -Z 464f9a3c62e750102957cbf88d682eca +P 77933dc4dbe0e0af3b13a14293a8bd684edc5056f4ae9291c6f95d4433bf90ce +R dbd1cec93fc87562979dbfde2067c782 +U drh +Z 42d147ea1b5d379198ee1e0c91039dc7 diff --git a/manifest.uuid b/manifest.uuid index 87125d956b..50bd455119 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -77933dc4dbe0e0af3b13a14293a8bd684edc5056f4ae9291c6f95d4433bf90ce \ No newline at end of file +af28bff91ad7e2d69db0052323c9c05c75a41d4134974bd1305f1c4f579d3558 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 891dfd641b..517a09fc80 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -1967,7 +1967,7 @@ static int shell_callback( int nArg, /* Number of result columns */ char **azArg, /* Text of each result column */ char **azCol, /* Column names */ - int *aiType /* Column types */ + int *aiType /* Column types. Might be NULL */ ){ int i; ShellState *p = (ShellState*)pArg; @@ -1992,36 +1992,43 @@ static int shell_callback( case MODE_Markdown: case MODE_Explain: case MODE_Column: { - static const int aExplainWidths[] = {4, 13, 4, 4, 4, 13, 2, 13}; - const int *colWidth; int showHdr; char *rowSep; char *colSep; char *rowStart; - int nWidth; if( p->cMode==MODE_Column ){ - colWidth = p->colWidth; - nWidth = ArraySize(p->colWidth); showHdr = p->showHeader; rowSep = p->rowSeparator; colSep = " "; rowStart = ""; }else if( p->cMode==MODE_Explain ){ - colWidth = aExplainWidths; - nWidth = ArraySize(aExplainWidths); showHdr = 1; rowSep = SEP_Row; colSep = " "; rowStart = ""; }else{ - colWidth = p->colWidth; - nWidth = ArraySize(p->colWidth); - showHdr = p->showHeader; + showHdr = 1; rowSep = " |\n"; colSep = " | "; rowStart = "| "; } + if( p->cnt++==0 ){ + /* Compute column widths in p->actualWidth[] when the first row + ** is seen. The width of each column is either the defined + ** width in p->colWidth[], or if p->colWidth[i]==0, then the + ** width is the larger of the width of the first row and the + ** column name. */ + static const int aExplainWidths[] = {4, 13, 4, 4, 4, 13, 2, 13}; + const int *colWidth; + int nWidth; + if( p->cMode==MODE_Explain ){ + colWidth = aExplainWidths; + nWidth = ArraySize(aExplainWidths); + }else{ + colWidth = p->colWidth; + nWidth = ArraySize(p->colWidth); + } for(i=0; iactualWidth[i] = w; } } + if( p->cMode==MODE_Table ){ + print_row_separator(p, nArg, "+"); + } if( showHdr ){ - if( p->cMode==MODE_Table ){ - print_row_separator(p, nArg, "+"); - } fputs(rowStart, p->out); for(i=0; icMode==MODE_Explain && azArg[i] && strlenChar(azArg[i])>w ){ - w = strlenChar(azArg[i]); - } - if( i==1 && p->aiIndent && p->pStmt ){ - if( p->iIndentnIndent ){ - utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], ""); + if( p->cMode==MODE_Explain ){ + if( azArg[i] && strlenChar(azArg[i])>w ){ + w = strlenChar(azArg[i]); + } + if( i==1 && p->aiIndent && p->pStmt ){ + if( p->iIndentnIndent ){ + utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], ""); + } + p->iIndent++; } - p->iIndent++; } utf8_width_print(p->out, w, azArg[i] ? azArg[i] : p->nullValue); utf8_printf(p->out, "%s", i==nArg-1 ? rowSep : colSep); From 0285d98de74baa44617ca67694385fbfd21127c9 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 29 May 2020 14:38:43 +0000 Subject: [PATCH 020/186] Space to hold the ".width" of columns in the CLI is now obtained from malloc() and hence is not limited in the number of columns supported. FossilOrigin-Name: 445ed5dab2c26e9f4a7fb5277abdba3359d23cf5318cfd0d8322162d9616ee7a --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 16 +++++++++++----- 3 files changed, 18 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 4061939f7d..edf9e43a80 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Incremental\simprovements\sto\stabular\soutput\smodes\sin\sthe\sCLI.\s\sThe\n"markdown"\sand\s"table"\smodes\sno\shave\sheaders\sturned\son\sby\sdefault. -D 2020-05-29T12:31:53.495 +C Space\sto\shold\sthe\s".width"\sof\scolumns\sin\sthe\sCLI\sis\snow\sobtained\sfrom\nmalloc()\sand\shence\sis\snot\slimited\sin\sthe\snumber\sof\scolumns\ssupported. +D 2020-05-29T14:38:43.840 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -534,7 +534,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 39a00a8bc89596dfb37c16afcbb1d33de5085b9963564b58aafe1566d08c0881 -F src/shell.c.in 17fff6834b839d684371a436f6c863dfbb8cb82ea8e4210b6090d9e8a6829dc3 +F src/shell.c.in 77530a909ab0e8e44c7797993b0f3143e95226380bc5f311158ad3e3209abf28 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 @@ -1866,7 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 77933dc4dbe0e0af3b13a14293a8bd684edc5056f4ae9291c6f95d4433bf90ce -R dbd1cec93fc87562979dbfde2067c782 +P af28bff91ad7e2d69db0052323c9c05c75a41d4134974bd1305f1c4f579d3558 +R 7199cbe7bb1c2e7279bcd8d792b04d19 U drh -Z 42d147ea1b5d379198ee1e0c91039dc7 +Z e4dd532cb0e0bd045df8215b6bacef2f diff --git a/manifest.uuid b/manifest.uuid index 50bd455119..589b69c5fc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -af28bff91ad7e2d69db0052323c9c05c75a41d4134974bd1305f1c4f579d3558 \ No newline at end of file +445ed5dab2c26e9f4a7fb5277abdba3359d23cf5318cfd0d8322162d9616ee7a \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 517a09fc80..299670755d 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -1104,8 +1104,9 @@ struct ShellState { char rowSeparator[20]; /* Row separator character for MODE_Ascii */ char colSepPrior[20]; /* Saved column separator */ char rowSepPrior[20]; /* Saved row separator */ - int colWidth[100]; /* Requested width of each column when in column mode*/ - int actualWidth[100]; /* Actual width of each column */ + int *colWidth; /* Requested width of each column in columnar modes */ + int *actualWidth; /* Actual width of each column */ + int nWidth; /* Number of slots in colWidth[] and actualWidth[] */ char nullValue[20]; /* The text to print when a NULL comes back from ** the database */ char outfile[FILENAME_MAX]; /* Filename for *out */ @@ -2027,7 +2028,7 @@ static int shell_callback( nWidth = ArraySize(aExplainWidths); }else{ colWidth = p->colWidth; - nWidth = ArraySize(p->colWidth); + nWidth = p->nWidth; } for(i=0; iout, "\n"); utf8_printf(p->out, "%12.12s: %s\n","stats", azBool[p->statsOn!=0]); utf8_printf(p->out, "%12.12s: ", "width"); - for (i=0;i<(int)ArraySize(p->colWidth) && p->colWidth[i] != 0;i++) { + for (i=0;inWidth;i++) { raw_printf(p->out, "%d ", p->colWidth[i]); } raw_printf(p->out, "\n"); @@ -10059,7 +10060,11 @@ static int do_meta_command(char *zLine, ShellState *p){ if( c=='w' && strncmp(azArg[0], "width", n)==0 ){ int j; assert( nArg<=ArraySize(azArg) ); - for(j=1; jcolWidth); j++){ + p->nWidth = nArg-1; + p->colWidth = realloc(p->colWidth, p->nWidth*sizeof(int)*2); + if( p->colWidth==0 && p->nWidth>0 ) shell_out_of_memory(); + if( p->nWidth ) p->actualWidth = &p->colWidth[p->nWidth]; + for(j=1; jcolWidth[j-1] = (int)integerValue(azArg[j]); } }else @@ -11068,6 +11073,7 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){ for(i=0; i Date: Fri, 29 May 2020 16:15:58 +0000 Subject: [PATCH 021/186] Improvements to columnar output in the CLI. Columns automatically expand to contain the largest row. FossilOrigin-Name: 4e1db8e9a9ee370a398f13fd8546a520111b8cfb84460389535b5bc5bd9f4f82 --- manifest | 12 +-- manifest.uuid | 2 +- src/shell.c.in | 234 +++++++++++++++++++++++-------------------------- 3 files changed, 119 insertions(+), 129 deletions(-) diff --git a/manifest b/manifest index edf9e43a80..d4109e2ff9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Space\sto\shold\sthe\s".width"\sof\scolumns\sin\sthe\sCLI\sis\snow\sobtained\sfrom\nmalloc()\sand\shence\sis\snot\slimited\sin\sthe\snumber\sof\scolumns\ssupported. -D 2020-05-29T14:38:43.840 +C Improvements\sto\scolumnar\soutput\sin\sthe\sCLI.\s\sColumns\sautomatically\sexpand\nto\scontain\sthe\slargest\srow. +D 2020-05-29T16:15:58.318 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -534,7 +534,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 39a00a8bc89596dfb37c16afcbb1d33de5085b9963564b58aafe1566d08c0881 -F src/shell.c.in 77530a909ab0e8e44c7797993b0f3143e95226380bc5f311158ad3e3209abf28 +F src/shell.c.in 9675df5f6be969309421509eef9c49a20179e5c4df8770f2d62edd41a9dee339 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 @@ -1866,7 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P af28bff91ad7e2d69db0052323c9c05c75a41d4134974bd1305f1c4f579d3558 -R 7199cbe7bb1c2e7279bcd8d792b04d19 +P 445ed5dab2c26e9f4a7fb5277abdba3359d23cf5318cfd0d8322162d9616ee7a +R 5cd70920783d10744759d8e97b9aed09 U drh -Z e4dd532cb0e0bd045df8215b6bacef2f +Z 0a5f6eacc5288734a9f57cf18ebe2785 diff --git a/manifest.uuid b/manifest.uuid index 589b69c5fc..cbe0de7cd3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -445ed5dab2c26e9f4a7fb5277abdba3359d23cf5318cfd0d8322162d9616ee7a \ No newline at end of file +4e1db8e9a9ee370a398f13fd8546a520111b8cfb84460389535b5bc5bd9f4f82 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 299670755d..e4883c1474 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -1945,15 +1945,8 @@ static void print_row_separator( ){ int i; for(i=0; iactualWidth) ){ - w = p->actualWidth[i]; - if( w<0 ) w = -w; - }else{ - w = 10; - } fputs(zSep, p->out); - print_dashes(p->out, w+2); + print_dashes(p->out, p->actualWidth[i]+2); } fputs(zSep, p->out); fputs("\n", p->out); @@ -1989,125 +1982,32 @@ static int shell_callback( } break; } - case MODE_Table: - case MODE_Markdown: - case MODE_Explain: - case MODE_Column: { - int showHdr; - char *rowSep; - char *colSep; - char *rowStart; - if( p->cMode==MODE_Column ){ - showHdr = p->showHeader; - rowSep = p->rowSeparator; - colSep = " "; - rowStart = ""; - }else if( p->cMode==MODE_Explain ){ - showHdr = 1; - rowSep = SEP_Row; - colSep = " "; - rowStart = ""; - }else{ - showHdr = 1; - rowSep = " |\n"; - colSep = " | "; - rowStart = "| "; + case MODE_Explain: { + static const int aExplainWidth[] = {4, 13, 4, 4, 4, 13, 2, 13}; + if( nArg>ArraySize(aExplainWidth) ){ + nArg = ArraySize(aExplainWidth); } - if( p->cnt++==0 ){ - /* Compute column widths in p->actualWidth[] when the first row - ** is seen. The width of each column is either the defined - ** width in p->colWidth[], or if p->colWidth[i]==0, then the - ** width is the larger of the width of the first row and the - ** column name. */ - static const int aExplainWidths[] = {4, 13, 4, 4, 4, 13, 2, 13}; - const int *colWidth; - int nWidth; - if( p->cMode==MODE_Explain ){ - colWidth = aExplainWidths; - nWidth = ArraySize(aExplainWidths); - }else{ - colWidth = p->colWidth; - nWidth = p->nWidth; - } for(i=0; inullValue); - if( wactualWidth) ){ - p->actualWidth[i] = w; - } - } - if( p->cMode==MODE_Table ){ - print_row_separator(p, nArg, "+"); - } - if( showHdr ){ - fputs(rowStart, p->out); - for(i=0; iactualWidth) ){ - w = p->actualWidth[i]; - if( w<0 ) w = -w; - }else{ - w = 10; - } - utf8_width_print(p->out, w, azCol[i]); - fputs(i==nArg-1 ? rowSep : colSep, p->out); - } - for(i=0; iactualWidth) ){ - w = p->actualWidth[i]; - if( w<0 ) w = -w; - }else{ - w = 10; - } - if( p->cMode==MODE_Table || p->cMode==MODE_Markdown ){ - char *zX = p->cMode==MODE_Markdown ? "|" : "+"; - fputs(zX, p->out); - print_dashes(p->out, w+2); - if( i==nArg-1 ){ - fputs(zX, p->out); - fputs("\n", p->out); - } - }else{ - print_dashes(p->out, w); - fputs(i==nArg-1 ? rowSep : colSep, p->out); - } - } + int w = aExplainWidth[i]; + utf8_width_print(p->out, w, azCol[i]); + fputs(i==nArg-1 ? "\n" : " ", p->out); } } if( azArg==0 ) break; - fputs(rowStart, p->out); for(i=0; iactualWidth) ){ - w = p->actualWidth[i]; - }else{ - w = 10; + int w = aExplainWidth[i]; + if( azArg[i] && strlenChar(azArg[i])>w ){ + w = strlenChar(azArg[i]); } - if( p->cMode==MODE_Explain ){ - if( azArg[i] && strlenChar(azArg[i])>w ){ - w = strlenChar(azArg[i]); - } - if( i==1 && p->aiIndent && p->pStmt ){ - if( p->iIndentnIndent ){ - utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], ""); - } - p->iIndent++; + if( i==1 && p->aiIndent && p->pStmt ){ + if( p->iIndentnIndent ){ + utf8_printf(p->out, "%*.s", p->aiIndent[p->iIndent], ""); } + p->iIndent++; } utf8_width_print(p->out, w, azArg[i] ? azArg[i] : p->nullValue); - utf8_printf(p->out, "%s", i==nArg-1 ? rowSep : colSep); + fputs(i==nArg-1 ? "\n" : " ", p->out); } break; } @@ -3042,23 +2942,105 @@ static void bind_prepared_stmt(ShellState *pArg, sqlite3_stmt *pStmt){ sqlite3_finalize(pQ); } -#if 0 /* ** Run a prepared statement and output the result in one of the -** table-oriented formats, either MODE_Markdown or MODE_Table. +** table-oriented formats: MODE_Column, MODE_Markdown, or MODE_Table. ** ** This is different from ordinary exec_prepared_stmt() in that ** it has to run the entire query and gather the results into memory ** first, in order to determine column widths, before providing ** any output. */ -static void exec_prepared_stmt_tablemode( - ShellState *pArg, /* Pointer to ShellState */ - sqlite3_stmt *pStmt /* Statment to run */ +static void exec_prepared_stmt_columnar( + ShellState *p, /* Pointer to ShellState */ + sqlite3_stmt *pStmt /* Statment to run */ ){ + int nRow = 0; + int nColumn = 0; + char **azData = 0; + char *zMsg = 0; + const char *z; + int rc; + int i, j, nTotal, w, n; + const char *colSep; + const char *rowSep; + rc = sqlite3_get_table(p->db, sqlite3_sql(pStmt), + &azData, &nRow, &nColumn, &zMsg); + if( rc ){ + utf8_printf(p->out, "ERROR: %s\n", zMsg); + sqlite3_free(zMsg); + sqlite3_free_table(azData); + return; + } + if( nColumn>p->nWidth ){ + p->colWidth = realloc(p->colWidth, nColumn*2*sizeof(int)); + if( p->colWidth==0 ) shell_out_of_memory(); + for(i=p->nWidth; icolWidth[i] = 0; + p->nWidth = nColumn; + p->actualWidth = &p->colWidth[nColumn]; + } + memset(p->actualWidth, 0, nColumn*sizeof(int)); + for(i=0; icolWidth[i]; + if( w<0 ) w = -w; + p->actualWidth[i] = w; + } + nTotal = nColumn*(nRow+1); + for(i=0; inullValue; + n = strlenChar(z); + j = i%nColumn; + if( n>p->actualWidth[j] ) p->actualWidth[j] = n; + } + if( p->cMode==MODE_Column ){ + colSep = " "; + rowSep = "\n"; + if( p->showHeader ){ + for(i=0; iactualWidth[i]; + if( p->colWidth[i]<0 ) w = -w; + utf8_width_print(p->out, w, azData[i]); + fputs(i==nColumn-1?"\n":" ", p->out); + } + for(i=0; iout, p->actualWidth[i]); + fputs(i==nColumn-1?"\n":" ", p->out); + } + } + }else{ + colSep = " | "; + rowSep = " |\n"; + if( p->cMode==MODE_Table ) print_row_separator(p, nColumn, "+"); + fputs("| ", p->out); + for(i=0; iactualWidth[i]; + n = strlenChar(azData[i]); + utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, ""); + fputs(i==nColumn-1?" |\n":" | ", p->out); + } + print_row_separator(p, nColumn, p->cMode==MODE_Table ? "+" : "|"); + } + for(i=nColumn, j=0; icMode!=MODE_Column ) fputs("| ", p->out); + z = azData[i]; + if( z==0 ) z = p->nullValue; + w = p->actualWidth[j]; + if( p->colWidth[j]<0 ) w = -w; + utf8_width_print(p->out, w, z); + if( j==nColumn-1 ){ + fputs(rowSep, p->out); + j = -1; + }else{ + fputs(colSep, p->out); + } + } + if( p->cMode==MODE_Table ){ + print_row_separator(p, nColumn, "+"); + } + sqlite3_free_table(azData); } -#endif /* ** Run a prepared statement @@ -3069,6 +3051,14 @@ static void exec_prepared_stmt( ){ int rc; + if( pArg->cMode==MODE_Column + || pArg->cMode==MODE_Table + || pArg->cMode==MODE_Markdown + ){ + exec_prepared_stmt_columnar(pArg, pStmt); + return; + } + /* perform the first step. this will tell us if we ** have a result set or not and how wide it is. */ From 1d29fd85a34b6a555a39f0d01b03b20e8aa7739a Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 29 May 2020 19:03:03 +0000 Subject: [PATCH 022/186] Fix a memory leak in the CLI when an unknown or unrecognized argument is given to the ".dump" command. FossilOrigin-Name: 71bfbbcc1a8d0e02073a381a5b31a5ccd5477011b22904b9989b6129d81f02e7 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 2 ++ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index d4109e2ff9..7ae1670e66 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improvements\sto\scolumnar\soutput\sin\sthe\sCLI.\s\sColumns\sautomatically\sexpand\nto\scontain\sthe\slargest\srow. -D 2020-05-29T16:15:58.318 +C Fix\sa\smemory\sleak\sin\sthe\sCLI\swhen\san\sunknown\sor\sunrecognized\nargument\sis\sgiven\sto\sthe\s".dump"\scommand. +D 2020-05-29T19:03:03.822 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -534,7 +534,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 39a00a8bc89596dfb37c16afcbb1d33de5085b9963564b58aafe1566d08c0881 -F src/shell.c.in 9675df5f6be969309421509eef9c49a20179e5c4df8770f2d62edd41a9dee339 +F src/shell.c.in 568398ec752c0dd2dc95fe5f2d1a41a3e2afad44fc426f29a433fb6d47682a57 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 @@ -1866,7 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 445ed5dab2c26e9f4a7fb5277abdba3359d23cf5318cfd0d8322162d9616ee7a -R 5cd70920783d10744759d8e97b9aed09 +P 4e1db8e9a9ee370a398f13fd8546a520111b8cfb84460389535b5bc5bd9f4f82 +R dbf605f7d5ebb17a9b1bf4d7d1629225 U drh -Z 0a5f6eacc5288734a9f57cf18ebe2785 +Z 26823eb3679b06374331d049cd4f4495 diff --git a/manifest.uuid b/manifest.uuid index cbe0de7cd3..4be1499c5a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4e1db8e9a9ee370a398f13fd8546a520111b8cfb84460389535b5bc5bd9f4f82 \ No newline at end of file +71bfbbcc1a8d0e02073a381a5b31a5ccd5477011b22904b9989b6129d81f02e7 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index e4883c1474..1126f570b3 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -7495,6 +7495,7 @@ static int do_meta_command(char *zLine, ShellState *p){ raw_printf(stderr, "The --preserve-rowids option is not compatible" " with SQLITE_OMIT_VIRTUALTABLE\n"); rc = 1; + sqlite3_free(zLike); goto meta_command_exit; #else ShellSetFlag(p, SHFLG_PreserveRowid); @@ -7506,6 +7507,7 @@ static int do_meta_command(char *zLine, ShellState *p){ { raw_printf(stderr, "Unknown option \"%s\" on \".dump\"\n", azArg[i]); rc = 1; + sqlite3_free(zLike); goto meta_command_exit; } }else if( zLike ){ From 7da29a3ad30ba28070f48c300633325a13b6eb8e Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 29 May 2020 19:17:20 +0000 Subject: [PATCH 023/186] Improvements to help text for the CLI. FossilOrigin-Name: 6a01e4c444b072e31a320121a6810d7c986c2c54ce45f9b11683233b1e7af8da --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 25 ++++++++++++++----------- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/manifest b/manifest index 7ae1670e66..d02314c466 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\smemory\sleak\sin\sthe\sCLI\swhen\san\sunknown\sor\sunrecognized\nargument\sis\sgiven\sto\sthe\s".dump"\scommand. -D 2020-05-29T19:03:03.822 +C Improvements\sto\shelp\stext\sfor\sthe\sCLI. +D 2020-05-29T19:17:20.081 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -534,7 +534,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 39a00a8bc89596dfb37c16afcbb1d33de5085b9963564b58aafe1566d08c0881 -F src/shell.c.in 568398ec752c0dd2dc95fe5f2d1a41a3e2afad44fc426f29a433fb6d47682a57 +F src/shell.c.in ca45965c1eca515e4cdd78a495bbebe86b52826cce0fcbf007766dfbd29fa5a5 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 @@ -1866,7 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 4e1db8e9a9ee370a398f13fd8546a520111b8cfb84460389535b5bc5bd9f4f82 -R dbf605f7d5ebb17a9b1bf4d7d1629225 +P 71bfbbcc1a8d0e02073a381a5b31a5ccd5477011b22904b9989b6129d81f02e7 +R bb1b7b61958145efdf723dd1c95331fe U drh -Z 26823eb3679b06374331d049cd4f4495 +Z 88ceb48d848b297c551cf9009c2925f8 diff --git a/manifest.uuid b/manifest.uuid index 4be1499c5a..02a3aba8db 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -71bfbbcc1a8d0e02073a381a5b31a5ccd5477011b22904b9989b6129d81f02e7 \ No newline at end of file +6a01e4c444b072e31a320121a6810d7c986c2c54ce45f9b11683233b1e7af8da \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 1126f570b3..3a59380977 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -3791,16 +3791,19 @@ static const char *(azHelp[]) = { ".log FILE|off Turn logging on or off. FILE can be stderr/stdout", ".mode MODE ?TABLE? Set output mode", " MODE is one of:", - " ascii Columns/rows delimited by 0x1F and 0x1E", - " csv Comma-separated values", - " column Left-aligned columns. (See .width)", - " html HTML
code", - " insert SQL insert statements for TABLE", - " line One value per line", - " list Values delimited by \"|\"", - " quote Escape answers as for SQL", - " tabs Tab-separated values", - " tcl TCL list elements", + " ascii Columns/rows delimited by 0x1F and 0x1E", + " csv Comma-separated values", + " column Output in columns. (See .width)", + " html HTML
code", + " insert SQL insert statements for TABLE", + " json Results in a JSON array", + " line One value per line", + " list Values delimited by \"|\"", + " markdown Markdown table format", + " quote Escape answers as for SQL", + " table ASCII-art table", + " tabs Tab-separated values", + " tcl TCL list elements", ".nullvalue STRING Use STRING in place of NULL values", ".once ?OPTIONS? ?FILE? Output for the next SQL command only to FILE", " If FILE begins with '|' then open as a pipe", @@ -3925,7 +3928,7 @@ static const char *(azHelp[]) = { ".vfsinfo ?AUX? Information about the top-level VFS", ".vfslist List all available VFSes", ".vfsname ?AUX? Print the name of the VFS stack", - ".width NUM1 NUM2 ... Set column widths for \"column\" mode", + ".width NUM1 NUM2 ... Set minimum column widths for columnar output", " Negative values right-justify", }; From 9776784f943cafb7d836ffff6c9c6d1580f18b4f Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 29 May 2020 19:39:35 +0000 Subject: [PATCH 024/186] Fix the ".import" command of the CLI to clean up better after errors. Add the new "shelltest" makefile target on unix platforms. FossilOrigin-Name: 50d4ddf1330b88551de51439eb535f385dee6b53013802dd62f832d16b3025b6 --- Makefile.in | 3 +++ main.mk | 3 +++ manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/shell.c.in | 33 ++++++++++++++++++++------------- test/permutations.test | 6 ++++++ 6 files changed, 42 insertions(+), 23 deletions(-) diff --git a/Makefile.in b/Makefile.in index 1341dee634..01bc2541f0 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1286,6 +1286,9 @@ valgrindtest: $(TESTPROGS) valgrindfuzz smoketest: $(TESTPROGS) fuzzcheck$(TEXE) ./testfixture$(TEXE) $(TOP)/test/main.test $(TESTOPTS) +shelltest: $(TESTPROGS) + ./testfixture$(TEXT) $(TOP)/test/permutations.test shell + sqlite3_analyzer.c: sqlite3.c $(TOP)/src/tclsqlite.c $(TOP)/tool/spaceanal.tcl $(TOP)/tool/mkccode.tcl $(TOP)/tool/sqlite3_analyzer.c.in $(TCLSH_CMD) $(TOP)/tool/mkccode.tcl $(TOP)/tool/sqlite3_analyzer.c.in >sqlite3_analyzer.c diff --git a/main.mk b/main.mk index 654bd043f3..fa2c199ed5 100644 --- a/main.mk +++ b/main.mk @@ -975,6 +975,9 @@ valgrindtest: $(TESTPROGS) valgrindfuzz smoketest: $(TESTPROGS) fuzzcheck$(EXE) ./testfixture$(EXE) $(TOP)/test/main.test $(TESTOPTS) +shelltest: $(TESTPROGS) + ./testfixture$(EXT) $(TOP)/test/permutations.test shell + # The next two rules are used to support the "threadtest" target. Building # threadtest runs a few thread-safety tests that are implemented in C. This # target is invoked by the releasetest.tcl script. diff --git a/manifest b/manifest index d02314c466..0715c01cc7 100644 --- a/manifest +++ b/manifest @@ -1,9 +1,9 @@ -C Improvements\sto\shelp\stext\sfor\sthe\sCLI. -D 2020-05-29T19:17:20.081 +C Fix\sthe\s".import"\scommand\sof\sthe\sCLI\sto\sclean\sup\sbetter\safter\serrors.\nAdd\sthe\snew\s"shelltest"\smakefile\starget\son\sunix\splatforms. +D 2020-05-29T19:39:35.710 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 -F Makefile.in 376f53999defeb32b7ad2626fd58aae8f3694c38ab7ee30c2289e0d0525a9238 +F Makefile.in 8d79d12bae1b624d32cf9a698ecc797bfa908ab7eabac5d76faf130c4d362223 F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 F Makefile.msc 8d00aeba2609bb498dded5eead2890126321f02e292573bf29bf2d18487d37bd F README.md 1514a365ffca3c138e00c5cc839906108a01011a6b082bad19b09781e3aa498a @@ -455,7 +455,7 @@ F ext/userauth/userauth.c 7f00cded7dcaa5d47f54539b290a43d2e59f4b1eb5f447545fa865 F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk addd0a300e90ad090dc4a934df8a6f1b6c52c057a1aebb93682aed29fb68a345 +F main.mk 980ad4201300ca43e9db0f972c5f38776d1e78022252bf3a8c0fec7ddda540df F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 @@ -534,7 +534,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 39a00a8bc89596dfb37c16afcbb1d33de5085b9963564b58aafe1566d08c0881 -F src/shell.c.in ca45965c1eca515e4cdd78a495bbebe86b52826cce0fcbf007766dfbd29fa5a5 +F src/shell.c.in 5074277ad9469c281bc9dce86fd15aeffffffc2735ae2f912561dfcc5101d267 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 @@ -1237,7 +1237,7 @@ F test/parser1.test 6ccdf5e459a5dc4673d3273dc311a7e9742ca952dd0551a6a6320d27035c F test/pcache.test c8acbedd3b6fd0f9a7ca887a83b11d24a007972b F test/pcache2.test af7f3deb1a819f77a6d0d81534e97d1cf62cd442 F test/percentile.test 4243af26b8f3f4555abe166f723715a1f74c77ff -F test/permutations.test c83339862d72b6272f957905205f874e6eefdbad2823380452c4f0128fd3d906 +F test/permutations.test 94bfbc9d32449fb3ef7d31962f8cdcd57dc59490681db84bd72236d4af7b5815 F test/pg_common.tcl 222a1bad1c41c308fa366313cd7b51b3be7e9b21c8736a421b974ac941693b54 F test/pragma.test 59becdfd720b80d463ab750f69f7118fde10dfd556aa5d554f3bf6b7e5ea7533 F test/pragma2.test e5d5c176360c321344249354c0c16aec46214c9f @@ -1866,7 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 71bfbbcc1a8d0e02073a381a5b31a5ccd5477011b22904b9989b6129d81f02e7 -R bb1b7b61958145efdf723dd1c95331fe +P 6a01e4c444b072e31a320121a6810d7c986c2c54ce45f9b11683233b1e7af8da +R d5d44835676f1e6d2a436c688d30cb21 U drh -Z 88ceb48d848b297c551cf9009c2925f8 +Z e85f70a84a25681410e513d2a789e322 diff --git a/manifest.uuid b/manifest.uuid index 02a3aba8db..3c5ea8764e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6a01e4c444b072e31a320121a6810d7c986c2c54ce45f9b11683233b1e7af8da \ No newline at end of file +50d4ddf1330b88551de51439eb535f385dee6b53013802dd62f832d16b3025b6 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 3a59380977..8208ce0856 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -4765,6 +4765,7 @@ typedef struct ImportCtx ImportCtx; struct ImportCtx { const char *zFile; /* Name of the input file */ FILE *in; /* Read the CSV text from this input stream */ + int (SQLITE_CDECL *xCloser)(FILE*); /* Func to close in */ char *z; /* Accumulated text for a field */ int n; /* Number of bytes in z */ int nAlloc; /* Space allocated for z[] */ @@ -4777,6 +4778,16 @@ struct ImportCtx { int cRowSep; /* The row separator character. (Usually "\n") */ }; +/* Clean up resourced used by an ImportCtx */ +static void import_cleanup(ImportCtx *p){ + if( p->in!=0 &&& p->xCloser!=0 ){ + p->xCloser(p->in); + p->in = 0; + } + sqlite3_free(p->z); + p->z = 0; +} + /* Append a single byte to z[] */ static void import_append_char(ImportCtx *p, int c){ if( p->n+1>=p->nAlloc ){ @@ -7868,7 +7879,6 @@ static int do_meta_command(char *zLine, ShellState *p){ char *zSql; /* An SQL statement */ ImportCtx sCtx; /* Reader context */ char *(SQLITE_CDECL *xRead)(ImportCtx*); /* Func to read one value */ - int (SQLITE_CDECL *xCloser)(FILE*); /* Func to close file */ int eVerbose = 0; /* Larger for more console output */ int nSkip = 0; /* Initial lines to skip */ int useOutputMode = 1; /* Use output mode to determine separators */ @@ -7974,11 +7984,11 @@ static int do_meta_command(char *zLine, ShellState *p){ #else sCtx.in = popen(sCtx.zFile+1, "r"); sCtx.zFile = ""; - xCloser = pclose; + sCtx.xCloser = pclose; #endif }else{ sCtx.in = fopen(sCtx.zFile, "rb"); - xCloser = fclose; + sCtx.xCloser = fclose; } if( sCtx.in==0 ){ utf8_printf(stderr, "Error: cannot open \"%s\"\n", zFile); @@ -8002,7 +8012,7 @@ static int do_meta_command(char *zLine, ShellState *p){ } zSql = sqlite3_mprintf("SELECT * FROM %s", zTable); if( zSql==0 ){ - xCloser(sCtx.in); + import_cleanup(&sCtx); shell_out_of_memory(); } nByte = strlen30(zSql); @@ -8018,8 +8028,7 @@ static int do_meta_command(char *zLine, ShellState *p){ } if( cSep=='(' ){ sqlite3_free(zCreate); - sqlite3_free(sCtx.z); - xCloser(sCtx.in); + import_cleanup(&sCtx); utf8_printf(stderr,"%s: empty file\n", sCtx.zFile); rc = 1; goto meta_command_exit; @@ -8033,8 +8042,7 @@ static int do_meta_command(char *zLine, ShellState *p){ if( rc ){ utf8_printf(stderr, "CREATE TABLE %s(...) failed: %s\n", zTable, sqlite3_errmsg(p->db)); - sqlite3_free(sCtx.z); - xCloser(sCtx.in); + import_cleanup(&sCtx); rc = 1; goto meta_command_exit; } @@ -8044,7 +8052,7 @@ static int do_meta_command(char *zLine, ShellState *p){ if( rc ){ if (pStmt) sqlite3_finalize(pStmt); utf8_printf(stderr,"Error: %s\n", sqlite3_errmsg(p->db)); - xCloser(sCtx.in); + import_cleanup(&sCtx); rc = 1; goto meta_command_exit; } @@ -8054,7 +8062,7 @@ static int do_meta_command(char *zLine, ShellState *p){ if( nCol==0 ) return 0; /* no columns, no error */ zSql = sqlite3_malloc64( nByte*2 + 20 + nCol*2 ); if( zSql==0 ){ - xCloser(sCtx.in); + import_cleanup(&sCtx); shell_out_of_memory(); } sqlite3_snprintf(nByte+20, zSql, "INSERT INTO \"%w\" VALUES(?", zTable); @@ -8073,7 +8081,7 @@ static int do_meta_command(char *zLine, ShellState *p){ if( rc ){ utf8_printf(stderr, "Error: %s\n", sqlite3_errmsg(p->db)); if (pStmt) sqlite3_finalize(pStmt); - xCloser(sCtx.in); + import_cleanup(&sCtx); rc = 1; goto meta_command_exit; } @@ -8125,8 +8133,7 @@ static int do_meta_command(char *zLine, ShellState *p){ } }while( sCtx.cTerm!=EOF ); - xCloser(sCtx.in); - sqlite3_free(sCtx.z); + import_cleanup(&sCtx); sqlite3_finalize(pStmt); if( needCommit ) sqlite3_exec(p->db, "COMMIT", 0, 0, 0); if( eVerbose>0 ){ diff --git a/test/permutations.test b/test/permutations.test index d8ec9e4a55..ba7fa2be86 100644 --- a/test/permutations.test +++ b/test/permutations.test @@ -171,6 +171,12 @@ test_suite "veryquick" -prefix "" -description { *fts5corrupt* *fts5big* *fts5aj* ] +test_suite "shell" -prefix "" -description { + Run tests of the command-line shell +} -files [ + test_set [glob $testdir/shell*.test] +] + test_suite "extraquick" -prefix "" -description { "Extra" quick test suite. Runs in a few minutes on a workstation. This test suite is the same as the "veryquick" tests, except that From 02c17a4da7f86f7076eb2a91d1afc959df3ec0b6 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 29 May 2020 19:45:03 +0000 Subject: [PATCH 025/186] Add the "shelltest" target to the MSVC makefile as well. FossilOrigin-Name: 9924c0456bfcd2058c9620a93dfbfd4c7d960c68910ce6aed7364dff42baba5c --- Makefile.msc | 3 +++ manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/Makefile.msc b/Makefile.msc index a5c9828901..235c7c19ac 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -2452,6 +2452,9 @@ smoketest: $(TESTPROGS) @set PATH=$(LIBTCLPATH);$(PATH) .\testfixture.exe $(TOP)\test\main.test $(TESTOPTS) +shelltest: $(TESTPROGS) + .\testfixture.exe $(TOP)\test\permutations.test shell + sqlite3_analyzer.c: $(SQLITE3C) $(SQLITE3H) $(TOP)\src\tclsqlite.c $(TOP)\tool\spaceanal.tcl $(TOP)\tool\mkccode.tcl $(TOP)\tool\sqlite3_analyzer.c.in $(SQLITE_TCL_DEP) $(TCLSH_CMD) $(TOP)\tool\mkccode.tcl $(TOP)\tool\sqlite3_analyzer.c.in > $@ diff --git a/manifest b/manifest index 0715c01cc7..5688260174 100644 --- a/manifest +++ b/manifest @@ -1,11 +1,11 @@ -C Fix\sthe\s".import"\scommand\sof\sthe\sCLI\sto\sclean\sup\sbetter\safter\serrors.\nAdd\sthe\snew\s"shelltest"\smakefile\starget\son\sunix\splatforms. -D 2020-05-29T19:39:35.710 +C Add\sthe\s"shelltest"\starget\sto\sthe\sMSVC\smakefile\sas\swell. +D 2020-05-29T19:45:03.464 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 F Makefile.in 8d79d12bae1b624d32cf9a698ecc797bfa908ab7eabac5d76faf130c4d362223 F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 -F Makefile.msc 8d00aeba2609bb498dded5eead2890126321f02e292573bf29bf2d18487d37bd +F Makefile.msc 708c6032842b4fa340a6af87e124c1563da82663fb5a74d4a2f5b2c0829b51e0 F README.md 1514a365ffca3c138e00c5cc839906108a01011a6b082bad19b09781e3aa498a F VERSION 5db2ee2cfcc790af73775fa485c13b2e8ccaa5936c6e1f47aedeba7056041ca5 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 @@ -1866,7 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 6a01e4c444b072e31a320121a6810d7c986c2c54ce45f9b11683233b1e7af8da -R d5d44835676f1e6d2a436c688d30cb21 +P 50d4ddf1330b88551de51439eb535f385dee6b53013802dd62f832d16b3025b6 +R f806000b80d1906a07120f53d52bf9b7 U drh -Z e85f70a84a25681410e513d2a789e322 +Z 7d0d8f75af2aa05c25ec32eee4f87b2f diff --git a/manifest.uuid b/manifest.uuid index 3c5ea8764e..3fb0d7415a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -50d4ddf1330b88551de51439eb535f385dee6b53013802dd62f832d16b3025b6 \ No newline at end of file +9924c0456bfcd2058c9620a93dfbfd4c7d960c68910ce6aed7364dff42baba5c \ No newline at end of file From 42c2a04eb70c0c6a684be8884533d4c7266dc4bf Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 29 May 2020 20:16:19 +0000 Subject: [PATCH 026/186] Remove a stray "&" character in the CLI, detected by a clang warning. FossilOrigin-Name: 5865d2f2d0333024366ecf1d919535fd4ec05c637feff16d75028ccdc8db4b50 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 5688260174..1c917dad38 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s"shelltest"\starget\sto\sthe\sMSVC\smakefile\sas\swell. -D 2020-05-29T19:45:03.464 +C Remove\sa\sstray\s"&"\scharacter\sin\sthe\sCLI,\sdetected\sby\sa\sclang\swarning. +D 2020-05-29T20:16:19.429 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -534,7 +534,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 39a00a8bc89596dfb37c16afcbb1d33de5085b9963564b58aafe1566d08c0881 -F src/shell.c.in 5074277ad9469c281bc9dce86fd15aeffffffc2735ae2f912561dfcc5101d267 +F src/shell.c.in 1c47af1236007851fbded02bcdca020415f35e215cb161adbe2cf06f9ca70b99 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 @@ -1866,7 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 50d4ddf1330b88551de51439eb535f385dee6b53013802dd62f832d16b3025b6 -R f806000b80d1906a07120f53d52bf9b7 +P 9924c0456bfcd2058c9620a93dfbfd4c7d960c68910ce6aed7364dff42baba5c +R 85938626fdde133bf2bbed9b50812696 U drh -Z 7d0d8f75af2aa05c25ec32eee4f87b2f +Z a7ec4245396908b4263f1a81f6c6a7ec diff --git a/manifest.uuid b/manifest.uuid index 3fb0d7415a..c182cd8037 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9924c0456bfcd2058c9620a93dfbfd4c7d960c68910ce6aed7364dff42baba5c \ No newline at end of file +5865d2f2d0333024366ecf1d919535fd4ec05c637feff16d75028ccdc8db4b50 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 8208ce0856..9ed0dda713 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -4780,7 +4780,7 @@ struct ImportCtx { /* Clean up resourced used by an ImportCtx */ static void import_cleanup(ImportCtx *p){ - if( p->in!=0 &&& p->xCloser!=0 ){ + if( p->in!=0 && p->xCloser!=0 ){ p->xCloser(p->in); p->in = 0; } From 375b0b014b3f64ddb4ff705f3b7f5bc1ed08db3d Mon Sep 17 00:00:00 2001 From: mistachkin Date: Fri, 29 May 2020 21:06:52 +0000 Subject: [PATCH 027/186] Enhancements to the incremental build support for MSVC. FossilOrigin-Name: 2e25d915bcb8d6f1747f9befdef64d2e0e495cc6c5948a8eff5d0097b6613d06 --- Makefile.msc | 29 ++++++++++++++++++++--------- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 28 insertions(+), 17 deletions(-) diff --git a/Makefile.msc b/Makefile.msc index 235c7c19ac..241961e2d5 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -1495,7 +1495,7 @@ SRC12 = # All source code files. # -SRC = $(SRC00) $(SRC01) $(SRC03) $(SRC04) $(SRC05) $(SRC06) $(SRC07) $(SRC08) $(SRC09) $(SRC10) $(SRC11) +SRC = $(SRC00) $(SRC01) $(SRC03) $(SRC04) $(SRC05) $(SRC06) $(SRC07) $(SRC08) $(SRC09) $(SRC10) $(SRC11) $(SRC12) # Source code to the test files. # @@ -1846,15 +1846,16 @@ mptest: mptester.exe for %i in ($(SRC11)) do copy /Y %i tsrc for %i in ($(SRC12)) do copy /Y %i tsrc copy /Y fts5.c tsrc + copy /B tsrc\fts5.c +,, copy /Y fts5.h tsrc + copy /B tsrc\fts5.h +,, del /Q tsrc\sqlite.h.in tsrc\parse.y 2>NUL $(TCLSH_CMD) $(TOP)\tool\vdbe-compress.tcl $(OPTS) < tsrc\vdbe.c > vdbe.new move vdbe.new tsrc\vdbe.c echo > .target_source -sqlite3.c: .target_source sqlite3ext.h $(MKSQLITE3C_TOOL) +sqlite3.c: .target_source sqlite3ext.h sqlite3session.h $(MKSQLITE3C_TOOL) $(TCLSH_CMD) $(MKSQLITE3C_TOOL) $(MKSQLITE3C_ARGS) - copy $(TOP)\ext\session\sqlite3session.h . sqlite3-all.c: sqlite3.c $(TOP)\tool\split-sqlite3c.tcl $(TCLSH_CMD) $(TOP)\tool\split-sqlite3c.tcl @@ -1869,7 +1870,8 @@ sqlite3.lo: $(SQLITE3C) # Rules to build the LEMON compiler generator # lempar.c: $(TOP)\tool\lempar.c - copy $(TOP)\tool\lempar.c . + copy /Y $(TOP)\tool\lempar.c . + copy /B lempar.c +,, lemon.exe: $(TOP)\tool\lemon.c lempar.c $(BCC) $(NO_WARN) -Daccess=_access \ @@ -2169,7 +2171,8 @@ parse.h: parse.c parse.c: $(TOP)\src\parse.y lemon.exe del /Q parse.y parse.h parse.h.temp 2>NUL - copy $(TOP)\src\parse.y . + copy /Y $(TOP)\src\parse.y . + copy /B parse.y +,, .\lemon.exe $(REQ_FEATURE_FLAGS) $(OPT_FEATURE_FLAGS) $(EXT_FEATURE_FLAGS) $(OPTS) -S parse.y $(SQLITE3H): $(TOP)\src\sqlite.h.in $(TOP)\manifest mksourceid.exe $(TOP)\VERSION @@ -2182,8 +2185,13 @@ sqlite3ext.h: .target_source copy /Y sqlite3ext.h tsrc\sqlite3ext.h !ELSE copy /Y tsrc\sqlite3ext.h sqlite3ext.h + copy /B sqlite3ext.h +,, !ENDIF +sqlite3session.h: $(TOP)\ext\session\sqlite3session.h + copy /Y $(TOP)\ext\session\sqlite3session.h . + copy /B sqlite3session.h +,, + mkkeywordhash.exe: $(TOP)\tool\mkkeywordhash.c $(BCC) $(NO_WARN) -Fe$@ $(REQ_FEATURE_FLAGS) $(OPT_FEATURE_FLAGS) $(EXT_FEATURE_FLAGS) $(OPTS) \ $(TOP)\tool\mkkeywordhash.c /link $(LDFLAGS) $(NLTLINKOPTS) $(NLTLIBPATHS) @@ -2198,7 +2206,7 @@ SHELL_SRC = \ $(TOP)\ext\misc\shathree.c \ $(TOP)\ext\misc\fileio.c \ $(TOP)\ext\misc\completion.c \ - $(TOP)\ext\misc\uint.c \ + $(TOP)\ext\misc\uint.c \ $(TOP)\ext\expert\sqlite3expert.c \ $(TOP)\ext\expert\sqlite3expert.h \ $(TOP)\ext\misc\memtrace.c \ @@ -2329,7 +2337,8 @@ LSM1_SRC = \ $(TOP)\ext\lsm1\lsm_win32.c fts5parse.c: $(TOP)\ext\fts5\fts5parse.y lemon.exe - copy $(TOP)\ext\fts5\fts5parse.y . + copy /Y $(TOP)\ext\fts5\fts5parse.y . + copy /B fts5parse.y +,, del /Q fts5parse.h 2>NUL .\lemon.exe $(REQ_FEATURE_FLAGS) $(OPT_FEATURE_FLAGS) $(EXT_FEATURE_FLAGS) $(OPTS) -S fts5parse.y @@ -2337,11 +2346,13 @@ fts5parse.h: fts5parse.c fts5.c: $(FTS5_SRC) $(TCLSH_CMD) $(TOP)\ext\fts5\tool\mkfts5c.tcl - copy $(TOP)\ext\fts5\fts5.h . + copy /Y $(TOP)\ext\fts5\fts5.h . + copy /B fts5.h +,, lsm1.c: $(LSM1_SRC) $(TCLSH_CMD) $(TOP)\ext\lsm1\tool\mklsm1c.tcl - copy $(TOP)\ext\lsm1\lsm.h . + copy /Y $(TOP)\ext\lsm1\lsm.h . + copy /B lsm.h +,, fts5.lo: fts5.c $(HDR) $(EXTHDR) $(LTCOMPILE) $(CORE_COMPILE_OPTS) $(NO_WARN) -DSQLITE_CORE -c fts5.c diff --git a/manifest b/manifest index 1c917dad38..996c4868f7 100644 --- a/manifest +++ b/manifest @@ -1,11 +1,11 @@ -C Remove\sa\sstray\s"&"\scharacter\sin\sthe\sCLI,\sdetected\sby\sa\sclang\swarning. -D 2020-05-29T20:16:19.429 +C Enhancements\sto\sthe\sincremental\sbuild\ssupport\sfor\sMSVC. +D 2020-05-29T21:06:52.599 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 F Makefile.in 8d79d12bae1b624d32cf9a698ecc797bfa908ab7eabac5d76faf130c4d362223 F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 -F Makefile.msc 708c6032842b4fa340a6af87e124c1563da82663fb5a74d4a2f5b2c0829b51e0 +F Makefile.msc 08268b28e97fce2475c4a9bd7ba84a99827d6cf9e6b46952409821f6a12ee46d F README.md 1514a365ffca3c138e00c5cc839906108a01011a6b082bad19b09781e3aa498a F VERSION 5db2ee2cfcc790af73775fa485c13b2e8ccaa5936c6e1f47aedeba7056041ca5 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 @@ -1866,7 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9924c0456bfcd2058c9620a93dfbfd4c7d960c68910ce6aed7364dff42baba5c -R 85938626fdde133bf2bbed9b50812696 -U drh -Z a7ec4245396908b4263f1a81f6c6a7ec +P 5865d2f2d0333024366ecf1d919535fd4ec05c637feff16d75028ccdc8db4b50 +R ea1f39211518f41f5c2b12c4cd8c40f2 +U mistachkin +Z 0c710e2dd8d54ec195365654b7322b90 diff --git a/manifest.uuid b/manifest.uuid index c182cd8037..fefbf02513 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5865d2f2d0333024366ecf1d919535fd4ec05c637feff16d75028ccdc8db4b50 \ No newline at end of file +2e25d915bcb8d6f1747f9befdef64d2e0e495cc6c5948a8eff5d0097b6613d06 \ No newline at end of file From e557b0155b1f0b70f95da0b8f1225e4d22e0d5c8 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 30 May 2020 00:30:08 +0000 Subject: [PATCH 028/186] Improved VDBE comments on the ANALYZE code generator. This change also fixes a harmless use of an uninitialized integer variable as an input to the %d format on a VDBE comment. FossilOrigin-Name: 1cb248a3fc4c35c5bc3993b554edcccaa5c5e91570af67ebb99643a15221ae33 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/analyze.c | 30 +++++++++++++++++++++++++++--- 3 files changed, 35 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 996c4868f7..c6b550a14b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhancements\sto\sthe\sincremental\sbuild\ssupport\sfor\sMSVC. -D 2020-05-29T21:06:52.599 +C Improved\sVDBE\scomments\son\sthe\sANALYZE\scode\sgenerator.\s\sThis\schange\nalso\sfixes\sa\sharmless\suse\sof\san\suninitialized\sinteger\svariable\sas\san\sinput\nto\sthe\s%d\sformat\son\sa\sVDBE\scomment. +D 2020-05-30T00:30:08.761 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -468,7 +468,7 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a F src/alter.c 826bc4561456094cf758f095776026f25892a2bb3a7cd86742323267dc9bdb5f -F src/analyze.c 953a6c43870ccaf080597244e1eeb4dc2ff6cb84f9501b24e46323de36970b61 +F src/analyze.c 2c77bcbb8651ccced4a8cdaf8d997663813b2967787070fa26d0360de2ee4367 F src/attach.c ff2daea0fe62080192e3f262670e4f61f5a86c1e7bea9cec34e960fe79852aa1 F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 F src/backup.c b1c90cd4110248c8e1273ff4578d3a84c0c34725e1b96dacd4a6294a908702de @@ -1866,7 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 5865d2f2d0333024366ecf1d919535fd4ec05c637feff16d75028ccdc8db4b50 -R ea1f39211518f41f5c2b12c4cd8c40f2 -U mistachkin -Z 0c710e2dd8d54ec195365654b7322b90 +P 2e25d915bcb8d6f1747f9befdef64d2e0e495cc6c5948a8eff5d0097b6613d06 +R 2675b53bd7c59c171705e1753c06ddb1 +U drh +Z 4e29343ffa9662765735989ac396bab3 diff --git a/manifest.uuid b/manifest.uuid index fefbf02513..d73db9e650 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2e25d915bcb8d6f1747f9befdef64d2e0e495cc6c5948a8eff5d0097b6613d06 \ No newline at end of file +1cb248a3fc4c35c5bc3993b554edcccaa5c5e91570af67ebb99643a15221ae33 \ No newline at end of file diff --git a/src/analyze.c b/src/analyze.c index b2f030df09..76f8f818ab 100644 --- a/src/analyze.c +++ b/src/analyze.c @@ -951,6 +951,30 @@ static void callStatGet(Parse *pParse, int regStat, int iParam, int regOut){ &statGetFuncdef, 0); } +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS +/* Add a comment to the most recent VDBE opcode that is the name +** of the k-th column of the pIdx index. +*/ +static void analyzeVdbeCommentIndexWithColumnName( + Vdbe *v, /* Prepared statement under construction */ + Index *pIdx, /* Index whose column is being loaded */ + int k /* Which column index */ +){ + int i; /* Index of column in the table */ + assert( k>=0 && knColumn ); + i = pIdx->aiColumn[k]; + if( NEVER(i==XN_ROWID) ){ + VdbeComment((v,"%s.rowid",pIdx->zName)); + }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)); + } +} +#else +# define analyzeVdbeCommentIndexWithColumnName(a,b,c) +#endif /* SQLITE_DEBUG */ + /* ** Generate code to do an analysis of all indices associated with ** a single table. @@ -1167,7 +1191,7 @@ static void analyzeOneTable( char *pColl = (char*)sqlite3LocateCollSeq(pParse, pIdx->azColl[i]); sqlite3VdbeAddOp2(v, OP_Integer, i, regChng); sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, i, regTemp); - VdbeComment((v, "%s.column(%d)", pIdx->zName, i)); + analyzeVdbeCommentIndexWithColumnName(v,pIdx,i); aGotoChng[i] = sqlite3VdbeAddOp4(v, OP_Ne, regTemp, 0, regPrev+i, pColl, P4_COLLSEQ); sqlite3VdbeChangeP5(v, SQLITE_NULLEQ); @@ -1188,7 +1212,7 @@ static void analyzeOneTable( for(i=0; izName, i)); + analyzeVdbeCommentIndexWithColumnName(v,pIdx,i); } sqlite3VdbeResolveLabel(v, endDistinctTest); sqlite3DbFree(db, aGotoChng); @@ -1214,7 +1238,7 @@ static void analyzeOneTable( k = sqlite3TableColumnToIndex(pIdx, pPk->aiColumn[j]); assert( k>=0 && knColumn ); sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, k, regKey+j); - VdbeComment((v, "%s.column(%d)", pIdx->zName, i)); + analyzeVdbeCommentIndexWithColumnName(v,pIdx,k); } sqlite3VdbeAddOp3(v, OP_MakeRecord, regKey, pPk->nKeyCol, regRowid); sqlite3ReleaseTempRange(pParse, regKey, pPk->nKeyCol); From e566cebb26bc8c5be17200a215c6aec91c277c66 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 30 May 2020 15:34:49 +0000 Subject: [PATCH 029/186] Draw the dashes below the headers in "explain" mode in the CLI. FossilOrigin-Name: c6b7833ac7d9cc75cb45d5e8041367ebd6f197f776766e6143535c227fc72a20 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 5 +++++ 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index c6b550a14b..59cc8715a6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\sVDBE\scomments\son\sthe\sANALYZE\scode\sgenerator.\s\sThis\schange\nalso\sfixes\sa\sharmless\suse\sof\san\suninitialized\sinteger\svariable\sas\san\sinput\nto\sthe\s%d\sformat\son\sa\sVDBE\scomment. -D 2020-05-30T00:30:08.761 +C Draw\sthe\sdashes\sbelow\sthe\sheaders\sin\s"explain"\smode\sin\sthe\sCLI. +D 2020-05-30T15:34:49.222 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -534,7 +534,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 39a00a8bc89596dfb37c16afcbb1d33de5085b9963564b58aafe1566d08c0881 -F src/shell.c.in 1c47af1236007851fbded02bcdca020415f35e215cb161adbe2cf06f9ca70b99 +F src/shell.c.in 9c0e886561b9a9644a4134e29e4b7d08eb16690da47a9de6bea082183d527adf F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 @@ -1866,7 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 2e25d915bcb8d6f1747f9befdef64d2e0e495cc6c5948a8eff5d0097b6613d06 -R 2675b53bd7c59c171705e1753c06ddb1 +P 1cb248a3fc4c35c5bc3993b554edcccaa5c5e91570af67ebb99643a15221ae33 +R 8b6d070d9470292acffd6f600425ba3f U drh -Z 4e29343ffa9662765735989ac396bab3 +Z 86932043c882c09459de0bf040004fa9 diff --git a/manifest.uuid b/manifest.uuid index d73db9e650..7a5d2249dd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1cb248a3fc4c35c5bc3993b554edcccaa5c5e91570af67ebb99643a15221ae33 \ No newline at end of file +c6b7833ac7d9cc75cb45d5e8041367ebd6f197f776766e6143535c227fc72a20 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 9ed0dda713..ca2b408e58 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -1993,6 +1993,11 @@ static int shell_callback( utf8_width_print(p->out, w, azCol[i]); fputs(i==nArg-1 ? "\n" : " ", p->out); } + for(i=0; iout, w); + fputs(i==nArg-1 ? "\n" : " ", p->out); + } } if( azArg==0 ) break; for(i=0; i Date: Wed, 3 Jun 2020 03:00:09 +0000 Subject: [PATCH 030/186] Improve the query planner so that it is better able to find full index scan plan when there is an INDEXED BY clause. FossilOrigin-Name: d901837fea1ed54de43ad59eb47c02cbfd2eb215fc57317b5ea8c22a7df947c4 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/where.c | 2 ++ test/indexedby.test | 26 +++++++++++++------------- test/where9.test | 14 +++++++------- 5 files changed, 31 insertions(+), 29 deletions(-) diff --git a/manifest b/manifest index 59cc8715a6..c774d96b07 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Draw\sthe\sdashes\sbelow\sthe\sheaders\sin\s"explain"\smode\sin\sthe\sCLI. -D 2020-05-30T15:34:49.222 +C Improve\sthe\squery\splanner\sso\sthat\sit\sis\sbetter\sable\sto\sfind\sfull\nindex\sscan\splan\swhen\sthere\sis\san\sINDEXED\sBY\sclause. +D 2020-06-03T03:00:09.331 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -620,7 +620,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 04c3d2a673192016a671eb051a1900945a8c7331f4378636a8bfb70e8e596c84 F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 3df26a33dc4f54e8771600fb7fdebe1ece0896c2ad68c30ab40b017aa4395049 -F src/where.c 9546c82056e8cdb27291f98cf1adca5d271240b399bb97b32f77fc2bea6146c9 +F src/where.c 7bcc07ff56d03d73308245135d96de46d2faeaee628bd4badf0bae60ae6a31fe F src/whereInt.h 6b874aa15f94e43a2cec1080be64d955b04deeafeac90ffb5d6975c0d511be3c F src/wherecode.c 7b939de85d65cc4b4bfa197513136b9e0ae03167e3b82842ca5a0ba1055ba65d F src/whereexpr.c 264d58971eaf8256eb5b0917bcd7fc7a1f1109fdda183a8382308a1b18a2dce7 @@ -1070,7 +1070,7 @@ F test/index6.test f172653b35b20233e59200e8b92a76db61bf7285437bf777b93b306ba26a4 F test/index7.test b8a0ba2110fd517bb48c4e76d26d60f1ab2ed9e257b18d71f820d7e71e9f8570 F test/index8.test bc2e3db70e8e62459aaa1bd7e4a9b39664f8f9d7 F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7721 -F test/indexedby.test a52c8c6abfae4fbfb51d99440de4ca1840dbacc606b05e29328a2a8ba7cd914e +F test/indexedby.test f54aac21c06948872010a956fd02de5178c362c7785a9887cf0b8616be17883b F test/indexexpr1.test 284e119999d132cc8bf37735a928c9859b28e8e295d02b7a6a4f93977c7f9ba5 F test/indexexpr2.test dba11dbb0a58fcba4cd694f46b4004976123b81b0501f525d43c9be59f0207b1 F test/indexfault.test 98d78a8ff1f5335628b62f886a1cb7c7dac1ef6d48fa39c51ec871c87dce9811 @@ -1706,7 +1706,7 @@ F test/where5.test fdf66f96d29a064b63eb543e28da4dfdccd81ad2 F test/where6.test 5da5a98cec820d488e82708301b96cb8c18a258b F test/where7.test 75722434c486ac9e74718caa6cce234f45ba34c0b6c0f9555b29eb8bb5f6ade1 F test/where8.test 461ca40265ed996a6305da99bb024b0e41602bb586acf544c08f95922358e49f -F test/where9.test 2c554b97bbdb2fdf26c57099f60db8a52bfcf7c147f2c256f9798fa0e267ca85 +F test/where9.test 8e3e0ff42cc17156f52361a1c012281550d0d632912fec92d1d6df74db7a8e6d F test/whereA.test 6c6a420ca7d313242f9b1bd471dc80e4d0f8323700ba9c78df0bb843d4daa3b4 F test/whereB.test 0def95db3bdec220a731c7e4bec5930327c1d8c5 F test/whereC.test cae295158703cb3fc23bf1a108a9ab730efff0f6 @@ -1866,7 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1cb248a3fc4c35c5bc3993b554edcccaa5c5e91570af67ebb99643a15221ae33 -R 8b6d070d9470292acffd6f600425ba3f +P c6b7833ac7d9cc75cb45d5e8041367ebd6f197f776766e6143535c227fc72a20 +R 952d1a55f39aa3fb3430db1783a8d16a U drh -Z 86932043c882c09459de0bf040004fa9 +Z 7e892dc73a9c345df1500a78da6d8191 diff --git a/manifest.uuid b/manifest.uuid index 7a5d2249dd..6e6181dfcb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c6b7833ac7d9cc75cb45d5e8041367ebd6f197f776766e6143535c227fc72a20 \ No newline at end of file +d901837fea1ed54de43ad59eb47c02cbfd2eb215fc57317b5ea8c22a7df947c4 \ No newline at end of file diff --git a/src/where.c b/src/where.c index ad309006d1..a7df4b9b80 100644 --- a/src/where.c +++ b/src/where.c @@ -3028,6 +3028,7 @@ static int whereLoopAddBtree( pNew->nOut = rSize; pNew->u.btree.pIndex = pProbe; b = indexMightHelpWithOrderBy(pBuilder, pProbe, pSrc->iCursor); + /* The ONEPASS_DESIRED flags never occurs together with ORDER BY */ assert( (pWInfo->wctrlFlags & WHERE_ONEPASS_DESIRED)==0 || b==0 ); if( pProbe->idxType==SQLITE_IDXTYPE_IPK ){ @@ -3057,6 +3058,7 @@ static int whereLoopAddBtree( if( b || !HasRowid(pTab) || pProbe->pPartIdxWhere!=0 + || pSrc->fg.isIndexedBy || ( m==0 && pProbe->bUnordered==0 && (pProbe->szIdxRowszTabRow) diff --git a/test/indexedby.test b/test/indexedby.test index 8624b10c75..18f7bb8fa3 100644 --- a/test/indexedby.test +++ b/test/indexedby.test @@ -95,7 +95,7 @@ do_test indexedby-2.4 { # an error. do_test indexedby-2.4.1 { catchsql { SELECT b FROM t1 INDEXED BY i1 WHERE b = 'two' } -} {1 {no query solution}} +} {0 {}} do_test indexedby-2.5 { catchsql { SELECT * FROM t1 INDEXED BY i5 WHERE a = 'one' AND b = 'two'} @@ -135,10 +135,10 @@ do_eqp_test indexedby-3.3 { } {SEARCH TABLE t1 USING INDEX i2 (b=?)} do_test indexedby-3.4 { catchsql { SELECT * FROM t1 INDEXED BY i2 WHERE a = 'one' } -} {1 {no query solution}} +} {0 {}} do_test indexedby-3.5 { catchsql { SELECT * FROM t1 INDEXED BY i2 ORDER BY a } -} {1 {no query solution}} +} {0 {}} do_test indexedby-3.6 { catchsql { SELECT * FROM t1 INDEXED BY i1 WHERE a = 'one' } } {0 {}} @@ -154,7 +154,7 @@ do_eqp_test indexedby-3.9 { } {SEARCH TABLE t3 USING INDEX sqlite_autoindex_t3_1 (e=?)} do_test indexedby-3.10 { catchsql { SELECT * FROM t3 INDEXED BY sqlite_autoindex_t3_1 WHERE f = 10 } -} {1 {no query solution}} +} {0 {}} do_test indexedby-3.11 { catchsql { SELECT * FROM t3 INDEXED BY sqlite_autoindex_t3_2 WHERE f = 10 } } {1 {no such index: sqlite_autoindex_t3_2}} @@ -172,19 +172,19 @@ do_eqp_test indexedby-4.2 { SELECT * FROM t1 INDEXED BY i1, t2 WHERE a = c } { QUERY PLAN - |--SCAN TABLE t2 - `--SEARCH TABLE t1 USING INDEX i1 (a=?) + |--SCAN TABLE t1 USING INDEX i1 + `--SEARCH TABLE t2 USING INDEX i3 (c=?) } do_test indexedby-4.3 { catchsql { SELECT * FROM t1 INDEXED BY i1, t2 INDEXED BY i3 WHERE a=c } -} {1 {no query solution}} +} {0 {}} do_test indexedby-4.4 { catchsql { SELECT * FROM t2 INDEXED BY i3, t1 INDEXED BY i1 WHERE a=c } -} {1 {no query solution}} +} {0 {}} # Test embedding an INDEXED BY in a CREATE VIEW statement. This block # also tests that nothing bad happens if an index refered to by @@ -205,7 +205,7 @@ do_test indexedby-5.4 { # Recreate index i1 in such a way as it cannot be used by the view query. execsql { CREATE INDEX i1 ON t1(b) } catchsql { SELECT * FROM v2 } -} {1 {no query solution}} +} {0 {}} do_test indexedby-5.5 { # Drop and recreate index i1 again. This time, create it so that it can # be used by the query. @@ -245,7 +245,7 @@ do_eqp_test indexedby-7.5 { } {SEARCH TABLE t1 USING INDEX i2 (b=?)} do_test indexedby-7.6 { catchsql { DELETE FROM t1 INDEXED BY i2 WHERE a = 5} -} {1 {no query solution}} +} {0 {}} # Test that "INDEXED BY" can be used in an UPDATE statement. # @@ -266,7 +266,7 @@ do_eqp_test indexedby-8.5 { } {SEARCH TABLE t1 USING INDEX i2 (b=?)} do_test indexedby-8.6 { catchsql { UPDATE t1 INDEXED BY i2 SET rowid=rowid+1 WHERE a = 5} -} {1 {no query solution}} +} {0 {}} # Test that bug #3560 is fixed. # @@ -284,10 +284,10 @@ do_test indexedby-9.2 { joinme as j indexed by joinme_id_text_idx on ( m.id = j.id_int) } -} {1 {no query solution}} +} {0 {}} do_test indexedby-9.3 { catchsql { select * from maintable, joinme INDEXED by joinme_id_text_idx } -} {1 {no query solution}} +} {0 {}} # Make sure we can still create tables, indices, and columns whose name # is "indexed". diff --git a/test/where9.test b/test/where9.test index b274609364..0f770dfee8 100644 --- a/test/where9.test +++ b/test/where9.test @@ -426,7 +426,7 @@ do_test where9-4.5 { AND (c=31031 OR d IS NULL) ORDER BY +a } -} {1 {no query solution}} +} {0 {92 93 97}} do_test where9-4.6 { count_steps { SELECT a FROM t1 NOT INDEXED @@ -442,7 +442,7 @@ do_test where9-4.7 { AND (c=31031 OR d IS NULL) ORDER BY +a } -} {1 {no query solution}} +} {0 {92 93 97}} do_test where9-4.8 { catchsql { SELECT a FROM t1 INDEXED BY t1d @@ -450,7 +450,7 @@ do_test where9-4.8 { AND (c=31031 OR d IS NULL) ORDER BY +a } -} {1 {no query solution}} +} {0 {92 93 97}} # The (c=31031 OR d IS NULL) clause is preferred over b>1000 because # the former is an equality test which is expected to return fewer rows. @@ -776,7 +776,7 @@ do_test where9-6.8.1 { OR (b NOT NULL AND c IS NULL AND d NOT NULL) OR (b NOT NULL AND c NOT NULL AND d IS NULL) } -} {1 {no query solution}} +} {0 {}} do_test where9-6.8.2 { catchsql { UPDATE t1 INDEXED BY t1b SET a=a+100 @@ -784,7 +784,7 @@ do_test where9-6.8.2 { OR (b NOT NULL AND c IS NULL AND d NOT NULL) OR (b NOT NULL AND c NOT NULL AND d IS NULL) } -} {1 {no query solution}} +} {0 {}} set solution_possible 0 ifcapable stat4 { @@ -818,7 +818,7 @@ if $solution_possible { OR (b NOT NULL AND c IS NULL AND d NOT NULL) OR (b NOT NULL AND c NOT NULL AND d IS NULL) } - } {1 {no query solution}} + } {0 {}} do_test where9-6.8.4 { catchsql { DELETE FROM t1 INDEXED BY t1b @@ -826,7 +826,7 @@ if $solution_possible { OR (b NOT NULL AND c IS NULL AND d NOT NULL) OR (b NOT NULL AND c NOT NULL AND d IS NULL) } - } {1 {no query solution}} + } {0 {}} } ############################################################################ # Test cases where terms inside an OR series are combined with AND terms From 56f1873d10c220ab17b147b424afafbca04cae2c Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 3 Jun 2020 15:59:22 +0000 Subject: [PATCH 031/186] Simplification to the interrupt handling logic in sqlite3VdbeExec() saves a few bytes of code space. FossilOrigin-Name: 43e0e59bd4e34c6e88c004ea951c0d76ff1cf0a034389f490495a5d12e239382 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 4 +--- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index c774d96b07..b492a8f95b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improve\sthe\squery\splanner\sso\sthat\sit\sis\sbetter\sable\sto\sfind\sfull\nindex\sscan\splan\swhen\sthere\sis\san\sINDEXED\sBY\sclause. -D 2020-06-03T03:00:09.331 +C Simplification\sto\sthe\sinterrupt\shandling\slogic\sin\ssqlite3VdbeExec()\ssaves\na\sfew\sbytes\sof\scode\sspace. +D 2020-06-03T15:59:22.719 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -605,7 +605,7 @@ F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c d7a61c1dfdac3eb091d43341a674032dca5a34e122f78ef0b5bd2d5a31967dde F src/util.c 3b6cedf7a0c69bd6e1acce832873952d416212d6293b18d03064e07d7a9b5118 F src/vacuum.c de9780b89fa4ee74c3534f60b94820e3179aca759ffc1338ee53cb4ea7693dd3 -F src/vdbe.c e3dba0dee25bc92e871c13cac655260912b3be4abcc85b439259c9934b208da3 +F src/vdbe.c 0b58285c791c7a7e6131b83197c9d80b08d2c4492519b14bd582f40ff951d095 F src/vdbe.h 07b8c636a87df8b6e58f29d6badd7f10d5844353deff1d7c88ed1c2bfe3bbd35 F src/vdbeInt.h 571413068b5ac07e2ed8ca7a02fa529622fd5455ae6981498376e5e492d2e5ef F src/vdbeapi.c e467b75a710ea099f8d2d022abf601d2ccd05e28f63b44b12d93000b6a75f4a8 @@ -1866,7 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P c6b7833ac7d9cc75cb45d5e8041367ebd6f197f776766e6143535c227fc72a20 -R 952d1a55f39aa3fb3430db1783a8d16a +P d901837fea1ed54de43ad59eb47c02cbfd2eb215fc57317b5ea8c22a7df947c4 +R 9a59f637e16d1db55166e5242085c5d1 U drh -Z 7e892dc73a9c345df1500a78da6d8191 +Z fa34faa1c48883dc3f1dada85dfce7a8 diff --git a/manifest.uuid b/manifest.uuid index 6e6181dfcb..787ee9eaf9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d901837fea1ed54de43ad59eb47c02cbfd2eb215fc57317b5ea8c22a7df947c4 \ No newline at end of file +43e0e59bd4e34c6e88c004ea951c0d76ff1cf0a034389f490495a5d12e239382 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index ce96439d1e..276c7979be 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -8015,8 +8015,6 @@ no_mem: */ abort_due_to_interrupt: assert( AtomicLoad(&db->u1.isInterrupted) ); - rc = db->mallocFailed ? SQLITE_NOMEM_BKPT : SQLITE_INTERRUPT; - p->rc = rc; - sqlite3VdbeError(p, "%s", sqlite3ErrStr(rc)); + rc = SQLITE_INTERRUPT; goto abort_due_to_error; } From a5f3fb3015e5195b7c124878adcc4439eca98236 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 3 Jun 2020 19:28:10 +0000 Subject: [PATCH 032/186] Fix for ticket [810dc8038872e212]. Thank to user "Maxulite" for tracking down the problem! FossilOrigin-Name: 89af93d77fa7959a4ee7364bae6c02c40963a3cdf80b0a4a8af9c9764d5c7bb5 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbe.c | 2 ++ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index b492a8f95b..ce42902a3c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Simplification\sto\sthe\sinterrupt\shandling\slogic\sin\ssqlite3VdbeExec()\ssaves\na\sfew\sbytes\sof\scode\sspace. -D 2020-06-03T15:59:22.719 +C Fix\sfor\sticket\s[810dc8038872e212].\s\sThank\sto\suser\s"Maxulite"\sfor\stracking\ndown\sthe\sproblem! +D 2020-06-03T19:28:10.752 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -605,7 +605,7 @@ F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 F src/utf.c d7a61c1dfdac3eb091d43341a674032dca5a34e122f78ef0b5bd2d5a31967dde F src/util.c 3b6cedf7a0c69bd6e1acce832873952d416212d6293b18d03064e07d7a9b5118 F src/vacuum.c de9780b89fa4ee74c3534f60b94820e3179aca759ffc1338ee53cb4ea7693dd3 -F src/vdbe.c 0b58285c791c7a7e6131b83197c9d80b08d2c4492519b14bd582f40ff951d095 +F src/vdbe.c a154f2785fbe4a1205944c647026445552ca3fa04ed1f313b05e614be205c061 F src/vdbe.h 07b8c636a87df8b6e58f29d6badd7f10d5844353deff1d7c88ed1c2bfe3bbd35 F src/vdbeInt.h 571413068b5ac07e2ed8ca7a02fa529622fd5455ae6981498376e5e492d2e5ef F src/vdbeapi.c e467b75a710ea099f8d2d022abf601d2ccd05e28f63b44b12d93000b6a75f4a8 @@ -1866,7 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P d901837fea1ed54de43ad59eb47c02cbfd2eb215fc57317b5ea8c22a7df947c4 -R 9a59f637e16d1db55166e5242085c5d1 +P 43e0e59bd4e34c6e88c004ea951c0d76ff1cf0a034389f490495a5d12e239382 +R d117a58d0c795ef2086dc59d9f0ad01c U drh -Z fa34faa1c48883dc3f1dada85dfce7a8 +Z 631114b7aaeb4e0342cd2238d03bd056 diff --git a/manifest.uuid b/manifest.uuid index 787ee9eaf9..51a4ca0c33 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -43e0e59bd4e34c6e88c004ea951c0d76ff1cf0a034389f490495a5d12e239382 \ No newline at end of file +89af93d77fa7959a4ee7364bae6c02c40963a3cdf80b0a4a8af9c9764d5c7bb5 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 276c7979be..f26b64680b 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -702,6 +702,8 @@ int sqlite3VdbeExec( goto no_mem; } assert( p->rc==SQLITE_OK || (p->rc&0xff)==SQLITE_BUSY ); + testcase( p->rc!=SQLITE_OK ); + p->rc = SQLITE_OK; assert( p->bIsReader || p->readOnly!=0 ); p->iCurrentTime = 0; assert( p->explain==0 ); From 21b473de781e05c32cf609d3e7472730bca0aa08 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 4 Jun 2020 02:50:47 +0000 Subject: [PATCH 033/186] Work around a bug in clang-11.0.0. FossilOrigin-Name: 3c2bf8042ec46195c67dfd91df084f5bc19162fd26389920e716b310c80deea6 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/utf.c | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index ce42902a3c..755b3d647c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sfor\sticket\s[810dc8038872e212].\s\sThank\sto\suser\s"Maxulite"\sfor\stracking\ndown\sthe\sproblem! -D 2020-06-03T19:28:10.752 +C Work\saround\sa\sbug\sin\sclang-11.0.0. +D 2020-06-04T02:50:47.244 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -602,7 +602,7 @@ F src/treeview.c 9df54af6e5830fd527496e62ae0148e1ba33197205d8e232c2826537d42d406 F src/trigger.c 4ada1037cc99777f647a882cdacbd1a4deb6567b69daf02946286401b88cdc04 F src/update.c 3199098455830fc2d8c8fc4ae3ec2ea513eef64339ae9a7048db62b21169bc7a F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 -F src/utf.c d7a61c1dfdac3eb091d43341a674032dca5a34e122f78ef0b5bd2d5a31967dde +F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 3b6cedf7a0c69bd6e1acce832873952d416212d6293b18d03064e07d7a9b5118 F src/vacuum.c de9780b89fa4ee74c3534f60b94820e3179aca759ffc1338ee53cb4ea7693dd3 F src/vdbe.c a154f2785fbe4a1205944c647026445552ca3fa04ed1f313b05e614be205c061 @@ -1866,7 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 43e0e59bd4e34c6e88c004ea951c0d76ff1cf0a034389f490495a5d12e239382 -R d117a58d0c795ef2086dc59d9f0ad01c +P 89af93d77fa7959a4ee7364bae6c02c40963a3cdf80b0a4a8af9c9764d5c7bb5 +R 015d7b0bbb01693da2e969fcd700008e U drh -Z 631114b7aaeb4e0342cd2238d03bd056 +Z e60d8b817ea3e4ea751ceb5512848057 diff --git a/manifest.uuid b/manifest.uuid index 51a4ca0c33..d498a3e122 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -89af93d77fa7959a4ee7364bae6c02c40963a3cdf80b0a4a8af9c9764d5c7bb5 \ No newline at end of file +3c2bf8042ec46195c67dfd91df084f5bc19162fd26389920e716b310c80deea6 \ No newline at end of file diff --git a/src/utf.c b/src/utf.c index 3a2becfbcc..5f27babdfc 100644 --- a/src/utf.c +++ b/src/utf.c @@ -342,9 +342,9 @@ SQLITE_NOINLINE int sqlite3VdbeMemTranslate(Mem *pMem, u8 desiredEnc){ *z = 0; assert( (pMem->n+(desiredEnc==SQLITE_UTF8?1:2))<=len ); - c = pMem->flags; + c = MEM_Str|MEM_Term|(pMem->flags&(MEM_AffMask|MEM_Subtype)); sqlite3VdbeMemRelease(pMem); - pMem->flags = MEM_Str|MEM_Term|(c&(MEM_AffMask|MEM_Subtype)); + pMem->flags = c; pMem->enc = desiredEnc; pMem->z = (char*)zOut; pMem->zMalloc = pMem->z; From ec206a7d34c7fc36c71087d0eb3ac9cb8cb4a59b Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 4 Jun 2020 16:07:51 +0000 Subject: [PATCH 034/186] Use AtomicStore() to set values in the wal-index hash table. FossilOrigin-Name: 1ab30c75f2fe14d1ee77d0eace4e29ba8f805d63e2da0897b111ea1311f409aa --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/wal.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 755b3d647c..352bef62bf 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Work\saround\sa\sbug\sin\sclang-11.0.0. -D 2020-06-04T02:50:47.244 +C Use\sAtomicStore()\sto\sset\svalues\sin\sthe\swal-index\shash\stable. +D 2020-06-04T16:07:51.338 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -617,7 +617,7 @@ F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143 F src/vdbevtab.c ee5b4c902fdda2230f9503ac7b84c6d614c91e8f6f4dc1633e2e8dfef8ffb144 F src/vtab.c 7b452592ed2ee95dedb1f323d557cebede5a6f3b4558b21a5dca527e6ae9b12c F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 04c3d2a673192016a671eb051a1900945a8c7331f4378636a8bfb70e8e596c84 +F src/wal.c 231044ecf7d5d78bc705af9dcec6c10ec59e891366362b6be54bb6a0bc7c17db F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a F src/walker.c 3df26a33dc4f54e8771600fb7fdebe1ece0896c2ad68c30ab40b017aa4395049 F src/where.c 7bcc07ff56d03d73308245135d96de46d2faeaee628bd4badf0bae60ae6a31fe @@ -1866,7 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 89af93d77fa7959a4ee7364bae6c02c40963a3cdf80b0a4a8af9c9764d5c7bb5 -R 015d7b0bbb01693da2e969fcd700008e -U drh -Z e60d8b817ea3e4ea751ceb5512848057 +P 3c2bf8042ec46195c67dfd91df084f5bc19162fd26389920e716b310c80deea6 +R abb5e2a6f69eedf6a5a3f76fdbc7fd1a +U dan +Z ec12bc606d4dba66db05b4caac700c1f diff --git a/manifest.uuid b/manifest.uuid index d498a3e122..3e9e59cbde 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3c2bf8042ec46195c67dfd91df084f5bc19162fd26389920e716b310c80deea6 \ No newline at end of file +1ab30c75f2fe14d1ee77d0eace4e29ba8f805d63e2da0897b111ea1311f409aa \ No newline at end of file diff --git a/src/wal.c b/src/wal.c index 52087e1296..c6d4476e7b 100644 --- a/src/wal.c +++ b/src/wal.c @@ -1096,7 +1096,7 @@ static int walIndexAppend(Wal *pWal, u32 iFrame, u32 iPage){ if( (nCollide--)==0 ) return SQLITE_CORRUPT_BKPT; } sLoc.aPgno[idx] = iPage; - sLoc.aHash[iKey] = (ht_slot)idx; + AtomicStore(&sLoc.aHash[iKey], (ht_slot)idx); #ifdef SQLITE_ENABLE_EXPENSIVE_ASSERT /* Verify that the number of entries in the hash table exactly equals From b55389412fbce88965cc897ff25630527fa8db30 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 4 Jun 2020 16:34:49 +0000 Subject: [PATCH 035/186] Use __has_extension(c_atomic) instead of __has_feature(c_atomic) to detect support for atomic load and store operations with clang. FossilOrigin-Name: 362255791f8801e0d9869e36239b8b2cb29c38bf0b86894bd2d159ce46d8447e --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqliteInt.h | 6 +++--- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 352bef62bf..7e6a1fc4d7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\sAtomicStore()\sto\sset\svalues\sin\sthe\swal-index\shash\stable. -D 2020-06-04T16:07:51.338 +C Use\s__has_extension(c_atomic)\sinstead\sof\s__has_feature(c_atomic)\sto\sdetect\ssupport\sfor\satomic\sload\sand\sstore\soperations\swith\sclang. +D 2020-06-04T16:34:49.514 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -538,7 +538,7 @@ F src/shell.c.in 9c0e886561b9a9644a4134e29e4b7d08eb16690da47a9de6bea082183d527ad F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 -F src/sqliteInt.h 37f74544c8e2f59a16d1b13e6847bc02fb3fcbbfae4d6e6342c7a94c3a3984a5 +F src/sqliteInt.h f5e422635c089adf60260e1947ecfaf68dd333bda20c2afdd60323357d8540a0 F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032 F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -1866,7 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 3c2bf8042ec46195c67dfd91df084f5bc19162fd26389920e716b310c80deea6 -R abb5e2a6f69eedf6a5a3f76fdbc7fd1a +P 1ab30c75f2fe14d1ee77d0eace4e29ba8f805d63e2da0897b111ea1311f409aa +R 2523b78414a8ebd8b46ab8adc56999f4 U dan -Z ec12bc606d4dba66db05b4caac700c1f +Z 865312b054fec1ad1eb5fd8a39501f1b diff --git a/manifest.uuid b/manifest.uuid index 3e9e59cbde..b99e055ff3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1ab30c75f2fe14d1ee77d0eace4e29ba8f805d63e2da0897b111ea1311f409aa \ No newline at end of file +362255791f8801e0d9869e36239b8b2cb29c38bf0b86894bd2d159ce46d8447e \ No newline at end of file diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 122e26ad73..e37ed673af 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -190,10 +190,10 @@ ** WAL mode depends on atomic aligned 32-bit loads and stores in a few ** places. The following macros try to make this explicit. */ -#ifndef __has_feature -# define __has_feature(x) 0 /* compatibility with non-clang compilers */ +#ifndef __has_extension +# define __has_extension(x) 0 /* compatibility with non-clang compilers */ #endif -#if GCC_VERSION>=4007000 || __has_feature(c_atomic) +#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 634af38115702866491380736bcebc571c623507 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 4 Jun 2020 16:54:10 +0000 Subject: [PATCH 036/186] Improved display of ".mode table" output for empty result sets. FossilOrigin-Name: 7efabd683b79743b407ad71dda56db00fb0d668828bdc342145816b4f1c3bf3a --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c.in | 4 ++++ 3 files changed, 12 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 7e6a1fc4d7..d3d3f40fed 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\s__has_extension(c_atomic)\sinstead\sof\s__has_feature(c_atomic)\sto\sdetect\ssupport\sfor\satomic\sload\sand\sstore\soperations\swith\sclang. -D 2020-06-04T16:34:49.514 +C Improved\sdisplay\sof\s".mode\stable"\soutput\sfor\sempty\sresult\ssets. +D 2020-06-04T16:54:10.263 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -534,7 +534,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 39a00a8bc89596dfb37c16afcbb1d33de5085b9963564b58aafe1566d08c0881 -F src/shell.c.in 9c0e886561b9a9644a4134e29e4b7d08eb16690da47a9de6bea082183d527adf +F src/shell.c.in b8fd54e80021c9aed59c4f8ef7d8a68167aea3b2c5f8cc80e6ca373fb146cdba F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 @@ -1866,7 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1ab30c75f2fe14d1ee77d0eace4e29ba8f805d63e2da0897b111ea1311f409aa -R 2523b78414a8ebd8b46ab8adc56999f4 -U dan -Z 865312b054fec1ad1eb5fd8a39501f1b +P 362255791f8801e0d9869e36239b8b2cb29c38bf0b86894bd2d159ce46d8447e +R e25e15e7d406e657ad2786c9bbcb9942 +U drh +Z acf5bed5cb288b39151d44a020264134 diff --git a/manifest.uuid b/manifest.uuid index b99e055ff3..ba2429e47f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -362255791f8801e0d9869e36239b8b2cb29c38bf0b86894bd2d159ce46d8447e \ No newline at end of file +7efabd683b79743b407ad71dda56db00fb0d668828bdc342145816b4f1c3bf3a \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index ca2b408e58..bd78165e6b 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -2978,6 +2978,10 @@ static void exec_prepared_stmt_columnar( sqlite3_free_table(azData); return; } + if( nRow==0 || nColumn==0 ){ + sqlite3_free_table(azData); + return; + } if( nColumn>p->nWidth ){ p->colWidth = realloc(p->colWidth, nColumn*2*sizeof(int)); if( p->colWidth==0 ) shell_out_of_memory(); From 0908e3853675b41f3070bb8178e51a7b4f2f844e Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 4 Jun 2020 18:05:39 +0000 Subject: [PATCH 037/186] Add support for "box" mode in the CLI: Like "table" except that it uses unicode box-drawing characters instead of ascii-art. FossilOrigin-Name: 6da784c9e174744d6deeb76c553b515b96c1fcb80c55a281e476959ec680fb72 --- manifest | 14 ++-- manifest.uuid | 2 +- src/shell.c.in | 185 ++++++++++++++++++++++++++++++++++++++--------- test/shell1.test | 12 +-- 4 files changed, 164 insertions(+), 49 deletions(-) diff --git a/manifest b/manifest index d3d3f40fed..e3723f551c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\sdisplay\sof\s".mode\stable"\soutput\sfor\sempty\sresult\ssets. -D 2020-06-04T16:54:10.263 +C Add\ssupport\sfor\s"box"\smode\sin\sthe\sCLI:\s\sLike\s"table"\sexcept\sthat\sit\suses\nunicode\sbox-drawing\scharacters\sinstead\sof\sascii-art. +D 2020-06-04T18:05:39.066 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -534,7 +534,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 39a00a8bc89596dfb37c16afcbb1d33de5085b9963564b58aafe1566d08c0881 -F src/shell.c.in b8fd54e80021c9aed59c4f8ef7d8a68167aea3b2c5f8cc80e6ca373fb146cdba +F src/shell.c.in 6f7ea57d3f15e7e6a1f7049b6b7e39589dd5fe114e8de034ae9a68bf7722fd40 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 @@ -1338,7 +1338,7 @@ F test/sharedA.test 49d87ec54ab640fbbc3786ee3c01de94aaa482a3a9f834ad3fe92770eb69 F test/sharedB.test 16cc7178e20965d75278f410943109b77b2e645e F test/shared_err.test 32634e404a3317eeb94abc7a099c556a346fdb8fb3858dbe222a4cbb8926a939 F test/sharedlock.test 5ede3c37439067c43b0198f580fd374ebf15d304 -F test/shell1.test 1c4713ccec468f9300100d5e1419b414b8dcccc742978ad8942e8bd31d2adc9c +F test/shell1.test fabf21eea2c6bb04dd86dfc7441c7c14841b25e2540c1fffeae815e718625bcc F test/shell2.test e242a9912f44f4c23c3d1d802a83e934e84c853b F test/shell3.test ac8c2b744014c3e9a0e26bfd829ab65f00923dc1a91ffd044863e9423cc91494 F test/shell4.test 1c6aef11daaa2d6830acaba3ac9cbec93fbc1c3d5530743a637f39b3987d08ce @@ -1866,7 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 362255791f8801e0d9869e36239b8b2cb29c38bf0b86894bd2d159ce46d8447e -R e25e15e7d406e657ad2786c9bbcb9942 +P 7efabd683b79743b407ad71dda56db00fb0d668828bdc342145816b4f1c3bf3a +R 3dac6f750121e41150b03b7c089ed222 U drh -Z acf5bed5cb288b39151d44a020264134 +Z e00f940b0330d0b11d881b13cbeefb56 diff --git a/manifest.uuid b/manifest.uuid index ba2429e47f..93e7eee675 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7efabd683b79743b407ad71dda56db00fb0d668828bdc342145816b4f1c3bf3a \ No newline at end of file +6da784c9e174744d6deeb76c553b515b96c1fcb80c55a281e476959ec680fb72 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index bd78165e6b..e46188e4ec 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -1194,6 +1194,7 @@ struct ShellState { #define MODE_Json 13 /* Output JSON */ #define MODE_Markdown 14 /* Markdown formatting */ #define MODE_Table 15 /* MySQL-style table formatting */ +#define MODE_Box 16 /* Unicode box-drawing characters */ static const char *modeDescr[] = { "line", @@ -1211,7 +1212,8 @@ static const char *modeDescr[] = { "eqp", "json", "markdown", - "table" + "table", + "box" }; /* @@ -1936,7 +1938,7 @@ static void print_dashes(FILE *out, int N){ } /* -** Print a markdown or table-style row separator +** Print a markdown or table-style row separator using ascii-art */ static void print_row_separator( ShellState *p, @@ -1944,11 +1946,15 @@ static void print_row_separator( const char *zSep ){ int i; - for(i=0; i0 ){ + fputs(zSep, p->out); + print_dashes(p->out, p->actualWidth[0]+2); + for(i=1; iout); + print_dashes(p->out, p->actualWidth[i]+2); + } fputs(zSep, p->out); - print_dashes(p->out, p->actualWidth[i]+2); } - fputs(zSep, p->out); fputs("\n", p->out); } @@ -2947,9 +2953,76 @@ static void bind_prepared_stmt(ShellState *pArg, sqlite3_stmt *pStmt){ sqlite3_finalize(pQ); } +/* +** UTF8 box-drawing characters. Imagine box lines like this: +** +** 1 +** | +** 4 --+-- 2 +** | +** 3 +** +** Each box characters has between 2 and 4 of the lines leading from +** the center. The characters are here identified by the numbers of +** their corresponding lines. +*/ +#define BOX_24 "\342\224\200" /* U+2500 --- */ +#define BOX_13 "\342\224\202" /* U+2502 | */ +#define BOX_23 "\342\224\214" /* U+250c ,- */ +#define BOX_34 "\342\224\220" /* U+2510 -, */ +#define BOX_12 "\342\224\224" /* U+2514 '- */ +#define BOX_14 "\342\224\230" /* U+2518 -' */ +#define BOX_123 "\342\224\234" /* U+251c |- */ +#define BOX_134 "\342\224\244" /* U+2524 -| */ +#define BOX_234 "\342\224\254" /* U+252c -,- */ +#define BOX_124 "\342\224\264" /* U+2534 -'- */ +#define BOX_1234 "\342\224\274" /* U+253c -|- */ + +/* Draw horizontal line N characters long using unicode box +** characters +*/ +static void print_box_line(FILE *out, int N){ + const char zDash[] = + BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 + BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24 BOX_24; + const int nDash = sizeof(zDash) - 1; + N *= 3; + while( N>nDash ){ + utf8_printf(out, zDash); + N -= nDash; + } + utf8_printf(out, "%.*s", N, zDash); +} + +/* +** Draw a horizontal separator for a MODE_Box table. +*/ +static void print_box_row_separator( + ShellState *p, + int nArg, + const char *zSep1, + const char *zSep2, + const char *zSep3 +){ + int i; + if( nArg>0 ){ + utf8_printf(p->out, "%s", zSep1); + print_box_line(p->out, p->actualWidth[0]+2); + for(i=1; iout, "%s", zSep2); + print_box_line(p->out, p->actualWidth[i]+2); + } + utf8_printf(p->out, "%s", zSep3); + } + fputs("\n", p->out); +} + + + /* ** Run a prepared statement and output the result in one of the -** table-oriented formats: MODE_Column, MODE_Markdown, or MODE_Table. +** table-oriented formats: MODE_Column, MODE_Markdown, MODE_Table, +** or MODE_Box. ** ** This is different from ordinary exec_prepared_stmt() in that ** it has to run the entire query and gather the results into memory @@ -2967,8 +3040,8 @@ static void exec_prepared_stmt_columnar( const char *z; int rc; int i, j, nTotal, w, n; - const char *colSep; - const char *rowSep; + const char *colSep = 0; + const char *rowSep = 0; rc = sqlite3_get_table(p->db, sqlite3_sql(pStmt), &azData, &nRow, &nColumn, &zMsg); @@ -3003,50 +3076,87 @@ static void exec_prepared_stmt_columnar( j = i%nColumn; if( n>p->actualWidth[j] ) p->actualWidth[j] = n; } - if( p->cMode==MODE_Column ){ - colSep = " "; - rowSep = "\n"; - if( p->showHeader ){ + switch( p->cMode ){ + case MODE_Column: { + colSep = " "; + rowSep = "\n"; + if( p->showHeader ){ + for(i=0; iactualWidth[i]; + if( p->colWidth[i]<0 ) w = -w; + utf8_width_print(p->out, w, azData[i]); + fputs(i==nColumn-1?"\n":" ", p->out); + } + for(i=0; iout, p->actualWidth[i]); + fputs(i==nColumn-1?"\n":" ", p->out); + } + } + break; + } + case MODE_Table: { + colSep = " | "; + rowSep = " |\n"; + print_row_separator(p, nColumn, "+"); + fputs("| ", p->out); for(i=0; iactualWidth[i]; - if( p->colWidth[i]<0 ) w = -w; - utf8_width_print(p->out, w, azData[i]); - fputs(i==nColumn-1?"\n":" ", p->out); + n = strlenChar(azData[i]); + utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, ""); + fputs(i==nColumn-1?" |\n":" | ", p->out); } + print_row_separator(p, nColumn, "+"); + break; + } + case MODE_Markdown: { + colSep = " | "; + rowSep = " |\n"; + fputs("| ", p->out); for(i=0; iout, p->actualWidth[i]); - fputs(i==nColumn-1?"\n":" ", p->out); + w = p->actualWidth[i]; + n = strlenChar(azData[i]); + utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, ""); + fputs(i==nColumn-1?" |\n":" | ", p->out); } + print_row_separator(p, nColumn, "|"); + break; } - }else{ - colSep = " | "; - rowSep = " |\n"; - if( p->cMode==MODE_Table ) print_row_separator(p, nColumn, "+"); - fputs("| ", p->out); - for(i=0; iactualWidth[i]; - n = strlenChar(azData[i]); - utf8_printf(p->out, "%*s%s%*s", (w-n)/2, "", azData[i], (w-n+1)/2, ""); - fputs(i==nColumn-1?" |\n":" | ", p->out); + case MODE_Box: { + colSep = " " BOX_13 " "; + rowSep = " " BOX_13 "\n"; + print_box_row_separator(p, nColumn, BOX_23, BOX_234, BOX_34); + utf8_printf(p->out, BOX_13 " "); + for(i=0; iactualWidth[i]; + n = strlenChar(azData[i]); + utf8_printf(p->out, "%*s%s%*s%s", + (w-n)/2, "", azData[i], (w-n+1)/2, "", + i==nColumn-1?" "BOX_13"\n":" "BOX_13" "); + } + print_box_row_separator(p, nColumn, BOX_123, BOX_1234, BOX_134); + break; } - print_row_separator(p, nColumn, p->cMode==MODE_Table ? "+" : "|"); } for(i=nColumn, j=0; icMode!=MODE_Column ) fputs("| ", p->out); + if( j==0 && p->cMode!=MODE_Column ){ + utf8_printf(p->out, "%s", p->cMode==MODE_Box?BOX_13" ":"| "); + } z = azData[i]; if( z==0 ) z = p->nullValue; w = p->actualWidth[j]; if( p->colWidth[j]<0 ) w = -w; utf8_width_print(p->out, w, z); if( j==nColumn-1 ){ - fputs(rowSep, p->out); + utf8_printf(p->out, "%s", rowSep); j = -1; }else{ - fputs(colSep, p->out); + utf8_printf(p->out, "%s", colSep); } } if( p->cMode==MODE_Table ){ print_row_separator(p, nColumn, "+"); + }else if( p->cMode==MODE_Box ){ + print_box_row_separator(p, nColumn, BOX_12, BOX_124, BOX_14); } sqlite3_free_table(azData); } @@ -3062,6 +3172,7 @@ static void exec_prepared_stmt( if( pArg->cMode==MODE_Column || pArg->cMode==MODE_Table + || pArg->cMode==MODE_Box || pArg->cMode==MODE_Markdown ){ exec_prepared_stmt_columnar(pArg, pStmt); @@ -3115,9 +3226,7 @@ static void exec_prepared_stmt( } } while( SQLITE_ROW == rc ); sqlite3_free(pData); - if( pArg->cMode==MODE_Table ){ - print_row_separator(pArg, nCol, "+"); - }else if( pArg->cMode==MODE_Json ){ + if( pArg->cMode==MODE_Json ){ fputs("]\n", pArg->out); } } @@ -3801,6 +3910,7 @@ static const char *(azHelp[]) = { ".mode MODE ?TABLE? Set output mode", " MODE is one of:", " ascii Columns/rows delimited by 0x1F and 0x1E", + " box Tables using unicode box-drawing characters", " csv Comma-separated values", " column Output in columns. (See .width)", " html HTML
code", @@ -8414,13 +8524,15 @@ static int do_meta_command(char *zLine, ShellState *p){ p->mode = MODE_Markdown; }else if( c2=='t' && strncmp(azArg[1],"table",n2)==0 ){ p->mode = MODE_Table; + }else if( c2=='b' && strncmp(azArg[1],"box",n2)==0 ){ + p->mode = MODE_Box; }else if( c2=='j' && strncmp(azArg[1],"json",n2)==0 ){ p->mode = MODE_Json; }else if( nArg==1 ){ raw_printf(p->out, "current output mode: %s\n", modeDescr[p->mode]); }else{ raw_printf(stderr, "Error: mode should be one of: " - "ascii column csv html insert json line list markdown " + "ascii box column csv html insert json line list markdown " "quote table tabs tcl\n"); rc = 1; } @@ -10420,6 +10532,7 @@ static const char zOptions[] = " -ascii set output mode to 'ascii'\n" " -bail stop after hitting an error\n" " -batch force batch I/O\n" + " -box set output mode to 'box'\n" " -column set output mode to 'column'\n" " -cmd COMMAND run \"COMMAND\" before reading stdin\n" " -csv set output mode to 'csv'\n" @@ -10867,6 +10980,8 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){ data.mode = MODE_Markdown; }else if( strcmp(z,"-table")==0 ){ data.mode = MODE_Table; + }else if( strcmp(z,"-box")==0 ){ + data.mode = MODE_Box; }else if( strcmp(z,"-csv")==0 ){ data.mode = MODE_Csv; memcpy(data.colSeparator,",",2); diff --git a/test/shell1.test b/test/shell1.test index a900dc3e1d..b08e111804 100644 --- a/test/shell1.test +++ b/test/shell1.test @@ -199,10 +199,10 @@ do_test shell1-2.2.4 { } {0 {}} do_test shell1-2.2.5 { catchcmd "test.db" ".mode \"insert FOO" -} {1 {Error: mode should be one of: ascii column csv html insert json line list markdown quote table tabs tcl}} +} {1 {Error: mode should be one of: ascii box column csv html insert json line list markdown quote table tabs tcl}} do_test shell1-2.2.6 { catchcmd "test.db" ".mode \'insert FOO" -} {1 {Error: mode should be one of: ascii column csv html insert json line list markdown quote table tabs tcl}} +} {1 {Error: mode should be one of: ascii box column csv html insert json line list markdown quote table tabs tcl}} # check multiple tokens, and quoted tokens do_test shell1-2.3.1 { @@ -230,7 +230,7 @@ do_test shell1-2.3.7 { # check quoted args are unquoted do_test shell1-2.4.1 { catchcmd "test.db" ".mode FOO" -} {1 {Error: mode should be one of: ascii column csv html insert json line list markdown quote table tabs tcl}} +} {1 {Error: mode should be one of: ascii box column csv html insert json line list markdown quote table tabs tcl}} do_test shell1-2.4.2 { catchcmd "test.db" ".mode csv" } {0 {}} @@ -430,7 +430,7 @@ do_test shell1-3.13.1 { } {0 {current output mode: list}} do_test shell1-3.13.2 { catchcmd "test.db" ".mode FOO" -} {1 {Error: mode should be one of: ascii column csv html insert json line list markdown quote table tabs tcl}} +} {1 {Error: mode should be one of: ascii box column csv html insert json line list markdown quote table tabs tcl}} do_test shell1-3.13.3 { catchcmd "test.db" ".mode csv" } {0 {}} @@ -463,10 +463,10 @@ do_test shell1-3.13.11 { # don't allow partial mode type matches do_test shell1-3.13.12 { catchcmd "test.db" ".mode l" -} {1 {Error: mode should be one of: ascii column csv html insert json line list markdown quote table tabs tcl}} +} {1 {Error: mode should be one of: ascii box column csv html insert json line list markdown quote table tabs tcl}} do_test shell1-3.13.13 { catchcmd "test.db" ".mode li" -} {1 {Error: mode should be one of: ascii column csv html insert json line list markdown quote table tabs tcl}} +} {1 {Error: mode should be one of: ascii box column csv html insert json line list markdown quote table tabs tcl}} do_test shell1-3.13.14 { catchcmd "test.db" ".mode lin" } {0 {}} From c06050844565a59ca3c11f09c3ffecf1d609fd9b Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 5 Jun 2020 00:54:27 +0000 Subject: [PATCH 038/186] Always use ?...? to indicate optional arguments in the output of ".help" in the CLI. Change ".mode column" so that it automatically activates ".headers on" if headers have not been previously turned on or off. FossilOrigin-Name: 2827c0a186596299e43eb3e7378eea462d2b060b2c3388ce5cb2bc8e0b43999e --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c.in | 7 ++++++- test/shell1.test | 4 ++-- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index e3723f551c..c60045179c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\ssupport\sfor\s"box"\smode\sin\sthe\sCLI:\s\sLike\s"table"\sexcept\sthat\sit\suses\nunicode\sbox-drawing\scharacters\sinstead\sof\sascii-art. -D 2020-06-04T18:05:39.066 +C Always\suse\s?...?\sto\sindicate\soptional\sarguments\sin\sthe\soutput\sof\s".help"\nin\sthe\sCLI.\s\sChange\s".mode\scolumn"\sso\sthat\sit\sautomatically\sactivates\n".headers\son"\sif\sheaders\shave\snot\sbeen\spreviously\sturned\son\sor\soff. +D 2020-06-05T00:54:27.575 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -534,7 +534,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 F src/select.c 39a00a8bc89596dfb37c16afcbb1d33de5085b9963564b58aafe1566d08c0881 -F src/shell.c.in 6f7ea57d3f15e7e6a1f7049b6b7e39589dd5fe114e8de034ae9a68bf7722fd40 +F src/shell.c.in c6e26593f2738eefded08a39204bf6b48db135cdfaa458c26ffe57055b4fe365 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 @@ -1338,7 +1338,7 @@ F test/sharedA.test 49d87ec54ab640fbbc3786ee3c01de94aaa482a3a9f834ad3fe92770eb69 F test/sharedB.test 16cc7178e20965d75278f410943109b77b2e645e F test/shared_err.test 32634e404a3317eeb94abc7a099c556a346fdb8fb3858dbe222a4cbb8926a939 F test/sharedlock.test 5ede3c37439067c43b0198f580fd374ebf15d304 -F test/shell1.test fabf21eea2c6bb04dd86dfc7441c7c14841b25e2540c1fffeae815e718625bcc +F test/shell1.test a1cf47c5e110560ff25a714570bfd53bfaceeb61db5cad3072a4064f17ebd10e F test/shell2.test e242a9912f44f4c23c3d1d802a83e934e84c853b F test/shell3.test ac8c2b744014c3e9a0e26bfd829ab65f00923dc1a91ffd044863e9423cc91494 F test/shell4.test 1c6aef11daaa2d6830acaba3ac9cbec93fbc1c3d5530743a637f39b3987d08ce @@ -1866,7 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7efabd683b79743b407ad71dda56db00fb0d668828bdc342145816b4f1c3bf3a -R 3dac6f750121e41150b03b7c089ed222 +P 6da784c9e174744d6deeb76c553b515b96c1fcb80c55a281e476959ec680fb72 +R 969ac1a40c6ff55758c13b258f83a246 U drh -Z e00f940b0330d0b11d881b13cbeefb56 +Z 0d6660a390bea97335acfad3a03d0eb7 diff --git a/manifest.uuid b/manifest.uuid index 93e7eee675..dd798eb824 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6da784c9e174744d6deeb76c553b515b96c1fcb80c55a281e476959ec680fb72 \ No newline at end of file +2827c0a186596299e43eb3e7378eea462d2b060b2c3388ce5cb2bc8e0b43999e \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index e46188e4ec..d1b1203ebe 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -1167,6 +1167,7 @@ struct ShellState { #define SHFLG_Newlines 0x00000010 /* .dump --newline flag */ #define SHFLG_CountChanges 0x00000020 /* .changes setting */ #define SHFLG_Echo 0x00000040 /* .echo or --echo setting */ +#define SHFLG_HeaderSet 0x00000080 /* .header has been used */ /* ** Macros for testing and setting shellFlgs @@ -3930,7 +3931,7 @@ static const char *(azHelp[]) = { " -e Send output to the system text editor", " -x Send output as CSV to a spreadsheet (same as \".excel\")", #ifdef SQLITE_DEBUG - ".oom [--repeat M] [N] Simulate an OOM error on the N-th allocation", + ".oom ?--repeat M? ?N? Simulate an OOM error on the N-th allocation", #endif ".open ?OPTIONS? ?FILE? Close existing database and reopen FILE", " Options:", @@ -7969,6 +7970,7 @@ static int do_meta_command(char *zLine, ShellState *p){ if( c=='h' && strncmp(azArg[0], "headers", n)==0 ){ if( nArg==2 ){ p->showHeader = booleanValue(azArg[1]); + p->shellFlgs |= SHFLG_HeaderSet; }else{ raw_printf(stderr, "Usage: .headers on|off\n"); rc = 1; @@ -8491,6 +8493,9 @@ static int do_meta_command(char *zLine, ShellState *p){ sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); }else if( c2=='c' && strncmp(azArg[1],"columns",n2)==0 ){ p->mode = MODE_Column; + if( (p->shellFlgs & SHFLG_HeaderSet)==0 ){ + p->showHeader = 1; + } sqlite3_snprintf(sizeof(p->rowSeparator), p->rowSeparator, SEP_Row); }else if( c2=='l' && n2>2 && strncmp(azArg[1],"list",n2)==0 ){ p->mode = MODE_List; diff --git a/test/shell1.test b/test/shell1.test index b08e111804..49af3aa35d 100644 --- a/test/shell1.test +++ b/test/shell1.test @@ -709,11 +709,11 @@ do_test shell1-3.26.4 { # this should be treated the same as a '1' width for col 1 and 2 } {0 {}} do_test shell1-3.26.5 { - catchcmd "test.db" ".mode column\n.width 10 -10\nSELECT 'abcdefg', 123456;" + catchcmd "test.db" ".mode column\n.header off\n.width 10 -10\nSELECT 'abcdefg', 123456;" # this should be treated the same as a '1' width for col 1 and 2 } {0 {abcdefg 123456}} do_test shell1-3.26.6 { - catchcmd "test.db" ".mode column\n.width -10 10\nSELECT 'abcdefg', 123456;" + catchcmd "test.db" ".mode column\n.header off\n.width -10 10\nSELECT 'abcdefg', 123456;" # this should be treated the same as a '1' width for col 1 and 2 } {0 { abcdefg 123456 }} From a0365c487c1267af6d3ab101399c6fa35f5184a3 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 5 Jun 2020 04:01:50 +0000 Subject: [PATCH 039/186] In the debugging treeview output, change the name of "SELECT-expr" expression nodes to be "subquery-expr", so as to not confuse them with actual SELECT nodes. FossilOrigin-Name: c1c8937a30feff6aa4385b0c264fd8e70d54422a0629c2ce38082d85d3334a57 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/treeview.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index c60045179c..ca4608031d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Always\suse\s?...?\sto\sindicate\soptional\sarguments\sin\sthe\soutput\sof\s".help"\nin\sthe\sCLI.\s\sChange\s".mode\scolumn"\sso\sthat\sit\sautomatically\sactivates\n".headers\son"\sif\sheaders\shave\snot\sbeen\spreviously\sturned\son\sor\soff. -D 2020-06-05T00:54:27.575 +C In\sthe\sdebugging\streeview\soutput,\schange\sthe\sname\sof\s"SELECT-expr"\sexpression\nnodes\sto\sbe\s"subquery-expr",\sso\sas\sto\snot\sconfuse\sthem\swith\sactual\sSELECT\nnodes. +D 2020-06-05T04:01:50.831 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -598,7 +598,7 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c eee7bae3ec0bc4abee951554bf46a8ba567c0f7752ac90c820ed8afff4c612dc -F src/treeview.c 9df54af6e5830fd527496e62ae0148e1ba33197205d8e232c2826537d42d4063 +F src/treeview.c c5691babcd558baa136474b57a4aede45cf68daa3ed6637b981dde4b256e5b67 F src/trigger.c 4ada1037cc99777f647a882cdacbd1a4deb6567b69daf02946286401b88cdc04 F src/update.c 3199098455830fc2d8c8fc4ae3ec2ea513eef64339ae9a7048db62b21169bc7a F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 @@ -1866,7 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 6da784c9e174744d6deeb76c553b515b96c1fcb80c55a281e476959ec680fb72 -R 969ac1a40c6ff55758c13b258f83a246 +P 2827c0a186596299e43eb3e7378eea462d2b060b2c3388ce5cb2bc8e0b43999e +R ee30fc3f51275fe44c86656d5c06c7d7 U drh -Z 0d6660a390bea97335acfad3a03d0eb7 +Z bb7b42e3c07b2ab8975730fed03b093c diff --git a/manifest.uuid b/manifest.uuid index dd798eb824..5c9bd2c32c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2827c0a186596299e43eb3e7378eea462d2b060b2c3388ce5cb2bc8e0b43999e \ No newline at end of file +c1c8937a30feff6aa4385b0c264fd8e70d54422a0629c2ce38082d85d3334a57 \ No newline at end of file diff --git a/src/treeview.c b/src/treeview.c index f167e588cd..8ae06261ea 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -616,7 +616,7 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ break; } case TK_SELECT: { - sqlite3TreeViewLine(pView, "SELECT-expr flags=0x%x", pExpr->flags); + sqlite3TreeViewLine(pView, "subquery-expr flags=0x%x", pExpr->flags); sqlite3TreeViewSelect(pView, pExpr->x.pSelect, 0); break; } From 896366282dae3789fb277c2dad8660784a0895a3 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 7 Jun 2020 17:33:18 +0000 Subject: [PATCH 040/186] Alternative fix to ticket [c8d3b9f0a750a529]: Prior to deleting or modifying an Expr not that is referenced by an AggInfo, modify the AggInfo to get its own copy of the original Expr. FossilOrigin-Name: 7682d8a768fbccfe0cc956e9f6481637146e1ab9763b248ff11052761ce32e32 --- manifest | 27 +++++---- manifest.uuid | 2 +- src/build.c | 13 ++++- src/expr.c | 62 ++++++++++++++++++++- src/select.c | 37 ++++++++++++- src/sqliteInt.h | 17 ++++-- src/window.c | 5 +- test/fuzzdata8.db | Bin 1492992 -> 1495040 bytes test/window1.test | 136 ++++++++++++++++++++++++++++++++++++++++++++++ 9 files changed, 276 insertions(+), 23 deletions(-) diff --git a/manifest b/manifest index ca4608031d..5c9f7982ab 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sthe\sdebugging\streeview\soutput,\schange\sthe\sname\sof\s"SELECT-expr"\sexpression\nnodes\sto\sbe\s"subquery-expr",\sso\sas\sto\snot\sconfuse\sthem\swith\sactual\sSELECT\nnodes. -D 2020-06-05T04:01:50.831 +C Alternative\sfix\sto\sticket\s[c8d3b9f0a750a529]:\s\sPrior\sto\sdeleting\sor\smodifying\nan\sExpr\snot\sthat\sis\sreferenced\sby\san\sAggInfo,\smodify\sthe\sAggInfo\sto\sget\sits\nown\scopy\sof\sthe\soriginal\sExpr. +D 2020-06-07T17:33:18.737 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -477,7 +477,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c f14e415fcfd0b52b4e4ebd193ba5fadac5e8252c30f023389af682813af44025 F src/btree.h 989ef3c33413549e3e148f3dcb46c030f317dac130dc86809ba6b9aa4b16c72a F src/btreeInt.h 5c8b8749805787313ecf49eb5be3ced1e94bbf8ef54bb01470ce6bd0d5185c67 -F src/build.c 1c3dec6d36ddc697dbc1df04100687cdbbed65aacfda067d1e9632e4102e9999 +F src/build.c 02cff9bb5b3eaf437cbad3f0e1b6c9612e4d4f355c9a766b8ebf121d95cee6d2 F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c e98518d2d3d4029a13c805e07313fb60c877be56db76e90dd5f3af73085d0ce6 @@ -485,7 +485,7 @@ F src/date.c b29b349d277e3d579dcc295b24c0a2caed83fd8f090a9f7cbe6070c0fd662384 F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 793deaf88a0904f88285d93d6713c636d55ede0ffd9f08d10f4ea825531d367f F src/delete.c 88047c8e59878c920fce14582bc1dde4d81157d1ca5ffdf36c2907e6d41996c4 -F src/expr.c 4750c6b63419eefb24c8a6158b9287dea2a9714b4e6e297e25805505c9f73b6c +F src/expr.c 23434d32b9bf92638a61ea6a95845e163f388d6cfd4931b7774f8ad7561b7cfd F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41 F src/func.c 2333eb4277f55a5efdc12ef754e7d7ec9105d257b2fd00301d23ce1e8fa67dc0 @@ -533,12 +533,12 @@ F src/printf.c 94b5419ad0a17269f76a9e968ca19cf9fa37617abed2e246fc48844e511b6bc6 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 39a00a8bc89596dfb37c16afcbb1d33de5085b9963564b58aafe1566d08c0881 +F src/select.c 6eb5d0c524ed986107bbcb5b5c5d177c705155bc5284b3006bbec9af66361f47 F src/shell.c.in c6e26593f2738eefded08a39204bf6b48db135cdfaa458c26ffe57055b4fe365 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 -F src/sqliteInt.h f5e422635c089adf60260e1947ecfaf68dd333bda20c2afdd60323357d8540a0 +F src/sqliteInt.h dda913aa727b7c01cae68259cafe6d26b5d8704c114d128585c1610d324d4d41 F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032 F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -624,7 +624,7 @@ F src/where.c 7bcc07ff56d03d73308245135d96de46d2faeaee628bd4badf0bae60ae6a31fe F src/whereInt.h 6b874aa15f94e43a2cec1080be64d955b04deeafeac90ffb5d6975c0d511be3c F src/wherecode.c 7b939de85d65cc4b4bfa197513136b9e0ae03167e3b82842ca5a0ba1055ba65d F src/whereexpr.c 264d58971eaf8256eb5b0917bcd7fc7a1f1109fdda183a8382308a1b18a2dce7 -F src/window.c 66c5fd1e48af7581cf90b97700268294f4da4037f120f367715f912e1148d3f9 +F src/window.c 7d19c08b62b70d5dc2ef4c098cc5ba611fac246a111fa36ebb39505415124b90 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -1029,7 +1029,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 209623791b0ad72ab39110c867af2080a79004e493c4da14ad661e790b5d1ed8 +F test/fuzzdata8.db 6acee588a3311994b57b226c9eac9e9e69f135cb8b000bd48fdb924e32041312 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1727,7 +1727,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 502a3e72fce895aaaa633bbe709f6de3c24eed3ecb8098ab9fb8b47584b4452c +F test/window1.test 30ec5cc344f5ad07bd50742a5dda580d3c6954d60879a440fecaee2ded27700a F test/window2.tcl 492c125fa550cda1dd3555768a2303b3effbeceee215293adf8871efc25f1476 F test/window2.test e466a88bd626d66edc3d352d7d7e1d5531e0079b549ba44efb029d1fbff9fd3c F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 @@ -1866,7 +1866,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 2827c0a186596299e43eb3e7378eea462d2b060b2c3388ce5cb2bc8e0b43999e -R ee30fc3f51275fe44c86656d5c06c7d7 +P c1c8937a30feff6aa4385b0c264fd8e70d54422a0629c2ce38082d85d3334a57 +R 3e4eafa96401be2af64b22062bf801bb +T *branch * persist-agginfo +T *sym-persist-agginfo * +T -sym-trunk * U drh -Z bb7b42e3c07b2ab8975730fed03b093c +Z 6c6c52ade97d07f6efb7096e79fdc901 diff --git a/manifest.uuid b/manifest.uuid index 5c9bd2c32c..b331efaa0b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c1c8937a30feff6aa4385b0c264fd8e70d54422a0629c2ce38082d85d3334a57 \ No newline at end of file +7682d8a768fbccfe0cc956e9f6481637146e1ab9763b248ff11052761ce32e32 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 877db05084..03081b9654 100644 --- a/src/build.c +++ b/src/build.c @@ -207,12 +207,21 @@ void sqlite3FinishCoding(Parse *pParse){ */ sqlite3AutoincrementBegin(pParse); - /* Code constant expressions that where factored out of inner loops */ + /* Code constant expressions that where factored out of inner loops. + ** + ** The pConstExpr list might also contain expressions that we simply + ** want to keep around until the Parse object is deleted. Such + ** expressions have iConstExprReg==0. Do not generate code for + ** those expressions, of course. + */ if( pParse->pConstExpr ){ ExprList *pEL = pParse->pConstExpr; pParse->okConstFactor = 0; for(i=0; inExpr; i++){ - sqlite3ExprCode(pParse, pEL->a[i].pExpr, pEL->a[i].u.iConstExprReg); + int iReg = pEL->a[i].u.iConstExprReg; + if( iReg>0 ){ + sqlite3ExprCode(pParse, pEL->a[i].pExpr, iReg); + } } } diff --git a/src/expr.c b/src/expr.c index 496177a5c7..631d715685 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5709,6 +5709,66 @@ int sqlite3FunctionUsesThisSrc(Expr *pExpr, SrcList *pSrcList){ return cnt.nThis>0 || cnt.nOther==0; } +/* +** This is a Walker expression node callback. +** +** For Expr nodes that contain pAggInfo pointers, make sure the AggInfo +** object that is referenced does not refer directly to the Expr. If +** it does, make a copy. This is done because the pExpr argument is +** subject to change. +** +** The copy is stored on pParse->pConstExpr with a register number of 0. +** This will cause the expression to be deleted automatically when the +** Parse object is destroyed, but the zero register number means that it +** will not generate any code in the preamble. +*/ +static int agginfoPersistExprCb(Walker *pWalker, Expr *pExpr){ + if( !ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced) + && pExpr->pAggInfo!=0 + ){ + AggInfo *pAggInfo = pExpr->pAggInfo; + int iAgg = pExpr->iAgg; + Parse *pParse = pWalker->pParse; + sqlite3 *db = pParse->db; + assert( pAggInfo->iAggMagic==AggInfoMagic ); + assert( pExpr->op==TK_COLUMN || pExpr->op==TK_AGG_COLUMN + || pExpr->op==TK_FUNCTION || pExpr->op==TK_AGG_FUNCTION ); + if( pExpr->op==TK_COLUMN || pExpr->op==TK_AGG_COLUMN ){ + assert( iAgg>=0 && iAggnColumn ); + if( pAggInfo->aCol[iAgg].pExpr==pExpr ){ + pExpr = sqlite3ExprDup(db, pExpr, 0); + if( pExpr ){ + pAggInfo->aCol[iAgg].pExpr = pExpr; + pParse->pConstExpr = + sqlite3ExprListAppend(pParse, pParse->pConstExpr, pExpr); + } + } + }else{ + assert( iAgg>=0 && iAggnFunc ); + if( pAggInfo->aFunc[iAgg].pExpr==pExpr ){ + pExpr = sqlite3ExprDup(db, pExpr, 0); + if( pExpr ){ + pAggInfo->aFunc[iAgg].pExpr = pExpr; + pParse->pConstExpr = + sqlite3ExprListAppend(pParse, pParse->pConstExpr, pExpr); + } + } + } + } + return WRC_Continue; +} + +/* +** Initialize a Walker object so that will persist AggInfo entries referenced +** by the tree that is walked. +*/ +void sqlite3AggInfoPersistWalkerInit(Walker *pWalker, Parse *pParse){ + memset(pWalker, 0, sizeof(*pWalker)); + pWalker->pParse = pParse; + pWalker->xExprCallback = agginfoPersistExprCb; + pWalker->xSelectCallback = sqlite3SelectWalkNoop; +} + /* ** Add a new element to the pAggInfo->aCol[] array. Return the index of ** the new element. Return a negative number if malloc fails. @@ -5739,7 +5799,7 @@ static int addAggInfoFunc(sqlite3 *db, AggInfo *pInfo){ &i ); return i; -} +} /* ** This is the xExprCallback for a tree walker. It is used to diff --git a/src/select.c b/src/select.c index 7ff2b5d347..0e7a6ecd0f 100644 --- a/src/select.c +++ b/src/select.c @@ -3791,6 +3791,7 @@ static int flattenSubquery( Expr *pWhere; /* The WHERE clause */ struct SrcList_item *pSubitem; /* The subquery */ sqlite3 *db = pParse->db; + Walker w; /* Walker to persist agginfo data */ /* Check to see if flattening is permitted. Return 0 if not. */ @@ -4165,6 +4166,8 @@ static int flattenSubquery( /* Finially, delete what is left of the subquery and return ** success. */ + sqlite3AggInfoPersistWalkerInit(&w, pParse); + sqlite3WalkSelect(&w,pSub1); sqlite3SelectDelete(db, pSub1); #if SELECTTRACE_ENABLED @@ -5765,6 +5768,9 @@ int sqlite3Select( } if( sqlite3AuthCheck(pParse, SQLITE_SELECT, 0, 0, 0) ) return 1; memset(&sAggInfo, 0, sizeof(sAggInfo)); +#ifdef SQLITE_DEBUG + sAggInfo.iAggMagic = AggInfoMagic; +#endif #if SELECTTRACE_ENABLED SELECTTRACE(1,pParse,p, ("begin processing:\n", pParse->addrExplain)); if( sqlite3SelectTrace & 0x100 ){ @@ -5917,6 +5923,7 @@ int sqlite3Select( } #endif if( p->pNext==0 ) ExplainQueryPlanPop(pParse); + assert( sAggInfo.nFunc==0 && sAggInfo.nColumn==0 ); return rc; } #endif @@ -6789,8 +6796,34 @@ int sqlite3Select( */ select_end: sqlite3ExprListDelete(db, pMinMaxOrderBy); - sqlite3DbFree(db, sAggInfo.aCol); - sqlite3DbFree(db, sAggInfo.aFunc); + if( sAggInfo.aCol ){ +#ifdef SQLITE_DEBUG + for(i=0; idb->mallocFailed ); + if( pExpr==0 ) continue; + assert( pExpr->pAggInfo==&sAggInfo ); + assert( pExpr->iAgg==i ); + } +#endif + sqlite3DbFree(db, sAggInfo.aCol); + } + if( sAggInfo.aFunc ){ +#ifdef SQLITE_DEBUG + for(i=0; idb->mallocFailed ); + if( pExpr==0 ) continue; + assert( pExpr->pAggInfo==&sAggInfo ); + assert( pExpr->iAgg==i ); + } +#endif + sqlite3DbFree(db, sAggInfo.aFunc); + } +#ifdef SQLITE_DEBUG + sAggInfo.iAggMagic = 0; +#endif + #if SELECTTRACE_ENABLED SELECTTRACE(0x1,pParse,p,("end processing\n")); if( (sqlite3SelectTrace & 0x2000)!=0 && ExplainQueryPlanParent(pParse)==0 ){ diff --git a/src/sqliteInt.h b/src/sqliteInt.h index e37ed673af..52ff846966 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2506,11 +2506,11 @@ struct AggInfo { ExprList *pGroupBy; /* The group by clause */ struct AggInfo_col { /* For each column used in source tables */ Table *pTab; /* Source table */ - int iTable; /* Cursor number of the source table */ - int iColumn; /* Column number within the source table */ - int iSorterColumn; /* Column number in the sorting index */ - int iMem; /* Memory location that acts as accumulator */ Expr *pExpr; /* The original expression */ + int iTable; /* Cursor number of the source table */ + int iMem; /* Memory location that acts as accumulator */ + i16 iColumn; /* Column number within the source table */ + i16 iSorterColumn; /* Column number in the sorting index */ } *aCol; int nColumn; /* Number of used entries in aCol[] */ int nAccumulator; /* Number of columns that show through to the output. @@ -2523,8 +2523,16 @@ struct AggInfo { int iDistinct; /* Ephemeral table used to enforce DISTINCT */ } *aFunc; int nFunc; /* Number of entries in aFunc[] */ +#ifdef SQLITE_DEBUG + int iAggMagic; /* Magic number when valid */ +#endif }; +/* +** Value for AggInfo.iAggMagic when the structure is valid +*/ +#define AggInfoMagic 0x2059e99e + /* ** The datatype ynVar is a signed integer, either 16-bit or 32-bit. ** Usually it is 16-bits. But if SQLITE_MAX_VARIABLE_NUMBER is greater @@ -4287,6 +4295,7 @@ int sqlite3ExprCompareSkip(Expr*, Expr*, int); int sqlite3ExprListCompare(ExprList*, ExprList*, int); int sqlite3ExprImpliesExpr(Parse*,Expr*, Expr*, int); int sqlite3ExprImpliesNonNullRow(Expr*,int); +void sqlite3AggInfoPersistWalkerInit(Walker*,Parse*); void sqlite3ExprAnalyzeAggregates(NameContext*, Expr*); void sqlite3ExprAnalyzeAggList(NameContext*,ExprList*); int sqlite3ExprCoveredByIndex(Expr*, int iCur, Index *pIdx); diff --git a/src/window.c b/src/window.c index 77ec8a02e0..8046e46274 100644 --- a/src/window.c +++ b/src/window.c @@ -956,12 +956,16 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ Window *pMWin = p->pWin; /* Master window object */ Window *pWin; /* Window object iterator */ Table *pTab; + Walker w; + u32 selFlags = p->selFlags; pTab = sqlite3DbMallocZero(db, sizeof(Table)); if( pTab==0 ){ return sqlite3ErrorToParser(db, SQLITE_NOMEM); } + sqlite3AggInfoPersistWalkerInit(&w, pParse); + sqlite3WalkSelect(&w, p); p->pSrc = 0; p->pWhere = 0; @@ -1042,7 +1046,6 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ p->pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); if( p->pSrc ){ Table *pTab2; - Walker w; p->pSrc->a[0].pSelect = pSub; sqlite3SrcListAssignCursors(pParse, p->pSrc); pSub->selFlags |= SF_Expanded; diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 350ffa26312c32b3452ebf103c8b7bb90ec69ce0..b1837460297bbe7aea0ea95aa6946c523c946fa4 100644 GIT binary patch delta 24027 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 diff --git a/test/window1.test b/test/window1.test index 677297fc89..97c3cdd79a 100644 --- a/test/window1.test +++ b/test/window1.test @@ -1743,5 +1743,141 @@ do_execsql_test 53.0 { WHERE a.c); } {4 4 4 4} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 54.1 { + CREATE TABLE t1(a VARCHAR(20), b FLOAT); + INSERT INTO t1 VALUES('1',10.0); +} + +do_catchsql_test 54.2 { + SELECT * FROM ( + SELECT sum(b) OVER() AS c FROM t1 + UNION + SELECT b AS c FROM t1 + ) WHERE c>10; +} {1 {misuse of window function sum()}} + +do_execsql_test 54.3 { + INSERT INTO t1 VALUES('2',5.0); + INSERT INTO t1 VALUES('3',15.0); +} + +do_catchsql_test 54.4 { + SELECT * FROM ( + SELECT sum(b) OVER() AS c FROM t1 + UNION + SELECT b AS c FROM t1 + ) WHERE c>10; +} {1 {misuse of window function sum()}} + +# 2020-06-05 ticket c8d3b9f0a750a529 +reset_db +do_execsql_test 55.1 { + CREATE TABLE a(b); + SELECT + (SELECT b FROM a + GROUP BY b + HAVING (SELECT COUNT()OVER() + lead(b)OVER(ORDER BY SUM(DISTINCT b) + b)) + ) + FROM a + UNION + SELECT 99 + ORDER BY 1; +} {99} + +#------------------------------------------------------------------------ +reset_db +do_execsql_test 56.1 { + CREATE TABLE t1(a, b INTEGER); + CREATE TABLE t2(c, d); +} +do_catchsql_test 56.2 { + SELECT avg(b) FROM t1 + UNION ALL + SELECT min(c) OVER () FROM t2 + ORDER BY nosuchcolumn; +} {1 {1st ORDER BY term does not match any column in the result set}} + +reset_db +do_execsql_test 57.1 { + CREATE TABLE t4(a, b, c, d, e); +} + +do_catchsql_test 57.2 { + SELECT b FROM t4 + UNION + SELECT a FROM t4 + ORDER BY ( + SELECT sum(x) OVER() FROM ( + SELECT c AS x FROM t4 + UNION + SELECT d FROM t4 + ORDER BY (SELECT e FROM t4) + ) + ); +} {1 {1st ORDER BY term does not match any column in the result set}} + +# 2020-06-06 various dbsqlfuzz finds and +# ticket 0899cf62f597d7e7 +# +reset_db +do_execsql_test 57.1 { + CREATE TABLE t1(a, b, c); + INSERT INTO t1 VALUES(NULL,NULL,NULL); + SELECT + sum(a), + min(b) OVER (), + count(c) OVER (ORDER BY b) + FROM t1; +} {{} {} 0} +do_execsql_test 57.2 { + CREATE TABLE v0 ( v1 INTEGER PRIMARY KEY ) ; + INSERT INTO v0 VALUES ( 10 ) ; + SELECT DISTINCT v1, lead(v1) OVER() FROM v0 GROUP BY v1 ORDER BY 2; +} {10 {}} +do_catchsql_test 57.3 { + DROP TABLE t1; + CREATE TABLE t1(a); + INSERT INTO t1(a) VALUES(22); + CREATE TABLE t3(y); + INSERT INTO t3(y) VALUES(5),(11),(-9); + SELECT ( + SELECT max(y) OVER( ORDER BY (SELECT x FROM (SELECT sum(y) AS x FROM t1))) + ) + FROM t3; +} {1 {misuse of aggregate: sum()}} + +# 2020-06-06 ticket 1f6f353b684fc708 +reset_db +do_execsql_test 58.1 { + CREATE TABLE a(a, b, c); + INSERT INTO a VALUES(1, 2, 3); + INSERT INTO a VALUES(4, 5, 6); + SELECT sum(345+b) OVER (ORDER BY b), + sum(avg(678)) OVER (ORDER BY c) FROM a; +} {347 678.0} + +# 2020-06-06 ticket e5504e987e419fb0 +do_catchsql_test 59.1 { + DROP TABLE IF EXISTS t1; + CREATE TABLE t1(x INTEGER PRIMARY KEY); + INSERT INTO t1 VALUES (123); + SELECT + ntile( (SELECT sum(x)) ) OVER(ORDER BY x), + min(x) OVER(ORDER BY x) + FROM t1; +} {1 {misuse of aggregate: sum()}} + +# 2020-06-07 ticket f7d890858f361402 +do_execsql_test 60.1 { + DROP TABLE IF EXISTS t1; + CREATE TABLE t1 (x INTEGER PRIMARY KEY); + INSERT INTO t1 VALUES (99); + SELECT EXISTS(SELECT count(*) OVER() FROM t1 ORDER BY sum(x) OVER()); +} {1} + +reset_db + finish_test From bf7909734a351c68f852a0ecb11f1c41738e96bf Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 7 Jun 2020 20:18:07 +0000 Subject: [PATCH 041/186] AggInfo objects might be referenced even after the sqlite3Select() function that created them has exited. So AggInfo cannot be a stack variable. And it must not be freed until the Parse object is destroyed. FossilOrigin-Name: 3c840b4df306e2db1da08673e9ede973b4cb6d2b3f9eeeab5835e39452ee3056 --- manifest | 23 ++++---- manifest.uuid | 2 +- src/expr.c | 1 - src/prepare.c | 15 ++++++ src/select.c | 133 ++++++++++++++++++++++------------------------ src/sqliteInt.h | 2 + test/window1.test | 11 +++- 7 files changed, 103 insertions(+), 84 deletions(-) diff --git a/manifest b/manifest index 5c9f7982ab..ad5a11efd3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Alternative\sfix\sto\sticket\s[c8d3b9f0a750a529]:\s\sPrior\sto\sdeleting\sor\smodifying\nan\sExpr\snot\sthat\sis\sreferenced\sby\san\sAggInfo,\smodify\sthe\sAggInfo\sto\sget\sits\nown\scopy\sof\sthe\soriginal\sExpr. -D 2020-06-07T17:33:18.737 +C AggInfo\sobjects\smight\sbe\sreferenced\seven\safter\sthe\ssqlite3Select()\sfunction\nthat\screated\sthem\shas\sexited.\s\sSo\sAggInfo\scannot\sbe\sa\sstack\svariable.\s\sAnd\sit\nmust\snot\sbe\sfreed\suntil\sthe\sParse\sobject\sis\sdestroyed. +D 2020-06-07T20:18:07.068 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -485,7 +485,7 @@ F src/date.c b29b349d277e3d579dcc295b24c0a2caed83fd8f090a9f7cbe6070c0fd662384 F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 793deaf88a0904f88285d93d6713c636d55ede0ffd9f08d10f4ea825531d367f F src/delete.c 88047c8e59878c920fce14582bc1dde4d81157d1ca5ffdf36c2907e6d41996c4 -F src/expr.c 23434d32b9bf92638a61ea6a95845e163f388d6cfd4931b7774f8ad7561b7cfd +F src/expr.c 3ee54650bbf8cf1003bee34bbeca354c9c7bddab3ef66ba618f806a1c7c51b4b F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41 F src/func.c 2333eb4277f55a5efdc12ef754e7d7ec9105d257b2fd00301d23ce1e8fa67dc0 @@ -528,17 +528,17 @@ F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 6596e10baf3d8f84cc1585d226cf1ab26564a5f5caf85a15757a281ff977d51a F src/pragma.c 1b0db48177e52b256c003b8dc6ac708b1079a82cded944a23820574586a4731f F src/pragma.h 8168e588536bffd95319451f34e9a754dc37d205ebe433031a7813c5b286beae -F src/prepare.c aeb3ba661e2666dab15c4b5c55f6eb816f01d20e35fa860bb807e4a3b36e1e27 +F src/prepare.c bb996921a85590418f951f27566216646fad2d6856ba131b21594862055b1bd7 F src/printf.c 94b5419ad0a17269f76a9e968ca19cf9fa37617abed2e246fc48844e511b6bc6 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 6eb5d0c524ed986107bbcb5b5c5d177c705155bc5284b3006bbec9af66361f47 +F src/select.c fb79ed71f8b8bbe9fefaba9b844f80700dea4f175ccac34c64a7b5cd75abc362 F src/shell.c.in c6e26593f2738eefded08a39204bf6b48db135cdfaa458c26ffe57055b4fe365 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 -F src/sqliteInt.h dda913aa727b7c01cae68259cafe6d26b5d8704c114d128585c1610d324d4d41 +F src/sqliteInt.h 04621e8c61c2bf4578d07e99cc5b5909b16d5e34600ed8297a8fd4d1a95afc4e F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032 F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -1727,7 +1727,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 30ec5cc344f5ad07bd50742a5dda580d3c6954d60879a440fecaee2ded27700a +F test/window1.test 49f81c25c065fd65b64cd2aaa96f20199fd5d8f847dd1c8151cfccae2aeae83f F test/window2.tcl 492c125fa550cda1dd3555768a2303b3effbeceee215293adf8871efc25f1476 F test/window2.test e466a88bd626d66edc3d352d7d7e1d5531e0079b549ba44efb029d1fbff9fd3c F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 @@ -1866,10 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P c1c8937a30feff6aa4385b0c264fd8e70d54422a0629c2ce38082d85d3334a57 -R 3e4eafa96401be2af64b22062bf801bb -T *branch * persist-agginfo -T *sym-persist-agginfo * -T -sym-trunk * +P 7682d8a768fbccfe0cc956e9f6481637146e1ab9763b248ff11052761ce32e32 +R aa0e843c27b9cda2c788e9652bc81696 U drh -Z 6c6c52ade97d07f6efb7096e79fdc901 +Z e618df7dc043f3b81d6494dff0ad5e1b diff --git a/manifest.uuid b/manifest.uuid index b331efaa0b..01928527e0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7682d8a768fbccfe0cc956e9f6481637146e1ab9763b248ff11052761ce32e32 \ No newline at end of file +3c840b4df306e2db1da08673e9ede973b4cb6d2b3f9eeeab5835e39452ee3056 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 631d715685..b1beb2e3eb 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5730,7 +5730,6 @@ static int agginfoPersistExprCb(Walker *pWalker, Expr *pExpr){ int iAgg = pExpr->iAgg; Parse *pParse = pWalker->pParse; sqlite3 *db = pParse->db; - assert( pAggInfo->iAggMagic==AggInfoMagic ); assert( pExpr->op==TK_COLUMN || pExpr->op==TK_AGG_COLUMN || pExpr->op==TK_FUNCTION || pExpr->op==TK_AGG_FUNCTION ); if( pExpr->op==TK_COLUMN || pExpr->op==TK_AGG_COLUMN ){ diff --git a/src/prepare.c b/src/prepare.c index 2599546760..c63c0a8353 100644 --- a/src/prepare.c +++ b/src/prepare.c @@ -530,11 +530,26 @@ int sqlite3SchemaToIndex(sqlite3 *db, Schema *pSchema){ return i; } +/* +** Deallocate a single AggInfo object +*/ +static void agginfoFree(sqlite3 *db, AggInfo *p){ + sqlite3DbFree(db, p->aCol); + sqlite3DbFree(db, p->aFunc); + sqlite3DbFree(db, p); +} + /* ** Free all memory allocations in the pParse object */ void sqlite3ParserReset(Parse *pParse){ sqlite3 *db = pParse->db; + AggInfo *pThis = pParse->pAggList; + while( pThis ){ + AggInfo *pNext = pThis->pNext; + agginfoFree(db, pThis); + pThis = pNext; + } sqlite3DbFree(db, pParse->aLabel); sqlite3ExprListDelete(db, pParse->pConstExpr); if( db ){ diff --git a/src/select.c b/src/select.c index 0e7a6ecd0f..9e8af0cb17 100644 --- a/src/select.c +++ b/src/select.c @@ -5752,10 +5752,10 @@ int sqlite3Select( Expr *pWhere; /* The WHERE clause. May be NULL */ ExprList *pGroupBy; /* The GROUP BY clause. May be NULL */ Expr *pHaving; /* The HAVING clause. May be NULL */ + AggInfo *pAggInfo = 0; /* Aggregate information */ int rc = 1; /* Value to return from this function */ DistinctCtx sDistinct; /* Info on how to code the DISTINCT keyword */ SortCtx sSort; /* Info on how to code the ORDER BY clause */ - AggInfo sAggInfo; /* Information used by aggregate queries */ int iEnd; /* Address of the end of the query */ sqlite3 *db; /* The database connection */ ExprList *pMinMaxOrderBy = 0; /* Added ORDER BY for min/max queries */ @@ -5767,10 +5767,6 @@ int sqlite3Select( return 1; } if( sqlite3AuthCheck(pParse, SQLITE_SELECT, 0, 0, 0) ) return 1; - memset(&sAggInfo, 0, sizeof(sAggInfo)); -#ifdef SQLITE_DEBUG - sAggInfo.iAggMagic = AggInfoMagic; -#endif #if SELECTTRACE_ENABLED SELECTTRACE(1,pParse,p, ("begin processing:\n", pParse->addrExplain)); if( sqlite3SelectTrace & 0x100 ){ @@ -5923,7 +5919,6 @@ int sqlite3Select( } #endif if( p->pNext==0 ) ExplainQueryPlanPop(pParse); - assert( sAggInfo.nFunc==0 && sAggInfo.nColumn==0 ); return rc; } #endif @@ -6361,14 +6356,20 @@ int sqlite3Select( ** sAggInfo for all TK_AGG_FUNCTION nodes in expressions of the ** SELECT statement. */ + pAggInfo = sqlite3DbMallocZero(db, sizeof(*pAggInfo) ); + if( pAggInfo==0 ){ + goto select_end; + } + pAggInfo->pNext = pParse->pAggList; + pParse->pAggList = pAggInfo; memset(&sNC, 0, sizeof(sNC)); sNC.pParse = pParse; sNC.pSrcList = pTabList; - sNC.uNC.pAggInfo = &sAggInfo; + sNC.uNC.pAggInfo = pAggInfo; VVA_ONLY( sNC.ncFlags = NC_UAggInfo; ) - sAggInfo.mnReg = pParse->nMem+1; - sAggInfo.nSortingColumn = pGroupBy ? pGroupBy->nExpr : 0; - sAggInfo.pGroupBy = pGroupBy; + pAggInfo->mnReg = pParse->nMem+1; + pAggInfo->nSortingColumn = pGroupBy ? pGroupBy->nExpr : 0; + pAggInfo->pGroupBy = pGroupBy; sqlite3ExprAnalyzeAggList(&sNC, pEList); sqlite3ExprAnalyzeAggList(&sNC, sSort.pOrderBy); if( pHaving ){ @@ -6381,14 +6382,14 @@ int sqlite3Select( } sqlite3ExprAnalyzeAggregates(&sNC, pHaving); } - sAggInfo.nAccumulator = sAggInfo.nColumn; - if( p->pGroupBy==0 && p->pHaving==0 && sAggInfo.nFunc==1 ){ - minMaxFlag = minMaxQuery(db, sAggInfo.aFunc[0].pExpr, &pMinMaxOrderBy); + pAggInfo->nAccumulator = pAggInfo->nColumn; + if( p->pGroupBy==0 && p->pHaving==0 && pAggInfo->nFunc==1 ){ + minMaxFlag = minMaxQuery(db, pAggInfo->aFunc[0].pExpr, &pMinMaxOrderBy); }else{ minMaxFlag = WHERE_ORDERBY_NORMAL; } - for(i=0; inFunc; i++){ + Expr *pExpr = pAggInfo->aFunc[i].pExpr; assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); sNC.ncFlags |= NC_InAggFunc; sqlite3ExprAnalyzeAggList(&sNC, pExpr->x.pList); @@ -6400,22 +6401,22 @@ int sqlite3Select( #endif sNC.ncFlags &= ~NC_InAggFunc; } - sAggInfo.mxReg = pParse->nMem; + pAggInfo->mxReg = pParse->nMem; if( db->mallocFailed ) goto select_end; #if SELECTTRACE_ENABLED if( sqlite3SelectTrace & 0x400 ){ int ii; - SELECTTRACE(0x400,pParse,p,("After aggregate analysis %p:\n", &sAggInfo)); + SELECTTRACE(0x400,pParse,p,("After aggregate analysis %p:\n", pAggInfo)); sqlite3TreeViewSelect(0, p, 0); - for(ii=0; iinColumn; ii++){ sqlite3DebugPrintf("agg-column[%d] iMem=%d\n", - ii, sAggInfo.aCol[ii].iMem); - sqlite3TreeViewExpr(0, sAggInfo.aCol[ii].pExpr, 0); + ii, pAggInfo->aCol[ii].iMem); + sqlite3TreeViewExpr(0, pAggInfo->aCol[ii].pExpr, 0); } - for(ii=0; iinFunc; ii++){ sqlite3DebugPrintf("agg-func[%d]: iMem=%d\n", - ii, sAggInfo.aFunc[ii].iMem); - sqlite3TreeViewExpr(0, sAggInfo.aFunc[ii].pExpr, 0); + ii, pAggInfo->aFunc[ii].iMem); + sqlite3TreeViewExpr(0, pAggInfo->aFunc[ii].pExpr, 0); } } #endif @@ -6440,10 +6441,11 @@ int sqlite3Select( ** that we do not need it after all, the OP_SorterOpen instruction ** will be converted into a Noop. */ - sAggInfo.sortingIdx = pParse->nTab++; - pKeyInfo = sqlite3KeyInfoFromExprList(pParse,pGroupBy,0,sAggInfo.nColumn); + pAggInfo->sortingIdx = pParse->nTab++; + pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pGroupBy, + 0, pAggInfo->nColumn); addrSortingIdx = sqlite3VdbeAddOp4(v, OP_SorterOpen, - sAggInfo.sortingIdx, sAggInfo.nSortingColumn, + pAggInfo->sortingIdx, pAggInfo->nSortingColumn, 0, (char*)pKeyInfo, P4_KEYINFO); /* Initialize memory locations used by GROUP BY aggregate processing @@ -6498,8 +6500,8 @@ int sqlite3Select( nGroupBy = pGroupBy->nExpr; nCol = nGroupBy; j = nGroupBy; - for(i=0; i=j ){ + for(i=0; inColumn; i++){ + if( pAggInfo->aCol[i].iSorterColumn>=j ){ nCol++; j++; } @@ -6507,8 +6509,8 @@ int sqlite3Select( regBase = sqlite3GetTempRange(pParse, nCol); sqlite3ExprCodeExprList(pParse, pGroupBy, regBase, 0, 0); j = nGroupBy; - for(i=0; inColumn; i++){ + struct AggInfo_col *pCol = &pAggInfo->aCol[i]; if( pCol->iSorterColumn>=j ){ int r1 = j + regBase; sqlite3ExprCodeGetColumnOfTable(v, @@ -6518,16 +6520,16 @@ int sqlite3Select( } regRecord = sqlite3GetTempReg(pParse); sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase, nCol, regRecord); - sqlite3VdbeAddOp2(v, OP_SorterInsert, sAggInfo.sortingIdx, regRecord); + sqlite3VdbeAddOp2(v, OP_SorterInsert, pAggInfo->sortingIdx, regRecord); sqlite3ReleaseTempReg(pParse, regRecord); sqlite3ReleaseTempRange(pParse, regBase, nCol); sqlite3WhereEnd(pWInfo); - sAggInfo.sortingIdxPTab = sortPTab = pParse->nTab++; + pAggInfo->sortingIdxPTab = sortPTab = pParse->nTab++; sortOut = sqlite3GetTempReg(pParse); sqlite3VdbeAddOp3(v, OP_OpenPseudo, sortPTab, sortOut, nCol); - sqlite3VdbeAddOp2(v, OP_SorterSort, sAggInfo.sortingIdx, addrEnd); + sqlite3VdbeAddOp2(v, OP_SorterSort, pAggInfo->sortingIdx, addrEnd); VdbeComment((v, "GROUP BY sort")); VdbeCoverage(v); - sAggInfo.useSortingIdx = 1; + pAggInfo->useSortingIdx = 1; } /* If the index or temporary table used by the GROUP BY sort @@ -6551,14 +6553,14 @@ int sqlite3Select( */ addrTopOfLoop = sqlite3VdbeCurrentAddr(v); if( groupBySort ){ - sqlite3VdbeAddOp3(v, OP_SorterData, sAggInfo.sortingIdx, + sqlite3VdbeAddOp3(v, OP_SorterData, pAggInfo->sortingIdx, sortOut, sortPTab); } for(j=0; jnExpr; j++){ if( groupBySort ){ sqlite3VdbeAddOp3(v, OP_Column, sortPTab, j, iBMem+j); }else{ - sAggInfo.directMode = 1; + pAggInfo->directMode = 1; sqlite3ExprCode(pParse, pGroupBy->a[j].pExpr, iBMem+j); } } @@ -6588,14 +6590,14 @@ int sqlite3Select( ** the current row */ sqlite3VdbeJumpHere(v, addr1); - updateAccumulator(pParse, iUseFlag, &sAggInfo); + updateAccumulator(pParse, iUseFlag, pAggInfo); sqlite3VdbeAddOp2(v, OP_Integer, 1, iUseFlag); VdbeComment((v, "indicate data in accumulator")); /* End of the loop */ if( groupBySort ){ - sqlite3VdbeAddOp2(v, OP_SorterNext, sAggInfo.sortingIdx, addrTopOfLoop); + sqlite3VdbeAddOp2(v, OP_SorterNext, pAggInfo->sortingIdx, addrTopOfLoop); VdbeCoverage(v); }else{ sqlite3WhereEnd(pWInfo); @@ -6628,7 +6630,7 @@ int sqlite3Select( VdbeCoverage(v); VdbeComment((v, "Groupby result generator entry point")); sqlite3VdbeAddOp1(v, OP_Return, regOutputRow); - finalizeAggFunctions(pParse, &sAggInfo); + finalizeAggFunctions(pParse, pAggInfo); sqlite3ExprIfFalse(pParse, pHaving, addrOutputRow+1, SQLITE_JUMPIFNULL); selectInnerLoop(pParse, p, -1, &sSort, &sDistinct, pDest, @@ -6639,7 +6641,7 @@ int sqlite3Select( /* Generate a subroutine that will reset the group-by accumulator */ sqlite3VdbeResolveLabel(v, addrReset); - resetAccumulator(pParse, &sAggInfo); + resetAccumulator(pParse, pAggInfo); sqlite3VdbeAddOp2(v, OP_Integer, 0, iUseFlag); VdbeComment((v, "indicate accumulator empty")); sqlite3VdbeAddOp1(v, OP_Return, regReset); @@ -6647,7 +6649,7 @@ int sqlite3Select( } /* endif pGroupBy. Begin aggregate queries without GROUP BY: */ else { Table *pTab; - if( (pTab = isSimpleCount(p, &sAggInfo))!=0 ){ + if( (pTab = isSimpleCount(p, pAggInfo))!=0 ){ /* If isSimpleCount() returns a pointer to a Table structure, then ** the SQL statement is of the form: ** @@ -6702,7 +6704,7 @@ int sqlite3Select( if( pKeyInfo ){ sqlite3VdbeChangeP4(v, -1, (char *)pKeyInfo, P4_KEYINFO); } - sqlite3VdbeAddOp2(v, OP_Count, iCsr, sAggInfo.aFunc[0].iMem); + sqlite3VdbeAddOp2(v, OP_Count, iCsr, pAggInfo->aFunc[0].iMem); sqlite3VdbeAddOp1(v, OP_Close, iCsr); explainSimpleCount(pParse, pTab, pBest); }else{ @@ -6717,12 +6719,16 @@ int sqlite3Select( ** first row visited by the aggregate, so that they are updated at ** least once even if the FILTER clause means the min() or max() ** function visits zero rows. */ - if( sAggInfo.nAccumulator ){ - for(i=0; ifuncFlags&SQLITE_FUNC_NEEDCOLL ) break; + if( pAggInfo->nAccumulator ){ + for(i=0; inFunc; i++){ + if( ExprHasProperty(pAggInfo->aFunc[i].pExpr, EP_WinFunc) ){ + continue; + } + if( pAggInfo->aFunc[i].pFunc->funcFlags&SQLITE_FUNC_NEEDCOLL ){ + break; + } } - if( i==sAggInfo.nFunc ){ + if( i==pAggInfo->nFunc ){ regAcc = ++pParse->nMem; sqlite3VdbeAddOp2(v, OP_Integer, 0, regAcc); } @@ -6733,7 +6739,7 @@ int sqlite3Select( ** of output. */ assert( p->pGroupBy==0 ); - resetAccumulator(pParse, &sAggInfo); + resetAccumulator(pParse, pAggInfo); /* If this query is a candidate for the min/max optimization, then ** minMaxFlag will have been previously set to either @@ -6749,7 +6755,7 @@ int sqlite3Select( if( pWInfo==0 ){ goto select_end; } - updateAccumulator(pParse, regAcc, &sAggInfo); + updateAccumulator(pParse, regAcc, pAggInfo); if( regAcc ) sqlite3VdbeAddOp2(v, OP_Integer, 1, regAcc); if( sqlite3WhereIsOrdered(pWInfo)>0 ){ sqlite3VdbeGoto(v, sqlite3WhereBreakLabel(pWInfo)); @@ -6757,7 +6763,7 @@ int sqlite3Select( (minMaxFlag==WHERE_ORDERBY_MIN?"min":"max"))); } sqlite3WhereEnd(pWInfo); - finalizeAggFunctions(pParse, &sAggInfo); + finalizeAggFunctions(pParse, pAggInfo); } sSort.pOrderBy = 0; @@ -6796,32 +6802,23 @@ int sqlite3Select( */ select_end: sqlite3ExprListDelete(db, pMinMaxOrderBy); - if( sAggInfo.aCol ){ #ifdef SQLITE_DEBUG - for(i=0; idb->mallocFailed ); + if( pAggInfo ){ + for(i=0; inColumn; i++){ + Expr *pExpr = pAggInfo->aCol[i].pExpr; + assert( pExpr!=0 || db->mallocFailed ); if( pExpr==0 ) continue; - assert( pExpr->pAggInfo==&sAggInfo ); + assert( pExpr->pAggInfo==pAggInfo ); assert( pExpr->iAgg==i ); } -#endif - sqlite3DbFree(db, sAggInfo.aCol); - } - if( sAggInfo.aFunc ){ -#ifdef SQLITE_DEBUG - for(i=0; idb->mallocFailed ); + for(i=0; inFunc; i++){ + Expr *pExpr = pAggInfo->aFunc[i].pExpr; + assert( pExpr!=0 || db->mallocFailed ); if( pExpr==0 ) continue; - assert( pExpr->pAggInfo==&sAggInfo ); + assert( pExpr->pAggInfo==pAggInfo ); assert( pExpr->iAgg==i ); } -#endif - sqlite3DbFree(db, sAggInfo.aFunc); } -#ifdef SQLITE_DEBUG - sAggInfo.iAggMagic = 0; #endif #if SELECTTRACE_ENABLED diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 52ff846966..0b71ef42bb 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2526,6 +2526,7 @@ struct AggInfo { #ifdef SQLITE_DEBUG int iAggMagic; /* Magic number when valid */ #endif + AggInfo *pNext; /* Next in list of them all */ }; /* @@ -3329,6 +3330,7 @@ struct Parse { Parse *pToplevel; /* Parse structure for main program (or NULL) */ Table *pTriggerTab; /* Table triggers are being coded for */ Parse *pParentParse; /* Parent parser if this parser is nested */ + AggInfo *pAggList; /* List of all AggInfo objects */ int addrCrTab; /* Address of OP_CreateBtree opcode on CREATE TABLE */ u32 nQueryLoop; /* Est number of iterations of a query (10*log2(N)) */ u32 oldmask; /* Mask of old.* columns referenced */ diff --git a/test/window1.test b/test/window1.test index 97c3cdd79a..3336a613ab 100644 --- a/test/window1.test +++ b/test/window1.test @@ -1877,7 +1877,16 @@ do_execsql_test 60.1 { SELECT EXISTS(SELECT count(*) OVER() FROM t1 ORDER BY sum(x) OVER()); } {1} +# 2020-06-07 test case generated by dbsqlfuzz showing how an AggInfo +# object might be referenced after the sqlite3Select() call that created +# it returns. This proves the need to persist all AggInfo objects until +# the Parse object is destroyed. +# reset_db - +do_execsql_test 61.1 { +CREATE TABLE t1(a); +INSERT INTO t1 VALUES(5),(NULL),('seventeen'); +SELECT (SELECT max(x)OVER(ORDER BY x) % min(x)OVER(ORDER BY CASE x WHEN 889 THEN x WHEN x THEN x END)) FROM (SELECT (SELECT sum(CAST(a IN(SELECT (SELECT max(x)OVER(ORDER BY CASE x WHEN 889 THEN 299 WHEN 863 THEN 863 END)) FROM (SELECT (SELECT sum(CAST((SELECT (SELECT max(x)OVER(ORDER BY x) / min(x)OVER(ORDER BY CASE x WHEN 889 THEN 299 WHEN -true THEN 863 END)) FROM (SELECT (SELECT sum(CAST(a IN(SELECT (SELECT max(x) & sum ( a )OVER(ORDER BY CASE x WHEN -8 THEN 299 WHEN 863 THEN 863 END)) FROM (SELECT (SELECT sum(CAST(a AS )) FROM t1) AS x FROM t1)) AS t1 )) FROM t1) AS x FROM t1)) AS x )) FROM t1) AS x FROM t1)) AS real)) FROM t1) AS x FROM t1); +} {{} {} {}} finish_test From 2f82acc036c5f286fda6ef815bfc3469acd402e2 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 7 Jun 2020 22:44:23 +0000 Subject: [PATCH 042/186] Fix minor OOM problems. FossilOrigin-Name: 8b23d80271aab38abe42ee8b3ca4b746572ecef26c2a37b094b01560e6be9d45 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/expr.c | 14 +++++++++----- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index ad5a11efd3..5adab9d6c4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C AggInfo\sobjects\smight\sbe\sreferenced\seven\safter\sthe\ssqlite3Select()\sfunction\nthat\screated\sthem\shas\sexited.\s\sSo\sAggInfo\scannot\sbe\sa\sstack\svariable.\s\sAnd\sit\nmust\snot\sbe\sfreed\suntil\sthe\sParse\sobject\sis\sdestroyed. -D 2020-06-07T20:18:07.068 +C Fix\sminor\sOOM\sproblems. +D 2020-06-07T22:44:23.371 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -485,7 +485,7 @@ F src/date.c b29b349d277e3d579dcc295b24c0a2caed83fd8f090a9f7cbe6070c0fd662384 F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 793deaf88a0904f88285d93d6713c636d55ede0ffd9f08d10f4ea825531d367f F src/delete.c 88047c8e59878c920fce14582bc1dde4d81157d1ca5ffdf36c2907e6d41996c4 -F src/expr.c 3ee54650bbf8cf1003bee34bbeca354c9c7bddab3ef66ba618f806a1c7c51b4b +F src/expr.c 217bee94b696a061fec28526c5d5ef3049536ace5c10a0a3ff7d15b0d3a9cd11 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41 F src/func.c 2333eb4277f55a5efdc12ef754e7d7ec9105d257b2fd00301d23ce1e8fa67dc0 @@ -1866,7 +1866,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7682d8a768fbccfe0cc956e9f6481637146e1ab9763b248ff11052761ce32e32 -R aa0e843c27b9cda2c788e9652bc81696 +P 3c840b4df306e2db1da08673e9ede973b4cb6d2b3f9eeeab5835e39452ee3056 +R 5a67d9ba1d91119ad620e46132adbad1 U drh -Z e618df7dc043f3b81d6494dff0ad5e1b +Z 23a540eb57cb09221e33c4eabdced32a diff --git a/manifest.uuid b/manifest.uuid index 01928527e0..5b9f0ff1f4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3c840b4df306e2db1da08673e9ede973b4cb6d2b3f9eeeab5835e39452ee3056 \ No newline at end of file +8b23d80271aab38abe42ee8b3ca4b746572ecef26c2a37b094b01560e6be9d45 \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index b1beb2e3eb..6fbc8bb49c 100644 --- a/src/expr.c +++ b/src/expr.c @@ -52,7 +52,12 @@ char sqlite3ExprAffinity(const Expr *pExpr){ op = pExpr->op; if( op==TK_SELECT ){ assert( pExpr->flags&EP_xIsSelect ); - return sqlite3ExprAffinity(pExpr->x.pSelect->pEList->a[0].pExpr); + if( ALWAYS(pExpr->x.pSelect) + && pExpr->x.pSelect->pEList + && ALWAYS(pExpr->x.pSelect->pEList->a[0].pExpr) + ){ + return sqlite3ExprAffinity(pExpr->x.pSelect->pEList->a[0].pExpr); + } } if( op==TK_REGISTER ) op = pExpr->op2; #ifndef SQLITE_OMIT_CAST @@ -5723,16 +5728,15 @@ int sqlite3FunctionUsesThisSrc(Expr *pExpr, SrcList *pSrcList){ ** will not generate any code in the preamble. */ static int agginfoPersistExprCb(Walker *pWalker, Expr *pExpr){ - if( !ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced) + if( ALWAYS(!ExprHasProperty(pExpr, EP_TokenOnly|EP_Reduced)) && pExpr->pAggInfo!=0 ){ AggInfo *pAggInfo = pExpr->pAggInfo; int iAgg = pExpr->iAgg; Parse *pParse = pWalker->pParse; sqlite3 *db = pParse->db; - assert( pExpr->op==TK_COLUMN || pExpr->op==TK_AGG_COLUMN - || pExpr->op==TK_FUNCTION || pExpr->op==TK_AGG_FUNCTION ); - if( pExpr->op==TK_COLUMN || pExpr->op==TK_AGG_COLUMN ){ + assert( pExpr->op==TK_AGG_COLUMN || pExpr->op==TK_AGG_FUNCTION ); + if( pExpr->op==TK_AGG_COLUMN ){ assert( iAgg>=0 && iAggnColumn ); if( pAggInfo->aCol[iAgg].pExpr==pExpr ){ pExpr = sqlite3ExprDup(db, pExpr, 0); From 5c10930fa9df10de8bc50859cf4289bf3ddb4d97 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 8 Jun 2020 14:43:41 +0000 Subject: [PATCH 043/186] Fix a case where a corrupted fts3 record could cause an assert() failure, or spurious SQLITE_NOMEM error in builds with assert() disabled. FossilOrigin-Name: d48af4d2cfff3d5f4ccc3db5d658e8b503255b577e6e62b5c2b4a4437875b895 --- ext/fts3/fts3.c | 5 +++- manifest | 16 +++++------ manifest.uuid | 2 +- test/fts3corrupt6.test | 60 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 73 insertions(+), 10 deletions(-) create mode 100644 test/fts3corrupt6.test diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index e6092a215e..88ff0ee2c5 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -5560,7 +5560,10 @@ static int fts3EvalTestExpr( }else #endif { - bHit = (pExpr->bEof==0 && pExpr->iDocid==pCsr->iPrevId); + bHit = ( + pExpr->bEof==0 && pExpr->iDocid==pCsr->iPrevId + && pExpr->pPhrase->doclist.nList>0 + ); } break; } diff --git a/manifest b/manifest index ae3141103a..6be90cfd3a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\san\sExpr\sobject\sis\schanged\sand\sthat\sExpr\sis\sreferenced\sby\san\sAggInfo,\sthen\nalso\supdate\sthe\sAggInfo.\s\sAlso,\spersist\sall\sAggInfo\sobjects\suntil\sthe\sParse\nobject\sis\sdestroyed.\s\sThis\sis\sa\snew\sfix\sfor\sticket\s[c8d3b9f0a750a529]\sthat\navoids\sthe\sfollow-on\sproblems\sidentified\sby\stickets\n[0899cf62f597d7e7],\s[1f6f353b684fc708],\s[e5504e987e419fb0],\sand\n[f7d890858f361402]. -D 2020-06-08T11:34:40.204 +C Fix\sa\scase\swhere\sa\scorrupted\sfts3\srecord\scould\scause\san\sassert()\sfailure,\sor\sspurious\sSQLITE_NOMEM\serror\sin\sbuilds\swith\sassert()\sdisabled. +D 2020-06-08T14:43:41.880 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -82,7 +82,7 @@ F ext/fts3/README.content fdc666a70d5257a64fee209f97cf89e0e6e32b51 F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers b92bdeb8b46503f0dd301d364efc5ef59ef9fa8e2758b8e742f39fa93a2e422d F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c 45f5774987a68d36355799503b6d02dbff5286ffb42bec14d928b295d2b93c1b +F ext/fts3/fts3.c 7a12745b024dfb26c7b87f9a5e30241b1b8c8f049ecd5c228454757b500a0595 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h 2c59cc46aefde134c1782e89a6a5384710ddcd4e783071337aa5d43d07269be3 F ext/fts3/fts3_aux.c 96708c8b3a7d9b8ca1b68ea2b7e503e283f20e95f145becadedfad096dbd0f34 @@ -950,6 +950,7 @@ F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999f F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f F test/fts3corrupt4.test fde292a4712753c7ef235a199273c5d196e18a56bd2c4d2db7ccaf59b7027a0a F test/fts3corrupt5.test 0549f85ec4bd22e992f645f13c59b99d652f2f5e643dac75568bfd23a6db7ed5 +F test/fts3corrupt6.test b6c55218b704b0cef224b284c756f9c55d0afd0b3c3837618bffeaa8c31e0d8e F test/fts3cov.test 7eacdbefd756cfa4dc2241974e3db2834e9b372ca215880e00032222f32194cf F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f F test/fts3defer.test f4c20e4c7153d20a98ee49ee5f3faef624fefc9a067f8d8d629db380c4d9f1de @@ -1866,8 +1867,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P c1c8937a30feff6aa4385b0c264fd8e70d54422a0629c2ce38082d85d3334a57 8b23d80271aab38abe42ee8b3ca4b746572ecef26c2a37b094b01560e6be9d45 -R 5a67d9ba1d91119ad620e46132adbad1 -T +closed 8b23d80271aab38abe42ee8b3ca4b746572ecef26c2a37b094b01560e6be9d45 -U drh -Z 6f53567ca5c0a8bbc47fb39a7dc9415b +P 6e6b3729e0549de028f6c5bf494b2d69d621c81b61a1dc0a329d3950039342fb +R 501a6f582df48fcb778cb04d0dbc67e9 +U dan +Z 59d7d89d08b1863cb68d3606c4f1b730 diff --git a/manifest.uuid b/manifest.uuid index af887204a7..1ae45ab99b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6e6b3729e0549de028f6c5bf494b2d69d621c81b61a1dc0a329d3950039342fb \ No newline at end of file +d48af4d2cfff3d5f4ccc3db5d658e8b503255b577e6e62b5c2b4a4437875b895 \ No newline at end of file diff --git a/test/fts3corrupt6.test b/test/fts3corrupt6.test new file mode 100644 index 0000000000..9e22bdf68a --- /dev/null +++ b/test/fts3corrupt6.test @@ -0,0 +1,60 @@ +# 2020 June 8 +# +# 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. The +# focus of this script is testing the FTS3 module. +# +# $Id: fts3aa.test,v 1.1 2007/08/20 17:38:42 shess Exp $ +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +source $testdir/fts3_common.tcl +set testprefix fts3corrupt6 + +# If SQLITE_ENABLE_FTS3 is defined, omit this file. +ifcapable !fts3 { + finish_test + return +} + +set ::saved_sqlite_fts3_enable_parentheses $::sqlite_fts3_enable_parentheses +set sqlite_fts3_enable_parentheses 1 +sqlite3_fts3_may_be_corrupt 1 +database_may_be_corrupt + +do_execsql_test 1.0 { + BEGIN TRANSACTION; + CREATE TABLE t_content(col0 INTEGER); + PRAGMA writable_schema=ON; + CREATE VIRTUAL TABLE t0 USING fts3(col0 INTEGER PRIMARY KEY,col1 VARCHAR(8),col2 BINARY,col3 BINARY); + INSERT INTO t0_content VALUES(0,NULL,NULL,NULL,NULL); + INSERT INTO t0_segdir VALUES(0,0,0,0,'0 42',X'000131030102000103323334050101010200000461616161050101020200000462626262050101030200'); + COMMIT; +} + +do_execsql_test 1.1 { + SELECT 0+matchinfo(t0,'yxyyxy') FROM t0 WHERE t0 MATCH CAST( x'2b0a312b0a312a312a2a0b5d0a0b0b0a312a0a0b0b0a312a0b310a392a0b0a27312a2a0b5d0a312a0b310a31315d0b310a312a316d2a0b313b15bceaa50a312a0b0a27312a2a0b5d0a312a0b310a312b0b2a310a312a0b2a0b2a0b2e5d0a0bff313336e34a2a312a0b0a3c310b0a0b4b4b0b4b2a4bec40322b2a0b310a0a312a0a0a0a0a0a0a0a0a0b310a312a2a2a0b5d0a0b0b0a312a0b310a312a0b0a4e4541530b310a5df5ced70a0a0a0a0a4f520a0a0a0a0a0a0a312a0b0a4e4541520b310a5d616161610a0a0a0a4f520a0a0a0a0a0a312b0a312a312a0a0a0a0a0a0a004a0b0a310b220a0b0a310a4a22310a0b0a7e6fe0e0e030e0e0e0e0e01176e02000e0e0e0e0e01131320226310a0b0a310a4a22310a0b0a310a766f8b8b4ee0e0300ae0090909090909090909090909090909090909090909090909090909090909090947aaaa540b09090909090909090909090909090909090909090909090909090909090909fae0e0f2f22164e0e0f273e07fefefef7d6dfafafafa6d6d6d6d' AS TEXT); +} {0} + +do_execsql_test 1.2 { + CREATE VIRTUAL TABLE t1 USING fts3(col0 INTEGER PRIMARY KEY,col1 VARCHAR(8),col2 BINARY,col3 BINARY); + INSERT INTO t1_content VALUES(0,NULL,NULL,NULL,NULL); + INSERT INTO t1_segdir VALUES(0,0,0,0,'0 42',X'000131030102000103323334050101010200000461616161050101020200000462626262050101030200'); +} + +do_execsql_test 1.3 { + SELECT 42+matchinfo(t1,'yxyyxy') FROM t1 WHERE t1 MATCH x'2b0a312b0a312a312a2a0b5d0a0b0b0a312a0a0b0b0a312a0b310a392a0b0a27312a2a0b5d0a312a0b310a31315d0b310a312a316d2a0b313b15bceaa50a312a0b0a27312a2a0b5d0a312a0b310a312b0b2a310a312a0b2a0b2a0b2e5d0a0bff313336e34a2a312a0b0a3c310b0a0b4b4b0b4b2a4bec40322b2a0b310a0a312a0a0a0a0a0a0a0a0a0b310a312a2a2a0b5d0a0b0b0a312a0b310a312a0b0a4e4541530b310a5df5ced70a0a0a0a0a4f520a0a0a0a0a0a0a312a0b0a4e4541520b310a5d616161610a0a0a0a4f520a0a0a0a0a0a312b0a312a312a0a0a0a0a0a0a004a0b0a310b220a0b0a310a4a22310a0b0a7e6fe0e0e030e0e0e0e0e01176e02000e0e0e0e0e01131320226310a0b0a310a4a22310a0b0a310a766f8b8b4ee0e0300ae0090909090909090909090909090909090909090909090909090909090909090947aaaa540b09090909090909090909090909090909090909090909090909090909090909fae0e0f2f22164e0e0f273e07fefefef7d6dfafafafa6d6d6d6d'; +} {42} + +set sqlite_fts3_enable_parentheses $saved_sqlite_fts3_enable_parentheses +finish_test + + From e26d428a5900bb0cbfbb4e3857ff6343e7664cfe Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 9 Jun 2020 11:59:15 +0000 Subject: [PATCH 044/186] Improved tree-view debugging output for aggregate functions. FossilOrigin-Name: b5711b4eead10ef4b0b61f2e2c54768d215a4105f6d47d2ea78991b6e53a6831 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/select.c | 1 + src/sqliteInt.h | 4 +--- src/treeview.c | 3 ++- 5 files changed, 14 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index 6be90cfd3a..5e72cbd1e9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\scase\swhere\sa\scorrupted\sfts3\srecord\scould\scause\san\sassert()\sfailure,\sor\sspurious\sSQLITE_NOMEM\serror\sin\sbuilds\swith\sassert()\sdisabled. -D 2020-06-08T14:43:41.880 +C Improved\stree-view\sdebugging\soutput\sfor\saggregate\sfunctions. +D 2020-06-09T11:59:15.991 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -533,12 +533,12 @@ F src/printf.c 94b5419ad0a17269f76a9e968ca19cf9fa37617abed2e246fc48844e511b6bc6 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c fb79ed71f8b8bbe9fefaba9b844f80700dea4f175ccac34c64a7b5cd75abc362 +F src/select.c 1301808307645b008ba7a33647c0ca19f97240c426addd2e0dad2a2867d8b2b5 F src/shell.c.in c6e26593f2738eefded08a39204bf6b48db135cdfaa458c26ffe57055b4fe365 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 -F src/sqliteInt.h 04621e8c61c2bf4578d07e99cc5b5909b16d5e34600ed8297a8fd4d1a95afc4e +F src/sqliteInt.h 73968c25461d9edf3b15d5d8f1468c4dd0677cbcb5a0be606e04e19e0d4a6863 F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032 F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -598,7 +598,7 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c eee7bae3ec0bc4abee951554bf46a8ba567c0f7752ac90c820ed8afff4c612dc -F src/treeview.c c5691babcd558baa136474b57a4aede45cf68daa3ed6637b981dde4b256e5b67 +F src/treeview.c 4b92992176fb2caefbe06ba5bd06e0e0ebcde3d5564758da672631f17aa51cda F src/trigger.c 4ada1037cc99777f647a882cdacbd1a4deb6567b69daf02946286401b88cdc04 F src/update.c 3199098455830fc2d8c8fc4ae3ec2ea513eef64339ae9a7048db62b21169bc7a F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 @@ -1867,7 +1867,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 6e6b3729e0549de028f6c5bf494b2d69d621c81b61a1dc0a329d3950039342fb -R 501a6f582df48fcb778cb04d0dbc67e9 -U dan -Z 59d7d89d08b1863cb68d3606c4f1b730 +P d48af4d2cfff3d5f4ccc3db5d658e8b503255b577e6e62b5c2b4a4437875b895 +R 7f4e9a8ad02c966f79b46556c8deb165 +U drh +Z 7160527ec9944aa7c5f24e9bdb594d2d diff --git a/manifest.uuid b/manifest.uuid index 1ae45ab99b..8ee67f7f22 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d48af4d2cfff3d5f4ccc3db5d658e8b503255b577e6e62b5c2b4a4437875b895 \ No newline at end of file +b5711b4eead10ef4b0b61f2e2c54768d215a4105f6d47d2ea78991b6e53a6831 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 9e8af0cb17..96e44225fa 100644 --- a/src/select.c +++ b/src/select.c @@ -6362,6 +6362,7 @@ int sqlite3Select( } pAggInfo->pNext = pParse->pAggList; pParse->pAggList = pAggInfo; + pAggInfo->selId = p->selId; memset(&sNC, 0, sizeof(sNC)); sNC.pParse = pParse; sNC.pSrcList = pTabList; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 0b71ef42bb..0cd33baa08 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2523,9 +2523,7 @@ struct AggInfo { int iDistinct; /* Ephemeral table used to enforce DISTINCT */ } *aFunc; int nFunc; /* Number of entries in aFunc[] */ -#ifdef SQLITE_DEBUG - int iAggMagic; /* Magic number when valid */ -#endif + u32 selId; /* Select to which this AggInfo belongs */ AggInfo *pNext; /* Next in list of them all */ }; diff --git a/src/treeview.c b/src/treeview.c index 8ae06261ea..187f1a07d1 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -582,8 +582,9 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){ #endif } if( pExpr->op==TK_AGG_FUNCTION ){ - sqlite3TreeViewLine(pView, "AGG_FUNCTION%d %Q%s iAgg=%d agg=%p", + sqlite3TreeViewLine(pView, "AGG_FUNCTION%d %Q%s agg=%d[%d]/%p", pExpr->op2, pExpr->u.zToken, zFlgs, + pExpr->pAggInfo ? pExpr->pAggInfo->selId : 0, pExpr->iAgg, pExpr->pAggInfo); }else if( pExpr->op2!=0 ){ const char *zOp2; From 81185a5138577baf2b32112fa3c6f931667c23f9 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 9 Jun 2020 13:38:12 +0000 Subject: [PATCH 045/186] Give the expression pointer fields of AggInfo distinctive names in order to simplify tracking of all their uses. FossilOrigin-Name: a53bdd311c4154fd5e1131efbb9665362f79db5a35ce9f7b1547f74b8ee2d8ba --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/expr.c | 14 +++++++------- src/select.c | 32 ++++++++++++++++---------------- src/sqliteInt.h | 4 ++-- 5 files changed, 34 insertions(+), 34 deletions(-) diff --git a/manifest b/manifest index 5e72cbd1e9..330b564652 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\stree-view\sdebugging\soutput\sfor\saggregate\sfunctions. -D 2020-06-09T11:59:15.991 +C Give\sthe\sexpression\spointer\sfields\sof\sAggInfo\sdistinctive\snames\sin\sorder\sto\nsimplify\stracking\sof\sall\stheir\suses. +D 2020-06-09T13:38:12.505 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -485,7 +485,7 @@ F src/date.c b29b349d277e3d579dcc295b24c0a2caed83fd8f090a9f7cbe6070c0fd662384 F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 793deaf88a0904f88285d93d6713c636d55ede0ffd9f08d10f4ea825531d367f F src/delete.c 88047c8e59878c920fce14582bc1dde4d81157d1ca5ffdf36c2907e6d41996c4 -F src/expr.c 217bee94b696a061fec28526c5d5ef3049536ace5c10a0a3ff7d15b0d3a9cd11 +F src/expr.c 5afb8dd59d5617e0eb25f91143ed042b6cd99c006352bdbd441cb9638d2602d8 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41 F src/func.c 2333eb4277f55a5efdc12ef754e7d7ec9105d257b2fd00301d23ce1e8fa67dc0 @@ -533,12 +533,12 @@ F src/printf.c 94b5419ad0a17269f76a9e968ca19cf9fa37617abed2e246fc48844e511b6bc6 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 1301808307645b008ba7a33647c0ca19f97240c426addd2e0dad2a2867d8b2b5 +F src/select.c a1f5efdbbfae1f73746242b43daedc974a4ae702d62c305219da650ec10fb08f F src/shell.c.in c6e26593f2738eefded08a39204bf6b48db135cdfaa458c26ffe57055b4fe365 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 -F src/sqliteInt.h 73968c25461d9edf3b15d5d8f1468c4dd0677cbcb5a0be606e04e19e0d4a6863 +F src/sqliteInt.h 8fddd3ff00bb5983c45fbe891c9c4134b5d4799d8816a1e97cba38dc66aca4c2 F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032 F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -1867,7 +1867,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P d48af4d2cfff3d5f4ccc3db5d658e8b503255b577e6e62b5c2b4a4437875b895 -R 7f4e9a8ad02c966f79b46556c8deb165 +P b5711b4eead10ef4b0b61f2e2c54768d215a4105f6d47d2ea78991b6e53a6831 +R 45115571336eb976de1e3114a0d3911d U drh -Z 7160527ec9944aa7c5f24e9bdb594d2d +Z b9fb75855deff6080f9952a1c1c95794 diff --git a/manifest.uuid b/manifest.uuid index 8ee67f7f22..2406f422d1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b5711b4eead10ef4b0b61f2e2c54768d215a4105f6d47d2ea78991b6e53a6831 \ No newline at end of file +a53bdd311c4154fd5e1131efbb9665362f79db5a35ce9f7b1547f74b8ee2d8ba \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 6fbc8bb49c..555b2a8d82 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5738,20 +5738,20 @@ static int agginfoPersistExprCb(Walker *pWalker, Expr *pExpr){ assert( pExpr->op==TK_AGG_COLUMN || pExpr->op==TK_AGG_FUNCTION ); if( pExpr->op==TK_AGG_COLUMN ){ assert( iAgg>=0 && iAggnColumn ); - if( pAggInfo->aCol[iAgg].pExpr==pExpr ){ + if( pAggInfo->aCol[iAgg].pCExpr==pExpr ){ pExpr = sqlite3ExprDup(db, pExpr, 0); if( pExpr ){ - pAggInfo->aCol[iAgg].pExpr = pExpr; + pAggInfo->aCol[iAgg].pCExpr = pExpr; pParse->pConstExpr = sqlite3ExprListAppend(pParse, pParse->pConstExpr, pExpr); } } }else{ assert( iAgg>=0 && iAggnFunc ); - if( pAggInfo->aFunc[iAgg].pExpr==pExpr ){ + if( pAggInfo->aFunc[iAgg].pFExpr==pExpr ){ pExpr = sqlite3ExprDup(db, pExpr, 0); if( pExpr ){ - pAggInfo->aFunc[iAgg].pExpr = pExpr; + pAggInfo->aFunc[iAgg].pFExpr = pExpr; pParse->pConstExpr = sqlite3ExprListAppend(pParse, pParse->pConstExpr, pExpr); } @@ -5853,7 +5853,7 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ pCol->iColumn = pExpr->iColumn; pCol->iMem = ++pParse->nMem; pCol->iSorterColumn = -1; - pCol->pExpr = pExpr; + pCol->pCExpr = pExpr; if( pAggInfo->pGroupBy ){ int j, n; ExprList *pGB = pAggInfo->pGroupBy; @@ -5896,7 +5896,7 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ */ struct AggInfo_func *pItem = pAggInfo->aFunc; for(i=0; inFunc; i++, pItem++){ - if( sqlite3ExprCompare(0, pItem->pExpr, pExpr, -1)==0 ){ + if( sqlite3ExprCompare(0, pItem->pFExpr, pExpr, -1)==0 ){ break; } } @@ -5908,7 +5908,7 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){ if( i>=0 ){ assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); pItem = &pAggInfo->aFunc[i]; - pItem->pExpr = pExpr; + pItem->pFExpr = pExpr; pItem->iMem = ++pParse->nMem; assert( !ExprHasProperty(pExpr, EP_IntValue) ); pItem->pFunc = sqlite3FindFunction(pParse->db, diff --git a/src/select.c b/src/select.c index 96e44225fa..cd242bb1fd 100644 --- a/src/select.c +++ b/src/select.c @@ -5389,7 +5389,7 @@ static void resetAccumulator(Parse *pParse, AggInfo *pAggInfo){ sqlite3VdbeAddOp3(v, OP_Null, 0, pAggInfo->mnReg, pAggInfo->mxReg); for(pFunc=pAggInfo->aFunc, i=0; inFunc; i++, pFunc++){ if( pFunc->iDistinct>=0 ){ - Expr *pE = pFunc->pExpr; + Expr *pE = pFunc->pFExpr; assert( !ExprHasProperty(pE, EP_xIsSelect) ); if( pE->x.pList==0 || pE->x.pList->nExpr!=1 ){ sqlite3ErrorMsg(pParse, "DISTINCT aggregates must have exactly one " @@ -5413,8 +5413,8 @@ static void finalizeAggFunctions(Parse *pParse, AggInfo *pAggInfo){ int i; struct AggInfo_func *pF; for(i=0, pF=pAggInfo->aFunc; inFunc; i++, pF++){ - ExprList *pList = pF->pExpr->x.pList; - assert( !ExprHasProperty(pF->pExpr, EP_xIsSelect) ); + ExprList *pList = pF->pFExpr->x.pList; + assert( !ExprHasProperty(pF->pFExpr, EP_xIsSelect) ); sqlite3VdbeAddOp2(v, OP_AggFinal, pF->iMem, pList ? pList->nExpr : 0); sqlite3VdbeAppendP4(v, pF->pFunc, P4_FUNCDEF); } @@ -5443,11 +5443,11 @@ static void updateAccumulator(Parse *pParse, int regAcc, AggInfo *pAggInfo){ int nArg; int addrNext = 0; int regAgg; - ExprList *pList = pF->pExpr->x.pList; - assert( !ExprHasProperty(pF->pExpr, EP_xIsSelect) ); - assert( !IsWindowFunc(pF->pExpr) ); - if( ExprHasProperty(pF->pExpr, EP_WinFunc) ){ - Expr *pFilter = pF->pExpr->y.pWin->pFilter; + ExprList *pList = pF->pFExpr->x.pList; + assert( !ExprHasProperty(pF->pFExpr, EP_xIsSelect) ); + assert( !IsWindowFunc(pF->pFExpr) ); + if( ExprHasProperty(pF->pFExpr, EP_WinFunc) ){ + Expr *pFilter = pF->pFExpr->y.pWin->pFilter; if( pAggInfo->nAccumulator && (pF->pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL) ){ @@ -5509,7 +5509,7 @@ static void updateAccumulator(Parse *pParse, int regAcc, AggInfo *pAggInfo){ addrHitTest = sqlite3VdbeAddOp1(v, OP_If, regHit); VdbeCoverage(v); } for(i=0, pC=pAggInfo->aCol; inAccumulator; i++, pC++){ - sqlite3ExprCode(pParse, pC->pExpr, pC->iMem); + sqlite3ExprCode(pParse, pC->pCExpr, pC->iMem); } pAggInfo->directMode = 0; @@ -6385,12 +6385,12 @@ int sqlite3Select( } pAggInfo->nAccumulator = pAggInfo->nColumn; if( p->pGroupBy==0 && p->pHaving==0 && pAggInfo->nFunc==1 ){ - minMaxFlag = minMaxQuery(db, pAggInfo->aFunc[0].pExpr, &pMinMaxOrderBy); + minMaxFlag = minMaxQuery(db, pAggInfo->aFunc[0].pFExpr, &pMinMaxOrderBy); }else{ minMaxFlag = WHERE_ORDERBY_NORMAL; } for(i=0; inFunc; i++){ - Expr *pExpr = pAggInfo->aFunc[i].pExpr; + Expr *pExpr = pAggInfo->aFunc[i].pFExpr; assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); sNC.ncFlags |= NC_InAggFunc; sqlite3ExprAnalyzeAggList(&sNC, pExpr->x.pList); @@ -6412,12 +6412,12 @@ int sqlite3Select( for(ii=0; iinColumn; ii++){ sqlite3DebugPrintf("agg-column[%d] iMem=%d\n", ii, pAggInfo->aCol[ii].iMem); - sqlite3TreeViewExpr(0, pAggInfo->aCol[ii].pExpr, 0); + sqlite3TreeViewExpr(0, pAggInfo->aCol[ii].pCExpr, 0); } for(ii=0; iinFunc; ii++){ sqlite3DebugPrintf("agg-func[%d]: iMem=%d\n", ii, pAggInfo->aFunc[ii].iMem); - sqlite3TreeViewExpr(0, pAggInfo->aFunc[ii].pExpr, 0); + sqlite3TreeViewExpr(0, pAggInfo->aFunc[ii].pFExpr, 0); } } #endif @@ -6722,7 +6722,7 @@ int sqlite3Select( ** function visits zero rows. */ if( pAggInfo->nAccumulator ){ for(i=0; inFunc; i++){ - if( ExprHasProperty(pAggInfo->aFunc[i].pExpr, EP_WinFunc) ){ + if( ExprHasProperty(pAggInfo->aFunc[i].pFExpr, EP_WinFunc) ){ continue; } if( pAggInfo->aFunc[i].pFunc->funcFlags&SQLITE_FUNC_NEEDCOLL ){ @@ -6806,14 +6806,14 @@ select_end: #ifdef SQLITE_DEBUG if( pAggInfo ){ for(i=0; inColumn; i++){ - Expr *pExpr = pAggInfo->aCol[i].pExpr; + Expr *pExpr = pAggInfo->aCol[i].pCExpr; assert( pExpr!=0 || db->mallocFailed ); if( pExpr==0 ) continue; assert( pExpr->pAggInfo==pAggInfo ); assert( pExpr->iAgg==i ); } for(i=0; inFunc; i++){ - Expr *pExpr = pAggInfo->aFunc[i].pExpr; + Expr *pExpr = pAggInfo->aFunc[i].pFExpr; assert( pExpr!=0 || db->mallocFailed ); if( pExpr==0 ) continue; assert( pExpr->pAggInfo==pAggInfo ); diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 0cd33baa08..7231856423 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2506,7 +2506,7 @@ struct AggInfo { ExprList *pGroupBy; /* The group by clause */ struct AggInfo_col { /* For each column used in source tables */ Table *pTab; /* Source table */ - Expr *pExpr; /* The original expression */ + Expr *pCExpr; /* The original expression */ int iTable; /* Cursor number of the source table */ int iMem; /* Memory location that acts as accumulator */ i16 iColumn; /* Column number within the source table */ @@ -2517,7 +2517,7 @@ struct AggInfo { ** Additional columns are used only as parameters to ** aggregate functions */ struct AggInfo_func { /* For each aggregate function */ - Expr *pExpr; /* Expression encoding the function */ + Expr *pFExpr; /* Expression encoding the function */ FuncDef *pFunc; /* The aggregate function implementation */ int iMem; /* Memory location that acts as accumulator */ int iDistinct; /* Ephemeral table used to enforce DISTINCT */ From cfb8bf6a501ccc5f67b9ae84ad1b6aa40bc1a374 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 9 Jun 2020 13:53:56 +0000 Subject: [PATCH 046/186] Modify a test file to avoid causing Tcl to allocate too much memory. FossilOrigin-Name: 232431f32ef77a9dfc4eeb7765dca24af72051fd5460f648d0c5ba318c8a01fc --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/printf.test | 8 +++++--- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 330b564652..b8ba79ee60 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Give\sthe\sexpression\spointer\sfields\sof\sAggInfo\sdistinctive\snames\sin\sorder\sto\nsimplify\stracking\sof\sall\stheir\suses. -D 2020-06-09T13:38:12.505 +C Modify\sa\stest\sfile\sto\savoid\scausing\sTcl\sto\sallocate\stoo\smuch\smemory. +D 2020-06-09T13:53:56.924 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1247,7 +1247,7 @@ F test/pragma4.test 10c624e45a83c0096a82a7579a5ff658542391d3b77355192da6572c8c17 F test/pragma5.test 7b33fc43e2e41abf17f35fb73f71b49671a380ea92a6c94b6ce530a25f8d9102 F test/pragmafault.test 275edaf3161771d37de60e5c2b412627ac94cef11739236bec12ed1258b240f8 F test/prefixes.test b524a1c44bffec225b9aec98bd728480352aa8532ac4c15771fb85e8beef65d9 -F test/printf.test 1e0e469f5f8a09afa8a182f34647e3d9b8c01978cbbe2313a194ccc3a8471506 +F test/printf.test 390d0d7fcffc3c4ea3c1bb4cbb267444e32b33b048ae21895f23a291844fe1da F test/printf2.test 30b5dd0b4b992dc5626496846ecce17ff592cacbcb11c3e589f3ac4d7e129dae F test/progress.test ebab27f670bd0d4eb9d20d49cef96e68141d92fb F test/ptrchng.test ef1aa72d6cf35a2bbd0869a649b744e9d84977fc @@ -1867,7 +1867,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b5711b4eead10ef4b0b61f2e2c54768d215a4105f6d47d2ea78991b6e53a6831 -R 45115571336eb976de1e3114a0d3911d -U drh -Z b9fb75855deff6080f9952a1c1c95794 +P a53bdd311c4154fd5e1131efbb9665362f79db5a35ce9f7b1547f74b8ee2d8ba +R 8d5a1a9f2ed9a4fff418950bdfdce962 +U dan +Z f464d78ab773b9580c31ba7ad2e586ff diff --git a/manifest.uuid b/manifest.uuid index 2406f422d1..3aa4f6d091 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a53bdd311c4154fd5e1131efbb9665362f79db5a35ce9f7b1547f74b8ee2d8ba \ No newline at end of file +232431f32ef77a9dfc4eeb7765dca24af72051fd5460f648d0c5ba318c8a01fc \ No newline at end of file diff --git a/test/printf.test b/test/printf.test index d6acacb0f0..445470fc07 100644 --- a/test/printf.test +++ b/test/printf.test @@ -538,9 +538,11 @@ do_test printf-2.1.2.8 { do_test printf-2.1.2.9 { sqlite3_mprintf_double {abc: %d %d (%1.1g) :xyz} 1 1 1.0e-20 } {abc: 1 1 (1e-20) :xyz} -do_test printf-2.1.2.10 { - sqlite3_mprintf_double {abc: %*.*f} 2000000000 1000000000 1.0e-20 -} {} +if {$SQLITE_MAX_LENGTH<=[expr 1000*1000*1000]} { + do_test printf-2.1.2.10 { + sqlite3_mprintf_double {abc: %*.*f} 2000000000 1000000000 1.0e-20 + } {} +} do_test printf-2.1.3.1 { sqlite3_mprintf_double {abc: (%*.*f) :xyz} 1 1 1.0 } {abc: (1.0) :xyz} From ed41a96bc1e3a6eb011330b0a109ae4fc703a14c Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 9 Jun 2020 17:45:48 +0000 Subject: [PATCH 047/186] Ensure that aggregate functions that (a) are part of SELECT statements with no FROM clause and (b) have one or more scalar sub-selects as arguments are assigned to the correct aggregate context. FossilOrigin-Name: 16a41fa8c4c74bba4e908a9c19e6cf5a927cac140e2070c9abf303158be7257b --- manifest | 19 ++++++++++-------- manifest.uuid | 2 +- src/expr.c | 20 +++++++++++++++++-- test/aggnested.test | 47 +++++++++++++++++++++++++++++++++++++++++++++ test/window9.test | 4 ++-- 5 files changed, 79 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index b8ba79ee60..cb430643e5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Modify\sa\stest\sfile\sto\savoid\scausing\sTcl\sto\sallocate\stoo\smuch\smemory. -D 2020-06-09T13:53:56.924 +C Ensure\sthat\saggregate\sfunctions\sthat\s(a)\sare\spart\sof\sSELECT\sstatements\swith\sno\sFROM\sclause\sand\s(b)\shave\sone\sor\smore\sscalar\ssub-selects\sas\sarguments\sare\sassigned\sto\sthe\scorrect\saggregate\scontext. +D 2020-06-09T17:45:48.153 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -485,7 +485,7 @@ F src/date.c b29b349d277e3d579dcc295b24c0a2caed83fd8f090a9f7cbe6070c0fd662384 F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 793deaf88a0904f88285d93d6713c636d55ede0ffd9f08d10f4ea825531d367f F src/delete.c 88047c8e59878c920fce14582bc1dde4d81157d1ca5ffdf36c2907e6d41996c4 -F src/expr.c 5afb8dd59d5617e0eb25f91143ed042b6cd99c006352bdbd441cb9638d2602d8 +F src/expr.c a72ee44af014cade90746871e90f57a16f97ce5e5d1502e29a556490fd267a15 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41 F src/func.c 2333eb4277f55a5efdc12ef754e7d7ec9105d257b2fd00301d23ce1e8fa67dc0 @@ -629,7 +629,7 @@ F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 -F test/aggnested.test 12106f0748e8e9bfc1a8e6840e203e051eae06a26ed13fc9fd5db108a8d6db54 +F test/aggnested.test 2f65ec8132e0ca896de550b9908094d49ad65a99116a9d79deeb6017604ad4f6 F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87 F test/all.test 2ecb8bbd52416642e41c9081182a8df05d42c75637afd4488aace78cc4b69e13 F test/alter.test 25e109787dc5e631e117eb6e1c57f96a572bb51228db3b4f8b5f41d665e2ccaa @@ -1741,7 +1741,7 @@ F test/window7.tcl 6a1210f05d40ec89c22960213a22cd3f98d4e2f2eb20646c83c8c30d4d761 F test/window7.test 1d31276961ae7801edc72173edaf7593e3cbc79c06d1f1f09e20d8418af403cd F test/window8.tcl f2711aa3571e4e6b0dad98db8d95fd6cb8d9db0c92bbdf535f153b07606a1ce2 F test/window8.test c4331b27a6f66d69fa8f8bab10cc731db1a81d293ae108a68f7c3487fa94e65b -F test/window9.test c22c25377c820613e1842fe7ad4af7c03df625f6a7caee99e6fdb4fcd52e0a8b +F test/window9.test 4d8c875b73febdbac9b8f2b52ec132b98f48261cdafd6b08db62bc6d8ff913fc F test/windowA.test 6d63dc1260daa17141a55007600581778523a8b420629f1282d2acfc36af23be F test/windowB.test 7a983ea1cc1cf72be7f378e4b32f6cb2d73014c5cd8b25aaee825164cd4269e5 F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387019e0 @@ -1867,7 +1867,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 a53bdd311c4154fd5e1131efbb9665362f79db5a35ce9f7b1547f74b8ee2d8ba -R 8d5a1a9f2ed9a4fff418950bdfdce962 +P 232431f32ef77a9dfc4eeb7765dca24af72051fd5460f648d0c5ba318c8a01fc +R 0227801129ea01db7bd6b8fdef42c443 +T *branch * agg-context-fix +T *sym-agg-context-fix * +T -sym-trunk * U dan -Z f464d78ab773b9580c31ba7ad2e586ff +Z b0984ce04348fe30b8ef7dbc168a8647 diff --git a/manifest.uuid b/manifest.uuid index 3aa4f6d091..0f7761b1d4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -232431f32ef77a9dfc4eeb7765dca24af72051fd5460f648d0c5ba318c8a01fc \ No newline at end of file +16a41fa8c4c74bba4e908a9c19e6cf5a927cac140e2070c9abf303158be7257b \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 555b2a8d82..87dbe617ac 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5654,10 +5654,25 @@ int sqlite3ExprCoveredByIndex( */ struct SrcCount { SrcList *pSrc; /* One particular FROM clause in a nested query */ + int iSrcInner; /* Smallest cursor number in this context */ int nThis; /* Number of references to columns in pSrcList */ int nOther; /* Number of references to columns in other FROM clauses */ }; +/* +** xSelect callback for sqlite3FunctionUsesThisSrc(). If this is the first +** SELECT with a FROM clause encountered during this iteration, set +** SrcCount.iSrcInner to the cursor number of the leftmost object in +** the FROM cause. +*/ +static int selectSrcCount(Walker *pWalker, Select *pSel){ + struct SrcCount *p = pWalker->u.pSrcCount; + if( p->iSrcInner==0x7FFFFFFF && pSel->pSrc && pSel->pSrc->nSrc ){ + pWalker->u.pSrcCount->iSrcInner = pSel->pSrc->a[0].iCursor; + } + return WRC_Continue; +} + /* ** Count the number of references to columns. */ @@ -5678,7 +5693,7 @@ static int exprSrcCount(Walker *pWalker, Expr *pExpr){ } if( inThis++; - }else if( nSrc==0 || pExpr->iTablea[0].iCursor ){ + }else if( pExpr->iTableiSrcInner ){ /* In a well-formed parse tree (no name resolution errors), ** TK_COLUMN nodes with smaller Expr.iTable values are in an ** outer context. Those are the only ones to count as "other" */ @@ -5700,9 +5715,10 @@ int sqlite3FunctionUsesThisSrc(Expr *pExpr, SrcList *pSrcList){ assert( pExpr->op==TK_AGG_FUNCTION ); memset(&w, 0, sizeof(w)); w.xExprCallback = exprSrcCount; - w.xSelectCallback = sqlite3SelectWalkNoop; + w.xSelectCallback = selectSrcCount; w.u.pSrcCount = &cnt; cnt.pSrc = pSrcList; + cnt.iSrcInner = (pSrcList&&pSrcList->nSrc)?pSrcList->a[0].iCursor:0x7FFFFFFF; cnt.nThis = 0; cnt.nOther = 0; sqlite3WalkExprList(&w, pExpr->x.pList); diff --git a/test/aggnested.test b/test/aggnested.test index d712c840f1..dcb1f95c99 100644 --- a/test/aggnested.test +++ b/test/aggnested.test @@ -17,6 +17,7 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl +set testprefix aggnested do_test aggnested-1.1 { db eval { @@ -259,6 +260,52 @@ do_execsql_test aggnested-4.4 { SELECT max((SELECT a FROM (SELECT count(*) AS a FROM ty) AS s)) FROM tx; } {3} +#-------------------------------------------------------------------------- +# +reset_db +do_execsql_test 5.0 { + CREATE TABLE x1(a, b); + INSERT INTO x1 VALUES(1, 2); + CREATE TABLE x2(x); + INSERT INTO x2 VALUES(NULL), (NULL), (NULL); +} + +# At one point, aggregate "total()" in the query below was being processed +# as part of the outer SELECT, not as part of the sub-select with no FROM +# clause. +do_execsql_test 5.1 { + SELECT ( SELECT total( (SELECT b FROM x1) ) ) FROM x2; +} {2.0 2.0 2.0} + +do_execsql_test 5.2 { + SELECT ( SELECT total( (SELECT 2 FROM x1) ) ) FROM x2; +} {2.0 2.0 2.0} + +do_execsql_test 5.3 { + CREATE TABLE t1(a); + CREATE TABLE t2(b); +} + +do_execsql_test 5.4 { + SELECT( + SELECT max(b) LIMIT ( + SELECT total( (SELECT a FROM t1) ) + ) + ) + FROM t2; +} {{}} + +do_execsql_test 5.5 { + CREATE TABLE a(b); + WITH c AS(SELECT a) + SELECT(SELECT(SELECT group_concat(b, b) + LIMIT(SELECT 0.100000 * + AVG(DISTINCT(SELECT 0 FROM a ORDER BY b, b, b)))) + FROM a GROUP BY b, + b, b) FROM a EXCEPT SELECT b FROM a ORDER BY b, + b, b; +} + diff --git a/test/window9.test b/test/window9.test index 46d746c4ff..c342a4d790 100644 --- a/test/window9.test +++ b/test/window9.test @@ -255,7 +255,7 @@ do_execsql_test 8.2 { do_catchsql_test 8.3 { SELECT min( max((SELECT x FROM v1)) ) OVER() -} {1 {misuse of aggregate: max()}} +} {0 0} do_execsql_test 8.4 { SELECT( @@ -263,6 +263,6 @@ do_execsql_test 8.4 { SELECT sum( avg((SELECT x FROM v1)) ) OVER() ) FROM v1; -} {0.0} +} {0.0 0.0} finish_test From bc050b8f2720ca110c6a9db8cd1b15bcfcc6968c Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 9 Jun 2020 22:11:06 +0000 Subject: [PATCH 048/186] Mark an always-true conditional with ALWAYS(). FossilOrigin-Name: 35a236841764a10cdcda63f34e1a8e7ffa43933bc89cb32f675454327834d7bf --- manifest | 17 +++++++---------- manifest.uuid | 2 +- src/expr.c | 2 +- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index cb430643e5..f1c071e2ea 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\saggregate\sfunctions\sthat\s(a)\sare\spart\sof\sSELECT\sstatements\swith\sno\sFROM\sclause\sand\s(b)\shave\sone\sor\smore\sscalar\ssub-selects\sas\sarguments\sare\sassigned\sto\sthe\scorrect\saggregate\scontext. -D 2020-06-09T17:45:48.153 +C Mark\san\salways-true\sconditional\swith\sALWAYS(). +D 2020-06-09T22:11:06.772 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -485,7 +485,7 @@ F src/date.c b29b349d277e3d579dcc295b24c0a2caed83fd8f090a9f7cbe6070c0fd662384 F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a F src/dbstat.c 793deaf88a0904f88285d93d6713c636d55ede0ffd9f08d10f4ea825531d367f F src/delete.c 88047c8e59878c920fce14582bc1dde4d81157d1ca5ffdf36c2907e6d41996c4 -F src/expr.c a72ee44af014cade90746871e90f57a16f97ce5e5d1502e29a556490fd267a15 +F src/expr.c 54c0e48fdafb60c54efd786434a56eccbea7d887b7f84ed3568233de35ca81a8 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41 F src/func.c 2333eb4277f55a5efdc12ef754e7d7ec9105d257b2fd00301d23ce1e8fa67dc0 @@ -1867,10 +1867,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 232431f32ef77a9dfc4eeb7765dca24af72051fd5460f648d0c5ba318c8a01fc -R 0227801129ea01db7bd6b8fdef42c443 -T *branch * agg-context-fix -T *sym-agg-context-fix * -T -sym-trunk * -U dan -Z b0984ce04348fe30b8ef7dbc168a8647 +P 16a41fa8c4c74bba4e908a9c19e6cf5a927cac140e2070c9abf303158be7257b +R c0708f727fdcc95b477a18221a965825 +U drh +Z f79254b70a5e081e8abefb3c222e5de7 diff --git a/manifest.uuid b/manifest.uuid index 0f7761b1d4..9d6237b1f8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -16a41fa8c4c74bba4e908a9c19e6cf5a927cac140e2070c9abf303158be7257b \ No newline at end of file +35a236841764a10cdcda63f34e1a8e7ffa43933bc89cb32f675454327834d7bf \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 87dbe617ac..79d57454c9 100644 --- a/src/expr.c +++ b/src/expr.c @@ -5667,7 +5667,7 @@ struct SrcCount { */ static int selectSrcCount(Walker *pWalker, Select *pSel){ struct SrcCount *p = pWalker->u.pSrcCount; - if( p->iSrcInner==0x7FFFFFFF && pSel->pSrc && pSel->pSrc->nSrc ){ + if( p->iSrcInner==0x7FFFFFFF && ALWAYS(pSel->pSrc) && pSel->pSrc->nSrc ){ pWalker->u.pSrcCount->iSrcInner = pSel->pSrc->a[0].iCursor; } return WRC_Continue; From 7b4c4d4a674efe176437e5586cb55839ba43d499 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 10 Jun 2020 03:07:26 +0000 Subject: [PATCH 049/186] Disable AggInfo consistency checks when unwinding after an OOM. FossilOrigin-Name: 65179814aa0ae5927bae97c10ef20f290535399b889d96d5b88931f62635f212 --- manifest | 13 ++++++------- manifest.uuid | 2 +- src/select.c | 2 +- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 9bbc9d0223..bb9d8a086e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\saggregate\sfunctions\sthat\s(a)\sare\spart\sof\sSELECT\sstatements\swith\s\nno\sFROM\sclause\sand\s(b)\shave\sone\sor\smore\sscalar\ssub-selects\sas\sarguments\sare\nassigned\sto\sthe\scorrect\saggregate\scontext.\nFix\sfor\sticket\s[7c6d876f84e6e7e2] -D 2020-06-09T23:50:13.182 +C Disable\sAggInfo\sconsistency\schecks\swhen\sunwinding\safter\san\sOOM. +D 2020-06-10T03:07:26.868 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -533,7 +533,7 @@ F src/printf.c 94b5419ad0a17269f76a9e968ca19cf9fa37617abed2e246fc48844e511b6bc6 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c a1f5efdbbfae1f73746242b43daedc974a4ae702d62c305219da650ec10fb08f +F src/select.c 4daa7ac63367e88a970da434299463dac00ea59f68545e58f2c676c41c3df509 F src/shell.c.in c6e26593f2738eefded08a39204bf6b48db135cdfaa458c26ffe57055b4fe365 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1867,8 +1867,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 232431f32ef77a9dfc4eeb7765dca24af72051fd5460f648d0c5ba318c8a01fc 35a236841764a10cdcda63f34e1a8e7ffa43933bc89cb32f675454327834d7bf -R c0708f727fdcc95b477a18221a965825 -T +closed 35a236841764a10cdcda63f34e1a8e7ffa43933bc89cb32f675454327834d7bf +P c29a9e484e1dd245962afbbf511b183462af5e86c511261ccf018345e773f940 +R 440ef9b1055344c4df3ee1e29cdb0f73 U drh -Z ee07ca7203f666ac689e6e704d547cda +Z 72d82f473bff3f7dd22efa1accdf2ed0 diff --git a/manifest.uuid b/manifest.uuid index fb49b9cf82..8765d3aaf0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c29a9e484e1dd245962afbbf511b183462af5e86c511261ccf018345e773f940 \ No newline at end of file +65179814aa0ae5927bae97c10ef20f290535399b889d96d5b88931f62635f212 \ No newline at end of file diff --git a/src/select.c b/src/select.c index cd242bb1fd..093178f43d 100644 --- a/src/select.c +++ b/src/select.c @@ -6804,7 +6804,7 @@ int sqlite3Select( select_end: sqlite3ExprListDelete(db, pMinMaxOrderBy); #ifdef SQLITE_DEBUG - if( pAggInfo ){ + if( pAggInfo && !db->mallocFailed ){ for(i=0; inColumn; i++){ Expr *pExpr = pAggInfo->aCol[i].pCExpr; assert( pExpr!=0 || db->mallocFailed ); From f65e3799191b44f5db21f7d49b7f289bd4c5508f Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 10 Jun 2020 10:58:15 +0000 Subject: [PATCH 050/186] Ensure that the "push-down" optimization does not push constraints down into compound queries if any of the component queries uses window functions. FossilOrigin-Name: 094dcfe779613301521e8bb990432df187b3686add75a3420b4a193f02f3467f --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/select.c | 5 ++++- test/window1.test | 32 ++++++++++++++++++++++++++++++-- 4 files changed, 43 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index bb9d8a086e..229488da3e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Disable\sAggInfo\sconsistency\schecks\swhen\sunwinding\safter\san\sOOM. -D 2020-06-10T03:07:26.868 +C Ensure\sthat\sthe\s"push-down"\soptimization\sdoes\snot\spush\sconstraints\sdown\sinto\scompound\squeries\sif\sany\sof\sthe\scomponent\squeries\suses\swindow\sfunctions. +D 2020-06-10T10:58:15.548 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -533,7 +533,7 @@ F src/printf.c 94b5419ad0a17269f76a9e968ca19cf9fa37617abed2e246fc48844e511b6bc6 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c 4daa7ac63367e88a970da434299463dac00ea59f68545e58f2c676c41c3df509 +F src/select.c b7bbec203c2a00e542dfea72ddfad92df349a4e3565aa666c3157fc85afe30b3 F src/shell.c.in c6e26593f2738eefded08a39204bf6b48db135cdfaa458c26ffe57055b4fe365 F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1728,7 +1728,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 49f81c25c065fd65b64cd2aaa96f20199fd5d8f847dd1c8151cfccae2aeae83f +F test/window1.test 486f0e01310fc7d98e626cdcb3806582c17cb0afaf1f3ec0f58ba8619c38f5ae F test/window2.tcl 492c125fa550cda1dd3555768a2303b3effbeceee215293adf8871efc25f1476 F test/window2.test e466a88bd626d66edc3d352d7d7e1d5531e0079b549ba44efb029d1fbff9fd3c F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 @@ -1867,7 +1867,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P c29a9e484e1dd245962afbbf511b183462af5e86c511261ccf018345e773f940 -R 440ef9b1055344c4df3ee1e29cdb0f73 -U drh -Z 72d82f473bff3f7dd22efa1accdf2ed0 +P 65179814aa0ae5927bae97c10ef20f290535399b889d96d5b88931f62635f212 +R 9433b47fb24e72f9850aa4e3904d3746 +U dan +Z 349135e37e95a5cec7419bf8785fcd64 diff --git a/manifest.uuid b/manifest.uuid index 8765d3aaf0..fc1873d631 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -65179814aa0ae5927bae97c10ef20f290535399b889d96d5b88931f62635f212 \ No newline at end of file +094dcfe779613301521e8bb990432df187b3686add75a3420b4a193f02f3467f \ No newline at end of file diff --git a/src/select.c b/src/select.c index 093178f43d..465aab1ef1 100644 --- a/src/select.c +++ b/src/select.c @@ -4428,11 +4428,14 @@ static int pushDownWhereTerms( ){ Expr *pNew; int nChng = 0; + Select *pSel; if( pWhere==0 ) return 0; if( pSubq->selFlags & SF_Recursive ) return 0; /* restriction (2) */ #ifndef SQLITE_OMIT_WINDOWFUNC - if( pSubq->pWin ) return 0; /* restriction (6) */ + for(pSel=pSubq; pSel; pSel=pSel->pPrior){ + if( pSel->pWin ) return 0; /* restriction (6) */ + } #endif #ifdef SQLITE_DEBUG diff --git a/test/window1.test b/test/window1.test index 3336a613ab..ea5b66459e 100644 --- a/test/window1.test +++ b/test/window1.test @@ -1756,7 +1756,7 @@ do_catchsql_test 54.2 { UNION SELECT b AS c FROM t1 ) WHERE c>10; -} {1 {misuse of window function sum()}} +} {0 {}} do_execsql_test 54.3 { INSERT INTO t1 VALUES('2',5.0); @@ -1769,7 +1769,7 @@ do_catchsql_test 54.4 { UNION SELECT b AS c FROM t1 ) WHERE c>10; -} {1 {misuse of window function sum()}} +} {0 {15.0 30.0}} # 2020-06-05 ticket c8d3b9f0a750a529 reset_db @@ -1889,4 +1889,32 @@ INSERT INTO t1 VALUES(5),(NULL),('seventeen'); SELECT (SELECT max(x)OVER(ORDER BY x) % min(x)OVER(ORDER BY CASE x WHEN 889 THEN x WHEN x THEN x END)) FROM (SELECT (SELECT sum(CAST(a IN(SELECT (SELECT max(x)OVER(ORDER BY CASE x WHEN 889 THEN 299 WHEN 863 THEN 863 END)) FROM (SELECT (SELECT sum(CAST((SELECT (SELECT max(x)OVER(ORDER BY x) / min(x)OVER(ORDER BY CASE x WHEN 889 THEN 299 WHEN -true THEN 863 END)) FROM (SELECT (SELECT sum(CAST(a IN(SELECT (SELECT max(x) & sum ( a )OVER(ORDER BY CASE x WHEN -8 THEN 299 WHEN 863 THEN 863 END)) FROM (SELECT (SELECT sum(CAST(a AS )) FROM t1) AS x FROM t1)) AS t1 )) FROM t1) AS x FROM t1)) AS x )) FROM t1) AS x FROM t1)) AS real)) FROM t1) AS x FROM t1); } {{} {} {}} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 62.1 { + CREATE TABLE t1(a VARCHAR(20), b FLOAT); + INSERT INTO t1 VALUES('1',10.0); +} + +do_execsql_test 62.2 { + SELECT * FROM ( + SELECT sum(b) OVER() AS c FROM t1 + UNION + SELECT b AS c FROM t1 + ) WHERE c>10; +} + +do_execsql_test 62.3 { + INSERT INTO t1 VALUES('2',5.0); + INSERT INTO t1 VALUES('3',15.0); +} + +do_execsql_test 62.4 { + SELECT * FROM ( + SELECT sum(b) OVER() AS c FROM t1 + UNION + SELECT b AS c FROM t1 + ) WHERE c>10; +} {15.0 30.0} + finish_test From ac4f7cf8d33cd751b150625560e53821f81375d8 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 10 Jun 2020 14:30:15 +0000 Subject: [PATCH 051/186] Make sure the bbox object is fully initialized in geopoly, even if reading a corrupted database. FossilOrigin-Name: fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 --- ext/rtree/geopoly.c | 2 ++ manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/ext/rtree/geopoly.c b/ext/rtree/geopoly.c index 14facad534..35294c8d85 100644 --- a/ext/rtree/geopoly.c +++ b/ext/rtree/geopoly.c @@ -683,6 +683,8 @@ static GeoPoly *geopolyBBox( aCoord[2].f = mnY; aCoord[3].f = mxY; } + }else{ + memset(aCoord, 0, sizeof(RtreeCoord)*4); } return pOut; } diff --git a/manifest b/manifest index 229488da3e..e36a442250 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\sthe\s"push-down"\soptimization\sdoes\snot\spush\sconstraints\sdown\sinto\scompound\squeries\sif\sany\sof\sthe\scomponent\squeries\suses\swindow\sfunctions. -D 2020-06-10T10:58:15.548 +C Make\ssure\sthe\sbbox\sobject\sis\sfully\sinitialized\sin\sgeopoly,\seven\sif\sreading\na\scorrupted\sdatabase. +D 2020-06-10T14:30:15.355 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -385,7 +385,7 @@ F ext/repair/test/checkfreelist01.test 3e8aa6aeb4007680c94a8d07b41c339aa635cc782 F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c335096108c12c01bddbadcec F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 -F ext/rtree/geopoly.c cac70b5502742bd0ba8877a1329a74e86a379c78567546a2a18cf5f9c3787f73 +F ext/rtree/geopoly.c f15cc6845d64a629035627d863cbe3eadc9cb30f9ca77bd823b0ca8a5a3f8b00 F ext/rtree/rtree.c 0ee39cc787b95aa03a012e09e6090b0fa452154fa812af9a379898560fd6c00f F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 F ext/rtree/rtree1.test 00792b030a4e188ff1b22e8530e8aa0452bb5dd81c2b18cb004afc7dc63e040e @@ -1867,7 +1867,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 65179814aa0ae5927bae97c10ef20f290535399b889d96d5b88931f62635f212 -R 9433b47fb24e72f9850aa4e3904d3746 -U dan -Z 349135e37e95a5cec7419bf8785fcd64 +P 094dcfe779613301521e8bb990432df187b3686add75a3420b4a193f02f3467f +R fe50fdd9252d03af57c53593afdee806 +U drh +Z 9cfa3eb1061d3d10530f069bf73f5151 diff --git a/manifest.uuid b/manifest.uuid index fc1873d631..93b32e7733 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -094dcfe779613301521e8bb990432df187b3686add75a3420b4a193f02f3467f \ No newline at end of file +fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 \ No newline at end of file From 9216de8a230b001fd9841bcab5407c941b89ffb0 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 11 Jun 2020 00:57:09 +0000 Subject: [PATCH 052/186] Provide the ability to use the SELECTTRACE() debugging macro outside of the select.c source file. Use this to add a new SELECTTRACE() entry in window.c for improved tracing of window-function parse-tree rewriting. FossilOrigin-Name: 30c6d895b573d5f2a53487b3b7a0d20be7e382c7a0bc87336bd43fbd2fa89bf4 --- manifest | 1883 +---------------------------------------------- manifest.uuid | 2 +- src/global.c | 5 + src/select.c | 16 +- src/sqliteInt.h | 13 +- src/test1.c | 2 +- src/window.c | 3 + 7 files changed, 34 insertions(+), 1890 deletions(-) diff --git a/manifest b/manifest index e36a442250..09e432bfe3 100644 --- a/manifest +++ b/manifest @@ -1,1873 +1,12 @@ -C Make\ssure\sthe\sbbox\sobject\sis\sfully\sinitialized\sin\sgeopoly,\seven\sif\sreading\na\scorrupted\sdatabase. -D 2020-06-10T14:30:15.355 -F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 -F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea -F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 -F Makefile.in 8d79d12bae1b624d32cf9a698ecc797bfa908ab7eabac5d76faf130c4d362223 -F Makefile.linux-gcc f609543700659711fbd230eced1f01353117621dccae7b9fb70daa64236c5241 -F Makefile.msc 08268b28e97fce2475c4a9bd7ba84a99827d6cf9e6b46952409821f6a12ee46d -F README.md 1514a365ffca3c138e00c5cc839906108a01011a6b082bad19b09781e3aa498a -F VERSION 5db2ee2cfcc790af73775fa485c13b2e8ccaa5936c6e1f47aedeba7056041ca5 -F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 -F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 -F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90 -F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2 -F autoconf/INSTALL 83e4a25da9fd053c7b3665eaaaf7919707915903 -F autoconf/Makefile.am e14b629addaa1ce372b72043f28f40de2e32b7e211b6e0fc18dbb87989197e40 -F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac -F autoconf/Makefile.msc e0f1dafc48d000fd6ddfdb01815271528db55cbc7299ca888df5b93367f0d5a4 -F autoconf/README.first 6c4f34fe115ff55d4e8dbfa3cecf04a0188292f7 -F autoconf/README.txt 4f04b0819303aabaa35fff5f7b257fb0c1ef95f1 -F autoconf/configure.ac 3cd933b959fe514eebd1ca1717dfddbf2c9b825b6bc2c5f744deaf5d63af9288 -F autoconf/tea/Makefile.in b438a7020446c8a8156e8d97c8914a04833da6fd -F autoconf/tea/README 3e9a3c060f29a44344ab50aec506f4db903fb873 -F autoconf/tea/aclocal.m4 52c47aac44ce0ddb1f918b6993e8beb8eee88f43 -F autoconf/tea/configure.ac ea61e07340d97e4a79a081f0b8977198a6073edd060738dbb3ae5cb8d5e96f1c -F autoconf/tea/doc/sqlite3.n e1fe45d4f5286ee3d0ccc877aca2a0def488e9bb -F autoconf/tea/license.terms 13bd403c9610fd2b76ece0ab50c4c5eda933d523 -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 71915591c07cd5137711dc40ba3e127deb3f4531b9aad220b724cf5b451362bd -F autoconf/tea/win/nmakehlp.c 247538ad8e8c508f33c03ec1fbd67d3a07ef6291 -F autoconf/tea/win/rules.vc c511f222b80064096b705dbeb97060ee1d6b6d63 -F config.guess 883205ddf25b46f10c181818bf42c09da9888884af96f79e1719264345053bd6 -F config.h.in 6376abec766e9a0785178b1823b5a587e9f1ccbc -F config.sub c2d0260f17f3e4bc0b6808fccf1b291cb5e9126c14fc5890efc77b9fd0175559 -F configure 5a2d453f527dcf969eecaac335d8261b3f1a8a6bd2c693a00dd7d18c29ccc7e4 x -F configure.ac 798a24cee2879325ca5b688a618199eb32cc77ed8136edbaa43d9137b470d54e -F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad -F doc/F2FS.txt c1d4a0ae9711cfe0e1d8b019d154f1c29e0d3abfe820787ba1e9ed7691160fcd -F doc/lemon.html 857495c0ce060a4e2f2ad7111135ad7e28041a32c10612279ab398eddf678f58 -F doc/pager-invariants.txt 27fed9a70ddad2088750c4a2b493b63853da2710 -F doc/trusted-schema.md 33625008620e879c7bcfbbfa079587612c434fa094d338b08242288d358c3e8a -F doc/vfs-shm.txt e101f27ea02a8387ce46a05be2b1a902a021d37a -F ext/README.md fd5f78013b0a2bc6f0067afb19e6ad040e89a10179b4f6f03eee58fac5f169bd -F ext/async/README.txt e12275968f6fde133a80e04387d0e839b0c51f91 -F ext/async/sqlite3async.c 0f3070cc3f5ede78f2b9361fb3b629ce200d7d74 -F ext/async/sqlite3async.h f489b080af7e72aec0e1ee6f1d98ab6cf2e4dcef -F ext/expert/README.md b321c2762bb93c18ea102d5a5f7753a4b8bac646cb392b3b437f633caf2020c3 -F ext/expert/expert.c d548d603a4cc9e61f446cc179c120c6713511c413f82a4a32b1e1e69d3f086a4 -F ext/expert/expert1.test 2e10ff875c31c9e6fc5e324767624181273859771fe34c5daeeadf3f2974a4f7 -F ext/expert/sqlite3expert.c ac008c72c00e6ded0f5116914d22ebd57f415fc0a7ea04738f4e9766dbdd3117 -F ext/expert/sqlite3expert.h ca81efc2679a92373a13a3e76a6138d0310e32be53d6c3bfaedabd158ea8969b -F ext/expert/test_expert.c d56c194b769bdc90cf829a14c9ecbc1edca9c850b837a4d0b13be14095c32a72 -F ext/fts1/README.txt 20ac73b006a70bcfd80069bdaf59214b6cf1db5e -F ext/fts1/ft_hash.c 3927bd880e65329bdc6f506555b228b28924921b -F ext/fts1/ft_hash.h 06df7bba40dadd19597aa400a875dbc2fed705ea -F ext/fts1/fts1.c a39f7d21c2994d27c959ef9c3505c81542c81432 -F ext/fts1/fts1.h 6060b8f62c1d925ea8356cb1a6598073eb9159a6 -F ext/fts1/fts1_hash.c 3196cee866edbebb1c0521e21672e6d599965114 -F ext/fts1/fts1_hash.h e7f0d761353996a8175eda351104acfde23afcb0 -F ext/fts1/fts1_porter.c b1c7304b8988ba3f764a147cdd32043b4913ea7b -F ext/fts1/fts1_tokenizer.h fdea722c38a9f82ed921642981234f666e47919c -F ext/fts1/fts1_tokenizer1.c fd00d1fe4dc30dfc5c64cba695ce34f4af20d2fa -F ext/fts1/fulltext.c 37698e1909584f6d8ea67d1485e3ad39dbf42d19 -F ext/fts1/fulltext.h 08525a47852d1d62a0be81d3fc3fe2d23b094efd -F ext/fts1/simple_tokenizer.c bbfa4e3b2a26ef17d4edc6d98cd4a3f5396d998a -F ext/fts1/tokenizer.h 0c53421b832366d20d720d21ea3e1f6e66a36ef9 -F ext/fts2/README.tokenizers 21e3684ea5a095b55d70f6878b4ce6af5932dfb7 -F ext/fts2/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts2/fts2.c 72c816a9ae448049fbbe8f18a85698765fc7956c -F ext/fts2/fts2.h da5f76c65163301d1068a971fd32f4119e3c95fa -F ext/fts2/fts2_hash.c 011a1d32de45bb1b519a1fd0048e857d6a843558 -F ext/fts2/fts2_hash.h 1824b99dfd8d0225facbdb26a2c87289b2e7dcf8 -F ext/fts2/fts2_icu.c 51c5cd3c04954badd329fa738c95fcdb717b5188 -F ext/fts2/fts2_porter.c 2cd4a507bf3c3085fe66f59b0f2a325f65aaacf5 -F ext/fts2/fts2_tokenizer.c b529493d55e55497213c37e1f31680a77746be26 -F ext/fts2/fts2_tokenizer.h 27a1a99ca2d615cf7e142839b8d79e8751b4529e -F ext/fts2/fts2_tokenizer1.c 07e223eecb483d448313b5f1553a4f299a7fb7a1 -F ext/fts2/mkfts2amal.tcl 974d5d438cb3f7c4a652639262f82418c1e4cff0 -F ext/fts3/README.content fdc666a70d5257a64fee209f97cf89e0e6e32b51 -F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a -F ext/fts3/README.tokenizers b92bdeb8b46503f0dd301d364efc5ef59ef9fa8e2758b8e742f39fa93a2e422d -F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c 7a12745b024dfb26c7b87f9a5e30241b1b8c8f049ecd5c228454757b500a0595 -F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe -F ext/fts3/fts3Int.h 2c59cc46aefde134c1782e89a6a5384710ddcd4e783071337aa5d43d07269be3 -F ext/fts3/fts3_aux.c 96708c8b3a7d9b8ca1b68ea2b7e503e283f20e95f145becadedfad096dbd0f34 -F ext/fts3/fts3_expr.c f081e38da641724cd72c20e23b71db2bf4d0c9517c14637442f6910259f11a34 -F ext/fts3/fts3_hash.c 8b6e31bfb0844c27dc6092c2620bdb1fca17ed613072db057d96952c6bdb48b7 -F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf -F ext/fts3/fts3_icu.c 305ce7fb6036484085b5556a9c8e62acdc7763f0f4cdf5fd538212a9f3720116 -F ext/fts3/fts3_porter.c 3565faf04b626cddf85f03825e86056a4562c009 -F ext/fts3/fts3_snippet.c 86e7e947a176f0f005720b3ca17631aca2fd2f9daa6729d4adbf2d16ab1b9613 -F ext/fts3/fts3_term.c f45a1e7c6ef464abb1231245d123dae12266b69e05cc56e14045b76591ae92d1 -F ext/fts3/fts3_test.c 73b16e229e517c1b1f0fb8e1046182a4e5dbc8dbe6eea8a5d4353fcce7dbbf39 -F ext/fts3/fts3_tokenize_vtab.c cb792f59212f7799bf2891c7d4579bbf568f124ce8fbb0a9902aa5bd577e8b75 -F ext/fts3/fts3_tokenizer.c 6d8fc150c48238955d5182bf661498db0dd473c8a2a80e00c16994a646fa96e7 -F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 -F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 -F ext/fts3/fts3_unicode.c 4b9af6151c29b35ed09574937083cece7c31e911f69615e168a39677569b684d -F ext/fts3/fts3_unicode2.c 416eb7e1e81142703520d284b768ca2751d40e31fa912cae24ba74860532bf0f -F ext/fts3/fts3_write.c ed869b24d074f2498bdbef915d6db1f88c604ca5811502112061932a0bed5133 -F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 -F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 -F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87fea4ac01b73 -F ext/fts3/tool/fts3view.c 202801a2056995b763864d60c2dee744d46f1677 -F ext/fts3/unicode/CaseFolding.txt 8c678ca52ecc95e16bc7afc2dbf6fc9ffa05db8c -F ext/fts3/unicode/UnicodeData.txt cd07314edb62d49fde34debdaf92fa2aa69011e7 -F ext/fts3/unicode/mkunicode.tcl bf7fcaa6d68e6d38223467983785d054f1cff4d9e3905dd51f6ed8801bb590d5 -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 d7cbc214ee167496f70905667e18f73ea0402f7ef09236ce305e117e0efc866a -F ext/fts5/fts5_aux.c dcc627d8b6e3fc773db528ff67b39955dab7b51628f9dba8e15849e5bedfd7fa -F ext/fts5/fts5_buffer.c 5a5fe0159752c0fb0a5a93c722e9db2662822709490769d482b76a6dc8aaca70 -F ext/fts5/fts5_config.c b447948f35ad3354e8fe5e242e0a7e7b5b941555400b9404259944e3aa570037 -F ext/fts5/fts5_expr.c 2be456484786333d559dc2987a00f2750981fab91d52db8452a8046278c5f22e -F ext/fts5/fts5_hash.c 1cc0095646f5f3b46721aa112fb4f9bf29ae175cb5338f89dcec66ed97acfe75 -F ext/fts5/fts5_index.c f25bec3c00bf050fa2d702d97b773d0706692661172026ddac8df1f164b8b198 -F ext/fts5/fts5_main.c e881a2ea0bf01b3a3ff0bc1b31373c58fd54b6c9f3c43ea3d431bea4e5d4025e -F ext/fts5/fts5_storage.c 3ecda8edadc1f62a355d6789776be0da609f8658c50d72e422674093ab7e1528 -F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 -F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee -F ext/fts5/fts5_test_tok.c f96c6e193c466711d6d7828d5f190407fe7ab897062d371426dd3036f01258e7 -F ext/fts5/fts5_tokenize.c 2e508c6a3bd8ee56c48e98a38052e1a650e49b32a484cce9b189984114bc3b88 -F ext/fts5/fts5_unicode2.c 8bd0cd07396b74c1a05590e4070d635bccfc849812c305619f109e6c0485e250 -F ext/fts5/fts5_varint.c e64d2113f6e1bfee0032972cffc1207b77af63319746951bf1d09885d1dadf80 -F ext/fts5/fts5_vocab.c 7a071833064dc8bca236c3c323e56aac36f583aa2c46ce916d52e31ce87462c9 -F ext/fts5/fts5parse.y eb526940f892ade5693f22ffd6c4f2702543a9059942772526eac1fde256bb05 -F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba -F ext/fts5/test/fts5_common.tcl b01c584144b5064f30e6c648145a2dd6bc440841 -F ext/fts5/test/fts5aa.test 5bd43427b7d08ce2e19c488a26534be450538b9232d4d5305049e8de236e9aa9 -F ext/fts5/test/fts5ab.test 9205c839332c908aaad2b01ab8670ece8b161e8f2ec8a9fabf18ca9385880bb7 -F ext/fts5/test/fts5ac.test a7aa7e1fefc6e1918aa4d3111d5c44a09177168e962c5fd2cca9620de8a7ed6d -F ext/fts5/test/fts5ad.test e8cf959dfcd57c8e46d6f5f25665686f3b6627130a9a981371dafdf6482790de -F ext/fts5/test/fts5ae.test 1142d16d9cc193894dc13cc8f9c7a8a21411ac61b5567a878514df6f9f0d7bb7 -F ext/fts5/test/fts5af.test 724247405b13f8f06cc6ce464dc4f152dc5dd4e86b12c2099685d8f19747bf7b -F ext/fts5/test/fts5ag.test 7816f25a0707578f08145ab539fc0ca025f8951e788b28a6a18a06b2099469dd -F ext/fts5/test/fts5ah.test 27b5a33bfd0363ca8a4dc659e6e2a5df3dea1c3c5b04bc51ca6aeb1277bd9b21 -F ext/fts5/test/fts5ai.test bc97e4758cc93e06bf851d61c98fdf4e8b8f8315ee28a84fb15f916360856414 -F ext/fts5/test/fts5aj.test 745020852d85f5dd49d11cb7ad11d3cc6dafc4fe6d6d24bc0875ac8f43ee4149 -F ext/fts5/test/fts5ak.test fc3595f8e6873bb86d70c9bd4b67d0413ce577bd4793c39a2b60a7b8825b60a6 -F ext/fts5/test/fts5al.test 00c4c1c6a1366b73aa48ce2068c634520867c3cf7f5d1676ebbb775ee1f35734 -F ext/fts5/test/fts5alter.test 5565f7e4605512b69171ac18ca84398603f9f6456dbe377beeca97e83cc242cd -F ext/fts5/test/fts5auto.test 78989e6527ce69c9eddbef7392fea5c10b0010cd2b2ae68eec7bc869c471e691 -F ext/fts5/test/fts5aux.test ebf6f2ff7cb556e83f66991b7f12bff016d3c83d4eab36704b649dd6b1437318 -F ext/fts5/test/fts5auxdata.test eacc97ff04892f1a5f3d4df5a73f8bcbc3955ea1d12c9f24137eb1fc079e7611 -F ext/fts5/test/fts5bigpl.test 6466c89b38439f0aba26ac09e232a6b963f29b1cbe1304f6a664fe1e7a8f5fd3 -F ext/fts5/test/fts5bigtok.test 541119e616c637caea925a8c028c37c2c29e94383e00aa2f9198d530724b6e36 -F ext/fts5/test/fts5cat.test daba0b80659460b0cb60bd1f40b402478a761fe7ea414c3c94c2be25568cc33a -F ext/fts5/test/fts5circref.test f880dfd0d99f6fb73b88ccacb0927d18e833672fd906cc47d6b4e529419eaa62 -F ext/fts5/test/fts5colset.test a30473451321bbf0b6218af62e96b4ae5fa99931cfdb210b5ecc804623b30f75 -F ext/fts5/test/fts5columnsize.test 45459ce4dd9fd853b6044cdc9674921bff89e3d840f348ca8c1630f9edbf5482 -F ext/fts5/test/fts5config.test 60094712debc59286c59aef0e6cf511c37d866802776a825ce437d26afe0817f -F ext/fts5/test/fts5conflict.test 655925678e630d3cdf145d18725a558971806416f453ac8410ca8c04d934238d -F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c073e19b3ae9126b2f4 -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 fab4ea761b2df254fb3909423989320772a3a757de4d151ddcfa2a40a3b93328 -F ext/fts5/test/fts5corrupt4.test ea805c4d7c68b5f185b9db5d2060a7ae5875339738dd48203c92162f41e7ca91 -F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 -F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e -F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 -F ext/fts5/test/fts5dlidx.test b90852c55881b29dbac6380b274de27beae623ac4b6d567c6c8fb9cdc315a86e -F ext/fts5/test/fts5doclist.test e39a6001495f1dc68e20323586ac965787986c2bf6f515b9b0285627b089d9e6 -F ext/fts5/test/fts5ea.test b01e3a18cdfabbff8104a96a5242a06a68a998a0 -F ext/fts5/test/fts5eb.test 239bb2f02571f8cccfc7018d08f502df1cd8cc6a69b65ed1dde5f6a070e3f669 -F ext/fts5/test/fts5fault1.test d28a65caee75db6897c3cf1358c5230d3bb2a3bf7fb31062c19c7e5382b3d2bd -F ext/fts5/test/fts5fault2.test 69c8fdbef830cd0d450908d4504d5bb86609e255af99c421c20a0756251fe344 -F ext/fts5/test/fts5fault3.test da2f9e3e56ff5740d68ebdd6877c97089e7ed28ddff28a0da87a6afea27e5522 -F ext/fts5/test/fts5fault4.test 1c1db5fcfe59401e7833146100f1d8de284a0a686fac31ddac9fb56c459f725b -F ext/fts5/test/fts5fault5.test a336e4e11847de24c9497f80cce18e00bb3fab7fb11f97d04eb9af898900a762 -F ext/fts5/test/fts5fault6.test a0fc0a8f99e4b16500c31dfc7e38e1defe0f1693ac47650517ac7b723b1956f8 -F ext/fts5/test/fts5fault7.test 0acbec416edb24b8881f154e99c31e9ccf73f539cfcd164090be139e9e97ed4c -F ext/fts5/test/fts5fault8.test 318238659d35f82ad215ecb57ca4c87486ea85d45dbeedaee42f148ff5105ee2 -F ext/fts5/test/fts5fault9.test 098e6b894bbdf9b2192f994a30f4043673fb3f338b6b8ab1624c704422f39119 -F ext/fts5/test/fts5faultA.test be4487576bff8c22cee6597d1893b312f306504a8c6ccd3c53ca85af12290c8c -F ext/fts5/test/fts5faultB.test d606bdb8e81aaeb6f41de3fc9fc7ae315733f0903fbff05cf54f5b045b729ab5 -F ext/fts5/test/fts5faultD.test cc5d1225556e356615e719c612e845d41bff7d5a -F ext/fts5/test/fts5first.test 3fcf2365c00a15fc9704233674789a3b95131d12de18a9b996159f6909dc8079 -F ext/fts5/test/fts5full.test e1701a112354e0ff9a1fdffb0c940c576530c33732ee20ac5e8361777070d717 -F ext/fts5/test/fts5fuzz1.test 238d8c45f3b81342aa384de3e581ff2fa330bf922a7b69e484bbc06051a1080e -F ext/fts5/test/fts5hash.test a4cf51acad99bfc43c16fb74f9d22495dc221ae0701fc5e908ca963a9b26a02b -F ext/fts5/test/fts5integrity.test 8ffabcd91b058d812aba3e3e0a06f76ce165ba402a18cca20e34204a7feec92e -F ext/fts5/test/fts5interrupt.test 09613247b273a99889808ef852898177e671406fe71fdde7ea00e78ea283d227 -F ext/fts5/test/fts5lastrowid.test be98fe3e03235296585b72daad7aed5717ba0062bae5e5c18dd6e04e194c6b28 -F ext/fts5/test/fts5leftjoin.test c0b4cafb9661379e576dc4405c0891d8fcc2782680740513c4d1fc114b43d4ad -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/fts5multi.test a15bc91cdb717492e6e1b66fec1c356cb57386b980c7ba5af1915f97fe878581 -F ext/fts5/test/fts5multiclient.test 5ff811c028d6108045ffef737f1e9f05028af2458e456c0937c1d1b8dea56d45 -F ext/fts5/test/fts5near.test 211477940142d733ac04fad97cb24095513ab2507073a99c2765c3ddd2ef58bd -F ext/fts5/test/fts5onepass.test f9b7d9b2c334900c6542a869760290e2ab5382af8fbd618834bf1fcc3e7b84da -F ext/fts5/test/fts5optimize.test 36a752d24c818792032e4ff502936fc9cc5ef938721696396fdc79214b2717f1 -F ext/fts5/test/fts5phrase.test 13e5d8e9083077b3d9c74315b3c92ec723cc6eb37c8155e0bfe1bba00559f07b -F ext/fts5/test/fts5plan.test 771b999d161e24fd803ce0290adb7c6e7c9b9cc2c6a0adb344813fb89473aa32 -F ext/fts5/test/fts5porter.test 8d08010c28527db66bc3feebd2b8767504aaeb9b101a986342fa7833d49d0d15 -F ext/fts5/test/fts5porter2.test 0d251a673f02fa13ca7f011654873b3add20745f7402f108600a23e52d8c7457 -F ext/fts5/test/fts5prefix.test a0fa67b06650f2deaa7bf27745899d94e0fb547ad9ecbd08bfad98c04912c056 -F ext/fts5/test/fts5query.test ac363b17a442620bb0780e93c24f16a5f963dfe2f23dc85647b869efcfada728 -F ext/fts5/test/fts5rank.test c9fd4a1e36b4fa92d572ec13d846469b97da249d1c2f7fd3ee7e017ce46f2416 -F ext/fts5/test/fts5rebuild.test 55d6f17715cddbf825680dd6551efbc72ed916d8cf1cde40a46fc5d785b451e7 -F ext/fts5/test/fts5restart.test 835ecc8f449e3919f72509ab58056d0cedca40d1fe04108ccf8ac4c2ba41f415 -F ext/fts5/test/fts5rowid.test b8790ec170a8dc1942a15aef3db926a5f3061b1ff171013003d8297203a20ad6 -F ext/fts5/test/fts5savepoint.test fc02929f238d02a22df4172625704e029f7c1e0e92e332d654375690f8e6e43f -F ext/fts5/test/fts5simple.test a298670508c1458b88ce6030440f26a30673931884eb5f4094ac1773b3ba217b -F ext/fts5/test/fts5simple2.test 258a1b0c590409bfa5271e872c79572b319d2a56554d0585f68f146a0da603f0 -F ext/fts5/test/fts5simple3.test d5c74a9d3ca71bd5dd5cacb7c55b86ea12cdddfc8b1910e3de2995206898380f -F ext/fts5/test/fts5synonym.test 1651815b8008de170e8e600dcacc17521d765482ea8f074ae82cfa870d8bb7fb -F ext/fts5/test/fts5synonym2.test b54cce5c34ec08ed616f646635538ae82e34a0e28f947ec60b6fadbc4b3fb17a -F ext/fts5/test/fts5tok1.test ce6551e41ff56f30b69963577324624733bed0d1753589f06120d664d9cd45c9 -F ext/fts5/test/fts5tok2.test dcacb32d4a2a3f0dd3215d4a3987f78ae4be21a2 -F ext/fts5/test/fts5tokenizer.test ac3c9112b263a639fb0508ae73a3ee886bf4866d2153771a8e8a20c721305a43 -F ext/fts5/test/fts5umlaut.test a42fe2fe6387c40c49ab27ccbd070e1ae38e07f38d05926482cc0bccac9ad602 -F ext/fts5/test/fts5unicode.test 17056f4efe6b0a5d4f41fdf7a7dc9af2873004562eaa899d40633b93dc95f5a9 -F ext/fts5/test/fts5unicode2.test 9b3df486de05fb4bde4aa7ee8de2e6dae1df6eb90e3f2e242c9383b95d314e3e -F ext/fts5/test/fts5unicode3.test 590c72e18195bda2446133f9d82d04a4e89d094bba58c75ae10f4afc6faa0744 -F ext/fts5/test/fts5unicode4.test 6463301d669f963c83988017aa354108be0b947d325aef58d3abddf27147b687 -F ext/fts5/test/fts5unindexed.test 9021af86a0fb9fc616f7a69a996db0116e7936d0db63892db6bafabbec21af4d -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/tool/fts5speed.tcl b0056f91a55b2d1a3684ec05729de92b042e2f85 -F ext/fts5/tool/fts5txt2db.tcl 526a9979c963f1c54fd50976a05a502e533a4c59 -F ext/fts5/tool/loadfts5.tcl 95b03429ee6b138645703c6ca192c3ac96eaf093 -F ext/fts5/tool/mkfts5c.tcl d1c2a9ab8e0ec690a52316f33dd9b1d379942f45 -F ext/fts5/tool/showfts5.tcl d54da0e067306663e2d5d523965ca487698e722c -F ext/icu/README.txt 1c48ffaf7f255bd73d00a35f68f6de357c2a6594f16cb00506a151be23694706 -F ext/icu/icu.c 91c021c7e3e8bbba286960810fa303295c622e323567b2e6def4ce58e4466e60 -F ext/icu/sqliteicu.h 728867a802baa5a96de7495e9689a8e01715ef37 -F ext/lsm1/Makefile a553b728bba6c11201b795188c5708915cc4290f02b7df6ba7e8c4c943fd5cd9 -F ext/lsm1/Makefile.msc f8c878b467232226de288da320e1ac71c131f5ec91e08b21f502303347260013 -F ext/lsm1/lsm-test/README 87ea529d2abe615e856d4714bfe8bb185e6c2771b8612aa6298588b7b43e6f86 -F ext/lsm1/lsm-test/lsmtest.h cf58528ffe0cfe535e91b44584e2ec5fb1caacdabecef0d8dcf83bf83168bf28 -F ext/lsm1/lsm-test/lsmtest1.c ae6ba48a0851b39be69a7d0eb220bfb9521a526e926223d5014bd385df10abb3 -F ext/lsm1/lsm-test/lsmtest2.c 188b09aec776516aeedcfd13b9c6faf85ba16b3671a0897a2c740ee00a5dc4f8 -F ext/lsm1/lsm-test/lsmtest3.c 9ab87528a36dbf4a61d7c8ad954f5ee368c0878c127b84b942b2e2abe522de26 -F ext/lsm1/lsm-test/lsmtest4.c d258d6a245db5d8eaede096e2368d23f859c5e92c80ab9122463f708514fe10c -F ext/lsm1/lsm-test/lsmtest5.c 8d5242a0f870d65eeada191c8945781fed9cb8ece3886573790ebd373b62dac5 -F ext/lsm1/lsm-test/lsmtest6.c 869cb4a172cd07d1a75b3aeaecd61d0a477787b3b8668bad0d3ff0f43b642b7c -F ext/lsm1/lsm-test/lsmtest7.c 7a917455a0f956a8ed3f44f5c9387ec0ea6627714874464cc3fa5c5a9cabb2f2 -F ext/lsm1/lsm-test/lsmtest8.c 589b68c44531a0f04d5e879bb1e211be5f7100f48eed7e8631e07ed5cbd68f94 -F ext/lsm1/lsm-test/lsmtest9.c dd1a0ebf41134933a744d1e00e60429a2a21fc50d587ae7dd6bdb6e96d805bdc -F ext/lsm1/lsm-test/lsmtest_bt.c d70d9a9be5eef9360af1251dd083948d74fd30137a08f61bef995f7ac04e037f -F ext/lsm1/lsm-test/lsmtest_datasource.c 5d770be191d0ca51315926723009b2c25c0b4b8136840494ef710ac324aa916c -F ext/lsm1/lsm-test/lsmtest_func.c 159aa401bc8032bfa3d8cf2977bd687abebab880255895a5eb45770d626fa38d -F ext/lsm1/lsm-test/lsmtest_io.c cf11b27b129c6bd5818fa1d440176502dc27229f0db892b4479118d61993ea20 -F ext/lsm1/lsm-test/lsmtest_main.c a9bc647738c0dcaebf205d6d194b3ce4a6ef3925801cd2d919f0a4ea33a15aeb -F ext/lsm1/lsm-test/lsmtest_mem.c 4e63c764345ab1df59d4f13a77980c6f3643798210b10d6cdbd785b4b888fda5 -F ext/lsm1/lsm-test/lsmtest_tdb.c 618a8619183fda4f5540fcde15f9068293c5e3180e1a246e34409b0c148758b3 -F ext/lsm1/lsm-test/lsmtest_tdb.h 8733eee249b12956a9df8322994b43d19bd8c02ad2e8b0bb5164db4d6ccc1735 -F ext/lsm1/lsm-test/lsmtest_tdb2.cc 99ea7f2dd9c7536c8fb9bdd329e4cfeb76899f3ddf6f48bdd3926e016922b715 -F ext/lsm1/lsm-test/lsmtest_tdb3.c 7a7ccae189f5bb25bcd1ec3bbd740529706eded7f6729a5a0a9eeaeb57785320 -F ext/lsm1/lsm-test/lsmtest_tdb4.c 47e8bb5eba266472d690fb8264f1855ebdba0ae5a0e541e35fcda61ebf1d277f -F ext/lsm1/lsm-test/lsmtest_util.c 241622db5a332a09c8e6e7606b617d288a37b557f7d3bce0bb97809f67cc2806 -F ext/lsm1/lsm-test/lsmtest_win32.c 0e0a224674c4d3170631c41b026b56c7e1672b151f5261e1b4cc19068641da2d -F ext/lsm1/lsm.h 0f6f64ff071471cb87bf98beb8386566f30ea001 -F ext/lsm1/lsmInt.h 5983690e05e83653cc01ba9d8fbf8455e534ddf8349ed9adedbf46a7549760b0 -F ext/lsm1/lsm_ckpt.c 0eabfaf812ddb4ea43add38f05e430694cd054eb622c3e35af4c43118a2d5321 -F ext/lsm1/lsm_file.c 3c51841d5b3e7da162693cbac9a9f47eeedf6bcbbe2969a4d25e30c428c9fe36 -F ext/lsm1/lsm_log.c a8bf334532109bba05b09a504ee45fc393828b0d034ca61ab45e3940709d9a7c -F ext/lsm1/lsm_main.c b5703f8042e71d3a2d65e671f6832e077e79e89e9975818f67f969922618db63 -F ext/lsm1/lsm_mem.c 4c51ea9fa285ee6e35301b33491642d071740a0a -F ext/lsm1/lsm_mutex.c 378edf0a2b142b4f7640ee982df06d50b98788ea -F ext/lsm1/lsm_shared.c 76adfc1ed9ffebaf92746dde4b370ccc48143ca8b05b563816eadd2aadf1c525 -F ext/lsm1/lsm_sorted.c 6f7d8cf7a7d3d3f1ab5d9ba6347e8f39f3d73c00ec48afcd0c4bcbefd806f9b8 -F ext/lsm1/lsm_str.c 65e361b488c87b10bf3e5c0070b14ffc602cf84f094880bece77bbf6678bca82 -F ext/lsm1/lsm_tree.c 682679d7ef2b8b6f2fe77aeb532c8d29695bca671c220b0abac77069de5fb9fb -F ext/lsm1/lsm_unix.c 57361bcf5b1a1a028f5d66571ee490e9064d2cfb145a2cc9e5ddade467bb551b -F ext/lsm1/lsm_varint.c 43f954af668a66c7928b81597c14d6ad4be9fedbc276bbd80f52fa28a02fdb62 -F ext/lsm1/lsm_vtab.c 169bfe7ef8e6c9de9c77e17c4c50c9ae55fb0167d80be3d1be82c991184b6f35 -F ext/lsm1/lsm_win32.c 0a4acbd7e8d136dd3a5753f0a9e7a9802263a9d96cef3278cf120bcaa724db7c -F ext/lsm1/test/lsm1_common.tcl 5ed4bab07c93be2e4f300ebe46007ecf4b3e20bc5fbe1dedaf04a8774a6d8d82 -F ext/lsm1/test/lsm1_simple.test a04d08e8661ae6fc53786c67f0bd102c6692f003e859dde03ed9ac3f12e066e5 -F ext/lsm1/tool/mklsm1c.tcl f31561bbee5349f0a554d1ad7236ac1991fc09176626f529f6078e07335398b0 -F ext/misc/README.md d6dd0fe1d8af77040216798a6a2b0c46c73054d2f0ea544fbbcdccf6f238c240 -F ext/misc/amatch.c e3ad5532799cee9a97647f483f67f43b38796b84b5a8c60594fe782a4338f358 -F ext/misc/anycollseq.c 5ffdfde9829eeac52219136ad6aa7cd9a4edb3b15f4f2532de52f4a22525eddb -F ext/misc/appendvfs.c 3777f22ec1057dc4e5fd89f2fbddcc7a29fbeef1ad038c736c54411bb1967af7 -F ext/misc/blobio.c a867c4c4617f6ec223a307ebfe0eabb45e0992f74dd47722b96f3e631c0edb2a -F ext/misc/btreeinfo.c 26004b7a6be320ec08fc20ca8d0f01fccb00a98cbe0f3197446794ff2a506aa3 -F ext/misc/carray.c 91e9a7f512fda934894bed30464552fffa7d3073b5be04189ae0bd0c59f26bfd -F ext/misc/cksumvfs.c a3271f5cc3f87d80897cca76d54220380aeae3448efd23fefe47853443ef1185 -F ext/misc/closure.c dbfd8543b2a017ae6b1a5843986b22ddf99ff126ec9634a2f4047cd14c85c243 -F ext/misc/completion.c a0efe03edfdc4f717c61e6c9b0bfe2708ff7878010dae3174980a68fdf76aabc -F ext/misc/compress.c 3354c77a7c8e86e07d849916000cdac451ed96500bfb5bd83b20eb61eee012c9 -F ext/misc/csv.c 3ed979c1eb35e35a98b30ef545a2facf62994594217681d9138b4b75faf6b0d7 -F ext/misc/dbdata.c e316fba936571584e55abd5b974a32a191727a6b746053a0c9d439bd2cf93940 -F ext/misc/dbdump.c baf6e37447c9d6968417b1cd34cbedb0b0ab3f91b5329501d8a8d5be3287c336 -F ext/misc/eval.c 04bc9aada78c888394204b4ed996ab834b99726fb59603b0ee3ed6e049755dc1 -F ext/misc/explain.c d5c12962d79913ef774b297006872af1fccda388f61a11d37758f9179a09551f -F ext/misc/fileio.c 9b69e25da3b51d4a1d905a464ccb96709792ad627a742ba09215bc0d1447e7bd -F ext/misc/fossildelta.c 1240b2d3e52eab1d50c160c7fe1902a9bd210e052dc209200a750bbf885402d5 -F ext/misc/fuzzer.c eae560134f66333e9e1ca4c8ffea75df42056e2ce8456734565dbe1c2a92bf3d -F ext/misc/ieee754.c eaffd9b364d7c8371727e9c43fc8bec38cdacc4d11fc26beffaa3ca05a0ea9d6 -F ext/misc/json1.c 3a42e3231d716516a8ae33b0a052d3ed5f52943e3d627b68744a427a6e552ae3 -F ext/misc/memstat.c 3017a0832c645c0f8c773435620d663855f04690172316bd127270d1a7523d4d -F ext/misc/memtrace.c 7c0d115d2ef716ad0ba632c91e05bd119cb16c1aedf3bec9f06196ead2d5537b -F ext/misc/memvfs.c ab36f49e02ebcdf85a1e08dc4d8599ea8f343e073ac9e0bca18a98b7e1ec9567 -F ext/misc/mmapwarm.c 8c5fe90d807a23e44a8b93e96e8b812b19b300d5fd8c1d40a4fd1d8224e33f46 -F ext/misc/nextchar.c 7877914c2a80c2f181dd04c3dbef550dfb54c93495dc03da2403b5dd58f34edd -F ext/misc/noop.c 81efe4cad9ec740e64388b14281cb983e6e2c223fed43eb77ab3e34946e0c1ab -F ext/misc/normalize.c b4290464f542bae7a97b43f15bd197949b833ffd668b7c313631bd5d4610212c -F ext/misc/percentile.c b9086e223d583bdaf8cb73c98a6539d501a2fc4282654adbfea576453d82e691 -F ext/misc/prefixes.c 0f4f8cff5aebc00a7e3ac4021fd59cfe1a8e17c800ceaf592859ecb9cbc38196 -F ext/misc/regexp.c 246244c714267f303df76acf73dcf110cf2eaf076896aaaba8db6d6d21a129db -F ext/misc/remember.c add730f0f7e7436cd15ea3fd6a90fd83c3f706ab44169f7f048438b7d6baa69c -F ext/misc/rot13.c 51ac5f51e9d5fd811db58a9c23c628ad5f333c173f1fc53c8491a3603d38556c -F ext/misc/scrub.c db9fff56fed322ca587d73727c6021b11ae79ce3f31b389e1d82891d144f22ad -F ext/misc/series.c 4057dda3579b38ff88b2d3b13b4dd92dbd9d6f90dac2b55c19b0a8ed87ee4959 -F ext/misc/sha1.c c8f2253c8792ffab9517695ea7d88c079f0395a5505eefef5c8198fe184ed5ac -F ext/misc/shathree.c 135b7c145db4a09b1650c3e7aff9cb538763a9a361e834c015dd1aaf8d5c9a00 -F ext/misc/showauth.c 732578f0fe4ce42d577e1c86dc89dd14a006ab52 -F ext/misc/spellfix.c 94df9bbfa514a563c1484f684a2df3d128a2f7209a84ca3ca100c68a0163e29f -F ext/misc/sqlar.c 0ace5d3c10fe736dc584bf1159a36b8e2e60fab309d310cd8a0eecd9036621b6 -F ext/misc/stmt.c 35063044a388ead95557e4b84b89c1b93accc2f1c6ddea3f9710e8486a7af94a -F ext/misc/templatevtab.c 8a16a91a5ceaccfcbd6aaaa56d46828806e460dd194965b3f77bf38f14b942c4 -F ext/misc/totype.c fa4aedeb07f66169005dffa8de3b0a2b621779fd44f85c103228a42afa71853b -F ext/misc/uint.c 053fed3bce2e89583afcd4bf804d75d659879bbcedac74d0fa9ed548839a030b -F ext/misc/unionvtab.c 36237f0607ca954ac13a4a0e2d2ac40c33bc6e032a5f55f431713061ef1625f9 -F ext/misc/urifuncs.c f71360d14fa9e7626b563f1f781c6148109462741c5235ac63ae0f8917b9c751 -F ext/misc/uuid.c 5bb2264c1b64d163efa46509544fd7500cb8769cb7c16dd52052da8d961505cf -F ext/misc/vfslog.c 3b25c2f56ba60788db247287be6ab024b53c4afffd412b4876db563389be0d35 -F ext/misc/vfsstat.c 389ea13983d3af926504c314f06a83cc858d5adc24b40af74aaed1fece00c118 -F ext/misc/vtablog.c 5538acd0c8ddaae372331bee11608d76973436b77d6a91e8635cfc9432fba5ae -F ext/misc/vtshim.c 1976e6dd68dd0d64508c91a6dfab8e75f8aaf6cd -F ext/misc/wholenumber.c 520f34c3099e5b7d546f13708607dc2fa173c46b68952eecf0d19cd675fec85e -F ext/misc/zipfile.c d1be54ea83ac9ad71b8b6ffc4b60db8946ce2ceacdf6bff063fcd9489f41bb49 -F ext/misc/zorder.c b0ff58fa643afa1d846786d51ea8d5c4b6b35aa0254ab5a82617db92f3adda64 -F ext/rbu/rbu.c 8681f6157db6adc82c34af24b14ea8a3be0146ad2a3b6c1d5da6cb8a5796c8ce -F ext/rbu/rbu1.test 221d9c18a5e600ac9ac6b1810d99d9f99163a7909ba61597876ab6e4d4beb3d6 -F ext/rbu/rbu10.test 0a201c32202143f23c81c0144503da339786fc20acb7a2fda11601b65659f314 -F ext/rbu/rbu11.test 5c834cf491086b45e071eabf71f708febc143e86a384a92de69e0b1a4cace144 -F ext/rbu/rbu12.test 29f8b2118f6c96fac3755bd6d2b55c2db24f878b1f11fbfbe294f3a230a3dcdc -F ext/rbu/rbu13.test 1285298e3360ec74511764841b3c174dcfe21da2f618c22febf1a20abd0365c2 -F ext/rbu/rbu14.test 4a7bf0b3a4516d3ab0bc0ba4ceb53eb7e3324147ccda152e561060f659dbba31 -F ext/rbu/rbu3.test d6c6cc7a1326e8e23b9820f30bd3054f22092e503fadfd2a660ae006653f6d80 -F ext/rbu/rbu5.test 724b38ea5f722e3d22dc76343860bd998bb676c3f78c4bc8175df5c5d7720e23 -F ext/rbu/rbu6.test 401064236d3cf86b7edc01c586d7c5554f48553946fbfa1a3af35d7e47dce9e3 -F ext/rbu/rbu7.test ae25f47b56f178197fc1098537a35a39176cc73d1629b03dc9d795929fc36ec2 -F ext/rbu/rbu8.test b98a6fc58ead84a0e6ddee775b9702cd981f318d5d4fd1d4df0fa0c40db7251b -F ext/rbu/rbu9.test 0e4d985e25620d61920597e8ea69c871c9e8c1f5a0be2ae9fa70bb641d74378c -F ext/rbu/rbuA.test b34a90cb495682c25b5fc03a9d5e7a4fc99541c29256f25e2e2a4f6542b4f5b3 -F ext/rbu/rbuB.test 52b07158824c6927b7e25554ace92a695cdebfc296ae3d308ac386984aded9bc -F ext/rbu/rbuC.test 80f1cc2fb74f44b1128fd0ed8eedab3a76fefeb72a947860e2869ef76fc8dc6b -F ext/rbu/rbu_common.tcl 60d904133ff843fe72cc0514e9dd2486707181e6e0fbab20979da28c48d21de9 -F ext/rbu/rbucollate.test cac528a9a46318cba42e61258bb42660bbbf4fdb9a8c863de5a54ad0c658d197 -F ext/rbu/rbucrash.test 000981a1fe8a6e4d9a684232f6a129e66a3ef595f5ed74655e2f9c68ffa613b4 -F ext/rbu/rbucrash2.test efa143cc94228eb0266d3f1abfbee60a5838a84cef7cc3fcb8c145b74d96fd41 -F ext/rbu/rbudiff.test 156957851136b63c143478518dc1bda6c832103cdbe8ac1d7cdd47edb3cbe0a3 -F ext/rbu/rbudor.test e3e8623926012f43eebe51fedf06a102df2640750d971596b052495f2536db20 -F ext/rbu/rbuexpr.test 10d0420537c3bc7666e576d72adeffe7e86cfbb00dcc30aa9ce096c042415190 -F ext/rbu/rbufault.test 2d7f567b79d558f6e093c58808cab4354f8a174e3802f69e7790a9689b3c09f8 -F ext/rbu/rbufault2.test c81327a3ac2c385b9b954db3644d4e0df93eeebfc3de9f1f29975a1e73fd3d0c -F ext/rbu/rbufault3.test b2fcc9db5c982b869f67d1d4688d8cb515d5b92f58011fff95665f2e62cec179 -F ext/rbu/rbufault4.test 03d2849c3df7d7bd14a622e789ff049e5080edd34a79cd432e01204db2a5930a -F ext/rbu/rbufts.test 0ae8d1da191c75bd776b86e24456db0fb6e97b7c944259fae5407ea55d23c31d -F ext/rbu/rbumisc.test 329986cf5dd51890c4eb906c2f960ebb773a79a64bed90f506b7c417825b37eb -F ext/rbu/rbumulti.test 5fb139058f37ddc5a113c5b93238de915b769b7792de41b44c983bc7c18cf5b9 -F ext/rbu/rbupartial.test f25df014b8dbe3c5345851fba6e66f79ab237f57dc201b2d5f0dbae658ae5a4c -F ext/rbu/rbuprogress.test 857cf1f8166c83ef977edb9ef4fc42d80f71fbd798652b46ae2f3a7031870f8d -F ext/rbu/rburesume.test dbdc4ca504e9c76375a69e5f0d91205db967dcc509a5166ca80231f8fda49eb1 -F ext/rbu/rbusave.test f4190a1a86fccf84f723af5c93813365ae33feda35845ba107b59683d1cdd926 -F ext/rbu/rbusplit.test b37e7b40b38760881dc9c854bd40b4744c6b6cd74990754eca3bda0f407051e8 -F ext/rbu/rbutemplimit.test 05ceefa90a2e26a99f40dd48282ed63a00df5e59c1f2bfd479c143e201a1b0ba -F ext/rbu/rbuvacuum.test 55e101e90168c2b31df6c9638fe73dc7f7cc666b6142266d1563697d79f73534 -F ext/rbu/rbuvacuum2.test b8e5b51dc8b2c0153373d024c0936be3f66f9234acbd6d0baab0869d56b14e6b -F ext/rbu/rbuvacuum3.test 8addd82e4b83b4c93fa47428eae4fd0dbf410f8512c186f38e348feb49ba03dc -F ext/rbu/rbuvacuum4.test a78898e438a44803eb2bc897ba3323373c9f277418e2d6d76e90f2f1dbccfd10 -F ext/rbu/sqlite3rbu.c 77a47f3231f5f363b2c584dba3e310a7efdaf073ad8c18728ab846b38de2879c -F ext/rbu/sqlite3rbu.h 1dc88ab7bd32d0f15890ea08d23476c4198d3da3056985403991f8c9cd389812 -F ext/rbu/test_rbu.c 03f6f177096a5f822d68d8e4069ad8907fe572c62ff2d19b141f59742821828a -F ext/repair/README.md 92f5e8aae749a4dae14f02eea8e1bb42d4db2b6ce5e83dbcdd6b1446997e0c15 -F ext/repair/checkfreelist.c 0dbae18c1b552f58d64f8969e4fb1e7f11930c60a8c2a9a8d50b7f15bdfd54bd -F ext/repair/checkindex.c 7d28c01a2e012ac64257d230fc452b2cafb78311a91a343633d01d95220f66f3 -F ext/repair/sqlite3_checker.c.in 4a5a3af3f450fe503e5a2985e98516dc2a6b9ad247449e284c1cf140fc91720f -F ext/repair/sqlite3_checker.tcl a9a2caa9660567257c177a91124d8c0dccdfa341e25c51e6da7f1fd9e601eafa -F ext/repair/test/README.md 34b2f542cf5be7bffe479242b33ee3492cea30711e447cc4a1a86cb5915f419e -F ext/repair/test/checkfreelist01.test 3e8aa6aeb4007680c94a8d07b41c339aa635cc78249442da72ff3f8297398a69 -F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c335096108c12c01bddbadcec -F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c -F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 -F ext/rtree/geopoly.c f15cc6845d64a629035627d863cbe3eadc9cb30f9ca77bd823b0ca8a5a3f8b00 -F ext/rtree/rtree.c 0ee39cc787b95aa03a012e09e6090b0fa452154fa812af9a379898560fd6c00f -F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 -F ext/rtree/rtree1.test 00792b030a4e188ff1b22e8530e8aa0452bb5dd81c2b18cb004afc7dc63e040e -F ext/rtree/rtree2.test 9d9deddbb16fd0c30c36e6b4fdc3ee3132d765567f0f9432ee71e1303d32603d -F ext/rtree/rtree3.test 4ee5d7df86040efe3d8d84f141f2962a7745452200a7cba1db06f86d97050499 -F ext/rtree/rtree4.test 304de65d484540111b896827e4261815e5dca4ce28eeecd58be648cd73452c4b -F ext/rtree/rtree5.test 49c9041d713d54560b315c2c7ef7207ee287eba1b20f8266968a06f2e55d3142 -F ext/rtree/rtree6.test 1252a0439da01d2f1f5cbbdeeb80455a2d68b9bae2a9787937b167a5e3957828 -F ext/rtree/rtree7.test c8fb2e555b128dd0f0bdb520c61380014f497f8a23c40f2e820acc9f9e4fdce5 -F ext/rtree/rtree8.test 2d99006a1386663978c9e1df167554671e4f711c419175b39f332719deb1ce0e -F ext/rtree/rtree9.test c646f12c8c1c68ef015c6c043d86a0c42488e2e68ed1bb1b0771a7ca246cbabf -F ext/rtree/rtreeA.test ed2f1be9c06dde0b1ab93a95dd9e87eeaa02db2d30bcb4b9179b69ee3dc3319b -F ext/rtree/rtreeB.test 4cec297f8e5c588654bbf3c6ed0903f10612be8a2878055dd25faf8c71758bc9 -F ext/rtree/rtreeC.test 6aa87eba4d9a3003b941a1ba77db259c5cabc3fd92fc5a6360f5369520eb9a4d -F ext/rtree/rtreeD.test fe46aa7f012e137bd58294409b16c0d43976c3bb92c8f710481e577c4a1100dc -F ext/rtree/rtreeE.test e65d3fc625da1800b412fc8785817327d43ccfec5f5973912d8c9e471928caa9 -F ext/rtree/rtreeF.test 81ffa7ef51c4e4618d497a57328c265bf576990c7070633b623b23cd450ed331 -F ext/rtree/rtreeG.test 1b9ca6e3effb48f4161edaa463ddeaa8fca4b2526d084f9cbf5dbe4e0184939c -F ext/rtree/rtreeH.test 0885151ee8429242625600ae47142cca935332c70a06737f35af53a7bd7aaf90 -F ext/rtree/rtreeI.test 608e77f7fde9be5a12eae316baef640fffaafcfa90a3d67443e78123e19c4ca4 -F ext/rtree/rtree_perf.tcl 6c18c1f23cd48e0f948930c98dfdd37dfccb5195 -F ext/rtree/rtree_util.tcl db734b4c5e75fed6acc56d9701f2235345acfdec750b5fc7b587936f5f6bceed -F ext/rtree/rtreecheck.test d67d5b3e9e45bfa8cd90734e8e9302144ac415b8e9176c6f02d4f92892ee8a35 -F ext/rtree/rtreecirc.test aec664eb21ae943aeb344191407afff5d392d3ae9d12b9a112ced0d9c5de298e -F ext/rtree/rtreeconnect.test 225ad3fcb483d36cbee423a25052a6bbae762c9576ae9268332360c68c170d3d -F ext/rtree/rtreefuzz001.test eef1ed593bb15886cd5d5367a2f2492f81e315848896cdf7afb6e21454978827 -F ext/rtree/sqlite3rtree.h 03c8db3261e435fbddcfc961471795cbf12b24e03001d0015b2636b0f3881373 -F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de -F ext/rtree/util/randomshape.tcl 54ee03d0d4a1c621806f7f44d5b78d2db8fac26e0e8687c36c4bd0203b27dbff -F ext/rtree/viewrtree.tcl eea6224b3553599ae665b239bd827e182b466024 -F ext/rtree/visual01.txt e9c2564083bcd30ec51b07f881bffbf0e12b50a3f6fced0c222c5c1d2f94ac66 -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/session2.test 284de45abae4cc1082bc52012ee81521d5ac58e0 -F ext/session/session3.test ce9ce3dfa489473987f899e9f6a0f2db9bde3479 -F ext/session/session4.test 6778997065b44d99c51ff9cece047ff9244a32856b328735ae27ddef68979c40 -F ext/session/session5.test 716bc6fafd625ce60dfa62ae128971628c1a1169 -F ext/session/session6.test 443789bc2fca12e4f7075cf692c60b8a2bea1a26 -F ext/session/session8.test 8e194b3f655d861ca36de5d4de53f702751bab3b -F ext/session/session9.test 5409d90d8141881d08285ed1c2c0d8d10fb92069 -F ext/session/sessionA.test 1feeab0b8e03527f08f2f1defb442da25480138f -F ext/session/sessionB.test c4fb7f8a688787111606e123a555f18ee04f65bb9f2a4bb2aa71d55ce4e6d02c -F ext/session/sessionC.test f8a5508bc059ae646e5ec9bdbca66ad24bc92fe99fda5790ac57e1f59fce2fdf -F ext/session/sessionD.test 4f91d0ca8afc4c3969c72c9f0b5ea9527e21de29039937d0d973f821e8470724 -F ext/session/sessionE.test b2010949c9d7415306f64e3c2072ddabc4b8250c98478d3c0c4d064bce83111d -F ext/session/sessionF.test d37ed800881e742c208df443537bf29aa49fd56eac520d0f0c6df3e6320f3401 -F ext/session/sessionG.test 3828b944cd1285f4379340fd36f8b64c464fc84df6ff3ccbc95578fd87140b9c -F ext/session/sessionH.test b17afdbd3b8f17e9bab91e235acf167cf35485db2ab2df0ea8893fbb914741a4 -F ext/session/session_common.tcl 29ec9910aca1e996ca1c8531b8cecabf96eb576aa53de65a8ff03d848b9a2a8b -F ext/session/session_speed_test.c dcf0ef58d76b70c8fbd9eab3be77cf9deb8bc1638fed8be518b62d6cbdef88b3 -F ext/session/sessionat.test efe88965e74ff1bc2af9c310b28358c02d420c1fb2705cc7a28f0c1cc142c3ec -F ext/session/sessiondiff.test ad13dd65664bae26744e1f18eb3cbd5588349b7e9118851d8f9364248d67bcec -F ext/session/sessionfault.test da273f2712b6411e85e71465a1733b8501dbf6f7 -F ext/session/sessionfault2.test dd593f80b6b4786f7adfe83c5939620bc505559770cc181332da26f29cddd7bb -F ext/session/sessioninvert.test ae1a003a9ab1f8d64227dbb5c3a4c97e65b561b01e7b2953cf48683fb2724169 -F ext/session/sessionrebase.test ccfa716b23bd1d3b03217ee58cfd90c78d4b99f53e6a9a2f05e82363b9142810 -F ext/session/sessionstat1.test 218d351cf9fcd6648f125a26b607b140310160184723c2666091b54450a68fb5 -F ext/session/sessionwor.test 67b5ab91d4f93ce65ff1f58240ac5ddf73f8670facc1ffa49cef56293d52818d -F ext/session/sqlite3session.c e25b345896fa3646ff8b6c4058b3d9e365dc7eab4afe80b110808681098551c8 -F ext/session/sqlite3session.h a2db5b72b938d12c727b4b4ec632254ca493670a9c0de597af3271a7f774fc57 -F ext/session/test_session.c 98797aba475a799376c9a42214f2d1debf2d0c3cb657d9c8bbf4f70bf3fb4aec -F ext/userauth/sqlite3userauth.h 7f3ea8c4686db8e40b0a0e7a8e0b00fac13aa7a3 -F ext/userauth/user-auth.txt e6641021a9210364665fe625d067617d03f27b04 -F ext/userauth/userauth.c 7f00cded7dcaa5d47f54539b290a43d2e59f4b1eb5f447545fa865f002fc80cb -F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x -F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 -F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk 980ad4201300ca43e9db0f972c5f38776d1e78022252bf3a8c0fec7ddda540df -F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 -F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 -F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 -F mptest/crash01.test 61e61469e257df0850df4293d7d4d6c2af301421 -F mptest/crash02.subtest f4ef05adcd15d60e5d2bd654204f2c008b519df8 -F mptest/mptest.c aa41ace6dbc5050d76b02548d3521e6bbccae4f0 -F mptest/multiwrite01.test dab5c5f8f9534971efce679152c5146da265222d -F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca -F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b -F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 -F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 826bc4561456094cf758f095776026f25892a2bb3a7cd86742323267dc9bdb5f -F src/analyze.c 2c77bcbb8651ccced4a8cdaf8d997663813b2967787070fa26d0360de2ee4367 -F src/attach.c ff2daea0fe62080192e3f262670e4f61f5a86c1e7bea9cec34e960fe79852aa1 -F src/auth.c a3d5bfdba83d25abed1013a8c7a5f204e2e29b0c25242a56bc02bb0c07bf1e06 -F src/backup.c b1c90cd4110248c8e1273ff4578d3a84c0c34725e1b96dacd4a6294a908702de -F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 -F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c f14e415fcfd0b52b4e4ebd193ba5fadac5e8252c30f023389af682813af44025 -F src/btree.h 989ef3c33413549e3e148f3dcb46c030f317dac130dc86809ba6b9aa4b16c72a -F src/btreeInt.h 5c8b8749805787313ecf49eb5be3ced1e94bbf8ef54bb01470ce6bd0d5185c67 -F src/build.c 02cff9bb5b3eaf437cbad3f0e1b6c9612e4d4f355c9a766b8ebf121d95cee6d2 -F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c -F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e -F src/ctime.c e98518d2d3d4029a13c805e07313fb60c877be56db76e90dd5f3af73085d0ce6 -F src/date.c b29b349d277e3d579dcc295b24c0a2caed83fd8f090a9f7cbe6070c0fd662384 -F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a -F src/dbstat.c 793deaf88a0904f88285d93d6713c636d55ede0ffd9f08d10f4ea825531d367f -F src/delete.c 88047c8e59878c920fce14582bc1dde4d81157d1ca5ffdf36c2907e6d41996c4 -F src/expr.c 54c0e48fdafb60c54efd786434a56eccbea7d887b7f84ed3568233de35ca81a8 -F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 -F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41 -F src/func.c 2333eb4277f55a5efdc12ef754e7d7ec9105d257b2fd00301d23ce1e8fa67dc0 -F src/global.c 79a988b56b06ce2d08ebefe1d35da9aa25b3851faa47ea5233361c4827185a64 -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 92b07a7f7e682114948ce59fd6511ffec7672b508cc343a804ef6afee21b6c11 -F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa -F src/loadext.c 421310045bd78afefb772294a99e50f37d87ae578786a6169074e6291e30d969 -F src/main.c 97d962ab1f830540043042e41085c5b85636a60e6ed95002c1a56b64f7eb6a0b -F src/malloc.c d0400b0366e1a3a2414ca4534b4a7406df34732835f37a15cb4642eb7df1a363 -F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 -F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de -F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3 -F src/mem3.c 8768ac94694f31ffaf8b4d0ea5dc08af7010a35a -F src/mem5.c 9bf955937b07f8c32541c8a9991f33ce3173d944 -F src/memdb.c 252137ca122acb8f54a99b48cf9f96a31d5130f19d174381a53294446d8b64a3 -F src/memjournal.c 7561c01c90958f3ba9bc6cb2d857123d932bdfa5539ea34427a0957b2e35154d -F src/msvc.h 3a15918220367a8876be3fa4f2abe423a861491e84b864fb2b7426bf022a28f8 -F src/mutex.c 5e3409715552348732e97b9194abe92fdfcd934cfb681df4ba0ab87ac6c18d25 -F src/mutex.h a7b2293c48db5f27007c3bdb21d438873637d12658f5a0bf8ad025bb96803c4a -F src/mutex_noop.c 9d4309c075ba9cc7249e19412d3d62f7f94839c4 -F src/mutex_unix.c aaf9ebc3f89df28483c52208497a99a02cc3650011422fc9d4c57e4392f7fe58 -F src/mutex_w32.c 7670d770c94bbfe8289bec9d7f1394c5a00a57c37f892aab6b6612d085255235 -F src/notify.c 9711a7575036f0d3040ba61bc6e217f13a9888e7 -F src/os.c 669cc3839cc35d20f81faf0be1ab6d4581cea35e9d8f3a9d48a98d6571f7c285 -F src/os.h 48388821692e87da174ea198bf96b1b2d9d83be5dfc908f673ee21fafbe0d432 -F src/os_common.h b2f4707a603e36811d9b1a13278bffd757857b85 -F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 -F src/os_unix.c 03bad4eb1e13946cb967f3a6cc0a0d350df8ea4b8d2212d528024a5f9abc90ea -F src/os_win.c e832e21e830c1f9409c9c54053939b6dcb14c1e92128b756204ce1e3e331d678 -F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 96436cb1920074d4ade120a1a8a9d0ae3f52df06651e21b7eccc5eae2f02b111 -F src/pager.h 8d1dc9a2c3fc5eb6eeed75f48a076f425e77706f8935f05817fa05a308f587b5 -F src/parse.y c8eff38606f443d5ba245263fa7abc05e4116d95656e050c4b78e9bfbf931add -F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 -F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 -F src/pcache1.c 6596e10baf3d8f84cc1585d226cf1ab26564a5f5caf85a15757a281ff977d51a -F src/pragma.c 1b0db48177e52b256c003b8dc6ac708b1079a82cded944a23820574586a4731f -F src/pragma.h 8168e588536bffd95319451f34e9a754dc37d205ebe433031a7813c5b286beae -F src/prepare.c bb996921a85590418f951f27566216646fad2d6856ba131b21594862055b1bd7 -F src/printf.c 94b5419ad0a17269f76a9e968ca19cf9fa37617abed2e246fc48844e511b6bc6 -F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c c2008519a0654f1e7490e9281ed0397d0f14bb840d81f0b96946248afcbdb25d -F src/rowset.c ba9515a922af32abe1f7d39406b9d35730ed65efab9443dc5702693b60854c92 -F src/select.c b7bbec203c2a00e542dfea72ddfad92df349a4e3565aa666c3157fc85afe30b3 -F src/shell.c.in c6e26593f2738eefded08a39204bf6b48db135cdfaa458c26ffe57055b4fe365 -F src/sqlite.h.in 74342b41e9d68ff9e56b192009046f8dd0aa2bd76ce1a588f330de614ba61de7 -F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 -F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 -F src/sqliteInt.h 8fddd3ff00bb5983c45fbe891c9c4134b5d4799d8816a1e97cba38dc66aca4c2 -F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032 -F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278 -F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 -F src/tclsqlite.c 986b6391f02cd9b53c1d688be55899f6ffddeb8e8014cd83c1b73ff912579a71 -F src/test1.c 5e8b8cc54e8c88906ea8a084387aa79bad245e539f4cee73149e5c0527e1db16 -F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 -F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 -F src/test4.c 405834f6a93ec395cc4c9bb8ecebf7c3d8079e7ca16ae65e82d01afd229694bb -F src/test5.c 328aae2c010c57a9829d255dc099d6899311672d -F src/test6.c e8d839fbc552ce044bec8234561a2d5b8819b48e29548ad0ba400471697946a8 -F src/test7.c 5612e9aecf934d6df7bba6ce861fdf5ba5456010 -F src/test8.c 3f7d0cc4e12e06832ba3db4455cb16867ccadafa602eb6ff5fcf097bffce56ed -F src/test9.c 12e5ba554d2d1cbe0158f6ab3f7ffcd7a86ee4e5 -F src/test_async.c 195ab49da082053fdb0f949c114b806a49ca770a -F src/test_autoext.c 915d245e736652a219a907909bb6710f0d587871 -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 5ea19bf0972a9d91728518b4d30e91477acce80496003ecbef3a7fb18d0bd081 -F src/test_delete.c e2fe07646dff6300b48d49b2fee2fe192ed389e834dd635e3b3bac0ce0bf9f8f -F src/test_demovfs.c 86142ba864d4297d54c5b2e972e74f3141ae4b30f05b3a95824184ed2d3d7f91 -F src/test_devsym.c 6109b45c3db3ef7b002320947ed448c027356ab8b885156ff535fd8684d4a571 -F src/test_fs.c ba1e1dc18fd3159fdba0b9c4256f14032159785320dfbd6776eb9973cb75d480 -F src/test_func.c 181f992e5495644434c4f0e3cc72362a78c295eb2cf3ff4d02498b8bde7aa276 -F src/test_hexio.c d170d0e1a6431afdeac086a250d2595078288c2257615d37949355361399bcaa -F src/test_init.c 4413c211a94b62157ca4c145b3f27c497f03c664 -F src/test_intarray.c 39b4181662a0f33a427748d87218e7578d913e683dc27eab7098bb41617cac71 -F src/test_intarray.h d57ae92f420cda25e22790dac474d60961bd0c500cbaa3338a05152d4a669ef7 -F src/test_journal.c a0b9709b2f12b1ec819eea8a1176f283bca6d688a6d4a502bd6fd79786f4e287 -F src/test_loadext.c 337056bae59f80b9eb00ba82088b39d0f4fe6dfd -F src/test_malloc.c dec0aa821b230773aeb3dd11d652c1193f7cedb18a20b25659bc672288115242 -F src/test_md5.c 7268e1e8c399d4a5e181b64ac20e1e6f3bc4dd9fc87abac02db145a3d951fa8c -F src/test_multiplex.c 46e278397bef99b10530c1a695b4f6f23823fde6d6589b182f14e9bd43440b57 -F src/test_multiplex.h 5436d03f2d0501d04f3ed50a75819e190495b635 -F src/test_mutex.c 7f4337ba23ee6b1d2ec81c189653608cb069926a -F src/test_onefile.c f31e52e891c5fef6709b9fcef54ce660648a34172423a9cbdf4cbce3ba0049f4 -F src/test_osinst.c 98ef31ff03d55497829ca0f6c74a9f4e1aa48690 -F src/test_pcache.c a5cd24730cb43c5b18629043314548c9169abb00 -F src/test_quota.c 6cb9297115b551f433a9ad1741817a9831abed99 -F src/test_quota.h 2a8ad1952d1d2ca9af0ce0465e56e6c023b5e15d -F src/test_rtree.c 671f3fae50ff116ef2e32a3bf1fe21b5615b4b7b -F src/test_schema.c f575932cb6274d12147a77e13ea4b49d52408513 -F src/test_server.c a2615049954cbb9cfb4a62e18e2f0616e4dc38fe -F src/test_sqllog.c 11e6ce7575f489155c604ac4b439f2ac1d3d5aef -F src/test_superlock.c 4839644b9201da822f181c5bc406c0b2385f672e -F src/test_syscall.c 1073306ba2e9bfc886771871a13d3de281ed3939 -F src/test_tclsh.c eeafce33ad2136d57e5dec10f1e9a4347447eb72ffd504a1c7b9c6bfe2e71578 -F src/test_tclvar.c 33ff42149494a39c5fbb0df3d25d6fafb2f668888e41c0688d07273dcb268dfc -F src/test_thread.c 269ea9e1fa5828dba550eb26f619aa18aedbc29fd92f8a5f6b93521fbb74a61c -F src/test_vdbecov.c f60c6f135ec42c0de013a1d5136777aa328a776d33277f92abac648930453d43 -F src/test_vfs.c 36822d696789535bdd0260f07d2c9a46546082fea8bb1d0a7354c7f9366e37ea -F src/test_vfstrace.c bab9594adc976cbe696ff3970728830b4c5ed698 -F src/test_windirent.c a895e2c068a06644eef91a7f0a32182445a893b9a0f33d0cdb4283dca2486ac1 -F src/test_windirent.h 90dfbe95442c9762357fe128dc7ae3dc199d006de93eb33ba3972e0a90484215 -F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394ba3f -F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 -F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c -F src/tokenize.c eee7bae3ec0bc4abee951554bf46a8ba567c0f7752ac90c820ed8afff4c612dc -F src/treeview.c 4b92992176fb2caefbe06ba5bd06e0e0ebcde3d5564758da672631f17aa51cda -F src/trigger.c 4ada1037cc99777f647a882cdacbd1a4deb6567b69daf02946286401b88cdc04 -F src/update.c 3199098455830fc2d8c8fc4ae3ec2ea513eef64339ae9a7048db62b21169bc7a -F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78 -F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 -F src/util.c 3b6cedf7a0c69bd6e1acce832873952d416212d6293b18d03064e07d7a9b5118 -F src/vacuum.c de9780b89fa4ee74c3534f60b94820e3179aca759ffc1338ee53cb4ea7693dd3 -F src/vdbe.c a154f2785fbe4a1205944c647026445552ca3fa04ed1f313b05e614be205c061 -F src/vdbe.h 07b8c636a87df8b6e58f29d6badd7f10d5844353deff1d7c88ed1c2bfe3bbd35 -F src/vdbeInt.h 571413068b5ac07e2ed8ca7a02fa529622fd5455ae6981498376e5e492d2e5ef -F src/vdbeapi.c e467b75a710ea099f8d2d022abf601d2ccd05e28f63b44b12d93000b6a75f4a8 -F src/vdbeaux.c 00746a04b3a1e917bab5e3846f0931820a5ded53cbe1648ba1ad57c0869c1ba3 -F src/vdbeblob.c 253ed82894924c362a7fa3079551d3554cd1cdace39aa833da77d3bc67e7c1b1 -F src/vdbemem.c 39b942ecca179f4f30a32b54579a85d74ccaefa5af2a0ad2700abe5ef0768b22 -F src/vdbesort.c 2be76d26998ce2b3324cdcc9f6443728e54b6c7677c553ad909c7d7cfab587df -F src/vdbetrace.c fa3bf238002f0bbbdfb66cc8afb0cea284ff9f148d6439bc1f6f2b4c3b7143f0 -F src/vdbevtab.c ee5b4c902fdda2230f9503ac7b84c6d614c91e8f6f4dc1633e2e8dfef8ffb144 -F src/vtab.c 7b452592ed2ee95dedb1f323d557cebede5a6f3b4558b21a5dca527e6ae9b12c -F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 231044ecf7d5d78bc705af9dcec6c10ec59e891366362b6be54bb6a0bc7c17db -F src/wal.h c3aa7825bfa2fe0d85bef2db94655f99870a285778baa36307c0a16da32b226a -F src/walker.c 3df26a33dc4f54e8771600fb7fdebe1ece0896c2ad68c30ab40b017aa4395049 -F src/where.c 7bcc07ff56d03d73308245135d96de46d2faeaee628bd4badf0bae60ae6a31fe -F src/whereInt.h 6b874aa15f94e43a2cec1080be64d955b04deeafeac90ffb5d6975c0d511be3c -F src/wherecode.c 7b939de85d65cc4b4bfa197513136b9e0ae03167e3b82842ca5a0ba1055ba65d -F src/whereexpr.c 264d58971eaf8256eb5b0917bcd7fc7a1f1109fdda183a8382308a1b18a2dce7 -F src/window.c 7d19c08b62b70d5dc2ef4c098cc5ba611fac246a111fa36ebb39505415124b90 -F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 -F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 -F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d -F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 -F test/aggnested.test 2f65ec8132e0ca896de550b9908094d49ad65a99116a9d79deeb6017604ad4f6 -F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87 -F test/all.test 2ecb8bbd52416642e41c9081182a8df05d42c75637afd4488aace78cc4b69e13 -F test/alter.test 25e109787dc5e631e117eb6e1c57f96a572bb51228db3b4f8b5f41d665e2ccaa -F test/alter2.test a966ccfcddf9ce0a4e0e6ff1aca9e6e7948e0e242cd7e43fc091948521807687 -F test/alter3.test e487958dec7932453e0b83baf21d6b1e71d5e7d9a55bc20eadfa62a51ddffc29 -F test/alter4.test dfd6086faf461b27ca2d2999848dcd207edf23352fc1592d0005c0844f3f08cf -F test/alterauth.test 63442ba61ceb0c1eeb63aac1f4f5cebfa509d352276059d27106ae256bafc959 -F test/alterauth2.test c0a1ddf5b93d93cb0d15ba7acaf0c5c6fb515bbe861ede75b2d3fabad33b6499 -F test/altercol.test 1d6a6fe698b81e626baea4881f5717f9bc53d7d07f1cd23ee7ad1b931f117ddf -F test/alterlegacy.test 82022721ce0de29cedc9a7af63bc9fcc078b0ee000f8283b4b6ea9c3eab2f44b -F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9 -F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b -F test/altertab.test 523ba6368e0da19f462f7c05563c569675736d946724cac1c4ae848f76783434 -F test/altertab2.test b0d62f323ca5dab42b0bc028c52e310ebdd13e655e8fac070fe622bad7852c2b -F test/altertab3.test 155b8dc225ce484454a7fb4c8ba745680b6fa0fc3e08919cbbc19f9309d128ff -F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f -F test/analyze.test 547bb700f903107b38611b014ca645d6b5bb819f5210d7bf39c40802aafeb7d7 -F test/analyze3.test 01f0b122e3e54ad2544f14f7cc7dcb4c2cb8753cad5e88c6b8d49615b3fd6a2b -F test/analyze4.test cdf88f3f72b0f0643a1ff6c730fc5af1e42464d47478d9fbac84c333f72c014e -F test/analyze5.test fa5131952303ac4146aba101b116b9c8cb89e2637531c334a6df7f7d19dddc0d -F test/analyze6.test 6c3f7df2996cb6872f355a6ac1eb6d5de00a5a9288214bad7ef25c97d9cc72dc -F test/analyze7.test 6ef0b12369f61ddeadc7d8a705c40e6b52cb29f63de3a4c56581b510b46b5783 -F test/analyze8.test 36ce54947710bd44e4f9484e1ad07e725ef01a9d7078b417c1bc884356febe4d -F test/analyze9.test 9fbf0e0101eef4f5dc149769aa14e10b76ee06e7c28598264b32173cd1999a54 -F test/analyzeC.test 489fe2ea3be3f17548e8dd895f1b41c9669b52de1b0861f5bffe6eec46eac710 -F test/analyzeD.test e50cd0b3e6063216cc0c88a1776e8645dc0bd65a6bb275769cbee33b7fd8d90c -F test/analyzeE.test 8684e8ac5722fb97c251887ad97e5d496a98af1d -F test/analyzeF.test 9e1a0537949eb5483642b1140a5c39e5b4025939024b935398471fa552f4dabb -F test/analyzeG.test a48c0f324dd14de9a40d52abe5ca2637f682b9a791d2523dd619f6efa14e345b -F test/analyzer1.test 459fa02c445ddbf0101a3bad47b34290a35f2e49 -F test/async.test 1d0e056ba1bb9729283a0f22718d3a25e82c277b -F test/async2.test c0a9bd20816d7d6a2ceca7b8c03d3d69c28ffb8b -F test/async3.test d73a062002376d7edc1fe3edff493edbec1fc2f7 -F test/async4.test 1787e3952128aa10238bf39945126de7ca23685a -F test/async5.test 383ab533fdb9f7ad228cc99ee66e1acb34cc0dc0 -F test/atof1.test 1ccfc96a6888566597b83d882c81b3c04258dc39317e8c1cec89ba481eaa2fba -F test/atomic.test 065a453dde33c77ff586d91ccaa6ed419829d492dbb1a5694b8a09f3f9d7d061 -F test/atomic2.test b6863b4aa552543874f80b42fb3063f1c8c2e3d8e56b6562f00a3cc347b5c1da -F test/atrc.c ec92d56d8fbed9eb3e11aaf1ab98cf7dd59e69dae31f128013f1d97e54e7dfed -F test/attach.test d42862c72fef3d54367d962d41dcfb5363442a4a1bd898c22ae950cea1aa0dd3 -F test/attach2.test 256bd240da1835fb8408dd59fb7ef71f8358c7a756c46662434d11d07ba3a0ce -F test/attach3.test c59d92791070c59272e00183b7353eeb94915976 -F test/attach4.test aa05b1d8218b24eba5a7cccf4f224f514ba57ba705c9267f09d2bb63fed0eea1 -F test/attachmalloc.test 12c4f028e570acf9e0a4b0b7fe6f536e21f3d5ebddcece423603d0569beaf438 -F test/auth.test 2154625c05bc79f0e0ea72cb2358395a8041243caa0fd7ce7617d50da4331794 -F test/auth2.test 9eb7fce9f34bf1f50d3f366fb3e606be5a2000a1 -F test/auth3.test db21405b95257c24d29273b6b31d0efc59e1d337e3d5804ba2d1fd4897b1ae49 -F test/autoanalyze1.test b9cc3f32a990fa56669b668d237c6d53e983554ae80c0604992e18869a0b2dec -F test/autoinc.test 997d6f185f138229dc4251583a1d04816423dddc2fc034871a01aeb1d728cb39 -F test/autoindex1.test 96185415f5faacd5b8d7a7f505efddd5abb1f111d58338e9c0b1dc40b87cd3cc -F test/autoindex2.test 12ef578928102baaa0dc23ad397601a2f4ecb0df -F test/autoindex3.test 2dd997d6590438b53e4f715f9278aa91c9299cf3f81246a0915269c35beb790e -F test/autoindex4.test 49d3cd791a9baa16fb461d7ea3de80d019a819cf -F test/autoindex5.test a5d72fe8c217cc0ea356dc6fa06a282a8a3fc53aa807709d79dba07a8f248102 -F test/autovacuum.test 0831cd34e14695d297187f7f6519265e3121c5b0a1720e548e86829e796129e9 -F test/autovacuum_ioerr2.test 8a367b224183ad801e0e24dcb7d1501f45f244b4 -F test/avtrans.test b7dc25459ecbd86c6fa9c606ee3068f59d81e225118617dcf2bbb6ded2ade89e -F test/backcompat.test 3e64cedda754c778ef6bbe417b6e7a295e662a4d -F test/backup.test dd4a5ff756e3df3931dacb1791db0584d4bad989 -F test/backup2.test 1fd1ad8c5b3d2d5b9c0cce4143a4fc610d51ddc6ae16a7a122973d43e6b50bbd -F test/backup4.test 8f6fd48e0dfde77b9a3bb26dc471ede3e101df32 -F test/backup5.test ee5da6d7fe5082f5b9b0bbfa31d016f52412a2e4 -F test/backup_ioerr.test 4c3c7147cee85b024ecf6e150e090c32fdbb5135 -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 705b57d7f51d53ee5fd043dd9666236e1fc18f4d59abf51da0ea5ea1b4804947 -F test/bestindex2.test 9a0ccd320b6525eec3a706aae6cdab7e1b7b5abca75027e39f39f755e76e5928 -F test/bestindex3.test 7622e792ff2da16d262d3cea6ad914591ac4806d57ed128e6c940b7920b47b84 -F test/bestindex4.test 038e3d0789332f3f1d61474f9bbc9c6d08c6bd1783a978f31f38ad82688de601 -F test/bestindex5.test 67c1166131bb59f9e47c00118f7d432ca5491e6cae6ca3f87ca9db20103a78f9 -F test/bestindex6.test d856a9bb63d927493575823eed44053bc36251e241aa364e54d0f2a2d302e1d4 -F test/bestindex7.test f36ada201973d3022cf7afffffe08de9e58341996020e7a2df9a1d2f2be20132 -F test/between.test 68137a6e941c221417c15b6fe2d55f27bb1b6ab48bdf9e2aa51efdd85bc53802 -F test/bigfile.test aa74f4e5db51c8e54a1d9de9fa65d01d1eb20b59 -F test/bigfile2.test 1b489a3a39ae90c7f027b79110d6b4e1dbc71bfc -F test/bigmmap.test 31dad31573638bd32de866cdefd11843f75685be4ba6aec1a47918f098f1899b -F test/bigrow.test f0aeb7573dcb8caaafea76454be3ade29b7fc747 -F test/bigsort.test 8299fa9298f4f1e02fc7d2712e8b77d6cd60e5a2 -F test/bind.test 1e136709b306f7ed3192d349c2930d89df6ab621654ad6f1a72381d3fe76f483 -F test/bindxfer.test efecd12c580c14df5f4ad3b3e83c667744a4f7e0 -F test/bitvec.test 75894a880520164d73b1305c1c3f96882615e142 -F test/blob.test e7ac6c7d3a985cc4678c64f325292529a69ae252 -F test/boundary1.tcl 6421b2d920d8b09539503a8673339d32f7609eb1 -F test/boundary1.test 66d7f4706ccdb42d58eafdb081de07b0eb42d77b -F test/boundary2.tcl e34ef4e930cf1083150d4d2c603e146bd3b76bcb -F test/boundary2.test 9ae758d7dab7e882c8b6cc4a6a10278385bff8fa -F test/boundary3.tcl 23361e108a125dca9c4080c2feb884fe54d69243 -F test/boundary3.test 56ef82096b4329aca2be74fa1e2b0f762ea0eb45 -F test/boundary4.tcl 0bb4b1a94f4fc5ae59b79b9a2b7a140c405e2983 -F test/boundary4.test 89e02fa66397b8a325d5eb102b5806f961f8ec4b -F test/btree01.test e08b3613540145b353f20c81cb18ead54ff12e0f -F test/btree02.test 7555a5440453d900410160a52554fe6478af4faf53098f7235f1f443d5a1d6cc -F test/btreefault.test c2bcb542685eea44621275cfedbd8a13f65201e3 -F test/busy.test 510dc6daaad18bcbbc085bcc6217d6dc418def5e73f72ce1475eea0cb7834727 -F test/cache.test 13bc046b26210471ca6f2889aceb1ea52dc717de -F test/cacheflush.test af25bb1509df04c1da10e38d8f322d66eceedf61 -F test/cachespill.test 895997f84a25b323b166aecb69baab2d6380ea98f9e0bcc688c4493c535cfab9 -F test/capi2.test 34a1a9a96d543a2ec2c209696b11b164444f57253b1f2cba1c2e53fadede6c7b -F test/capi3.test 3910a73c38ac76d69778dd9eb481ab7cd6ed59117fc047b4f6056a5c72529de1 -F test/capi3b.test efb2b9cfd127efa84433cd7a2d72ce0454ae0dc4 -F test/capi3c.test 54e2dc0c8fd7c34ad1590d1be6864397da2438c95a9f5aee2f8fbc60c112e44b -F test/capi3d.test aba917805573a03deed961a21f07a5a84505ad0a616f7e3fc1508844a15bccc4 -F test/capi3e.test 3d49c01ef2a1a55f41d73cba2b23b5059ec460fe -F test/cast.test 2906ccab6a3ebd147ffa63304b635be903ce58264110d0a0eb4fd9939422bb53 -F test/cffault.test 9d6b20606afe712374952eec4f8fd74b1a8097ef -F test/check.test 9776af795bb5d0f197b7f8fe248052e3ca2ed35304d863efcdbf8b1316e11f65 -F test/checkfault.test da6cb3d50247169efcb20bdf57863a3ccfa1d27d9e55cd324f0680096970f014 -F test/chunksize.test 427d87791743486cbf0c3b8c625002f3255cb3a89c6eba655a98923b1387b760 -F test/close.test eccbad8ecd611d974cbf47278c3d4e5874faf02d811338d5d348af42d56d647c -F test/closure01.test 9905883f1b171a4638f98fc764879f154e214a306d3d8daf412a15e7f3a9b1e0 -F test/coalesce.test cee0dccb9fbd2d494b77234bccf9dc6c6786eb91 -F test/collate1.test 532b4992f78e91dd80c2e3c7bd944fada8cbe3d6c0ded0b20f7182b4dfca0006 -F test/collate2.test 9aaa410a00734e48bcb27f3872617d6f69b2a621 -F test/collate3.test 89defc49983ddfbf0a0555aca8c0521a676f56a5 -F test/collate4.test c953715fb498b87163e3e73dd94356bff1f317bd -F test/collate5.test 65d928034d30d2d263a80f6359f7549ee1598ec6 -F test/collate6.test 8be65a182abaac8011a622131486dafb8076e907 -F test/collate7.test 8ec29d98f3ee4ccebce6e16ce3863fb6b8c7b868 -F test/collate8.test cd9b3d3f999b8520ffaa7cc1647061fc5bab1334 -F test/collate9.test 3adcc799229545940df2f25308dd1ad65869145a -F test/collateA.test b8218ab90d1fa5c59dcf156efabb1b2599c580d6 -F test/collateB.test 1e68906951b846570f29f20102ed91d29e634854ee47454d725f2151ecac0b95 -F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1 -F test/colname.test 87ad5458bb8709312dac0d6755fd30e8e4ca83298d0a9ef6e5c24277a3c3390e -F test/conflict.test 58857e2533fb9f2e0358ea7cb191215657846be1dd9da3b3d6df3e750c02ae03 -F test/conflict2.test bb0b94cf7196c64a3cbd815c66d3ee98c2fecd9c -F test/conflict3.test 81865d9599609aca394fb3b9cd5f561d4729ea5b176bece3644f6ecb540f88ac -F test/contrib01.test 2a1cbc0f2f48955d7d073f725765da6fbceda6b4 -F test/corrupt.test d7cb0300e4a297147b6a05e92a1684bc8973635c3bcaa3d66e983c9cbdbf47a3 -F test/corrupt2.test bb50042cf9a1f1023d73af325d47eb02a6bb11e3c52f8812644b220c5d4bca35 -F test/corrupt3.test f95d7bf78109e0b84eb285a787ce91a3fd6a2dd7d0cb55882abff3bdc081a57e -F test/corrupt4.test 8d1d86b850fcc43e417450454f2044e52d55778a -F test/corrupt5.test 387be3250795e2a86e6234745558b80efb248a357d0cd8e53bce75c7463f545d -F test/corrupt6.test fc6a891716139665dae0073b6945e3670bf92568 -F test/corrupt7.test b036f94bda4b0b23a2919bf717046ce9ecca4543 -F test/corrupt8.test 2399dfe40d2c0c63af86706e30f3e6302a8d0516 -F test/corrupt9.test 730a3db08d4ab9aa43392ea30d9c2b4879cbff85 -F test/corruptA.test 112f4b2ae0b95ebf3ea63718642fb969a93acea557ace3a307234d19c245989b -F test/corruptB.test 73a8d6c0b9833697ecf16b63e3c5c05c945b5dec -F test/corruptC.test 74d4498fd25759618b393f1e9cde111de828b88c1848ab320f6c179fd52b5a60 -F test/corruptD.test 33a37ce3ed56a20093ceee778cd2d7109c7085a59f3213d2baede11d952e8e50 -F test/corruptE.test 4143791f2dfb443aec5b7fabfa5821e6063eccc3b49b06f212c2f014715fd476 -F test/corruptF.test be9fde98e4c93648f1ba52b74e5318edc8f59fe4 -F test/corruptG.test adf79b669cbfd19e28c8191a610d083ae53a6d51 -F test/corruptH.test 79801d97ec5c2f9f3c87739aa1ec2eb786f96454 -F test/corruptI.test a17bbf54fdde78d43cf3cc34b0057719fd4a173a3d824285b67dc5257c064c7b -F test/corruptJ.test 4d5ccc4bf959464229a836d60142831ef76a5aa4 -F test/corruptK.test 5b4212fe346699831c5ad559a62c54e11c0611bdde1ea8423a091f9c01aa32af -F test/corruptL.test 13ef74a93223af25015d223add0df4c2d375f0b958b546a2a72033f2fdab7a70 -F test/corruptM.test 7d574320e08c1b36caa3e47262061f186367d593a7e305d35f15289cc2c3e067 -F test/cost.test 1d156ce9858780a966c062694687afe0343a0ed12d081d071fb57027e726bafc -F test/count.test e0699a15712bc2a4679d60e408921c2cce7f6365a30340e790c98e0f334a9c77 -F test/countofview.test e17d6e6688cf74f22783c9ec6e788c0790ee4fbbaee713affd00b1ac0bb39b86 -F test/coveridxscan.test 5ec98719a2e2914e8908dc75f7247d9b54a26df04625f846ac7900d5483f7296 -F test/crash.test fb9dc4a02dcba30d4aa5c2c226f98b220b2b959f -F test/crash2.test 5b14d4eb58b880e231361d3b609b216acda86651 -F test/crash3.test 8f5de9d32ab9ab95475a9efe7f47a940aa889418 -F test/crash4.test fe2821baf37168dc59dd733dcf7dba2a401487bc -F test/crash5.test f14ff37eddc41991be4eb63568f86caa306fd9962a0ae3750db8836777bb7aae -F test/crash6.test 4c56f1e40d0291e1110790a99807aa875b1647ba -F test/crash7.test 1a194c4900a255258cf94b7fcbfd29536db572df -F test/crash8.test 64366e459c28dd62edfb7ad87253a409c7533b92d16fcc479a6a8131bdcc3100 -F test/crashM.test d95f59046fa749b0d0822edf18a717788c8f318d -F test/crashtest1.c 09c1c7d728ccf4feb9e481671e29dda5669bbcc2 -F test/createtab.test 85cdfdae5c3de331cd888d6c66e1aba575b47c2e3c3cc4a1d6f54140699f5165 -F test/cse.test 00b3aea44b16828833c94fbe92475fd6977583fcb064ae0bc590986812b38d0c -F test/csv01.test c9c3af0d58c34e9ac970c5875a77939edb958762c8aafb95409e19a3f088b6cd -F test/ctime.test 78749e6c9a5f0010d67985be80788f841e3cd2da18114e2ed6010399a7d807f3 -F test/cursorhint.test 0175e4404181ace3ceca8b114eb0a98eae600d565aa4e2705abbe6614c7fe201 -F test/cursorhint2.test 6f3aa9cb19e7418967a10ec6905209bcbb5968054da855fc36c8beee9ae9c42f -F test/dataversion1.test 6e5e86ac681f0782e766ebcb56c019ae001522d114e0e111e5ebf68ccf2a7bb8 -F test/date.test 9b73bbeb1b82d9c1f44dec5cf563bf7da58d2373 -F test/date2.test 5ef8265c71460cda6b1698bf18f4bb0ffb40ac08c5092f6afe84d398c2feb5be -F test/dbdata.test 042f49acff3438f940eeba5868d3af080ae64ddf26ae78f80c92bec3ca7d8603 -F test/dbfuzz.c 73047c920d6210e5912c87cdffd9a1c281d4252e -F test/dbfuzz001.test 42aad1dcef6219fbee86a9b7d08832c9bbb2e41508f6f128ae91745927276292 -F test/dbfuzz2-seed1.db e6225c6f3d7b63f9c5b6867146a5f329d997ab105bee64644dc2b3a2f2aebaee -F test/dbfuzz2.c c2c9cb40082a77b7e95ffb8b2da1e93322efadfb1c8c1e0001c95a0af1e156c2 -F test/dbpage.test 650234ba683b9d82b899c6c51439819787e7609f17a0cc40e0080a7b6443bc38 -F test/dbstatus.test 4a4221a883025ffd39696b3d1b3910b928fb097d77e671351acb35f3aed42759 -F test/dbstatus2.test f5fe0afed3fa45e57cfa70d1147606c20d2ba23feac78e9a172f2fe8ab5b78ef -F test/default.test 9687cfb16717e4b8238c191697c98be88c0b16e568dd5368cd9284154097ef50 -F test/delete.test 31832b0c45ecb51a54348c68db173be462985901e6ed7f403d6d7a8f70ab4ef0 -F test/delete2.test 3a03f2cca1f9a67ec469915cb8babd6485db43fa -F test/delete3.test 555e84a00a99230b7d049d477a324a631126a6ab -F test/delete4.test 6aa279f459f4aa792cc251435c3809415c1ecaf9f27dce91675e26f05b503db3 -F test/delete_db.test 096d828493c7907f9ea11a7098ea6a0f73edba89406487d5d6cc2228dc4ab8b0 -F test/descidx1.test edc8adee58d491b06c7157c50364eaf1c3605c9c19f8093cb1ea2b6184f3ac13 -F test/descidx2.test a0ba347037ff3b811f4c6ceca5fd0f9d5d72e74e59f2d9de346a9d2f6ad78298 -F test/descidx3.test 953c831df7ea219c73826dfbf2f6ee02d95040725aa88ccb4fa43d1a1999b926 -F test/diskfull.test 106391384780753ea6896b7b4f005d10e9866b6e -F test/distinct.test e7d0cf371944dd0cbedff86420744e2f1ea2b528156451c97eb6ff41a99b9236 -F test/distinct2.test 11b0594c932098e969d084ba45ab81d5040f4d4e766db65d49146705a305ed98 -F test/distinctagg.test 1a6ef9c87a58669438fc771450d7a72577417376 -F test/e_blobbytes.test 439a945953b35cb6948a552edaec4dc31fd70a05 -F test/e_blobclose.test 4b3c8c60c2171164d472059c73e9f3c1844bb66d -F test/e_blobopen.test e95e1d40f995056f6f322cd5e1a1b83a27e1a145 -F test/e_blobwrite.test f87ff598b67af5b3ec002a8d83e804dc8d23808e88cf0080c176612fc9ffce14 -F test/e_changes.test fd66105385153dbf21fdb35eb8ef6c3e1eade579 -F test/e_createtable.test ea27082d6f84df61e1d9e383f3fd79220418856a4a8afc41af75d458b8e7ac33 -F test/e_delete.test ab39084f26ae1f033c940b70ebdbbd523dc4962e -F test/e_droptrigger.test 3cd080807622c13e5bbb61fc9a57bd7754da2412 -F test/e_dropview.test 74e405df7fa0f762e0c9445b166fe03955856532e2bb234c372f7c51228d75e7 -F test/e_expr.test 62000e6675d5bcf4b09276fe011a27779629ff8f6678ba5937fb6f1b78d645ff -F test/e_fkey.test b497feb7c436693e16a36cdaba8d81ffe12f23659d139ee71dfa57c0c52d1e5b -F test/e_fts3.test 17ba7c373aba4d4f5696ba147ee23fd1a1ef70782af050e03e262ca187c5ee07 -F test/e_insert.test f02f7f17852b2163732c6611d193f84fc67bc641fb4882c77a464076e5eba80e -F test/e_reindex.test 2b0e29344497d9a8a999453a003cb476b6b1d2eef2d6c120f83c2d3a429f3164 -F test/e_resolve.test a61751c368b109db73df0f20fc75fb47e166b1d8 -F test/e_select.test f9474205669a7736ef725b29cc7ae9e8601919a3d0ffc0ab30745a028f2a4b61 -F test/e_select2.test aceb80ab927d46fba5ce7586ebabf23e2bb0604f -F test/e_totalchanges.test b12ee5809d3e63aeb83238dd501a7bca7fd72c10 -F test/e_update.test f46c2554d915c9197548681e8d8c33a267e84528 -F test/e_uri.test 47eeb2960e74613f0f8722b2f13aef08fde69daa16e5380ac93df84dac8b1f72 -F test/e_vacuum.test 0d8832a2ce92350db0d0cff47b419465fd9772562e1f77ff7d9478c07a4980d2 -F test/e_wal.test ae9a593207a77d711443ee69ffe081fda9243625 -F test/e_walauto.test 248af31e73c98df23476a22bdb815524c9dc3ba8 -F test/e_walckpt.test 28c371a6bb5e5fe7f31679c1df1763a19d19e8a0 -F test/e_walhook.test 01b494287ba9e60b70f6ebf3c6c62e0ffe01788e344a4846b08e5de0b344cb66 -F test/emptytable.test a38110becbdfa6325cd65cb588dca658cd885f62 -F test/enc.test 9a7be5479da985381d740b15f432800f65e2c87029ee57a318f42cb2eb43763a -F test/enc2.test 848bf05f15b011719f478dddb7b5e9aea35e39e457493cba4c4eef75d849a5ec -F test/enc3.test 6807f7a7740a00361ca8d0ccd66bc60c8dc5f2b6 -F test/enc4.test c8f1ce3618508fd0909945beb8b8831feef2c020 -F test/eqp.test 84879b63e3110552bf8ce648a3507dc3ceb72109ecec83c2aef0db37a27f6382 -F test/errmsg.test eae9f091eb39ce7e20305de45d8e5d115b68fa856fba4ea6757b6ca3705ff7f9 -F test/eval.test a64c9105d6ff163df7cf09d6ac29cdad5922078c -F test/exclusive.test 7ff63be7503990921838d5c9f77f6e33e68e48ed1a9d48cd28745bf650bf0747 -F test/exclusive2.test 984090e8e9d1b331d2e8111daf6e5d61dda0bef7 -F test/exec.test e949714dc127eaa5ecc7d723efec1ec27118fdd7 -F test/exists.test 79a75323c78f02bbe9c251ea502a092f9ef63dac -F test/expr.test 26cd01e8485bc48c8aa6a1add598e9ce1e706b4eb4f3f554e0b0223022e8c2cf -F test/expr2.test c27327ae9c017a7ff6280123f67aff496f912da74d78c888926d68b46ec75fd8 -F test/extension01.test 00d13cec817f331a687a243e0e5a2d87b0e358c9 -F test/extraquick.test cb254400bd42bfb777ff675356aabf3287978f79 -F test/fallocate.test 37a62e396a68eeede8f8d2ecf23573a80faceb630788d314d0a073d862616717 -F test/filectrl.test 6e871c2d35dead1d9a88e176e8d2ca094fec6bb3 -F test/filefmt.test f393e80c4b8d493b7a7f8f3809a8425bbf4292af1f5140f01cb1427798a2bbd4 -F test/filter1.test 8a6f047a000ef391db2ca17b6beecc0006f4e0f9ca8bbe272b2443c7316e66b1 -F test/filter2.tcl 44e525497ce07382915f01bd29ffd0fa49dab3adb87253b5e5103ba8f93393e8 -F test/filter2.test 485cf95d1f6d6ceee5632201ca52a71868599836f430cdee42e5f7f14666e30a -F test/filterfault.test c08fb491d698e8df6c122c98f7db1c65ffcfcad2c1ab0e07fa8a5be1b34eaa8b -F test/fkey1.test d11dbb8a93ead9b5c46ae5d02da016d61245d47662fb2d844c99214f6163f768 -F test/fkey2.test b1b6a8c5556dc0ccf31291b1fed8aa57e404b38f3236110e19ab4dc6aa93edf2 -F test/fkey3.test 76d475c80b84ee7a5d062e56ccb6ea68882e2b49 -F test/fkey4.test 86446017011273aad8f9a99c1a65019e7bd9ca9d -F test/fkey5.test 24dd28eb3d9f1b5a174f47e9899ace5facb08373a4223593c8c631e6cf9f7d5a -F test/fkey6.test d078a1e323a740062bed38df32b8a736fd320dc0 -F test/fkey7.test 64fb28da03da5dfe3cdef5967aa7e832c2507bf7fb8f0780cacbca1f2338d031 -F test/fkey8.test 48ef829d63f5f7b37aabd4df9363ac05f65539d1da8c4a44251631769d920579 -F test/fkey_malloc.test 594a7ea1fbab553c036c70813cd8bd9407d63749 -F test/fordelete.test ba98f14446b310f9c9d935b97ec748753d0144a28b356ba30d1f4f6958fdde5c -F test/format4.test eeae341953db8b6bda7f549044797c3278a6cc345d11ada81471671b654f8ef4 -F test/fts-9fd058691.test 78b887e30ae6816df0e1fed6259de4b5a64ad33c -F test/fts1a.test 46090311f85da51bb33bd5ce84f7948359c6d8d7 -F test/fts1b.test 5d8a01aefbecc8b7442b36c94c05eb7a845462d5 -F test/fts1c.test 85a525ce7428907469b4cce13d5563ce542ce64c -F test/fts1d.test a73deace5c18df4a549b12908bade4f05dcf1a2f -F test/fts1e.test 77244843e925560b5a0b70069c3e7ab62f181ed2 -F test/fts1f.test 2d6cb10d8b7a4e6edc321bbdb3982f1f48774714 -F test/fts1i.test 6bfe08cdfdced063a39a50c8601da65e6274d879 -F test/fts1j.test e3797475796043a161e348c46a309664cac83f7f -F test/fts1k.test 65d3b41487b9f738d11b0f00eca375c0ca6bd970 -F test/fts1l.test 15c119ed2362b2b28d5300c0540a6a43eab66c36 -F test/fts1m.test 2d9ca67b095d49f037a914087cc0a61e89da4f0c -F test/fts1n.test a2317dcd27b1d087ee3878b30e0a59c593c98b7a -F test/fts1o.test d1554caede42bba2c82fe613bcc921856c196b752449ead0470fac52a20fd3b8 -F test/fts1porter.test d86e9c3e0c7f8ff95add6582b4b585fb4e02b96d -F test/fts2.test e3fb95f96a650411574efc136f3fb10eef479ed7 -F test/fts2a.test 473a5c8b473a4e21a8e3fddaed1e59666e0c6ab7 -F test/fts2b.test 964abc0236c849c07ca1ae496bb25c268ae94816 -F test/fts2c.test ffb5a35230ac72c4354535c547965ce6824537c0 -F test/fts2d.test b7eaa671ca9a16997f3e5b158ee777ae21052b0b -F test/fts2e.test 2da13dbc2d009105f42196845c1e1ce136c03d38 -F test/fts2f.test cf84096235991709c1e61caa389632aa0a4f976d -F test/fts2g.test 3d26fe171bda6133ebf5a380731d70eaa2ef2f6f73d79769cf8946e622b6d597 -F test/fts2h.test 223af921323b409d4b5b18ff4e51619541b174bb -F test/fts2i.test 1b22451d1f13f7c509baec620dc3a4a754885dd6 -F test/fts2j.test 298fa1670aa21cd445b282d139b70c72e7ade12b -F test/fts2k.test c7ebf4a4937594aa07459e3e1bca1251c1be8659 -F test/fts2l.test 3333336621524cf7d60bb62d6ef6ab69647866ed -F test/fts2m.test 4b30142ead6f3ed076e880a2a464064c5ad58c51 -F test/fts2n.test 12b9c5352128cebd1c6b8395e43788d4b09087c2 -F test/fts2o.test 4054ac7433eb5440f1b1d200cfa449342dc4aabd991759139813e17c73e5bf9a -F test/fts2p.test 4b48c35c91e6a7dbf5ac8d1e5691823cc999aafb -F test/fts2q.test b2fbbe038b7a31a52a6079b215e71226d8c6a682 -F test/fts2r.test b154c30b63061d8725e320fba1a39e2201cadd5e -F test/fts2token.test d8070b241a15ff13592a9ae4a8b7c171af6f445a -F test/fts3.test 672a040ea57036fb4b6fdc09027c18d7d24ab654 -F test/fts3_common.tcl dffad248f9ce090800e272017d2898005c28ee6314fc1dd5550643a02666907a -F test/fts3aa.test 814d60a1ba30b4a71d8f9306a6564bc7b636dd6efacd2ad80306f9b23ef3ebee -F test/fts3ab.test 7f6cf260ae80dda064023df8e8e503e9a412b91f -F test/fts3ac.test 636ed7486043055d4f126a0e385f2d5a82ebbf63 -F test/fts3ad.test e40570cb6f74f059129ad48bcef3d7cbc20dda49 -F test/fts3ae.test ce32a13b34b0260928e4213b4481acf801533bda -F test/fts3af.test d394978c534eabf22dd0837e718b913fd66b499c -F test/fts3ag.test c003672a215124df7fc6000036d896f498b26b53 -F test/fts3ah.test dc9f66c32c296f1bc8bcc4535126bddfeca62894 -F test/fts3ai.test 24058fdc6e9e5102c1fd8459591b114b6a85d285 -F test/fts3aj.test 0ed71e1dd9b03b843a857dc3eb9b15630e0104fc -F test/fts3ak.test bd14deafe9d1586e8e9bf032411026ac4f8c925d -F test/fts3al.test 07d64326e79bbdbab20ee87fc3328fbf01641c9f -F test/fts3am.test 218aa6ba0dfc50c7c16b2022aac5c6be593d08d8 -F test/fts3an.test a49ccadc07a2f7d646ec1b81bc09da2d85a85b18 -F test/fts3ao.test 266989148fec6d9f1bb6c5382f7aa3dcea0e9cd444576e28dd2b9287ac7dd220 -F test/fts3atoken.test dc2078ce464914efe3a8dfc545dd034a0fc14f2ab425c240471d5a5f1c721400 -F test/fts3auto.test 649aa4c198d7acc5cd6355e19ee073d051c40d9e88a43fc3d88af46bdf3e99d5 -F test/fts3aux1.test 7a170e172afdbceb67f5baa05941fd4fbf56af42f61daa3d140f4b4bf4cb68f6 -F test/fts3aux2.test 2459e7fa3e22734aed237d1e2ae192f5541c4d8b218956ad2d90754977bf907f -F test/fts3b.test c15c4a9d04e210d0be67e54ce6a87b927168fbf9c1e3faec8c1a732c366fd491 -F test/fts3c.test fc723a9cf10b397fdfc2b32e73c53c8b1ec02958 -F test/fts3comp1.test a0f5b16a2df44dd0b15751787130af2183167c0c -F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f5a76b -F test/fts3corrupt.test 79a32ffdcd5254e2f7fa121d9656e61949ad049c3c6554229911b7ceac37c9c6 -F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 -F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test fde292a4712753c7ef235a199273c5d196e18a56bd2c4d2db7ccaf59b7027a0a -F test/fts3corrupt5.test 0549f85ec4bd22e992f645f13c59b99d652f2f5e643dac75568bfd23a6db7ed5 -F test/fts3corrupt6.test b6c55218b704b0cef224b284c756f9c55d0afd0b3c3837618bffeaa8c31e0d8e -F test/fts3cov.test 7eacdbefd756cfa4dc2241974e3db2834e9b372ca215880e00032222f32194cf -F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f -F test/fts3defer.test f4c20e4c7153d20a98ee49ee5f3faef624fefc9a067f8d8d629db380c4d9f1de -F test/fts3defer2.test 3da52ca2114e300e9971eee2f0cc1a2e5f27e6a9ee67957d49e63e41fdfcc0e7 -F test/fts3defer3.test dd53fc13223c6d8264a98244e9b19abd35ed71cd -F test/fts3drop.test 1b906e293d6773812587b3dc458cb9e8f3f0c297 -F test/fts3e.test 1f6c6ac9cc8b772ca256e6b22aaeed50c9350851 -F test/fts3expr.test ebae205a7a89446c32583bcd492dcb817b9f6b31819bb4dde2583bb99c77e526 -F test/fts3expr2.test 18da930352e5693eaa163a3eacf96233b7290d1a -F test/fts3expr3.test c4d4a7d6327418428c96e0a3a1137c251b8dfbf8 -F test/fts3expr4.test f5b2832549f01b1f7f73389fa21d4b875499bc95bf7c8b36271844888c6a0938 -F test/fts3expr5.test a5b9a053becbdb8e973fbf4d6d3abaabeb42d511d1848bd57931f3e0a1cf983e -F test/fts3fault.test 798e45af84be7978ca33d5bdc94246eb44724db24174b5d8e9b1ac46c57fb08d -F test/fts3fault2.test 6a17a11d8034b1c4eca9f3091649273d56c49ff049e2173df8060f94341e9da0 -F test/fts3first.test dbdedd20914c8d539aa3206c9b34a23775644641 -F test/fts3fuzz001.test e3c7b0ce9b04cc02281dcc96812a277f02df03cd7dc082055d87e11eb18aaf56 -F test/fts3join.test 949b4f5ae3ae9cc2423cb865d711e32476bdb205ab2be923fdf48246e4a44166 -F test/fts3malloc.test b0e4c133b8d61d4f6d112d8110f8320e9e453ef6 -F test/fts3matchinfo.test aa66cc50615578b30f6df9984819ae5b702511cf8a94251ec7c594096a703a4a -F test/fts3matchinfo2.test 00144e841704b8debfcdf6097969cd9f2a1cf759e2203cda42583648f2e6bf58 -F test/fts3misc.test 9ec15e7c0b5831a6353bd4c46bf3acdf1360eda5d9f396f667db4d05bcf92ecf -F test/fts3near.test 7e3354d46f155a822b59c0e957fd2a70c1d7e905 -F test/fts3offsets.test b85fd382abdc78ebce721d8117bd552dfb75094c -F test/fts3prefix.test fa794eaab0bdae466494947b0b153d7844478ab2 -F test/fts3prefix2.test e1f0a822ca661dced7f12ce392e14eaf65609dce -F test/fts3query.test ca033ff2ebcc22c69d89032fb0bc1850997d31e7e60ecd26440796ba1654e78f -F test/fts3rank.test cd99bc83a3c923c8d52afd90d86979cf05fc41849f892faeac3988055ef37b99 -F test/fts3rnd.test 1320d8826a845e38a96e769562bf83d7a92a15d0 -F test/fts3shared.test 57e26a801f21027b7530da77db54286a6fe4997e -F test/fts3snippet.test 0887196d67cffbe365edde535b95ecc642a532ce8551ccd9a73aab5999c3ffae -F test/fts3snippet2.test 2dabb5889eda4c9980aad325e688b470781f97ce7c0fca0db125616fae0a2cdd -F test/fts3sort.test ed34c716a11cc2009a35210e84ad5f9c102362ca -F test/fts3tok1.test a663f4cac22a9505400bc22aacb818d7055240409c28729669ea7d4cc2120d15 -F test/fts3tok_err.test 52273cd193b9036282f7bacb43da78c6be87418d -F test/fts3varint.test 0b84a3fd4eba8a39f3687523804d18f3b322e6d4539a55bf342079c3614f2ada -F test/fts4aa.test 0e6bfd6a81695a39b23e448dda25d864e63dda75bde6949c45ddc95426c6c3f5 -F test/fts4check.test 6259f856604445d7b684c9b306b2efb6346834c3f50e8fc4a59a2ca6d5319ad0 -F test/fts4content.test 73bbb123420d2c46ef2fb3b24761e9acdb78b0877179d3a5d7d57aada08066f6 -F test/fts4docid.test e33c383cfbdff0284685604d256f347a18fdbf01 -F test/fts4growth.test 289833c34ad45a5e6e6133b53b6a71647231fb89d36ddcb8d9c87211b6721d7f -F test/fts4growth2.test 13ad4e76451af6e6906c95cdc725d01b00044269 -F test/fts4incr.test 4e353a0bd886ea984e56fce9e77724fc923b8d0d -F test/fts4langid.test 89e623218935507bca69d076ca254a7a8969dfc681c282b6374feaea8c7de784 -F test/fts4lastrowid.test 185835895948d5325c7710649824042373b2203149abe8024a9319d25234dfd7 -F test/fts4merge.test e2b2ec21e287d54ec09824ccfb41e66896eeca568fc818ba0e0eb2efd94c35d2 -F test/fts4merge2.test 5faa558d1b672f82b847d2a337465fa745e46891 -F test/fts4merge3.test 8d9ccb4a3d41c4c617a149d6c4b13ad02de797d0 -F test/fts4merge4.test d895b1057a7798b67e03455d0fa50e9ea836c47b -F test/fts4merge5.test 69932d85cda8a1c4dcfb742865900ed8fbda51724b8cf9a45bbe226dfd06c596 -F test/fts4min.test 1c11e4bde16674a0c795953509cbc3731a7d9cbd1ddc7f35467bf39d632d749f -F test/fts4noti.test 5553d7bb2e20bf4a06b23e849352efc022ce6309 -F test/fts4onepass.test d69ddc4ee3415e40b0c5d1d0408488a87614d4f63ba9c44f3e52db541d6b7cc7 -F test/fts4opt.test 0fd0cc84000743ff2a883b9b84b4a5be07249f0ba790c8848a757164cdd46b2a -F test/fts4record.test a48508f69a84c9287c8019d3a1ae712f5730d8335ffaf8e2101e691d078950bb -F test/fts4rename.test 15fd9985c2bce6dea20da2245b22029ec89bd4710ed317c4c53abbe3cfd0c880 -F test/fts4umlaut.test fcaca4471de7e78c9d1f7e8976e3e8704d7d8ad979d57a739d00f3f757380429 -F test/fts4unicode.test ceca76422abc251818cb25dabe33d3c3970da5f7c90e1540f190824e6b3a7c95 -F test/full.test 6b3c8fb43c6beab6b95438c1675374b95fab245d -F test/func.test f673822636fb8ed618dd2b80230d16e495d19c8f2e2e7d6c22e93e2b3de097ad -F test/func2.test 772d66227e4e6684b86053302e2d74a2500e1e0f -F test/func3.test 2bb0f31ab7baaed690b962a88544d7be6b34fa389364bc36a44e441ed3e3f1e6 -F test/func4.test a94858a8c1f10a408b0b3db439c990b59dbb2349411d503de011ac4e2b5f27a6 -F test/func5.test 863e6d1bd0013d09c17236f8a13ea34008dd857d87d85a13a673960e4c25d82a -F test/func6.test 90e42b64c4f9fb6f04f44cb8a1da586c8542502e926b19c76504fe74ff2a9b7c -F test/fuzz-oss1.test e58330d01cbbd8215ee636b17a03fe220b37dbfa -F test/fuzz.test 96083052bf5765e4518c1ba686ce2bab785670d1 -F test/fuzz2.test 76dc35b32b6d6f965259508508abce75a6c4d7e1 -F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c31 -F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 -F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 -F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c 656ee850f331872a784e7d6a10649efe2af123bdaacb728b5a03e4faee8b959c -F test/fuzzdata1.db d36e88741b4f23bcbaaf55b006290669d03c6c891cf13c7b3a53bc1b097b693f -F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f -F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba -F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e42ed2 -F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 -F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 -F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db 6acee588a3311994b57b226c9eac9e9e69f135cb8b000bd48fdb924e32041312 -F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 -F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 -F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 -F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c -F test/gencol1.test e89eafdf03245e2609ddf6e9b0add37a17ce229095836c409131764c3a5282a5 -F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98 -F test/having.test e4098a4b8962f9596035c3b87a8928a10648acc509f1bb8d6f96413bbf79a1b3 -F test/hexlit.test 4a6a5f46e3c65c4bf1fa06f5dd5a9507a5627751 -F test/hidden.test 23c1393a79e846d68fd902d72c85d5e5dcf98711 -F test/hook.test 1604b3b2f5931430087540404555c1b6be3618600b81558657c66b533ed70b13 -F test/hook2.test b9ff3b8c6519fb67f33192f1afe86e7782ee4ac8 -F test/icu.test 716a6b89fbabe5cc63e0cd4c260befb08fd7b9d761f04d43669233292f0753b1 -F test/ieee754.test 806fc0ce7f305f57e3331eaceeddcfec9339e607 -F test/imposter1.test c3f1db2d3db2c24611a6596a3fc0ffc14f1466c8 -F test/in.test ae4ba0fe3232fdd84ef1090a68c5cd6ccd93f1f8774d5c967dd0c1b301492eed -F test/in2.test 5d4c61d17493c832f7d2d32bef785119e87bde75 -F test/in3.test 3cbf58c87f4052cee3a58b37b6389777505aa0c0 -F test/in4.test 65460600d48933adba4283c6ebd089aae173d16136ab9d01f74c89089090c5a5 -F test/in5.test b32ce7f4a93f44c5dee94af16886d922cc16ebe33c8e1765c73d4049d0f4b40f -F test/in6.test 8562d0945195cab3cc4ab3794e9118e72cb44c43f785c2b04d48a9d06ca6b4ec -F test/incrblob.test c9b96afc292aeff43d6687bcb09b0280aa599822 -F test/incrblob2.test a494c9e848560039a23974b9119cfc2cf3ad3bd15cc2694ee6367ae537ef8f1f -F test/incrblob3.test d8d036fde015d4a159cd3cbae9d29003b37227a4 -F test/incrblob4.test 21a52a6843a56cdcce968c6a86b72a7066d0e6ba -F test/incrblob_err.test 89372a28f1d98254f03fed705f9efcd34ef61a674df16d2dbb4726944a2de5e9 -F test/incrblobfault.test 74dd8ac108304cea0b4a0df6df63a1567e558758 -F test/incrcorrupt.test 6c567fbf870aa9e91866fe52ce6f200cd548939a -F test/incrvacuum.test 2aaee202b1f230e55779f70d155f6ba67bbdff8481d650214d256ab0f97d4a2b -F test/incrvacuum2.test 7d26cfda66c7e55898d196de54ac4ec7d86a4e3d -F test/incrvacuum3.test 75256fb1377e7c39ef2de62bfc42bbff67be295a -F test/incrvacuum_ioerr.test 6ae2f783424e47a0033304808fe27789cf93e635 -F test/index.test a2e948ed949e575487b5c1d521767d4584ac42d352f2dcd8e48004638e7bc7dc -F test/index2.test f835d5e13ca163bd78c4459ca15fd2e4ed487407 -F test/index3.test 51685f39345462b84fcf77eb8537af847fdf438cc96b05c45d6aaca4e473ade0 -F test/index4.test ab92e736d5946840236cd61ac3191f91a7856bf6 -F test/index5.test 8621491915800ec274609e42e02a97d67e9b13e7 -F test/index6.test f172653b35b20233e59200e8b92a76db61bf7285437bf777b93b306ba26a47e7 -F test/index7.test b8a0ba2110fd517bb48c4e76d26d60f1ab2ed9e257b18d71f820d7e71e9f8570 -F test/index8.test bc2e3db70e8e62459aaa1bd7e4a9b39664f8f9d7 -F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7721 -F test/indexedby.test f54aac21c06948872010a956fd02de5178c362c7785a9887cf0b8616be17883b -F test/indexexpr1.test 284e119999d132cc8bf37735a928c9859b28e8e295d02b7a6a4f93977c7f9ba5 -F test/indexexpr2.test dba11dbb0a58fcba4cd694f46b4004976123b81b0501f525d43c9be59f0207b1 -F test/indexfault.test 98d78a8ff1f5335628b62f886a1cb7c7dac1ef6d48fa39c51ec871c87dce9811 -F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 -F test/insert.test 4e3f0de67aac3c5be1f4aaedbcea11638f1b5cdc9a3115be14d19aa9db7623c6 -F test/insert2.test 4d14b8f1b810a41995f6286b64a6943215d52208 -F test/insert3.test 1b7db95a03ad9c5013fdf7d6722b6cd66ee55e30 -F test/insert4.test fb9e0f752c75f453555990250b449f6d123ae6a3ebf054d14e4470de4498dce3 -F test/insert5.test 394f96728d1258f406fe5f5aeb0aaf29487c39a6 -F test/insertfault.test ac63d14ea3b49c573673a572f4014b9117383a03e497c58f308b5c776e4a7f74 -F test/instr.test 107df2b9b74a4b59315916b575590a08f2a714de0754abe541f10a0971d0a2a4 -F test/instrfault.test 95e28efade652e6d51ae11b377088fe523a581a07ec428009e152a4dd0e0f44c -F test/intarray.test bb976b0b3df0ebb6a2eddfb61768280440e672beba5460ed49679ea984ccf440 -F test/interrupt.test 16ea879ec728cb76414c148c5f24afd5d1f91054 -F test/interrupt2.test e4408ca770a6feafbadb0801e54a0dcd1a8d108d -F test/intpkey.test ac71107a49a06492b69b82aafaf225400598d3c8 -F test/intreal.test 2a87e85a5949bd55e41ef04c58f5800587c5380bdbc559ff1c79b614b0e6a533 -F test/io.test f95bca1783b01ea7761671560d023360d2dfa4cc -F test/ioerr.test 470fcc78e9cd352d162baf782fe301ea807d764241f58a48fc58109c2dfcdb6b -F test/ioerr2.test 2593563599e2cc6b6b4fcf5878b177bdd5d8df26 -F test/ioerr3.test d3cec5e1a11ad6d27527d0d38573fbff14c71bdd -F test/ioerr4.test f130fe9e71008577b342b8874d52984bd04ede2c -F test/ioerr5.test 2edfa4fb0f896f733071303b42224df8bedd9da4 -F test/ioerr6.test a395a6ab144b26a9e3e21059a1ab6a7149cca65b -F test/istrue.test 75327829744e65cc8700e69340b8e6c192e10e39dfae7ccb0e970d3c4f49090a -F test/join.test bca044589e94bb466e4c1e91fb6fecdc3f3326ca6b3f590f555f1958156eb321 -F test/join2.test 7d24d095ab88d3910228d53a3b548b7baf2e0e7d8aac6731a273e300e1b34b61 -F test/join3.test 6f0c774ff1ba0489e6c88a3e77b9d3528fb4fda0 -F test/join4.test 1a352e4e267114444c29266ce79e941af5885916 -F test/join5.test 3a96dc62f0b45402d7207e22d1993fe0c2fce1c57644a11439891dd62b990eb7 -F test/join6.test cfe6503791ceb0cbb509966740286ec423cbf10b -F test/journal1.test c7b768041b7f494471531e17abc2f4f5ebf9e5096984f43ed17c4eb80ba34497 -F test/journal2.test 9dac6b4ba0ca79c3b21446bbae993a462c2397c4 -F test/journal3.test 7c3cf23ffc77db06601c1fcfc9743de8441cb77db9d1aa931863d94f5ffa140e -F test/jrnlmode.test 9b5bc01dac22223cb60ec2d5f97acf568d73820794386de5634dcadbea9e1946 -F test/jrnlmode2.test 8759a1d4657c064637f8b079592651530db738419e1d649c6df7048cd724363d -F test/jrnlmode3.test 556b447a05be0e0963f4311e95ab1632b11c9eaa -F test/json101.test bb71538005f2d9e18620bdd3b76839a93ca0be61903eb8d751a64e78cf99b8fb -F test/json102.test eeb54efa221e50b74a2d6fb9259963b48d7414dca3ce2fdfdeed45cb28487bc1 -F test/json103.test aff6b7a4c17d5a20b487a7bc1a274bfdc63b829413bdfb83bedac42ec7f67e3b -F test/json104.test 317f4ec4b2d87afbba4d2460cf5be297aea76f2285eb618d276dbcd40a50950f -F test/json105.test 45f7d6a9a54c85f8a9589b68d3e7a1f42d02f2359911a8cdbad1f9988f571173 -F test/keyword1.test 37ef6bba5d2ed5b07ecdd6810571de2956599dff -F test/kvtest.c 94da54bb66aae7a54e47cf7e4ea4acecc0f217560f79ad3abfcc0361d6d557ba -F test/lastinsert.test 42e948fd6442f07d60acbd15d33fb86473e0ef63 -F test/laststmtchanges.test ae613f53819206b3222771828d024154d51db200 -F test/lemon-test01.y 58b764610fd934e189ffbb0bbfa33d171b9cb06019b55bdc04d090d6767e11d7 -F test/like.test 47b81d5de2ff19d996d49a65d50ec9754246aacbe0e950b48d186d9d8171eaf0 -F test/like2.test 3b2ee13149ba4a8a60b59756f4e5d345573852da -F test/like3.test 03d1bdf848483b78d2cfd1db283d75c4ec2e37c8b8eccc006813f3978d78fbbd -F test/limit.test 0c99a27a87b14c646a9d583c7c89fd06c352663e -F test/limit2.test 9409b033284642a859fafc95f29a5a6a557bd57c1f0d7c3f554bd64ed69df77e -F test/loadext.test faa4f6eed07a5aac35d57fdd7bc07f8fc82464cfd327567c10cf0ba3c86cde04 -F test/loadext2.test 0408380b57adca04004247179837a18e866a74f7 -F test/lock.test be4fe08118fb988fed741f429b7dd5d65e1c90db -F test/lock2.test 5242d8ac4e2d59c403aebff606af449b455aceff -F test/lock3.test f271375930711ae044080f4fe6d6eda930870d00 -F test/lock4.test 27143363eda1622f03c133efc8db808fc331afd973486cb571ea71cd717d37b8 -F test/lock5.test c6c5e0ebcb21c61a572870cc86c0cb9f14cede38 -F test/lock6.test ad5b387a3a8096afd3c68a55b9535056431b0cf5 -F test/lock7.test 49f1eaff1cdc491cc5dee3669f3c671d9f172431 -F test/lock_common.tcl 2f3f7f2e9637f93ccf609df48ef5b27a50278b6b1cd752b445d52262e5841413 -F test/lookaside.test 5a828e7256f1ee4da8e1bdaa03373a3ccdb0f1ff98dfa82e9b76cb41a45b1083 -F test/main.test 6bbb3999fd461eb8fb335cbab97409a3d7f91bbb8da60635e8be3e4a04a77772 -F test/make-where7.tcl 05c16b5d4f5d6512881dfec560cb793915932ef9 -F test/malloc.test 18dd1c4188c81ca79cf123527c71b19ee0c31feb9947fdffb0dc6ceb1436816a -F test/malloc3.test 6e88bae6312854a4adb4ecc2a6a5ea8c59b4db778b724ba718e1c43fc8c3c136 -F test/malloc4.test 957337613002b7058a85116493a262f679f3a261 -F test/malloc5.test 2e4ad7684a13389a44a840499cd47173a8d05f22f082d7d083eece433a7a64eb -F test/malloc6.test 2f039d9821927eacae43e1831f815e157659a151 -F test/malloc7.test 7c68a32942858bc715284856c5507446bba88c3a -F test/malloc8.test 9b7a3f8cb9cf0b12fff566e80a980b1767bd961d -F test/malloc9.test 2307c6ee3703b0a21391f3ea92388b4b73f9105e -F test/mallocA.test aea76f2dd8bcc2d19748f6b911e876cefda74a563753bf26af046e9d34bb97e6 -F test/mallocAll.test 98f1be74bc9f49a858bc4f361fc58e26486798be -F test/mallocB.test bc475ab850cda896142ab935bbfbc74c24e51ed6 -F test/mallocC.test 3dffe16532f109293ce1ccecd0c31dca55ef08c4 -F test/mallocD.test f78c295e8e18ea3029e65ca08278690e00c22100 -F test/mallocE.test db1ed69d7eded1b080952e2a7c37f364ad241b08 -F test/mallocF.test 2d5c590ebc2fc7f0dcebdf5aa8498b9aed69107e -F test/mallocG.test 0ff91b65c50bdaba680fb75d87fe4ad35bb7934f -F test/mallocH.test 79b65aed612c9b3ed2dcdaa727c85895fd1bfbdb -F test/mallocI.test 6c23a71df077fa5d387be90e7e669c5b368ca38a -F test/mallocJ.test b5d1839da331d96223e5f458856f8ffe1366f62e -F test/mallocK.test 1f4b5efbf61715ab79b20b38739ff4b3d110ceb53f54e5db6da1f01c083707ab -F test/mallocL.test fb311ff80afddf3b1a75e52289081f4754d901dc -F test/mallocM.test 78bbe9d3da84a5c679123cdb40d7b2010b18fc46e13897e4f253c6ba6fbff134 -F test/malloc_common.tcl aac62499b76be719fac31e7a3e54a7fd53272e7f -F test/malloctraceviewer.tcl b7a54595270c1d201abf1c3f3d461f27eaf24cdef623ad08a0fe5e411264c8a9 -F test/manydb.test 28385ae2087967aa05c38624cec7d96ec74feb3e -F test/mem5.test c6460fba403c5703141348cd90de1c294188c68f -F test/memdb.test c1f2a343ad14398d5d6debda6ea33e80d0dafcc7 -F test/memdb1.test 58d92c2bf622cc5f0f41461e1b35cf64f3f787199544c2c1dada37d88753f9d4 -F test/memleak.test 10b9c6c57e19fc68c32941495e9ba1c50123f6e2 -F test/memsubsys1.test 9e7555a22173b8f1c96c281ce289b338fcba2abe8b157f8798ca195bbf1d347e -F test/memsubsys2.test 3e4a8d0c05fd3e5fa92017c64666730a520c7e08 -F test/minmax.test 6751e87b409fe11b02e70a306d846fa544e25a41 -F test/minmax2.test 1edf66901ddfab26ae1e04165e8da834c8d3284e2b20aefb26b80ef217962eab -F test/minmax3.test cc1e8b010136db0d01a6f2a29ba5a9f321034354 -F test/minmax4.test 272ca395257f05937dc96441c9dde4bc9fbf116a8d4fa02baeb0d13d50e36c87 -F test/misc1.test 7ce84b25df9872e7d7878613a96815d2ba5bc974ac4e15a50118dde8f3917599 -F test/misc2.test 00d7de54eda90e237fc9a38b9e5ccc769ebf6d4d -F test/misc3.test cf3dda47d5dda3e53fc5804a100d3c82be736c9d -F test/misc4.test 10cd6addb2fa9093df4751a1b92b50440175dd5468a6ec84d0386e78f087db0e -F test/misc5.test c4aeaa0fa28faa08f2485309c38db4719e6cd1364215d5687a5b96d340a3fa58 -F test/misc6.test 953cc693924d88e6117aeba16f46f0bf5abede91 -F test/misc7.test 4f21954012e4eb0a923c54a311f38c81bf6798ccdd7b51584db46d4007f63daa -F test/misc8.test 8782708f4c8a459591c3e8fe1215bd2048bffb4024b3df249e9b9ed407dc61ed -F test/misuse.test 9e7f78402005e833af71dcab32d048003869eca5abcaccc985d4f8dc1d86bcc7 -F test/mjournal.test 28a08d5cb5fb5b5702a46e19176e45e964e0800d1f894677169e79f34030e152 -F test/mmap1.test fb04e0c10492455007624ade884ca0c8852ff3e4e11d95408f9709ca2ef7f626 -F test/mmap2.test 9d6dd9ddb4ad2379f29cc78f38ce1e63ed418022 -F test/mmap3.test b3c297e78e6a8520aafcc1a8f140535594c9086e -F test/mmap4.test 2e2b4e32555b58da15176e6fe750f17c9dcf7f93 -F test/mmapfault.test d4c9eff9cd8c2dc14bc43e71e042f175b0a26fe3 -F test/mmapwarm.test 2272005969cd17a910077bd5082f70bc1fefad9a875afec7fc9af483898ecaf3 -F test/multiplex.test dc0d67b66f84b484a83cb8bbdf3f0a7f49562ccd -F test/multiplex2.test 580ca5817c7edbe4cc68fa150609c9473393003a -F test/multiplex3.test d228f59eac91839a977eac19f21d053f03e4d101 -F test/multiplex4.test e8ae4c4bd70606a5727743241f13b5701990abe4 -F test/mutex1.test ea2cc74d97f077b9e74c84cbd024f14d79a8126f -F test/mutex2.test bfeaeac2e73095b2ac32285d2756e3a65e681660 -F test/nan.test 437d40e6d0778b050d7750726c0cbd2c9936b81962926e8f8c48ca698f00f4d1 -F test/nockpt.test 8c43b25af63b0bd620cf1b003529e37b6f1dc53bd22690e96a1bd73f78dde53a -F test/nolock.test f196cf8b8fbea4e2ca345140a2b3f3b0da45c76e -F test/normalize.test f23b6c5926c59548635fcf39678ac613e726121e073dd902a3062fbb83903b72 -F test/notify1.test 669b2b743618efdc18ca4b02f45423d5d2304abf -F test/notify2.test 2ecabaa1305083856b7c39cf32816b612740c161 -F test/notify3.test 10ff25cde502e72a92053a2f215d64bece4ef934 -F test/notnull.test a37b663d5bb728d66fc182016613fb8e4a0a4bbf3d75b8876a7527f7d4ed3f18 -F test/null.test 0dcce4f04284ec66108c503327ad6d224c0752b3 -F test/nulls1.test 82c5bc33148405f21205865abf13c786084438d573a4ac4e87e11b6091cde526 -F test/numcast.test 5d126f7f581432e86a90d1e35cac625164aec4a1 -F test/numindex1.test 20a5450d4b056e48cd5db30e659f13347a099823 -F test/offset1.test f06b83657bcf26f9ce805e67450e189e282143b2 -F test/openv2.test 0d3040974bf402e19b7df4b783e447289d7ab394 -F test/optfuzz-db01.c a0c256905c8ac79f9a5de2f374a3d9f757bef0dca2a238dc7c10cc8a38031834 -F test/optfuzz-db01.txt 21f6bdeadc701cf11528276e2a55c70bfcb846ba42df327f979bd9e7b6ce7041 -F test/optfuzz.c 50e330304eb1992e15ddd11f3daaad9bcc0d9aaad09cb2bcc77f9515df2e88b1 -F test/orderby1.test 6bf0ce45cbfb1cf4779dd418ac5e8cf66abfa04de2c1d2edf1e0e85f1520d8f3 -F test/orderby2.test bc11009f7cd99d96b1b11e57b199b00633eb5b04 -F test/orderby3.test 8619d06a3debdcd80a27c0fdea5c40b468854b99 -F test/orderby4.test 4d39bfbaaa3ae64d026ca2ff166353d2edca4ba4 -F test/orderby5.test bd7d9e3380e87e5dcf6ea817ebaab6d15da213c7804b38767e1b3e695e85650b -F test/orderby6.test 8b38138ab0972588240b3fca0985d2e400432859 -F test/orderby7.test 3d1383d52ade5b9eb3a173b3147fdd296f0202da -F test/orderby8.test 23ef1a5d72bd3adcc2f65561c654295d1b8047bd -F test/orderby9.test 87fb9548debcc2cd141c5299002dd94672fa76a3 -F test/orderbyA.test df608e59efc2ef50c1eddf1a773b272de3252e9401bfec86d04b52fd973866d5 -F test/oserror.test 1fc9746b83d778e70d115049747ba19c7fba154afce7cc165b09feb6ca6abbc5 -F test/ossfuzz.c 9636dad2092a05a32110df0ca06713038dd0c43dd89a77dabe4b8b0d71096715 -F test/ossshell.c f125c5bd16e537a2549aa579b328dd1c59905e7ab1338dfc210e755bb7b69f17 -F test/ovfl.test 199c482696defceacee8c8e0e0ef36da62726b2f -F test/pager1.test 1e9ee778bdeaf4f7f09997d029cdaca6a42dfc2092edafe4f5e590acbf1eab13 -F test/pager2.test 67b8f40ae98112bcdba1f2b2d03ea83266418c71 -F test/pager3.test 4e9a83d6ca0838d7c602c9eb93d1357562d9059c1e02ffb138a8271020838370 -F test/pager4.test a122e9e6925d5b23b31e3dfef8c6a44bbf19590e -F test/pagerfault.test 63c5da625562c66345ab4528790327ca63db2f6f9cbae2aba8cb7c51de3d1628 -F test/pagerfault2.test caf4c7facb914fd3b03a17b31ae2b180c8d6ca1f -F test/pagerfault3.test 1003fcda009bf48a8e22a516e193b6ef0dd1bbd8 -F test/pageropt.test 84e4cc5cbca285357f7906e99b21be4f2bf5abc0 -F test/pagesize.test 5769fc62d8c890a83a503f67d47508dfdc543305 -F test/parser1.test 6ccdf5e459a5dc4673d3273dc311a7e9742ca952dd0551a6a6320d27035ce4b3 -F test/pcache.test c8acbedd3b6fd0f9a7ca887a83b11d24a007972b -F test/pcache2.test af7f3deb1a819f77a6d0d81534e97d1cf62cd442 -F test/percentile.test 4243af26b8f3f4555abe166f723715a1f74c77ff -F test/permutations.test 94bfbc9d32449fb3ef7d31962f8cdcd57dc59490681db84bd72236d4af7b5815 -F test/pg_common.tcl 222a1bad1c41c308fa366313cd7b51b3be7e9b21c8736a421b974ac941693b54 -F test/pragma.test 59becdfd720b80d463ab750f69f7118fde10dfd556aa5d554f3bf6b7e5ea7533 -F test/pragma2.test e5d5c176360c321344249354c0c16aec46214c9f -F test/pragma3.test 92a46bbea12322dd94a404f49edcfbfc913a2c98115f0d030a7459bb4712ef31 -F test/pragma4.test 10c624e45a83c0096a82a7579a5ff658542391d3b77355192da6572c8c17c00b -F test/pragma5.test 7b33fc43e2e41abf17f35fb73f71b49671a380ea92a6c94b6ce530a25f8d9102 -F test/pragmafault.test 275edaf3161771d37de60e5c2b412627ac94cef11739236bec12ed1258b240f8 -F test/prefixes.test b524a1c44bffec225b9aec98bd728480352aa8532ac4c15771fb85e8beef65d9 -F test/printf.test 390d0d7fcffc3c4ea3c1bb4cbb267444e32b33b048ae21895f23a291844fe1da -F test/printf2.test 30b5dd0b4b992dc5626496846ecce17ff592cacbcb11c3e589f3ac4d7e129dae -F test/progress.test ebab27f670bd0d4eb9d20d49cef96e68141d92fb -F test/ptrchng.test ef1aa72d6cf35a2bbd0869a649b744e9d84977fc -F test/pushdown.test 5e72c51c5e33253ed639ccee1e01ce62d62b6eee5ca893cd82334e4ee7b1d7fc -F test/queryonly.test 5f653159e0f552f0552d43259890c1089391dcca -F test/quick.test 1681febc928d686362d50057c642f77a02c62e57 -F test/quota-glob.test 32901e9eed6705d68ca3faee2a06b73b57cb3c26 -F test/quota.test bfb269ce81ea52f593f9648316cd5013d766dd2a -F test/quota2.test 7dc12e08b11cbc4c16c9ba2aa2e040ea8d8ab4b8 -F test/quote.test 626149eda89ee64d81a3790de370f9f0211921b11568a49c28c861f394330508 -F test/randexpr1.tcl 40dec52119ed3a2b8b2a773bce24b63a3a746459 -F test/randexpr1.test eda062a97e60f9c38ae8d806b03b0ddf23d796df -F test/rbu.test 168573d353cd0fd10196b87b0caa322c144ef736 -F test/rdonly.test 64e2696c322e3538df0b1ed624e21f9a23ed9ff8 -F test/recover.test ccb8c2623902a92ebb76770edd075cb4f75a4760bb7afde38026572c6e79070d -F test/regexp1.test 497ea812f264d12b6198d6e50a76be4a1973a9d8 -F test/regexp2.test 40e894223b3d6672655481493f1be12012f2b33c -F test/reindex.test cd9d6021729910ece82267b4f5e1b5ac2911a7566c43b43c176a6a4732e2118d -F test/releasetest.tcl fb76d8fcc95ac29d6356cd9e52b726ab9e43a24082897618dfbcb7c2b0049153 x -F test/releasetest_data.tcl 9919fc6ac5bc92f8878fecfd1840db15999f660a6c9f609240b41aa62b885c88 -F test/resetdb.test 8062cf10a09d8c048f8de7711e94571c38b38168db0e5877ba7561789e5eeb2b -F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb -F test/rollback.test 06680159bc6746d0f26276e339e3ae2f951c64812468308838e0a3362d911eaa -F test/rollback2.test bc868d57899dc6972e2b4483faae0e03365a0556941474eec487ae21d8d38bb6 -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/rowvalue.test 8964f95b253d3b5cc8dc1cfd0cdb7529bce3ecc6b6259e23c5f829f80f4d51cd -F test/rowvalue2.test 060d238b7e5639a7c5630cb5e63e311b44efef2b -F test/rowvalue3.test 3068f508753af69884b12125995f023da0dbb256 -F test/rowvalue4.test 02e35f7762371c2f57ebd856aa056eac56cb27ef7715a0bb31eac1895a745356 -F test/rowvalue5.test c81c7d8cf36711ab37675ad7376084ae2a359cb6 -F test/rowvalue6.test d19b54feb604d5601f8614b15e214e0774c01087 -F test/rowvalue7.test c1cbdbf407029db01f87764097c6ac02a1c5a37efd2776eff32a9cdfdf6f2dba -F test/rowvalue8.test 5900eddad9e2c3c2e26f1a95f74aafc1232ee5e0 -F test/rowvalue9.test d8dd2c6ecac432dadaa79e41dc2434f007be1b6b -F test/rowvaluefault.test 7cd9ccc6c2fbdd881672984087aad0491bb75504 -F test/rowvaluevtab.test cd9747bb3f308086944c07968f547ad6b05022e698d80b9ffbdfe09ce0b8da6f -F test/rtree.test 0c8d9dd458d6824e59683c19ab2ffa9ef946f798 -F test/run-wordcount.sh 891e89c4c2d16e629cd45951d4ed899ad12afc09 -F test/savepoint.test 1f8a6b1aea9a0d05837adc463d4bf47bd9d0f1c842f1c2a9caccd639baf34bf9 -F test/savepoint2.test 9b8543940572a2f01a18298c3135ad0c9f4f67d7 -F test/savepoint4.test c8f8159ade6d2acd9128be61e1230f1c1edc6cc0 -F test/savepoint5.test 0735db177e0ebbaedc39812c8d065075d563c4fd -F test/savepoint6.test f41279c5e137139fa5c21485773332c7adb98cd7 -F test/savepoint7.test cde525ea3075283eb950cdcdefe23ead4f700daa -F test/savepointfault.test f044eac64b59f09746c7020ee261734de82bf9b2 -F test/scanstatus.test 874e35011779b07725a47dbf1dd6282b0ca04af7e028fb0b534ee544b571be42 -F test/schema.test 5dd11c96ba64744de955315d2e4f8992e447533690153b93377dffb2a5ef5431 -F test/schema2.test 906408621ea881fdb496d878b1822572a34e32c5 -F test/schema3.test 1bc1008e1f8cb5654b248c55f27249366eb7ed38 -F test/schema4.test 3b26c9fa916abb6dadf894137adcf41b7796f7b9 -F test/schema5.test 29699b4421f183c8f0e88bd28ce7d75d13ea653e -F test/schema6.test e4bd1f23d368695eb9e7b51ef6e02ca0642ea2ab4a52579959826b5e7dce1f9b -F test/schemafault.test 1936bceca55ac82c5efbcc9fc91a1933e45c8d1e1d106b9a7e56c972a5a2a51e -F test/securedel.test 2f70b2449186a1921bd01ec9da407fbfa98c3a7a5521854c300c194b2ff09384 -F test/securedel2.test 2d54c28e46eb1fd6902089958b20b1b056c6f1c5 -F test/select1.test 009a6d8eacd9684d046302b8d13b50846a87e39d6f08e92178aa13e95ea29a2d -F test/select2.test 352480e0e9c66eda9c3044e412abdf5be0215b56 -F test/select3.test ddd1bc6d0c8dece136321c11bd26d0d8ad17f2b27c72935fdd6574d8cb99d1d4 -F test/select4.test e8a2502e3623f3058871030599a48abb35789d2244d5b380ecf3696873fdd4a4 -F test/select5.test df9ec0d218cedceb4fe7b63262025b547b50a55e59148c6f40b60ca25f1d4546 -F test/select6.test 319d45e414cdd321bf17cfacedaf19e3935ad64dac357c53f1492338c6e9b801 -F test/select7.test f659f231489349e8c5734e610803d7654207318f -F test/select8.test 8c8f5ae43894c891efc5755ed905467d1d67ad5d -F test/select9.test aebc2bb0c3bc44606125033cbcaac2c8d1f33a95 -F test/selectA.test b8a590f6493cad5b0bb4dfe1709bf7dcda0b6c40bb4caf32d1e36a89eebc8fc5 -F test/selectB.test 954e4e49cf1f896d61794e440669e03a27ceea25 -F test/selectC.test e25243f8ca503e06f252eb0218976d07cfeceac3 -F test/selectD.test fc20452847a01775710090383cfb4423275d2f745fed61f34fbf37573ac0d214 -F test/selectE.test a8730ca330fcf40ace158f134f4fe0eb00c7edbf -F test/selectF.test 21c94e6438f76537b72532fa9fd4710cdd455fc3 -F test/selectG.test 089f7d3d7e6db91566f00b036cb353107a2cca6220eb1cb264085a836dae8840 -F test/server1.test c2b00864514a68a0e6fd518659dc95d0050307a357a08969872bef027d785dc4 -F test/session.test 78fa2365e93d3663a6e933f86e7afc395adf18be -F test/sessionfuzz-data1.db 1f8d5def831f19b1c74571037f0d53a588ea49a6c4ca2a028fc0c27ef896dbcb -F test/sessionfuzz.c be9c4d4afd359ce80024d8b541b9b8a880510aef5cf263df56fc0e9b947727f1 -F test/shared.test 1826673eb5eb745fb91a3bdac99a7737057742ae38dcb0fe076a384d6727578b -F test/shared2.test 03eb4a8d372e290107d34b6ce1809919a698e879 -F test/shared3.test ab693f9b6e156b8bfb2a0ad94f29fe69602a5d38 -F test/shared4.test c75f476804e76e26bf6fa0e7b421fb0ca7d07558 -F test/shared6.test 866bb4982c45ce216c61ded5e8fde4e7e2f3ffa9 -F test/shared7.test a81e99f83e6c51b02ac99c96fb3a2a7b5978c956 -F test/shared8.test 933ed7d71f598bb6c7a8c192a3cd30f2562fdccf514df383798599c34ffa672f -F test/shared9.test 5f2a8f79b4d6c7d107a01ffa1ed05ae7e6333e21 -F test/sharedA.test 49d87ec54ab640fbbc3786ee3c01de94aaa482a3a9f834ad3fe92770eb69e281 -F test/sharedB.test 16cc7178e20965d75278f410943109b77b2e645e -F test/shared_err.test 32634e404a3317eeb94abc7a099c556a346fdb8fb3858dbe222a4cbb8926a939 -F test/sharedlock.test 5ede3c37439067c43b0198f580fd374ebf15d304 -F test/shell1.test a1cf47c5e110560ff25a714570bfd53bfaceeb61db5cad3072a4064f17ebd10e -F test/shell2.test e242a9912f44f4c23c3d1d802a83e934e84c853b -F test/shell3.test ac8c2b744014c3e9a0e26bfd829ab65f00923dc1a91ffd044863e9423cc91494 -F test/shell4.test 1c6aef11daaa2d6830acaba3ac9cbec93fbc1c3d5530743a637f39b3987d08ce -F test/shell5.test 84a30b55722a95a5b72989e691c469a999ca7591e7aa00b7fabc783ea5c9a6fe -F test/shell6.test 1ceb51b2678c472ba6cf1e5da96679ce8347889fe2c3bf93a0e0fa73f00b00d3 -F test/shell7.test 115132f66d0463417f408562cc2cf534f6bbc6d83a6d50f0072a9eb171bae97f -F test/shell8.test 96be02ea0c21f05b24c1883d7b711a1fa8525a68ab7b636aacf6057876941013 -F test/shmlock.test 3dbf017d34ab0c60abe6a44e447d3552154bd0c87b41eaf5ceacd408dd13fda5 -F test/shortread1.test bb591ef20f0fd9ed26d0d12e80eee6d7ac8897a3 -F test/show_speedtest1_rtree.tcl 32e6c5f073d7426148a6936a0408f4b5b169aba5 -F test/shrink.test 1b4330b1fd9e818c04726d45cb28db73087535ce -F test/sidedelete.test f0ad71abe6233e3b153100f3b8d679b19a488329 -F test/skipscan1.test ed524bc86f27646b3a297f45d6557b55db338977b6838f8064b196b35848b31b -F test/skipscan2.test 3eb703ce794f139e7b83567911046298bcde29606116727f9b700ce34f559d2d -F test/skipscan3.test ec5bab3f81c7038b43450e7b3062e04a198bdbb5 -F test/skipscan5.test 67817a4b6857c47e0e33ba3e506da6f23ef68de2 -F test/skipscan6.test 0b4cd1b4ac9f84d91454df513c99a4932fa07e8f27b8049bea605068b3e34ac7 -F test/snapshot.test a504f2e7009f512ef66c719f0ea1c55a556bdaf1e1312c80a04d46fc1a3e9632 -F test/snapshot2.test 8d6ff5dd9cc503f6e12d408a30409c3f9c653507b24408d9cd7195931c89bc54 -F test/snapshot3.test 8744313270c55f6e18574283553d3c5c5fe4c5970585663613a0e75c151e599b -F test/snapshot4.test d4e9347ef2fcabc491fc893506c7bbaf334da3be111d6eb4f3a97cc623b78322 -F test/snapshot_fault.test f6c5ef7cb93bf92fbb4e864ecc5c87df7d3a250064838822db5b4d3a5563ede4 -F test/snapshot_up.test a0a29c4cf33475fcef07c3f8e64af795e24ab91b4cc68295863402a393cdd41c -F test/soak.test 18944cf21b94a7fe0df02016a6ee1e9632bc4e8d095a0cb49d95e15d5cca2d5c -F test/softheap1.test 843cd84db9891b2d01b9ab64cef3e9020f98d087 -F test/sort.test c2adc635c2564241fefec0b3a68391ef6868fd3b -F test/sort2.test cc23b7c19d684657559e8a55b02f7fcee03851d0 -F test/sort3.test 1480ed7c4c157682542224e05e3b75faf4a149e5 -F test/sort4.test 5c34d9623a4ae5921d956dfa2b70e77ed0fc6e5c -F test/sort5.test 6b43ae0e2169b5ceed441844492e55ba7f1ae0790528395ddf7888ab3094525d -F test/sorterref.test a13ed207a0eea3c7898f308f979bfb518f68c598ec737d2c494dfd3deaa83506 -F test/sortfault.test d4ccf606a0c77498e2beb542764fd9394acb4d66 -F test/speed1.test f2974a91d79f58507ada01864c0e323093065452 -F test/speed1p.explain d841e650a04728b39e6740296b852dccdca9b2cb -F test/speed1p.test b180e98609c7677382cf618c0ec9b69f789033a8 -F test/speed2.test 53177056baf6556dcbdcf032bbdfc41c1aa74ded -F test/speed3.test 694affeb9100526007436334cf7d08f3d74b85ef -F test/speed4.test abc0ad3399dcf9703abed2fff8705e4f8e416715 -F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa -F test/speed4p.test 377a0c48e5a92e0b11c1c5ebb1bc9d83a7312c922bc0cb05970ef5d6a96d1f0c -F test/speedtest1.c d564e7689a731f691adfe2cf3f3f735d3e11f100eebb065e2a0a267fdc39fb26 -F test/spellfix.test 951a6405d49d1a23d6b78027d3877b4a33eeb8221dcab5704b499755bb4f552e -F test/spellfix2.test dfc8f519a3fc204cb2dfa8b4f29821ae90f6f8c3 -F test/spellfix3.test 0f9efaaa502a0e0a09848028518a6fb096c8ad33 -F test/spellfix4.test 51c7c26514ade169855c66bcf130bd5acfb4d7fd090cc624645ab275ae6a41fb -F test/sqldiff1.test 28cd737cf1b0078b1ec1bbf425e674c47785835e -F test/sqllimits1.test 264f4b0f941800ba139d25e33ee919c5d95fea06dfbe8ac291d6811a30984ca5 -F test/sqllog.test 6af6cb0b09f4e44e1917e06ce85be7670302517a -F test/stat.test 423257dc36e5865fb9dd1d9051ac985763b6fba1daec134932f37772d5ed1e64 -F test/statfault.test f525a7bf633e50afd027700e9a486090684b1ac1 -F test/stmt.test 54ed2cc0764bf3e48a058331813c3dbd19fc1d0827c3d8369914a5d8f564ec75 -F test/stmtvtab1.test 6873dfb24f8e79cbb5b799b95c2e4349060eb7a3b811982749a84b359468e2d5 -F test/subjournal.test 8d4e2572c0ee9a15549f0d8e40863161295107e52f07a3e8012a2e1fdd093c49 -F test/subquery.test d7268d193dd33d5505df965399d3a594e76ae13f -F test/subquery2.test 90cf944b9de8204569cf656028391e4af1ccc8c0cc02d4ef38ee3be8de1ffb12 -F test/subselect.test 0966aa8e720224dbd6a5e769a3ec2a723e332303 -F test/substr.test 18f57c4ca8a598805c4d64e304c418734d843c1a -F test/subtype1.test 7fe09496352f97053af1437150751be2d0a0cae8 -F test/superlock.test ec94f0556b6488d97f71c79f9061ae08d9ab8f12 -F test/swarmvtab.test 9a3fd5ab3e9b3c976ad1b3d7646aab725114f2ac26b59395d0778b33bab6cdaf -F test/swarmvtab2.test c948cb2fdfc5b01d85e8f6d6504854202dc1a0782ab2a0ed61538f27cbd0aa5c -F test/swarmvtab3.test 247aa38b6ebd2b99db2075847ae47e789ac34f1c2ab5c720dfcffd990004c544 -F test/swarmvtabfault.test 8a67a9f27c61073a47990829e92bc0c64420a807cb642b15a25f6c788210ed95 -F test/symlink.test 72b22238d4405ba34df8e60b335d290a3b1129fd5c260835c944c1e4e77288a9 -F test/symlink2.test 9531f475a53d8781c4f81373f87faf2e2aff4f5fb2102ec6386e0c827916a670 -F test/sync.test 89539f4973c010eda5638407e71ca7fddbcd8e0594f4c9980229f804d4333092 -F test/sync2.test 8f9f7d4f6d5be8ca8941a8dadcc4299e558cb6a1ff653a9469146c7a76ef2039 -F test/syscall.test a39d9a36f852ae6e4800f861bc2f2e83f68bbc2112d9399931ecfadeabd2d69d -F test/sysfault.test c9f2b0d8d677558f74de750c75e12a5454719d04 -F test/tabfunc01.test 5ca6d004157a3e886a55a9387b960cc0db41acd88753eb597ff409ec6cfb1be0 -F test/table.test eb3463b7add9f16a5bb836badf118cf391b809d09fdccd1f79684600d07ec132 -F test/tableapi.test ecbcc29c4ab62c1912c3717c48ea5c5e59f7d64e4a91034e6148bd2b82f177f4 -F test/tableopts.test dba698ba97251017b7c80d738c198d39ab747930 -F test/tclsqlite.test 79a473f5797e317c08f2c4f8192edb3eea6a67329b1087453328b66a7cb31070 -F test/tempdb.test 4cdaa23ddd8acb4d79cbb1b68ccdfd09b0537aaba909ca69a876157c2a2cbd08 -F test/tempdb2.test 353864e96fd3ae2f70773d0ffbf8b1fe48589b02c2ec05013b540879410c3440 -F test/tempfault.test 0c0d349c9a99bf5f374655742577f8712c647900 -F test/temptable.test d2c9b87a54147161bcd1822e30c1d1cd891e5b30 -F test/temptable2.test d2940417496e2b9548e01d09990763fbe88c316504033256d51493e1f1a5ce6a -F test/temptable3.test d11a0974e52b347e45ee54ef1923c91ed91e4637 -F test/temptrigger.test 38f0ca479b1822d3117069e014daabcaacefffcc -F test/tester.tcl fd9d134a7cc4e31b307ad028a195f51cdcf556fc620d74b680515562f0137f25 -F test/thread001.test b61a29dd87cf669f5f6ac96124a7c97d71b0c80d9012746072055877055cf9ef -F test/thread002.test e630504f8a06c00bf8bbe68528774dd96aeb2e58 -F test/thread003.test ee4c9efc3b86a6a2767516a37bd64251272560a7 -F test/thread004.test f51dfc3936184aaf73ee85f315224baad272a87f -F test/thread005.test 50d10b5684399676174bd96c94ad4250b1a2c8b6 -F test/thread1.test df115faa10a4ba1d456e9d4d9ec165016903eae4 -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 38a612ea62854349ed66372f330a40d73c5cf956 -F test/threadtest4.c c1e67136ceb6c7ec8184e56ac61db28f96bd2925 -F test/time-wordcount.sh 8e0b0f8109367827ad5d58f5cc849705731e4b90 -F test/tkt-02a8e81d44.test 6c80d9c7514e2a42d4918bf87bf6bc54f379110c -F test/tkt-18458b1a.test 6a62cb1ee50fa3c620da59e3a6f531eb38fceaf7e2166203816b724524e6f1d6 -F test/tkt-26ff0c2d1e.test c15bec890c4d226c0da2f35ff30f9e84c169cfef90e73a8cb5cec11d723dfa96 -F test/tkt-2a5629202f.test 0521bd25658428baa26665aa53ffed9367d33af2 -F test/tkt-2d1a5c67d.test be1326f3061caec85085f4c9ee4490561ca037c0 -F test/tkt-2ea2425d34.test 1cf13e6f75d149b3209a0cb32927a82d3d79fb28 -F test/tkt-31338dca7e.test 6fb8807851964da0d24e942f2e19c7c705b9fb58 -F test/tkt-313723c356.test 4b306ad45c736cedf2f5221f6155b92143244b6d -F test/tkt-385a5b56b9.test 5204a7cba0e28c99df0acbf95af5e1af4d32965a7a14de6eccebf949607618b1 -F test/tkt-38cb5df375.test f3cc8671f1eb604d4ae9cf886ed4366bec656678 -F test/tkt-3998683a16.test 6d1d04d551ed1704eb3396ca87bb9ccc8c5c1eb7 -F test/tkt-3a77c9714e.test 90e3e8455ee945a4076d4c44062b8845708af24a880355328fe7008f2047c9f0 -F test/tkt-3fe897352e.test 27e26eb0f1811aeba4d65aba43a4c52e99da5e70 -F test/tkt-4a03edc4c8.test 91c0e135888cdc3d4eea82406a44b05c8c1648d0 -F test/tkt-4c86b126f2.test cbcc611becd0396890169ab23102dd70048bbc9a -F test/tkt-4dd95f6943.test 3d0ce415d2ee15d3d564121960016b9c7be79407 -F test/tkt-4ef7e3cfca.test 3965ae11cc9cf6e334f9d7d3c1e20bf8d56254b1 -F test/tkt-54844eea3f.test a12b851128f46a695e4e378cca67409b9b8f5894 -F test/tkt-5d863f876e.test 726e76d725f6fe0eb2fc8a522b721b79807380ee -F test/tkt-5e10420e8d.test 904d1687b3c06d43e5b3555bbcf6802e7c0ffd84 -F test/tkt-5ee23731f.test 9db6e1d7209dc0794948b260d6f82b2b1de83a9f -F test/tkt-6bfb98dfc0.test 24780633627b5cfc0635a5500c2389ebfb563336 -F test/tkt-752e1646fc.test ea78d88d14fe9866bdd991c634483334639e13bf -F test/tkt-78e04e52ea.test cb44d0f5e7940223be740a39913a1b9b9b30d7e4a17ed3349141f893bae1b8f2 -F test/tkt-7a31705a7e6.test 9e9c057b6a9497c8f7ba7b16871029414ccf6550e7345d9085d6d71c9a56bb6f -F test/tkt-7bbfb7d442.test 7b2cd79c7a17ae6750e75ec1a7846712a69c9d18 -F test/tkt-80ba201079.test 105a721e6aad0ae3c5946d7615d1e4d03f6145b8 -F test/tkt-80e031a00f.test 9ee36348b761bf7c14261e002b75a4c0d5a04d4c -F test/tkt-8454a207b9.test c583a9f814a82a2b5ba95207f55001c9f0cd816c -F test/tkt-868145d012.test a5f941107ece6a64410ca4755c6329b7eb57a356 -F test/tkt-8c63ff0ec.test 258b7fc8d7e4e1cb5362c7d65c143528b9c4cbed -F test/tkt-91e2e8ba6f.test 08c4f94ae07696b05c9b822da0b4e5337a2f54c5 -F test/tkt-94c04eaadb.test f738c57c7f68ab8be1c054415af7774617cb6223 -F test/tkt-9a8b09f8e6.test b2ef151d0984b2ebf237760dbeaa50724e5a0667 -F test/tkt-9d68c883.test 16f7cb96781ba579bc2e19bb14b4ad609d9774b6 -F test/tkt-9f2eb3abac.test cb6123ac695a08b4454c3792fbe85108f67fabf8 -F test/tkt-a7b7803e.test 159ef554234fa1f9fb318c751b284bd1cf858da4 -F test/tkt-a7debbe0.test e295fa83cd4416a8ca37b354eb5fadefc5e81fb55253db538d35261fe9c95067 -F test/tkt-a8a0d2996a.test 002e1cde8fc30c39611b52cf981c88200b858765748556822da72e0d32fac73e -F test/tkt-b1d3a2e531.test 8f7576e41ca179289ee1a8fee28386fd8e4b0550 -F test/tkt-b351d95f9.test d14a503c414c5c58fdde3e80f9a3cfef986498c0 -F test/tkt-b72787b1.test a95e8cdad0b98af1853ac7f0afd4ab27b77bf5f3 -F test/tkt-b75a9ca6b0.test ade89229d853a67a21bbd5e6e1e787a8f9d21f19908d1b7fca6bf3d4d5aa0767 -F test/tkt-ba7cbfaedc.test b4c0deccc12aeb55cfdb57935b16b5d67c5a9877 -F test/tkt-bd484a090c.test 60460bf946f79a79712b71f202eda501ca99b898 -F test/tkt-bdc6bbbb38.test fc38bb09bdd440e3513a1f5f98fc60a075182d7d -F test/tkt-c48d99d690.test ba61977d62ab612fc515b3c488a6fbd6464a2447 -F test/tkt-c694113d5.test 82c461924ada5c14866c47e85535b0b0923ba16a2e907e370061a5ca77f65d77 -F test/tkt-cbd054fa6b.test 708475ef4d730a6853512c8ce363bcbd3becf0e26826e1f4cd46e2f52ff38edf -F test/tkt-d11f09d36e.test d999b548fef885d1d1afa49a0e8544ecf436869d -F test/tkt-d635236375.test 9d37e988b47d87505bc9445be0ca447002df5d09 -F test/tkt-d82e3f3721.test bcc0dfba658d15bab30fd4a9320c9e35d214ce30 -F test/tkt-f3e5abed55.test d5a0126118142d13e27f6ce9f4c47096e9321c00 -F test/tkt-f67b41381a.test a23bc124c981662db712167bacd0ed8ad11abac9 -F test/tkt-f777251dc7a.test d1a8fc3eefb7a9e64d19ff24d5c8c94c34a632fb -F test/tkt-f7b4edec.test d998a08ff2b18b7f62edce8e3044317c45efe6c7 -F test/tkt-f973c7ac31.test 28ef85c7f015477916795246d8286aeda39d4ead -F test/tkt-fa7bf5ec.test 9102dfea58aa371d78969da735f9392c57e2e035 -F test/tkt-fc62af4523.test 72825d3febdedcd5593a27989fc05accdbfc2bb4 -F test/tkt-fc7bd6358f.test 634bb4af7d661e82d6b61b80c86727bad698e08f -F test/tkt1435.test f8c52c41de6e5ca02f1845f3a46e18e25cadac00 -F test/tkt1443.test bacc311da5c96a227bf8c167e77a30c99f8e8368 -F test/tkt1444.test a9d72f9e942708bd82dde6c707da61c489e213e9 -F test/tkt1449.test 93584a449752d52b07d2cfc280a69842b6e16ed5 -F test/tkt1473.test 9d000af3e11a4450d4c596f5e58b4b0d24eb0f8b -F test/tkt1501.test 2064f98e00871848af4b2f517e46c1a7fb2e32db -F test/tkt1512.test a1df1f66caf0b9122d6220c15dcee230298c2c2f -F test/tkt1514.test ddef38e34fea72eb1ab935ded9f17a3fb71dd9df -F test/tkt1536.test 83ff7a7b6e248016f8d682d4f7a4ae114070d466 -F test/tkt1537.test e3a14332de9770be8ff14bd15c19a49cbec10808 -F test/tkt1567.test 52f329386ac77e59260d4af1c58490d61377db20 -F test/tkt1644.test 80b6a2bb17885f3cf1cb886d97cdad13232bb869 -F test/tkt1667.test 4700d931ed19ea3983e8e703becb28079250b460 -F test/tkt1873.test 0e1b8c023050a430c2525179ed4022ddc7c31264 -F test/tkt2141.test f543d96f50d5a5dc0bc744f7db74ea166720ce46 -F test/tkt2192.test ff40157e5f42e65f844255d220fc6b290470942f -F test/tkt2213.test a9702175601a57b61aba095a233b001d6f362474 -F test/tkt2251.test 5aab8c7898cd2df2a68fe19289cc29e8f5cf8c82 -F test/tkt2285.test cca17be61cf600b397188e77e7143844d2b977e9 -F test/tkt2332.test fc955609b958ca86dfa102832243370a0cc84070 -F test/tkt2339.test 73bd17818924cd2ac442e5fd9916b58565739450 -F test/tkt2391.test ab7a11be7402da8b51a5be603425367aa0684567 -F test/tkt2409.test be0d60e7d283f639dccea4b0b5e1cd3a4851fb5b -F test/tkt2450.test 77ed94863f2049c1420288ddfea2d41e5e0971d6 -F test/tkt2565.test 8be666e927cb207aae88188f31c331870878b650 -F test/tkt2640.test 28134f5d1e05658ef182520cf0b680fa3de5211b -F test/tkt2643.test 3f3ebb743da00d4fed4fcf6daed92a0e18e57813 -F test/tkt2686.test 6ee01c9b9e9c48f6d3a1fdd553b1cc4258f903d6 -F test/tkt2767.test 569000d842678f9cf2db7e0d1b27cbc9011381b0 -F test/tkt2817.test f31839e01f4243cff7399ef654d3af3558cb8d8d -F test/tkt2820.test 39940276b3436d125deb7d8ebeee053e4cf13213 -F test/tkt2822.test f391776423a7c0d0949edfce375708bfb0f3141e -F test/tkt2832.test a9b0b74a02dca166a04d9e37739c414b10929caa -F test/tkt2854.test e432965db29e27e16f539b2ba7f502eb2ccc49af -F test/tkt2920.test a8737380e4ae6424e00c0273dc12775704efbebf -F test/tkt2927.test 4752868b9eeeb07a217f7f19f4cbaac98d6d086d -F test/tkt2942.test c5c87d179799ca6d1fbe83c815510b87cd5ec7ce -F test/tkt3080.test 1bca7579260920a66b4dd7e196e807c0f25ff804 -F test/tkt3093.test fbdbc5b4969244ad11f540759003e361fcaf391f -F test/tkt3121.test 536df66a02838c26a12fe98639354ca1290ca68b -F test/tkt3201.test f1500ccecc0d578dc4cde7d3242008297c4d59b3 -F test/tkt3292.test 7bad4423cf5eb075dbb58511d66d46fe816744754c9f0050ae60157f71a4fca7 -F test/tkt3298.test 20fd8773b825cb602e033aa04f8602e1ebdcd93c -F test/tkt3334.test 9756631e3c4aa3c416362c279e3c0953a83b7ca8274cb81a13264bb56296d8b0 -F test/tkt3346.test 6f67c3ed7db94dfc5df4f5f0b63809a1f611e01a -F test/tkt3357.test 77c37c6482b526fe89941ce951c22d011f5922ed -F test/tkt3419.test 1bbf36d7ea03b638c15804251287c2391f5c1f6b -F test/tkt3424.test 61f831bd2b071bd128fa5d00fbda57e656ca5812 -F test/tkt3442.test a1fc47c669e651d16494de3ff349bcb53281456f2ca02c8bc14220b6044bbfe8 -F test/tkt3457.test 5651e2cbb94645b677ec663160b9e192b87b7d365aecdfb24e19f749575a6fc2 -F test/tkt3461.test 228ea328a5a21e8663f80ee3d212a6ad92549a19 -F test/tkt3493.test 1686cbde85f8721fc1bdc0ee72f2ef2f63139218 -F test/tkt3508.test d75704db9501625c7f7deec119fcaf1696aefb7d -F test/tkt3522.test 22ce2ebbcb04a6be56c0977d405c207967318fd6 -F test/tkt3527.test 1a6a48441b560bdc53aec581a868eb576234874d -F test/tkt3541.test 5dc257bde9bc833ab9cc6844bf170b998dbb950a -F test/tkt3554.test f599967f279077bace39220cbe76085c7b423725 -F test/tkt3581.test 1966b7193f1e3f14951cce8c66907ae69454e9a3 -F test/tkt35xx.test f38c1b03713179d414969187c941466e44945b35 -F test/tkt3630.test 9a934c58c259f89a0ae6bb6bb846c56285a6fd0f -F test/tkt3718.test 3b59dcb5c4e7754dacd91e7fd353a61492cc402a -F test/tkt3731.test 0c5f4cbffe102d43c3b2188af91a9e36348f974b -F test/tkt3757.test 10cd679a88675c880533083fc79ac04324525595 -F test/tkt3761.test b95ea9c98f21cf91325f18a984887e62caceab33 -F test/tkt3762.test 4d439ff7abdc8d9323150269d182c37c2d514576 -F test/tkt3773.test 7bca904d2a647a6a4a291bd86d7fd7c73855b789 -F test/tkt3791.test a6624b9a80b216a26cf473607f42f3e51898c267 -F test/tkt3793.test d90ffd75c52413908d15e1c44fc2ea9c80fcc449 -F test/tkt3810.test 09608d81c63a6ff3aaf7bc70717909c51f5f4048 -F test/tkt3824.test 150aa00bb6220672e5f0eb14dc8eaa36750425f0 -F test/tkt3832.test 2300d10d57562b89875b72148338ac3e14f8847d -F test/tkt3838.test 292e72489101cd1320d7278dc111c173ebf334d4 -F test/tkt3841.test 4659845bc53f809a5932c61c6ce8c5bb9d6b947f -F test/tkt3871.test d921703d07c68f4fd5312073215a17fa34b0401d -F test/tkt3879.test 2ad5bef2c87e9991ce941e054c31abe26ef7fb90 -F test/tkt3911.test 74cd324f3ba653040cc6d94cc4857b290d12d633 -F test/tkt3918.test ea78bf164e4d55cbde0d83c671ef6fbe930a0032 -F test/tkt3922.test f26be40ab4fe6c00795629bd2006d96e270d9b1a -F test/tkt3929.test cdf67acf5aa936ec4ffead81db87f8a71fe40e59 -F test/tkt3935.test e15261fedb9e30a4305a311da614a5d8e693c767 -F test/tkt3992.test f3e7d548ac26f763b47bc0f750da3d03c81071da -F test/tkt3997.test a335fa41ca3985660a139df7b734a26ef53284bd -F test/tkt4018.test 18dbc6617f7a4b90e938d1bd6d26ad18daafaf08 -F test/tokenize.test ce430a7aed48fc98301611429595883fdfcab5d7 -F test/tpch01.test 7c4eb8cdd79c568f46d344b3e789c9fdb8a766d112871352704861f3fca32a2a -F test/trace.test a659a9862957f4789e37a92b3bf6d2caf5c86b02cdeefc41e850ae53acf6992a -F test/trace2.test f5cb67ad3bc09e0c58e8cca78dfd0b5639259983 -F test/trace3.test 1dff966888773ff1bfea01c080caf15417892b3f998408fe920c4791f7337144 -F test/trans.test 6e1b4c6a42dba31bd65f8fa5e61a2708e08ddde6 -F test/trans2.test 62bd045bfc7a1c14c5ba83ba64d21ade31583f76 -F test/trans3.test 91a100e5412b488e22a655fe423a14c26403ab94 -F test/transitive1.test 293300f46916569f08875cdb2fe2134be2c27677 -F test/trigger1.test d30cd09ae8ac365a088f09daba583cc5c0b8fc7d4e1d70809d0b4be3bf6ae2ab -F test/trigger2.test d15da46f7012832faf3e0c536b47024409d5fb1722d2bb77e29c06d96d704bb1 -F test/trigger3.test aa640bb2bbb03edd5ff69c055117ea088f121945 -F test/trigger4.test 74700b76ebf3947b2f7a92405141eb2cf2a5d359 -F test/trigger5.test 619391a3e9fc194081d22cefd830d811e7badf83 -F test/trigger6.test 0e411654f122552da6590f0b4e6f781048a4a9b9 -F test/trigger7.test e7ce54bfda67a88d778aea42544e151c465547a7e617127b6914c2221a6d53c1 -F test/trigger8.test 30cb0530bd7c4728055420e3f739aa00412eafa4 -F test/trigger9.test 2226ec795a33b0460ab5cf8891e9054cc7edef41 -F test/triggerA.test 837be862d8721f903dba3f3ceff05b32e0bee5214cf6ea3da5fadf12d3650e9d -F test/triggerB.test 56780c031b454abac2340dbb3b71ac5c56c3d7fe -F test/triggerC.test 29f5a28d0fe39e6e2c01f6e1f53f08c0955170ae10a63ad023e33cb0a1682a51 -F test/triggerD.test 8e7f3921a92a5797d472732108109e44575fa650 -F test/triggerE.test ede2e4bce4ba802337bd69d39447fa04a938e06d84a8bfc53c76850fc36ed86d -F test/triggerF.test 5d76f0a8c428ff87a4d5ed52da06f6096a2c787a1e21b846111dfac4123de3ad -F test/triggerG.test 2b816093c91ba73c733cfa8aedcc210ad819d72a98b1da30768a3c56505233e9 -F test/trustschema1.test 4e970aef0bfe0cee139703cc7209d0e0f07725d999b180ba50770f49edef1494 -F test/tt3_checkpoint.c 9e75cf7c1c364f52e1c47fd0f14c4340a9db0fe1 -F test/tt3_index.c 39eec10a35f57672225be4d182862152896dee4a -F test/tt3_lookaside1.c 0377e202c3c2a50d688cb65ba203afeda6fafeb9 -F test/tt3_stress.c c57d804716165811d979d4a719e05baccd79277f -F test/tt3_vacuum.c 1753f45917699c9c1f66b64c717a717c9379f776 -F test/types.test bf816ce73c7dfcfe26b700c19f97ef4050d194ff -F test/types2.test 1aeb81976841a91eef292723649b5c4fe3bc3cac -F test/types3.test 99e009491a54f4dc02c06bdbc0c5eea56ae3e25a -F test/unionvtab.test e1704ab1b4c1bb3ffc9da4681f8e85a0b909fd80b937984fc94b27415ac8e5a4 -F test/unionvtabfault.test e8759f3d14fb938ce9657e2342db34aeac0fb9bc1692b0d1ebb0069630151d06 -F test/unique.test 93f8b2ef5ea51b9495f8d6493429b1fd0f465264 -F test/unique2.test 3674e9f2a3f1fbbfd4772ac74b7a97090d0f77d2 -F test/unixexcl.test d936ba2b06794018e136418addd59a2354eeae97 -F test/unordered.test ffeea7747d5ba962a8009a20b7e53d68cbae05b063604c68702c5998eb50c981 -F test/update.test e906ca7cb1dc6f52af1ea243e08f727edfa79f924c2691f2f9e72481f847310d -F test/update2.test 67455bc61fcbcf96923c45b3bc4f87bc72be7d67575ad35f134906148c7b06d3 -F test/upsert1.test 88f9e258c6a0eeeb85937b08831e8daad440ba41f125af48439e9d33f266fb18 -F test/upsert2.test 9c3cdbb1a890227f6504ce4b0e3de68f4cdfa16bb21d8641208a9239896c5a09 -F test/upsert3.test 88d7d590a1948a9cb6eac1b54b0642f67a9f35a1fc0f19b200e97d5d39e3179c -F test/upsert4.test 25d2a1da92f149331ae0c51ca6e3eee78189577585eab92de149900d62994fa5 -F test/upsertfault.test f21ca47740841fdb4d61acfa7b17646d773e67724fe8c185b71c018db8a94b35 -F test/uri.test 3481026f00ade6dfe8adb7acb6e1e47b04369568 -F test/uri2.test 9d3ba7a53ee167572d53a298ee4a5d38ec4a8fb7 -F test/userauth01.test e740a2697a7b40d7c5003a7d7edaee16acd349a9 -F test/utf16align.test 54cd35a27c005a9b6e7815d887718780b6a462ae -F test/vacuum-into.test 48f4cec354fb6f27c98ef58d2fe49a11b71ff131af0cd9140efacc9858b9f670 -F test/vacuum.test ce91c39f7f91a4273bf620efad21086b5aa6ef1d -F test/vacuum2.test aa048abee196c16c9ba308465494009057b79f9b -F test/vacuum3.test 77ecdd54592b45a0bcb133339f99f1ae0ae94d0d -F test/vacuum4.test 7ea76b769fffeb41f925303b04cbcf5a5bbeabe55e4c60ae754ff24eeeb7c010 -F test/vacuum5.test 263b144d537e92ad8e9ca8a73cc6e1583f41cfd0dda9432b87f7806174a2f48c -F test/vacuummem.test 7b42abb3208bd82dd23a7536588396f295a314f2 -F test/varint.test bbce22cda8fc4d135bcc2b589574be8410614e62 -F test/veryquick.test 57ab846bacf7b90cf4e9a672721ea5c5b669b661 -F test/view.test 10ea54300a097d7c0337fd104abffe4a4786d1598b94017a37efe0e0d3e04dd5 -F test/vtab1.test c5d9e90ed02bcacd776dcbb7360199d290f7f53c26b484ddece543060c54319f -F test/vtab2.test 14d4ab26cee13ba6cf5c5601b158e4f57552d3b055cdd9406cf7f711e9c84082 -F test/vtab3.test b45f47d20f225ccc9c28dc915d92740c2dee311e -F test/vtab4.test 8e73ed268f3d596bc3590f45fc948fb40f28e9c3 -F test/vtab5.test 889f444970393c73f1e077e2bdc5d845e157a391 -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/vtabB.test 04df5dc531b9f44d9ca65b9c1b79f12b5922a796 -F test/vtabC.test 4528f459a13136f982e75614d120aef165f17292 -F test/vtabD.test 05b3f1d77117271671089e48719524b676842e96 -F test/vtabE.test 2a143fe75a11275781d1fd1988d86b66a3f69cb98f4add62e3da8fd0f637b45f -F test/vtabF.test 1918844c7c902f6a16c8dacf1ec8f84886d6e78b -F test/vtabH.test 2efb5a24b0bb50796b21eca23032cfb77abfa4b0c03938e38ce5897abac404ca -F test/vtabI.test 751b07636700dbdea328e4265b6077ccd6811a3f -F test/vtabJ.test d7b73675708cf63cfcb9d443bb451fc01a028347275b7311e51f9fdf3ca6757f -F test/vtab_alter.test 736e66fb5ec7b4fee58229aa3ada2f27ec58bc58c00edae4836890c3784c6783 -F test/vtab_err.test dcc8b7b9cb67522b3fe7a272c73856829dae4ab7fdb30399aea1b6981bda2b65 -F test/vtab_shared.test 5253bff2355a9a3f014c15337da7e177ab0ef8ad -F test/vtabdrop.test 65d4cf6722972e5499bdaf0c0d70ee3b8133944a4e4bc31862563f32a7edca12 -F test/wal.test 16180bc4becda176428ad02eaea437b4b8f5ae099314de443a4e12b2dcc007a2 -F test/wal2.test 537f59e5c5932e3b45bf3591ae3e48a2601360c2e52821b633e222fe6ebd5b09 -F test/wal3.test 2a93004bc0fb2b5c29888964024695bade278ab2 -F test/wal4.test 4744e155cd6299c6bd99d3eab1c82f77db9cdb3c -F test/wal5.test 9c11da7aeccd83a46d79a556ad11a18d3cb15aa9 -F test/wal6.test b602704e4b066199bc89d91ca9000f335dcf4572 -F test/wal64k.test 2a525c0f45d709bae3765c71045ccec5df7d100ccbd3a7860fdba46c9addb965 -F test/wal7.test 2ae8f427d240099cc4b2dfef63cff44e2a68a1bd -F test/wal8.test d9df3fba4caad5854ed69ed673c68482514203c8 -F test/wal9.test 378e76a9ad09cd9bee06c172ad3547b0129a6750 -F test/wal_common.tcl a98f17fba96206122eff624db0ab13ec377be4fe -F test/walbak.test 018d4e5a3d45c6298d11b99f09a8ef6876527946 -F test/walbig.test f437473a16cfb314867c6b5d1dbcd519e73e3434 -F test/walblock.test be48f3a75eff0b4456209f26b3ce186c2015497d -F test/walcksum.test bb234a1bb42248b3515d992b719708015c384278 -F test/walcrash.test 21038858cc552077b0522f50b0fa87e38139306a -F test/walcrash2.test a0edab4e5390f03b99a790de89aad15d6ec70b36 -F test/walcrash3.test e426aa58122d20f2b9fbe9a507f9eb8cab85b8af -F test/walcrash4.test e7b6e7639a950a0cca8e210e248c8dad4d63bf20 -F test/walfault.test 09b8ad7e52d2f54bce50e31aa7ea51412bb9f70ac13c74e669ddcd8b48b0d98d -F test/walfault2.test e039ac66c78d5561683cacde04097213cdad3b58e2b3f3fe1112862217bfd915 -F test/walhook.test ed00a40ba7255da22d6b66433ab61fab16a63483 -F test/walmode.test cd6e7cff618eaaa5910ce57c3657aa50110397f86213886a2400afb9bfec7b7b -F test/walnoshm.test 84ca10c544632a756467336b7c3b864d493ee496 -F test/waloverwrite.test dad2f26567f1b45174e54fbf9a8dc1cb876a7f03 -F test/walpersist.test 8c6b7e3ec1ba91b5e4dc4e0921d6d3f87cd356a6 -F test/walprotocol.test a112aba0b79e3adeaa485fed09484b32c654e97df58e454aa8489ac2cd57bf84 -F test/walprotocol2.test 7d3b6b4bf0b12f8007121b1e6ef714bc99101fb3b48e46371df1db868eebc131 -F test/walro.test cb438d05ba0d191f10b688e39c4f0cd5b71569a1d1f4440e5bdf3c6880e08c20 -F test/walro2.test 0e79dd15cbdb4f482c01ea248373669c732414a726b357d04846a816afafb768 -F test/walrofault.test c70cb6e308c443867701856cce92ad8288cd99488fa52afab77cca6cfd51af68 -F test/walsetlk.test 11f7fe792fdce54cf09874dab824e0627f2eedecfb9f7983e325606ec5184e0c -F test/walshared.test 0befc811dcf0b287efae21612304d15576e35417 -F test/walslow.test c05c68d4dc2700a982f89133ce103a1a84cc285f -F test/walthread.test 14b20fcfa6ae152f5d8e12f5dc8a8a724b7ef189f5d8ef1e2ceab79f2af51747 -F test/walvfs.test ca81c9f427e0e5434076dfa948fd1d8e6d5ddd192b2fb6991635d81da5f3f5d4 -F test/wapp.tcl b440cd8cf57953d3a49e7ee81e6a18f18efdaf113b69f7d8482b0710a64566ec -F test/wapptest.tcl 3cca775aede0591756a1fc0da55bbb3715d8c363873fd2cfdd4d555b0a4af57d x -F test/where.test 19c709c9f0f6ed12c23f909f6592aa55fba34269d5a2898537aa27a22b9ce650 -F test/where2.test 478d2170637b9211f593120648858593bf2445a1 -F test/where3.test 2341a294e17193a6b1699ea7f192124a5286ca6acfcc3f4b06d16c931fbcda2c -F test/where4.test 4a371bfcc607f41d233701bdec33ac2972908ba8 -F test/where5.test fdf66f96d29a064b63eb543e28da4dfdccd81ad2 -F test/where6.test 5da5a98cec820d488e82708301b96cb8c18a258b -F test/where7.test 75722434c486ac9e74718caa6cce234f45ba34c0b6c0f9555b29eb8bb5f6ade1 -F test/where8.test 461ca40265ed996a6305da99bb024b0e41602bb586acf544c08f95922358e49f -F test/where9.test 8e3e0ff42cc17156f52361a1c012281550d0d632912fec92d1d6df74db7a8e6d -F test/whereA.test 6c6a420ca7d313242f9b1bd471dc80e4d0f8323700ba9c78df0bb843d4daa3b4 -F test/whereB.test 0def95db3bdec220a731c7e4bec5930327c1d8c5 -F test/whereC.test cae295158703cb3fc23bf1a108a9ab730efff0f6 -F test/whereD.test c1c335e914e28b122e000e9310f02d2be83e1c9dbca2e29f46bd732703944d1b -F test/whereE.test b3a055eef928c992b0a33198a7b8dc10eea5ad2f -F test/whereF.test 3d9412b1199d3e2bed34fcb76b4c48d0bf4df95d27e3f8dd27b6f8b4716d0d89 -F test/whereG.test c9378b285828754377ef47fbece7264018c0a3743e7eb686e89917bb9df10885 -F test/whereH.test e4b07f7a3c2f5d31195cd33710054c78667573b2 -F test/whereI.test a2874062140ed4aba9ffae76e6190a3df6fc73d1373fdfa8fd632945082a5364 -F test/whereJ.test 88287550f6ee604422403b053455b1ad894eeaa5c35d348532dfa1439286cb9a -F test/whereK.test f8e3cf26a8513ecc7f514f54df9f0572c046c42b -F test/whereL.test e05cedc9389c6f09ad55bd5999a3fddccebec90672fb989433c145dcdaf26996 -F test/wherefault.test 1374c3aa198388925246475f84ad4cd5f9528864 -F test/wherelfault.test 9012e4ef5259058b771606616bd007af5d154e64cc25fa9fd4170f6411db44e3 -F test/wherelimit.test 592081800806d297dd7449b1030c863d2883d6d42901837ccd2e5a9bd962edb0 -F test/wherelimit2.test 9bf0aa56cca40ea0e4c5e2915341355a2bbc0859ec4ce1589197fe2a9d94635f -F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2aeee74 -F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 -F test/win32longpath.test 4baffc3acb2e5188a5e3a895b2b543ed09e62f7c72d713c1feebf76222fe9976 -F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test 486f0e01310fc7d98e626cdcb3806582c17cb0afaf1f3ec0f58ba8619c38f5ae -F test/window2.tcl 492c125fa550cda1dd3555768a2303b3effbeceee215293adf8871efc25f1476 -F test/window2.test e466a88bd626d66edc3d352d7d7e1d5531e0079b549ba44efb029d1fbff9fd3c -F test/window3.tcl acea6e86a4324a210fd608d06741010ca83ded9fde438341cb978c49928faf03 -F test/window3.test e9959a993c8a71e96433be8daaa1827d78b8921e4f12debd7bdbeb3c856ef3cb -F test/window4.tcl 6f85307eb67242b654d051f7da32a996a66aee039a09c5ae358541aa61720742 -F test/window4.test fbead87f681400ac07ef3555e0488b544a47d35491f8bf09a7474b6f76ce9b4e -F test/window5.test d328dd18221217c49c144181975eea17339eaeaf0e9aa558cee3afb84652821e -F test/window6.test f8d674254b23289cc17c84d79dec7eda7caa1dfb7836c43122cfdf3640d1df32 -F test/window7.tcl 6a1210f05d40ec89c22960213a22cd3f98d4e2f2eb20646c83c8c30d4d76108f -F test/window7.test 1d31276961ae7801edc72173edaf7593e3cbc79c06d1f1f09e20d8418af403cd -F test/window8.tcl f2711aa3571e4e6b0dad98db8d95fd6cb8d9db0c92bbdf535f153b07606a1ce2 -F test/window8.test c4331b27a6f66d69fa8f8bab10cc731db1a81d293ae108a68f7c3487fa94e65b -F test/window9.test 4d8c875b73febdbac9b8f2b52ec132b98f48261cdafd6b08db62bc6d8ff913fc -F test/windowA.test 6d63dc1260daa17141a55007600581778523a8b420629f1282d2acfc36af23be -F test/windowB.test 7a983ea1cc1cf72be7f378e4b32f6cb2d73014c5cd8b25aaee825164cd4269e5 -F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387019e0 -F test/windowerr.test a8b752402109c15aa1c5efe1b93ccb0ce1ef84fa964ae1cd6684dd0b3cc1819b -F test/windowfault.test 72375ae71031eabf96bc88d0af128c8628a091ddc99b5a394e848b3df5fc17ad -F test/with1.test 584580a5ae79868a91873863f8cb2d00040006dc1e4c332ef1d8642f2815dc6e -F test/with2.test e0030e2f0267a910d6c0e4f46f2dfe941c1cc0d4f659ba69b3597728e7e8f1ab -F test/with3.test 13b3336739da648a9e4dfa11bb04e73a920c97620041007c5f75d5d14084c346 -F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f198205 -F test/withM.test 693b61765f2b387b5e3e24a4536e2e82de15ff64 -F test/without_rowid1.test 9cfb83705c506e3849fa7efc88a3c9a15f9a50bf9b1516b41757a7cef9bba8c3 -F test/without_rowid2.test af260339f79d13cb220288b67cd287fbcf81ad99 -F test/without_rowid3.test f8e6b9f7cb32a3570bab743dd4f28d2000e2107808d57585e776f5c3eb076241 -F test/without_rowid4.test 4e08bcbaee0399f35d58b5581881e7a6243d458a -F test/without_rowid5.test 89b1c587bd92a0590e440da33e7666bf4891572a -F test/without_rowid6.test 8463b20098e9f75a501a9f17dfb42fffc79068eac0b2775fe56ef2281d2df45e -F test/without_rowid7.test d7c59a93d726b55812d620f8f284e01904a5b85f9ee9eea8f2f68571a5e8c40e -F test/wordcount.c d721a4b6fae93e6e33449700bce1686bc23257c27425bc3ef1599dc912adec66 -F test/writecrash.test f1da7f7adfe8d7f09ea79b42e5ca6dcc41102f27f8e334ad71539501ddd910cc -F test/zeroblob.test 07a5b11ab591d1f26c626945fb7f228f68b993533b2ada77273edf6ee29db174 -F test/zerodamage.test 9c41628db7e8d9e8a0181e59ea5f189df311a9f6ce99cc376dc461f66db6f8dc -F test/zipfile.test 429cb81c518487fa1b644b6b04b6e9af704a4fa767bd1a110204c5f03b2e8616 -F test/zipfile2.test 9903388a602a3834189857a985106ff95c3bba6a3969e0134127df991889db5d -F test/zipfilefault.test 44d4d7a7f7cca7521d569d7f71026b241d65a6b1757aa409c1a168827edbbc2c -F tool/GetFile.cs 47852aa0d806fe47ed1ac5138bdce7f000fe87aaa7f28107d0cb1e26682aeb44 -F tool/GetTclKit.bat 8995df40c4209808b31f24de0b58f90930239a234f7591e3675d45bfbb990c5d -F tool/Replace.cs 02c67258801c2fb5f63231e0ac0f220b4b36ba91 -F tool/build-all-msvc.bat c12328d06c45fec8baada5949e3d5af54bf8c887 x -F tool/build-shell.sh 950f47c6174f1eea171319438b93ba67ff5bf367 -F tool/cg_anno.tcl c1f875f5a4c9caca3d59937b16aff716f8b1883935f1b4c9ae23124705bc8099 x -F tool/checkSpacing.c 810e51703529a204fc4e1eb060e9ab663e3c06d2 -F tool/dbhash.c 19560c9a2aa2b269b6a5108259b93d26d12f8f0877c31fe9f8f61dfbd219ba63 -F tool/dbtotxt.c b2221864a20fb391c46bd31bc1fbdc4a96f5c8a89bef58f421eb9b9c36b1702c -F tool/dbtotxt.md c9a57af8739957ef36d2cfad5c4b1443ff3688ed33e4901ee200c8b651f43f3c -F tool/extract-sqlite3h.tcl 069ceab0cee26cba99952bfa08c0b23e35941c837acabe143f0c355d96c9e2eb x -F tool/extract.c 054069d81b095fbdc189a6f5d4466e40380505e2 -F tool/fast_vacuum.c 5ba0d6f5963a0a63bdc42840f678bad75b2ebce1 -F tool/fragck.tcl 5265a95126abcf6ab357f7efa544787e5963f439 -F tool/fuzzershell.c e1d90a03ca790d7c331c2aae08ca46ff435f1ae1faa6cb9cc48f4687c18fdc6e -F tool/genfkey.README cf68fddd4643bbe3ff8e31b8b6d8b0a1b85e20f4 -F tool/genfkey.test b6afd7b825d797a1e1274f519ab5695373552ecad5cd373530c63533638a5a4f -F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce -F tool/index_usage.c 9ec344d29cbeb03fdc0fce668eedfb7495792170de933adf95cf8d6904a166ad -F tool/kvtest-speed.sh 4761a9c4b3530907562314d7757995787f7aef8f -F tool/lemon.c a361b85fa230560b783006ac002a6a8bad214c3b9d7fa48980aecc2b691ddcad -F tool/lempar.c e8899b28488f060d0ff931539ea6311b16b22dce068c086c788a06d5e8d01ab7 -F tool/libvers.c caafc3b689638a1d88d44bc5f526c2278760d9b9 -F tool/loadfts.c c3c64e4d5e90e8ba41159232c2189dba4be7b862 -F tool/logest.c 11346aa019e2e77a00902aa7d0cabd27bd2e8cca -F tool/max-limits.c cbb635fbb37ae4d05f240bfb5b5270bb63c54439 -F tool/mkautoconfamal.sh 422fc365358a2e92876ffc62971a0ff28ed472fc8bcf9de0df921c736fdeca5e -F tool/mkccode.tcl 86463e68ce9c15d3041610fedd285ce32a5cf7a58fc88b3202b8b76837650dbe x -F tool/mkctimec.tcl dd183b73ae1c28249669741c250525f0407e579a70482371668fd5f130d9feb3 -F tool/mkkeywordhash.c 11a3f3af8e787d0c5ca459ed66fe80fd09e661876506e7b978ec08c19477bdc2 -F tool/mkmsvcmin.tcl 6ecab9fe22c2c8de4d82d4c46797bda3d2deac8e763885f5a38d0c44a895ab33 -F tool/mkopcodec.tcl d1b6362bd3aa80d5520d4d6f3765badf01f6c43c -F tool/mkopcodeh.tcl 352a4319c0ad869eb26442bf7c3b015aa15594c21f1cce5a6420dbe999367c21 -F tool/mkopts.tcl 680f785fdb09729fd9ac50632413da4eadbdf9071535e3f26d03795828ab07fa -F tool/mkpragmatab.tcl d348a4bf71ac068bddf89326562071cbbd962273d88f9b5e5d622f3e73b78bdf -F tool/mkshellc.tcl 70a9978e363b0f3280ca9ce1c46d72563ff479c1930a12a7375e3881b7325712 -F tool/mksourceid.c 36aa8020014aed0836fd13c51d6dc9219b0df1761d6b5f58ff5b616211b079b9 -F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 -F tool/mksqlite3c-noext.tcl 4f7cfef5152b0c91920355cbfc1d608a4ad242cb819f1aea07f6d0274f584a7f -F tool/mksqlite3c.tcl 3ab95bcf7b765f9d6d99cbeb8c4f150b38b0bb1f001ffac688f2ad02ebce2123 -F tool/mksqlite3h.tcl 080873e3856eceb9d289a08a00c4b30f875ea3feadcbece796bd509b1532792c -F tool/mksqlite3internalh.tcl eb994013e833359137eb53a55acdad0b5ae1049b -F tool/mkvsix.tcl b9e0777a213c23156b6542842c238479e496ebf5 -F tool/offsets.c fe4262fdfa378e8f5499a42136d17bf3b98f6091 -F tool/omittest.tcl 6616fbf384f0f630113eab27d41d4530435dd94e2883307759988b45f0604a3b -F tool/opcodesum.tcl 740ed206ba8c5040018988129abbf3089a0ccf4a -F tool/pagesig.c ff0ca355fd3c2398e933da5e22439bbff89b803b -F tool/replace.tcl 60f91e8dd06ab81f74d213ecbd9c9945f32ac048 -F tool/restore_jrnl.tcl 6957a34f8f1f0f8285e07536225ec3b292a9024a -F tool/rollback-test.c 9fc98427d1e23e84429d7e6d07d9094fbdec65a5 -F tool/run-speed-test.sh f95d19fd669b68c4c38b6b475242841d47c66076 -F tool/showdb.c 9b2dbb4b7a00afaf8fc1719f0d775775effa5b135ac1a2c23f1c3f5d670c4e15 -F tool/showjournal.c 5bad7ae8784a43d2b270d953060423b8bd480818 -F tool/showlocks.c 9920bcc64f58378ff1118caead34147201f48c68 -F tool/showshm.c a0ab6ec32dd1f11218ca2a4018f8fb875b59414801ab8ceed8b2e69b7b45a809 -F tool/showstat4.c 0682ebea7abf4d3657f53c4a243f2e7eab48eab344ed36a94bb75dcd19a5c2a1 -F tool/showwal.c ad9d768f96ca6199ad3a8c9562d679680bd032dd01204ea3e5ea6fb931d81847 -F tool/soak1.tcl 8d407956e1a45b485a8e072470a3e629a27037fe -F tool/spaceanal.tcl c161d838825d0242317c7cc13b1eb2126f8cec031950ef31114d42732cb2674e -F tool/speed-check.sh 2b042d703a9472f08c3b13be27afac658426f8e4fc87cd2d575953fda86f08d1 -F tool/speedtest.tcl 06c76698485ccf597b9e7dbb1ac70706eb873355 -F tool/speedtest16.c ecb6542862151c3e6509bbc00509b234562ae81e -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 7b9b7238284f02131dbb8f21a4e862409bff728045c5473139d28c67ac87580e -F tool/sqlite3_analyzer.c.in 7eeaae8b0d7577662acaabbb11107af0659d1b41bc1dfdd4d91422de27127968 -F tool/sqltclsh.c.in 1bcc2e9da58fadf17b0bf6a50e68c1159e602ce057210b655d50bad5aaaef898 -F tool/sqltclsh.tcl 862f4cf1418df5e1315b5db3b5ebe88969e2a784525af5fbf9596592f14ed848 -F tool/srcck1.c 371de5363b70154012955544f86fdee8f6e5326f -F tool/stack_usage.tcl f8e71b92cdb099a147dad572375595eae55eca43 -F tool/symbols-mingw.sh 4dbcea7e74768305384c9fd2ed2b41bbf9f0414d -F tool/symbols.sh 1612bd947750e21e7b47befad5f6b3825b06cce0705441f903bf35ced65ae9b9 -F tool/varint.c 5d94cb5003db9dbbcbcc5df08d66f16071aee003 -F tool/vdbe-compress.tcl 5926c71f9c12d2ab73ef35c29376e756eb68361c -F tool/vdbe_profile.tcl 246d0da094856d72d2c12efec03250d71639d19f -F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 -F tool/warnings.sh 09311479bdc290e20ec8e35a3d1b14b096bbd96222277cfd6274c3a99b3d012f -F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -F vsixtest/App.xaml b76d3b48860e7454775c47ea38ffea9c4abe3e85 -F vsixtest/App.xaml.cpp c465147f50871165c60ca16955219f6c5812d6d8 -F vsixtest/App.xaml.h 4a9768e2983d05600ad1e1c2f1b00a132967da9f -F vsixtest/Assets/LockScreenLogo.scale-200.png e820c9a3deb909197081b0bf3216c06e13905f0a -F vsixtest/Assets/SplashScreen.scale-200.png cab70988ca71bebec7bfeb3b6dbafe17b9ab0b4a -F vsixtest/Assets/Square150x150Logo.scale-200.png e17b40817db7a239fc239d83efcc951fb824e3ff -F vsixtest/Assets/Square44x44Logo.scale-200.png 2f166237094dea94d952d10b9eeae81806844f1c -F vsixtest/Assets/Square44x44Logo.targetsize-24_altform-unplated.png 5f6a6d391b95a3061ccca6e6fdd6955ede63b4ed -F vsixtest/Assets/StoreLogo.png 0828b7257db74a4ecd5eeb6b7b4971f0fdc4d9d1 -F vsixtest/Assets/Wide310x150Logo.scale-200.png 04ddefe5bc5f43ae12a7433f6f236ddab101ac42 -F vsixtest/MainPage.xaml 34f49897e3ca533a7e74506ba0759b66eebce151 -F vsixtest/MainPage.xaml.cpp 7f31fc6de751b64676c0924c97a5485d950a91d7 -F vsixtest/MainPage.xaml.h cc05cca10d50a003f6c6e4448b701cdd07f52f29 -F vsixtest/Package.appxmanifest 6b6db1eb7df3a315c5d681059754d5f0e0c47a93 -F vsixtest/pch.cpp cb823cfac36f1a39a7eb0acbd7e9a0b0de8f23af -F vsixtest/pch.h 9cab7980f2ac4baa40807d8b5e52af32a21cf78c -F vsixtest/vsixtest.sln 77cadbe4e96c1fe1bf51cd77de9e9b0a12ada547 -F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 -F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc -F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e -F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 094dcfe779613301521e8bb990432df187b3686add75a3420b4a193f02f3467f -R fe50fdd9252d03af57c53593afdee806 +B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 +C Provide\sthe\sability\sto\suse\sthe\sSELECTTRACE()\sdebugging\smacro\soutside\sof\sthe\nselect.c\ssource\sfile.\s\sUse\sthis\sto\sadd\sa\snew\sSELECTTRACE()\sentry\sin\nwindow.c\sfor\simproved\stracing\sof\swindow-function\sparse-tree\srewriting. +D 2020-06-11T00:57:09.771 +F src/global.c 0409ae635839e0bef26a69b68be64126ab6cba62ac19bd7694f1652e591c4c17 +F src/select.c 733ae255f1d10d95bbb8a7c13203a62eb79badc775eb2b2315e7ab4e35d45bad +F src/sqliteInt.h fe320867c4f48eeeca523062c5668508b3f9b88d65690d42610bd138a5fdb5c4 +F src/test1.c e9f68f157f8fd027ee4c32c4b427f4eed274749bfb745427e2d954fa89d95ad3 +F src/window.c 88a63e6948ea924b3cf9ad8aff5ea1fa53bebdb2f13340867205fda16ed0f19c +P fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 +R b3d2143c6508e1f1efd9ec1303abeeea U drh -Z 9cfa3eb1061d3d10530f069bf73f5151 +Z 41a1b9acde17079fb4a53b14e25df793 diff --git a/manifest.uuid b/manifest.uuid index 93b32e7733..850c7896e7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 \ No newline at end of file +30c6d895b573d5f2a53487b3b7a0d20be7e382c7a0bc87336bd43fbd2fa89bf4 \ No newline at end of file diff --git a/src/global.c b/src/global.c index aeddada6f2..c6bdbad1bd 100644 --- a/src/global.c +++ b/src/global.c @@ -300,6 +300,11 @@ sqlite3_uint64 sqlite3NProfileCnt = 0; int sqlite3PendingByte = 0x40000000; #endif +/* +** Flags for select tracing and the ".selecttrace" macro of the CLI +*/ +/**/ u32 sqlite3SelectTrace = 0; + #include "opcodes.h" /* ** Properties of opcodes. The OPFLG_INITIALIZER macro is diff --git a/src/select.c b/src/select.c index 465aab1ef1..123e0fb5fc 100644 --- a/src/select.c +++ b/src/select.c @@ -14,20 +14,6 @@ */ #include "sqliteInt.h" -/* -** Trace output macros -*/ -#if SELECTTRACE_ENABLED -/***/ int sqlite3SelectTrace = 0; -# define SELECTTRACE(K,P,S,X) \ - if(sqlite3SelectTrace&(K)) \ - sqlite3DebugPrintf("%u/%d/%p: ",(S)->selId,(P)->addrExplain,(S)),\ - sqlite3DebugPrintf X -#else -# define SELECTTRACE(K,P,S,X) -#endif - - /* ** An instance of the following object is used to record information about ** how to process the DISTINCT keyword, to simplify passing that information @@ -5826,7 +5812,7 @@ int sqlite3Select( memset(&sSort, 0, sizeof(sSort)); sSort.pOrderBy = p->pOrderBy; - /* Try to various optimizations (flattening subqueries, and strength + /* Try to do various optimizations (flattening subqueries, and strength ** reduction of join operators) in the FROM clause up into the main query */ #if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 7231856423..686096d4e1 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -979,6 +979,16 @@ typedef INT16_TYPE LogEst; #else # define SELECTTRACE_ENABLED 0 #endif +#if defined(SQLITE_ENABLE_SELECTTRACE) +# define SELECTTRACE_ENABLED 1 +# define SELECTTRACE(K,P,S,X) \ + if(sqlite3SelectTrace&(K)) \ + sqlite3DebugPrintf("%u/%d/%p: ",(S)->selId,(P)->addrExplain,(S)),\ + sqlite3DebugPrintf X +#else +# define SELECTTRACE(K,P,S,X) +# define SELECTTRACE_ENABLED 0 +#endif /* ** An instance of the following structure is used to store the busy-handler @@ -4555,10 +4565,11 @@ extern const unsigned char sqlite3UpperToLower[]; extern const unsigned char sqlite3CtypeMap[]; extern SQLITE_WSD struct Sqlite3Config sqlite3Config; extern FuncDefHash sqlite3BuiltinFunctions; +extern u32 sqlite3SelectTrace; #ifndef SQLITE_OMIT_WSD extern int sqlite3PendingByte; #endif -#endif +#endif /* SQLITE_AMALGAMATION */ #ifdef VDBE_PROFILE extern sqlite3_uint64 sqlite3NProfileCnt; #endif diff --git a/src/test1.c b/src/test1.c index 29207d51ac..46cc8b1acd 100644 --- a/src/test1.c +++ b/src/test1.c @@ -8164,7 +8164,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){ #endif #endif #if defined(SQLITE_ENABLE_SELECTTRACE) - extern int sqlite3SelectTrace; + extern u32 sqlite3SelectTrace; #endif for(i=0; iselId, p)); p->pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); if( p->pSrc ){ Table *pTab2; From 46daa99b8d054d851e51e0eb5f12079b9791c491 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 11 Jun 2020 15:53:54 +0000 Subject: [PATCH 053/186] Avoid rewriting compound SELECT statements that use a different collation sequence for ORDER BY and record processing a second time if they contain window functions. Fix for [b706351c]. FossilOrigin-Name: 32a88bdd4be5acdc1b80856bf6e32724dc3a467d5050bec0fe1a3dfedcc06f34 --- manifest | 15 ++++++++------- manifest.uuid | 2 +- src/select.c | 8 ++++++++ test/window1.test | 30 ++++++++++++++++++++++++++++++ 4 files changed, 47 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 09e432bfe3..228f95ace0 100644 --- a/manifest +++ b/manifest @@ -1,12 +1,13 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C Provide\sthe\sability\sto\suse\sthe\sSELECTTRACE()\sdebugging\smacro\soutside\sof\sthe\nselect.c\ssource\sfile.\s\sUse\sthis\sto\sadd\sa\snew\sSELECTTRACE()\sentry\sin\nwindow.c\sfor\simproved\stracing\sof\swindow-function\sparse-tree\srewriting. -D 2020-06-11T00:57:09.771 +C Avoid\srewriting\scompound\sSELECT\sstatements\sthat\suse\sa\sdifferent\scollation\ssequence\sfor\sORDER\sBY\sand\srecord\sprocessing\sa\ssecond\stime\sif\sthey\scontain\swindow\sfunctions.\sFix\sfor\s[b706351c]. +D 2020-06-11T15:53:54.084 F src/global.c 0409ae635839e0bef26a69b68be64126ab6cba62ac19bd7694f1652e591c4c17 -F src/select.c 733ae255f1d10d95bbb8a7c13203a62eb79badc775eb2b2315e7ab4e35d45bad +F src/select.c 4cf6adb522701a8f9d31b813898c0ec0b3409d343ba131a6f9659d49b76e222a F src/sqliteInt.h fe320867c4f48eeeca523062c5668508b3f9b88d65690d42610bd138a5fdb5c4 F src/test1.c e9f68f157f8fd027ee4c32c4b427f4eed274749bfb745427e2d954fa89d95ad3 F src/window.c 88a63e6948ea924b3cf9ad8aff5ea1fa53bebdb2f13340867205fda16ed0f19c -P fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -R b3d2143c6508e1f1efd9ec1303abeeea -U drh -Z 41a1b9acde17079fb4a53b14e25df793 +F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c +P 30c6d895b573d5f2a53487b3b7a0d20be7e382c7a0bc87336bd43fbd2fa89bf4 +R d77969df2abe7d3c02ea74b2057f9f3a +U dan +Z 0af3852064f40e6db0fa611ce2dd7e61 diff --git a/manifest.uuid b/manifest.uuid index 850c7896e7..3dc252ddbe 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -30c6d895b573d5f2a53487b3b7a0d20be7e382c7a0bc87336bd43fbd2fa89bf4 \ No newline at end of file +32a88bdd4be5acdc1b80856bf6e32724dc3a467d5050bec0fe1a3dfedcc06f34 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 123e0fb5fc..a8af176604 100644 --- a/src/select.c +++ b/src/select.c @@ -4621,6 +4621,14 @@ static int convertCompoundSelectToSubquery(Walker *pWalker, Select *p){ for(pX=p; pX && (pX->op==TK_ALL || pX->op==TK_SELECT); pX=pX->pPrior){} if( pX==0 ) return WRC_Continue; a = p->pOrderBy->a; +#ifndef SQLITE_OMIT_WINDOWFUNC + /* If iOrderByCol is already non-zero, then it has already been matched + ** to a result column of the SELECT statement. This occurs when the + ** SELECT is rewritten for window-functions processing and then passed + ** to sqlite3SelectPrep() and similar a second time. The rewriting done + ** by this function is not required in this case. */ + if( a[0].u.x.iOrderByCol ) return WRC_Continue; +#endif for(i=p->pOrderBy->nExpr-1; i>=0; i--){ if( a[i].pExpr->flags & EP_Collate ) break; } diff --git a/test/window1.test b/test/window1.test index ea5b66459e..618d95e685 100644 --- a/test/window1.test +++ b/test/window1.test @@ -1917,4 +1917,34 @@ do_execsql_test 62.4 { ) WHERE c>10; } {15.0 30.0} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 63.1 { + CREATE TABLE t1(b, x); + CREATE TABLE t2(c, d); + CREATE TABLE t3(e, f); +} + +do_execsql_test 63.2 { + SELECT max(b) OVER( + ORDER BY SUM( + (SELECT c FROM t2 UNION SELECT x ORDER BY c) + ) + ) FROM t1; +} {{}} + +do_execsql_test 63.3 { + SELECT sum(b) over( + ORDER BY ( + SELECT max(b) OVER( + ORDER BY sum( + (SELECT x AS c UNION SELECT 1234 ORDER BY c) + ) + ) AS e + ORDER BY e + ) + ) + FROM t1; +} {{}} + finish_test From b5aaee5e31c081b3ba5beeb563419f2d66be2656 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 11 Jun 2020 16:04:10 +0000 Subject: [PATCH 054/186] Add a new assert() to the SELECT processing. FossilOrigin-Name: 98cea4a32ba558c137d71a5e373a6803d764d34c5640907371dcf6468ffb2e64 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/select.c | 5 +++++ 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 228f95ace0..4f90c0b7d1 100644 --- a/manifest +++ b/manifest @@ -1,13 +1,13 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C Avoid\srewriting\scompound\sSELECT\sstatements\sthat\suse\sa\sdifferent\scollation\ssequence\sfor\sORDER\sBY\sand\srecord\sprocessing\sa\ssecond\stime\sif\sthey\scontain\swindow\sfunctions.\sFix\sfor\s[b706351c]. -D 2020-06-11T15:53:54.084 +C Add\sa\snew\sassert()\sto\sthe\sSELECT\sprocessing. +D 2020-06-11T16:04:10.746 F src/global.c 0409ae635839e0bef26a69b68be64126ab6cba62ac19bd7694f1652e591c4c17 -F src/select.c 4cf6adb522701a8f9d31b813898c0ec0b3409d343ba131a6f9659d49b76e222a +F src/select.c 929e1c0db3cb3d9f7d2304c6596868abcb6dfd7c2a0ac1bdf12a5a4432078ba4 F src/sqliteInt.h fe320867c4f48eeeca523062c5668508b3f9b88d65690d42610bd138a5fdb5c4 F src/test1.c e9f68f157f8fd027ee4c32c4b427f4eed274749bfb745427e2d954fa89d95ad3 F src/window.c 88a63e6948ea924b3cf9ad8aff5ea1fa53bebdb2f13340867205fda16ed0f19c F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c -P 30c6d895b573d5f2a53487b3b7a0d20be7e382c7a0bc87336bd43fbd2fa89bf4 -R d77969df2abe7d3c02ea74b2057f9f3a -U dan -Z 0af3852064f40e6db0fa611ce2dd7e61 +P 32a88bdd4be5acdc1b80856bf6e32724dc3a467d5050bec0fe1a3dfedcc06f34 +R 2b3df40625e1e1ca91eabc824248dfbb +U drh +Z 5781754b9c0a637aa77d00f970b7b71b diff --git a/manifest.uuid b/manifest.uuid index 3dc252ddbe..73df9f885f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -32a88bdd4be5acdc1b80856bf6e32724dc3a467d5050bec0fe1a3dfedcc06f34 \ No newline at end of file +98cea4a32ba558c137d71a5e373a6803d764d34c5640907371dcf6468ffb2e64 \ No newline at end of file diff --git a/src/select.c b/src/select.c index a8af176604..e89db37aeb 100644 --- a/src/select.c +++ b/src/select.c @@ -5829,6 +5829,11 @@ int sqlite3Select( Select *pSub = pItem->pSelect; Table *pTab = pItem->pTab; + /* The expander should have already created transient Table objects + ** even for FROM clause elements such as subqueries that do not correspond + ** to a real table */ + assert( pTab!=0 ); + /* Convert LEFT JOIN into JOIN if there are terms of the right table ** of the LEFT JOIN used in the WHERE clause. */ From 6aa7515c46f03f5e42843864cf732fbe0a0b284d Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 12 Jun 2020 00:31:52 +0000 Subject: [PATCH 055/186] Remove a NEVER() that turns out to be reachable. FossilOrigin-Name: 44e573ecd5c2b60107133d60c51f3a04a3f904e9c1cf926e9b8ea977c7acae8d --- manifest | 12 +++++++----- manifest.uuid | 2 +- src/btree.c | 2 +- test/fuzzdata8.db | Bin 1495040 -> 1502208 bytes 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 4f90c0b7d1..55bfba8acb 100644 --- a/manifest +++ b/manifest @@ -1,13 +1,15 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C Add\sa\snew\sassert()\sto\sthe\sSELECT\sprocessing. -D 2020-06-11T16:04:10.746 +C Remove\sa\sNEVER()\sthat\sturns\sout\sto\sbe\sreachable. +D 2020-06-12T00:31:52.711 +F src/btree.c fabc215bd1ebab0e48108e95e0f50531da9883156b95888f479f6c696db032ad F src/global.c 0409ae635839e0bef26a69b68be64126ab6cba62ac19bd7694f1652e591c4c17 F src/select.c 929e1c0db3cb3d9f7d2304c6596868abcb6dfd7c2a0ac1bdf12a5a4432078ba4 F src/sqliteInt.h fe320867c4f48eeeca523062c5668508b3f9b88d65690d42610bd138a5fdb5c4 F src/test1.c e9f68f157f8fd027ee4c32c4b427f4eed274749bfb745427e2d954fa89d95ad3 F src/window.c 88a63e6948ea924b3cf9ad8aff5ea1fa53bebdb2f13340867205fda16ed0f19c +F test/fuzzdata8.db 9ce2e5f0d7e5e61d5f8f0817346b2a3db2aeebbaff20d04043521623ea0558be F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c -P 32a88bdd4be5acdc1b80856bf6e32724dc3a467d5050bec0fe1a3dfedcc06f34 -R 2b3df40625e1e1ca91eabc824248dfbb +P 98cea4a32ba558c137d71a5e373a6803d764d34c5640907371dcf6468ffb2e64 +R fe941a98130365dcc5664681cdfda93a U drh -Z 5781754b9c0a637aa77d00f970b7b71b +Z a269c334c0d41dc18dbae6d92c570372 diff --git a/manifest.uuid b/manifest.uuid index 73df9f885f..8e39176095 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -98cea4a32ba558c137d71a5e373a6803d764d34c5640907371dcf6468ffb2e64 \ No newline at end of file +44e573ecd5c2b60107133d60c51f3a04a3f904e9c1cf926e9b8ea977c7acae8d \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index f269b3deee..6ec97f2edd 100644 --- a/src/btree.c +++ b/src/btree.c @@ -1751,7 +1751,7 @@ static int freeSpace(MemPage *pPage, u16 iStart, u16 iSize){ nFrag = iFreeBlk - iEnd; if( iEnd>iFreeBlk ) return SQLITE_CORRUPT_PAGE(pPage); iEnd = iFreeBlk + get2byte(&data[iFreeBlk+2]); - if( NEVER(iEnd > pPage->pBt->usableSize) ){ + if( iEnd > pPage->pBt->usableSize ){ return SQLITE_CORRUPT_PAGE(pPage); } iSize = iEnd - iStart; diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index b1837460297bbe7aea0ea95aa6946c523c946fa4..b943b2a99c2a7d48e1553cc8287b06e8bc43ce44 100644 GIT binary patch delta 10236 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 From 56e38185fe26dbaeba7545bf94c5a25150e16907 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 12 Jun 2020 15:17:27 +0000 Subject: [PATCH 056/186] Fix a buffer overread in fts3 that could occur when decoding a corrupted record. FossilOrigin-Name: 9a4a40c45feb2bb89020dc7711b4753479112ceae7ce2a44521d72afeddfac83 --- ext/fts3/fts3.c | 5 ++++- manifest | 15 +++++++++------ manifest.uuid | 2 +- test/fts3corrupt2.test | 2 +- test/fts3corrupt4.test | 35 ++++++++++++++++++++++++++++++++--- 5 files changed, 47 insertions(+), 12 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index 88ff0ee2c5..7e2cd79055 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -2267,6 +2267,9 @@ static int fts3PoslistMerge( */ fts3GetDeltaVarint(&p1, &i1); fts3GetDeltaVarint(&p2, &i2); + if( i1<2 || i2<2 ){ + break; + } do { fts3PutDeltaVarint(&p, &iPrev, (i1 Date: Fri, 12 Jun 2020 15:45:02 +0000 Subject: [PATCH 057/186] New test case added to test/fuzzdata8.db. FossilOrigin-Name: 14a5cbddc887e23a684fabab1a213cce261bd6cffa0663d4f138b92d0b65b9c2 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fuzzdata8.db | Bin 1502208 -> 1510400 bytes 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 18064f8a96..ee9f96a3ff 100644 --- a/manifest +++ b/manifest @@ -1,6 +1,6 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C Fix\sa\sbuffer\soverread\sin\sfts3\sthat\scould\soccur\swhen\sdecoding\sa\scorrupted\srecord. -D 2020-06-12T15:17:27.136 +C New\stest\scase\sadded\sto\stest/fuzzdata8.db. +D 2020-06-12T15:45:02.008 F ext/fts3/fts3.c acc51e4378dd772251b31ead0ccd19070fc1774f6f6a55b11e00cb885e0f34bc F src/btree.c fabc215bd1ebab0e48108e95e0f50531da9883156b95888f479f6c696db032ad F src/global.c 0409ae635839e0bef26a69b68be64126ab6cba62ac19bd7694f1652e591c4c17 @@ -10,9 +10,9 @@ F src/test1.c e9f68f157f8fd027ee4c32c4b427f4eed274749bfb745427e2d954fa89d95ad3 F src/window.c 88a63e6948ea924b3cf9ad8aff5ea1fa53bebdb2f13340867205fda16ed0f19c F test/fts3corrupt2.test e318f0676e5e78d5a4b702637e2bb25265954c08a1b1e4aaf93c7880bb0c67d0 F test/fts3corrupt4.test e77b06926348eb45b71569f9dc45e5b19c984ca1b1ef6671367f4ca9d6eaa973 -F test/fuzzdata8.db 9ce2e5f0d7e5e61d5f8f0817346b2a3db2aeebbaff20d04043521623ea0558be +F test/fuzzdata8.db b87ae726c84c3f80d457642d7650724a76eb3d7b76258959d712cc4d926ddfc7 F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c -P 44e573ecd5c2b60107133d60c51f3a04a3f904e9c1cf926e9b8ea977c7acae8d -R bcbd79b4c6c35d1dd8c3ebd4907c7f1d -U dan -Z ff2fe4fe3a58fa1f7eb72368a5beb544 +P 9a4a40c45feb2bb89020dc7711b4753479112ceae7ce2a44521d72afeddfac83 +R 84a32bdefc83764df15377cf4aebb49f +U drh +Z 693eb51b87f57815e5f55c632a3ec02d diff --git a/manifest.uuid b/manifest.uuid index 3d3c7ebf68..12e61dcff1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9a4a40c45feb2bb89020dc7711b4753479112ceae7ce2a44521d72afeddfac83 \ No newline at end of file +14a5cbddc887e23a684fabab1a213cce261bd6cffa0663d4f138b92d0b65b9c2 \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index b943b2a99c2a7d48e1553cc8287b06e8bc43ce44..01e4263e05f93f8c3e904e05a6ec60c39613435a 100644 GIT binary patch delta 17412 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 EA8PYO?*IS* delta 17022 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 From 74e0d966952b140f9732be351b04cb755d713cbf Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 13 Jun 2020 03:18:21 +0000 Subject: [PATCH 058/186] Identifiers "TRUE" and "FALSE" cannot take on their boolean constant values if they are operands of the "." operator. FossilOrigin-Name: ad738286e2441b5e84d05366db3fcafabe66be766f21fe6c17f43a8fabab16fb --- manifest | 12 +++++++----- manifest.uuid | 2 +- src/expr.c | 2 ++ test/istrue.test | 29 +++++++++++++++++++++++++++++ 4 files changed, 39 insertions(+), 6 deletions(-) diff --git a/manifest b/manifest index ee9f96a3ff..4259fbc66c 100644 --- a/manifest +++ b/manifest @@ -1,8 +1,9 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C New\stest\scase\sadded\sto\stest/fuzzdata8.db. -D 2020-06-12T15:45:02.008 +C Identifiers\s"TRUE"\sand\s"FALSE"\scannot\stake\son\stheir\sboolean\sconstant\svalues\sif\nthey\sare\soperands\sof\sthe\s"."\soperator. +D 2020-06-13T03:18:21.016 F ext/fts3/fts3.c acc51e4378dd772251b31ead0ccd19070fc1774f6f6a55b11e00cb885e0f34bc F src/btree.c fabc215bd1ebab0e48108e95e0f50531da9883156b95888f479f6c696db032ad +F src/expr.c 36bb737d2ca78ee9bd4fde46cf1e51a37e7e1b263e55fccfaef32922a19e9524 F src/global.c 0409ae635839e0bef26a69b68be64126ab6cba62ac19bd7694f1652e591c4c17 F src/select.c 929e1c0db3cb3d9f7d2304c6596868abcb6dfd7c2a0ac1bdf12a5a4432078ba4 F src/sqliteInt.h fe320867c4f48eeeca523062c5668508b3f9b88d65690d42610bd138a5fdb5c4 @@ -11,8 +12,9 @@ F src/window.c 88a63e6948ea924b3cf9ad8aff5ea1fa53bebdb2f13340867205fda16ed0f19c F test/fts3corrupt2.test e318f0676e5e78d5a4b702637e2bb25265954c08a1b1e4aaf93c7880bb0c67d0 F test/fts3corrupt4.test e77b06926348eb45b71569f9dc45e5b19c984ca1b1ef6671367f4ca9d6eaa973 F test/fuzzdata8.db b87ae726c84c3f80d457642d7650724a76eb3d7b76258959d712cc4d926ddfc7 +F test/istrue.test 06f92ea38750fa74df7dbbe6920205251c2310861fbbe23a3adfa918a2e2ba74 F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c -P 9a4a40c45feb2bb89020dc7711b4753479112ceae7ce2a44521d72afeddfac83 -R 84a32bdefc83764df15377cf4aebb49f +P 14a5cbddc887e23a684fabab1a213cce261bd6cffa0663d4f138b92d0b65b9c2 +R ebfcb880c83916e081aacf3bd673aef2 U drh -Z 693eb51b87f57815e5f55c632a3ec02d +Z f044363c3bc3fa94bf2e0fcb83823aba diff --git a/manifest.uuid b/manifest.uuid index 12e61dcff1..3cd9d72d8e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -14a5cbddc887e23a684fabab1a213cce261bd6cffa0663d4f138b92d0b65b9c2 \ No newline at end of file +ad738286e2441b5e84d05366db3fcafabe66be766f21fe6c17f43a8fabab16fb \ No newline at end of file diff --git a/src/expr.c b/src/expr.c index 79d57454c9..bfa247b4e9 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2048,8 +2048,10 @@ static int exprNodeIsConstant(Walker *pWalker, Expr *pExpr){ /* Fall through */ case TK_IF_NULL_ROW: case TK_REGISTER: + case TK_DOT: testcase( pExpr->op==TK_REGISTER ); testcase( pExpr->op==TK_IF_NULL_ROW ); + testcase( pExpr->op==TK_DOT ); pWalker->eCode = 0; return WRC_Abort; case TK_VARIABLE: diff --git a/test/istrue.test b/test/istrue.test index d2768b3798..b2f5b8d22b 100644 --- a/test/istrue.test +++ b/test/istrue.test @@ -172,4 +172,33 @@ do_execsql_test istrue-710 { SELECT 0.0 IS FALSE COLLATE BINARY; } {1 1 1 1 1 1 1 1 1} +# 2020-06-12 bug report from Chromium +# https://bugs.chromium.org/p/chromium/issues/detail?id=1094247 +do_catchsql_test istrue-800 { + SELECT 9 IN (false.false); +} {1 {no such column: false.false}} +do_execsql_test istrue-810 { + CREATE TABLE t8(a INT, true INT, false INT, d INT); + INSERT INTO t8(a,true,false,d) VALUES(5,6,7,8),(4,3,2,1),('a','b','c','d'); + SELECT * FROM t8 ORDER BY false; +} {4 3 2 1 5 6 7 8 a b c d} +do_catchsql_test istrue-820 { + SELECT 9 IN (false.false) FROM t8; +} {1 {no such column: false.false}} +do_execsql_test istrue-830 { + CREATE TABLE false(true INT, false INT, x INT CHECK (5 IN (false.false))); +} {} +do_execsql_test istrue-840 { + INSERT INTO False VALUES(4,5,6); +} {} +do_catchsql_test istrue-841 { + INSERT INTO False VALUES(5,6,7); +} {1 {CHECK constraint failed: false}} +do_execsql_test istrue-850 { + SELECT 9 IN (false.false) FROM false; +} {0} +do_execsql_test istrue-851 { + SELECT 5 IN (false.false) FROM false; +} {1} + finish_test From cd653a3266a4fd88b334c4aaffd1945e871a8d9a Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 13 Jun 2020 21:24:40 +0000 Subject: [PATCH 059/186] Avoid deleting expression nodes in the flattener code, as they may be referenced by AggInfo objects further up the stack. FossilOrigin-Name: cc1fffdeddf422404170fa163ab80372ae58b444d7012b2c164021b221709b3e --- manifest | 15 ++++++++------- manifest.uuid | 2 +- src/select.c | 8 +++++++- test/select3.test | 9 +++++++++ 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 4259fbc66c..481336b693 100644 --- a/manifest +++ b/manifest @@ -1,11 +1,11 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C Identifiers\s"TRUE"\sand\s"FALSE"\scannot\stake\son\stheir\sboolean\sconstant\svalues\sif\nthey\sare\soperands\sof\sthe\s"."\soperator. -D 2020-06-13T03:18:21.016 +C Avoid\sdeleting\sexpression\snodes\sin\sthe\sflattener\scode,\sas\sthey\smay\sbe\sreferenced\sby\sAggInfo\sobjects\sfurther\sup\sthe\sstack. +D 2020-06-13T21:24:40.551 F ext/fts3/fts3.c acc51e4378dd772251b31ead0ccd19070fc1774f6f6a55b11e00cb885e0f34bc F src/btree.c fabc215bd1ebab0e48108e95e0f50531da9883156b95888f479f6c696db032ad F src/expr.c 36bb737d2ca78ee9bd4fde46cf1e51a37e7e1b263e55fccfaef32922a19e9524 F src/global.c 0409ae635839e0bef26a69b68be64126ab6cba62ac19bd7694f1652e591c4c17 -F src/select.c 929e1c0db3cb3d9f7d2304c6596868abcb6dfd7c2a0ac1bdf12a5a4432078ba4 +F src/select.c 1a791ad41c35ec24217b8da877a4deb2a9e22a1dfae2bc46d68d9ad4e4bf8f40 F src/sqliteInt.h fe320867c4f48eeeca523062c5668508b3f9b88d65690d42610bd138a5fdb5c4 F src/test1.c e9f68f157f8fd027ee4c32c4b427f4eed274749bfb745427e2d954fa89d95ad3 F src/window.c 88a63e6948ea924b3cf9ad8aff5ea1fa53bebdb2f13340867205fda16ed0f19c @@ -13,8 +13,9 @@ F test/fts3corrupt2.test e318f0676e5e78d5a4b702637e2bb25265954c08a1b1e4aaf93c788 F test/fts3corrupt4.test e77b06926348eb45b71569f9dc45e5b19c984ca1b1ef6671367f4ca9d6eaa973 F test/fuzzdata8.db b87ae726c84c3f80d457642d7650724a76eb3d7b76258959d712cc4d926ddfc7 F test/istrue.test 06f92ea38750fa74df7dbbe6920205251c2310861fbbe23a3adfa918a2e2ba74 +F test/select3.test c49fbb758903f3718e2de5aa4655eda4838131cbea24a86db908f8b6889aa68c F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c -P 14a5cbddc887e23a684fabab1a213cce261bd6cffa0663d4f138b92d0b65b9c2 -R ebfcb880c83916e081aacf3bd673aef2 -U drh -Z f044363c3bc3fa94bf2e0fcb83823aba +P ad738286e2441b5e84d05366db3fcafabe66be766f21fe6c17f43a8fabab16fb +R 5e5118679cf69aa40cdce2d30c720aca +U dan +Z 711c877ed46b56919faaa443580ab634 diff --git a/manifest.uuid b/manifest.uuid index 3cd9d72d8e..b498bd973f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ad738286e2441b5e84d05366db3fcafabe66be766f21fe6c17f43a8fabab16fb \ No newline at end of file +cc1fffdeddf422404170fa163ab80372ae58b444d7012b2c164021b221709b3e \ No newline at end of file diff --git a/src/select.c b/src/select.c index e89db37aeb..ae41aaf81f 100644 --- a/src/select.c +++ b/src/select.c @@ -4115,7 +4115,13 @@ static int flattenSubquery( if( isLeftJoin>0 ){ sqlite3SetJoinExpr(pWhere, iNewParent); } - pParent->pWhere = sqlite3ExprAnd(pParse, pWhere, pParent->pWhere); + if( pWhere ){ + if( pParent->pWhere ){ + pParent->pWhere = sqlite3PExpr(pParse, TK_AND, pWhere, pParent->pWhere); + }else{ + pParent->pWhere = pWhere; + } + } if( db->mallocFailed==0 ){ SubstContext x; x.pParse = pParse; diff --git a/test/select3.test b/test/select3.test index 50039c551e..fec8ba4a51 100644 --- a/test/select3.test +++ b/test/select3.test @@ -314,4 +314,13 @@ do_execsql_test select3-9.100 { SELECT * FROM t0 GROUP BY c0; } {1.0 1.0} +reset_db +do_execsql_test select3.10.100 { + CREATE TABLE t1(a, b); + CREATE TABLE t2(c, d); + SELECT max(t1.a), + (SELECT 'xyz' FROM (SELECT * FROM t2 WHERE 0) WHERE t1.b=1) + FROM t1; +} {{} {}} + finish_test From 86d2de2571d5dd910a57c5f186bd34f1883974d4 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 14 Jun 2020 13:40:13 +0000 Subject: [PATCH 060/186] Check-in [1d4f86201dab9a22] changed a testcase() to an assert() because we didn't know how to reach that condition any more. But YongHeng's fuzzer found a way. So now we change it back. Ticket [9fb26d37cefaba40]. FossilOrigin-Name: 90b1169d1b200d35a3f9f0ad2ae35a1b336bdd9b1ad0494ba80a382354c8d8b8 --- manifest | 14 ++++++++------ manifest.uuid | 2 +- src/vdbe.c | 2 +- test/whereG.test | 11 +++++++++++ 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 481336b693..748c6f0d44 100644 --- a/manifest +++ b/manifest @@ -1,6 +1,6 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C Avoid\sdeleting\sexpression\snodes\sin\sthe\sflattener\scode,\sas\sthey\smay\sbe\sreferenced\sby\sAggInfo\sobjects\sfurther\sup\sthe\sstack. -D 2020-06-13T21:24:40.551 +C Check-in\s[1d4f86201dab9a22]\schanged\sa\stestcase()\sto\san\sassert()\sbecause\swe\ndidn't\sknow\show\sto\sreach\sthat\scondition\sany\smore.\s\sBut\sYongHeng's\sfuzzer\nfound\sa\sway.\s\sSo\snow\swe\schange\sit\sback.\s\sTicket\s[9fb26d37cefaba40]. +D 2020-06-14T13:40:13.692 F ext/fts3/fts3.c acc51e4378dd772251b31ead0ccd19070fc1774f6f6a55b11e00cb885e0f34bc F src/btree.c fabc215bd1ebab0e48108e95e0f50531da9883156b95888f479f6c696db032ad F src/expr.c 36bb737d2ca78ee9bd4fde46cf1e51a37e7e1b263e55fccfaef32922a19e9524 @@ -8,14 +8,16 @@ F src/global.c 0409ae635839e0bef26a69b68be64126ab6cba62ac19bd7694f1652e591c4c17 F src/select.c 1a791ad41c35ec24217b8da877a4deb2a9e22a1dfae2bc46d68d9ad4e4bf8f40 F src/sqliteInt.h fe320867c4f48eeeca523062c5668508b3f9b88d65690d42610bd138a5fdb5c4 F src/test1.c e9f68f157f8fd027ee4c32c4b427f4eed274749bfb745427e2d954fa89d95ad3 +F src/vdbe.c 2f5cdcd66be9bc1d1c6ca23b4a4ae003a5a36cf9830d9fa160efce66d9161c9d F src/window.c 88a63e6948ea924b3cf9ad8aff5ea1fa53bebdb2f13340867205fda16ed0f19c F test/fts3corrupt2.test e318f0676e5e78d5a4b702637e2bb25265954c08a1b1e4aaf93c7880bb0c67d0 F test/fts3corrupt4.test e77b06926348eb45b71569f9dc45e5b19c984ca1b1ef6671367f4ca9d6eaa973 F test/fuzzdata8.db b87ae726c84c3f80d457642d7650724a76eb3d7b76258959d712cc4d926ddfc7 F test/istrue.test 06f92ea38750fa74df7dbbe6920205251c2310861fbbe23a3adfa918a2e2ba74 F test/select3.test c49fbb758903f3718e2de5aa4655eda4838131cbea24a86db908f8b6889aa68c +F test/whereG.test 9363b2a97d914cb1b81aff5069ef0cf2a071a67e2b604eac6fe9c0114017d9aa F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c -P ad738286e2441b5e84d05366db3fcafabe66be766f21fe6c17f43a8fabab16fb -R 5e5118679cf69aa40cdce2d30c720aca -U dan -Z 711c877ed46b56919faaa443580ab634 +P cc1fffdeddf422404170fa163ab80372ae58b444d7012b2c164021b221709b3e +R 0ef6a213a076036833f157fe6b031b0b +U drh +Z 53f32837c1b7756aa8533c51e60a57b4 diff --git a/manifest.uuid b/manifest.uuid index b498bd973f..3d3f2d2583 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cc1fffdeddf422404170fa163ab80372ae58b444d7012b2c164021b221709b3e \ No newline at end of file +90b1169d1b200d35a3f9f0ad2ae35a1b336bdd9b1ad0494ba80a382354c8d8b8 \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index f26b64680b..c08e67612e 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -2076,7 +2076,7 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ if( (flags1 | flags3)&MEM_Str ){ if( (flags1 & (MEM_Int|MEM_IntReal|MEM_Real|MEM_Str))==MEM_Str ){ applyNumericAffinity(pIn1,0); - assert( flags3==pIn3->flags ); + testcase( flags3==pIn3->flags ); flags3 = pIn3->flags; } if( (flags3 & (MEM_Int|MEM_IntReal|MEM_Real|MEM_Str))==MEM_Str ){ diff --git a/test/whereG.test b/test/whereG.test index 9d4cde7b4d..c6ae3ce325 100644 --- a/test/whereG.test +++ b/test/whereG.test @@ -317,4 +317,15 @@ do_execsql_test 9.10 { SELECT coalesce(max(quote(a)),10) FROM t1 GROUP BY a; } {NULL '' 'X'} +# 2020-06-14: assert() changed back into testcase() +# ticket 9fb26d37cefaba40 +# +reset_db +do_execsql_test 10.1 { + CREATE TABLE a(b TEXT); INSERT INTO a VALUES(0),(4),(9); + CREATE TABLE c(d NUM); + CREATE VIEW f(g, h) AS SELECT b, 0 FROM a UNION SELECT d, d FROM c; + SELECT g = g FROM f GROUP BY h; +} {1} + finish_test From b7cbf5c1b2a9e099eec176e1ebeb659427a20626 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 15 Jun 2020 13:51:34 +0000 Subject: [PATCH 061/186] Fix a defect in the query-flattener optimization identified by ticket [8f157e8010b22af0]. FossilOrigin-Name: 10fa79d00f8091e5748c245f4cae5b5f499a5f8db20da741c130e05a21ede443 --- manifest | 15 ++++++++------- manifest.uuid | 2 +- src/select.c | 7 +++---- src/sqliteInt.h | 1 + test/selectA.test | 21 +++++++++++++++++++++ 5 files changed, 34 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 748c6f0d44..573d0222f7 100644 --- a/manifest +++ b/manifest @@ -1,12 +1,12 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C Check-in\s[1d4f86201dab9a22]\schanged\sa\stestcase()\sto\san\sassert()\sbecause\swe\ndidn't\sknow\show\sto\sreach\sthat\scondition\sany\smore.\s\sBut\sYongHeng's\sfuzzer\nfound\sa\sway.\s\sSo\snow\swe\schange\sit\sback.\s\sTicket\s[9fb26d37cefaba40]. -D 2020-06-14T13:40:13.692 +C Fix\sa\sdefect\sin\sthe\squery-flattener\soptimization\sidentified\sby\nticket\s[8f157e8010b22af0]. +D 2020-06-15T13:51:34.544 F ext/fts3/fts3.c acc51e4378dd772251b31ead0ccd19070fc1774f6f6a55b11e00cb885e0f34bc F src/btree.c fabc215bd1ebab0e48108e95e0f50531da9883156b95888f479f6c696db032ad F src/expr.c 36bb737d2ca78ee9bd4fde46cf1e51a37e7e1b263e55fccfaef32922a19e9524 F src/global.c 0409ae635839e0bef26a69b68be64126ab6cba62ac19bd7694f1652e591c4c17 -F src/select.c 1a791ad41c35ec24217b8da877a4deb2a9e22a1dfae2bc46d68d9ad4e4bf8f40 -F src/sqliteInt.h fe320867c4f48eeeca523062c5668508b3f9b88d65690d42610bd138a5fdb5c4 +F src/select.c 6ddd86a7272ff1f443bd9efcbb0f5ab590674d4c732e4cb8c3d5dd8e3a70cae6 +F src/sqliteInt.h abf448e9f839964086d5508ba795e948dbf36d773b6568cf4c830f6c7ad2110e F src/test1.c e9f68f157f8fd027ee4c32c4b427f4eed274749bfb745427e2d954fa89d95ad3 F src/vdbe.c 2f5cdcd66be9bc1d1c6ca23b4a4ae003a5a36cf9830d9fa160efce66d9161c9d F src/window.c 88a63e6948ea924b3cf9ad8aff5ea1fa53bebdb2f13340867205fda16ed0f19c @@ -15,9 +15,10 @@ F test/fts3corrupt4.test e77b06926348eb45b71569f9dc45e5b19c984ca1b1ef6671367f4ca F test/fuzzdata8.db b87ae726c84c3f80d457642d7650724a76eb3d7b76258959d712cc4d926ddfc7 F test/istrue.test 06f92ea38750fa74df7dbbe6920205251c2310861fbbe23a3adfa918a2e2ba74 F test/select3.test c49fbb758903f3718e2de5aa4655eda4838131cbea24a86db908f8b6889aa68c +F test/selectA.test 68de52409e45a3313d00b8461b48bef4fb729faf36ade9067a994eae55cc86f4 F test/whereG.test 9363b2a97d914cb1b81aff5069ef0cf2a071a67e2b604eac6fe9c0114017d9aa F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c -P cc1fffdeddf422404170fa163ab80372ae58b444d7012b2c164021b221709b3e -R 0ef6a213a076036833f157fe6b031b0b +P 90b1169d1b200d35a3f9f0ad2ae35a1b336bdd9b1ad0494ba80a382354c8d8b8 +R 7b2f74d8f4cf58d33d2119b338a7cd5f U drh -Z 53f32837c1b7756aa8533c51e60a57b4 +Z 1c6c6f6f8bb99dca6da53b2db99f530c diff --git a/manifest.uuid b/manifest.uuid index 3d3f2d2583..b9814cc0c8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -90b1169d1b200d35a3f9f0ad2ae35a1b336bdd9b1ad0494ba80a382354c8d8b8 \ No newline at end of file +10fa79d00f8091e5748c245f4cae5b5f499a5f8db20da741c130e05a21ede443 \ No newline at end of file diff --git a/src/select.c b/src/select.c index ae41aaf81f..cdc81fd1fc 100644 --- a/src/select.c +++ b/src/select.c @@ -2702,9 +2702,7 @@ static int multiSelect( selectOpName(p->op))); rc = sqlite3Select(pParse, p, &uniondest); testcase( rc!=SQLITE_OK ); - /* Query flattening in sqlite3Select() might refill p->pOrderBy. - ** Be sure to delete p->pOrderBy, therefore, to avoid a memory leak. */ - sqlite3ExprListDelete(db, p->pOrderBy); + assert( p->pOrderBy==0 ); pDelete = p->pPrior; p->pPrior = pPrior; p->pOrderBy = 0; @@ -4091,7 +4089,7 @@ static int flattenSubquery( ** We look at every expression in the outer query and every place we see ** "a" we substitute "x*3" and every place we see "b" we substitute "y+10". */ - if( pSub->pOrderBy ){ + if( pSub->pOrderBy && (pParent->selFlags & SF_NoopOrderBy)==0 ){ /* At this point, any non-zero iOrderByCol values indicate that the ** ORDER BY column expression is identical to the iOrderByCol'th ** expression returned by SELECT statement pSub. Since these values @@ -5791,6 +5789,7 @@ int sqlite3Select( sqlite3ExprListDelete(db, p->pOrderBy); p->pOrderBy = 0; p->selFlags &= ~SF_Distinct; + p->selFlags |= SF_NoopOrderBy; } sqlite3SelectPrep(pParse, p, 0); if( pParse->nErr || db->mallocFailed ){ diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 686096d4e1..1afca88f61 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3122,6 +3122,7 @@ struct Select { #define SF_WhereBegin 0x0080000 /* Really a WhereBegin() call. Debug Only */ #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 */ /* ** The results of a SELECT can be distributed in several ways, as defined diff --git a/test/selectA.test b/test/selectA.test index 838e5f4323..7ca0096b1d 100644 --- a/test/selectA.test +++ b/test/selectA.test @@ -1446,5 +1446,26 @@ do_execsql_test 6.1 { SELECT * FROM (SELECT a FROM t1 UNION SELECT b FROM t2) WHERE a=a; } {12345} +# 2020-06-15 ticket 8f157e8010b22af0 +# +reset_db +do_execsql_test 7.1 { + CREATE TABLE t1(c1); INSERT INTO t1 VALUES(12),(123),(1234),(NULL),('abc'); + CREATE TABLE t2(c2); INSERT INTO t2 VALUES(44),(55),(123); + CREATE TABLE t3(c3,c4); INSERT INTO t3 VALUES(66,1),(123,2),(77,3); + CREATE VIEW t4 AS SELECT c3 FROM t3; + CREATE VIEW t5 AS SELECT c3 FROM t3 ORDER BY c4; +} +do_execsql_test 7.2 { + SELECT * FROM t1, t2 WHERE c1=(SELECT 123 INTERSECT SELECT c2 FROM t4) AND c1=123; +} {123 123} +do_execsql_test 7.3 { + SELECT * FROM t1, t2 WHERE c1=(SELECT 123 INTERSECT SELECT c2 FROM t5) AND c1=123; +} {123 123} +do_execsql_test 7.4 { + CREATE TABLE a(b); + CREATE VIEW c(d) AS SELECT b FROM a ORDER BY b; + SELECT sum(d) OVER( PARTITION BY(SELECT 0 FROM c JOIN a WHERE b =(SELECT b INTERSECT SELECT d FROM c) AND b = 123)) FROM c; +} {} finish_test From b13c3a33fdd14c66726fb3d6ada2b0a8941e8bd4 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 15 Jun 2020 14:38:57 +0000 Subject: [PATCH 062/186] Fix the --enable-update-limit option to ./configure. FossilOrigin-Name: d31fd57ea538668238787fde10a6a57bbd8a428c73f2e54b2e95ee9a645bc75b --- configure | 2 +- configure.ac | 2 +- manifest | 12 +++++++----- manifest.uuid | 2 +- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/configure b/configure index fb1d9cfaa8..afd94711cf 100755 --- a/configure +++ b/configure @@ -11619,7 +11619,7 @@ if test "${enable_update_limit+set}" = set; then : enableval=$enable_update_limit; fi -if test "${enable_udlimit}" = "yes" ; then +if test "${enable_update_limit}" = "yes" ; then OPT_FEATURE_FLAGS="${OPT_FEATURE_FLAGS} -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT" fi diff --git a/configure.ac b/configure.ac index ef70a4f0d1..b9021efc82 100644 --- a/configure.ac +++ b/configure.ac @@ -651,7 +651,7 @@ fi # statements. AC_ARG_ENABLE(update-limit, AC_HELP_STRING([--enable-update-limit], [Enable the UPDATE/DELETE LIMIT clause])) -if test "${enable_udlimit}" = "yes" ; then +if test "${enable_update_limit}" = "yes" ; then OPT_FEATURE_FLAGS="${OPT_FEATURE_FLAGS} -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT" fi diff --git a/manifest b/manifest index 573d0222f7..188f6f98bd 100644 --- a/manifest +++ b/manifest @@ -1,6 +1,8 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C Fix\sa\sdefect\sin\sthe\squery-flattener\soptimization\sidentified\sby\nticket\s[8f157e8010b22af0]. -D 2020-06-15T13:51:34.544 +C Fix\sthe\s--enable-update-limit\soption\sto\s./configure. +D 2020-06-15T14:38:57.043 +F configure f594931bd7b23dad12db96b81e1dba43b41b30a4560d6eb008014e3d9f1617e8 x +F configure.ac 13e4ecf89214c3aa0ba099a9e0178f13f03261ace627126737d8cee240ec5c1c F ext/fts3/fts3.c acc51e4378dd772251b31ead0ccd19070fc1774f6f6a55b11e00cb885e0f34bc F src/btree.c fabc215bd1ebab0e48108e95e0f50531da9883156b95888f479f6c696db032ad F src/expr.c 36bb737d2ca78ee9bd4fde46cf1e51a37e7e1b263e55fccfaef32922a19e9524 @@ -18,7 +20,7 @@ F test/select3.test c49fbb758903f3718e2de5aa4655eda4838131cbea24a86db908f8b6889a F test/selectA.test 68de52409e45a3313d00b8461b48bef4fb729faf36ade9067a994eae55cc86f4 F test/whereG.test 9363b2a97d914cb1b81aff5069ef0cf2a071a67e2b604eac6fe9c0114017d9aa F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c -P 90b1169d1b200d35a3f9f0ad2ae35a1b336bdd9b1ad0494ba80a382354c8d8b8 -R 7b2f74d8f4cf58d33d2119b338a7cd5f +P 10fa79d00f8091e5748c245f4cae5b5f499a5f8db20da741c130e05a21ede443 +R 53b85d8633b314f290bd62efdc804e58 U drh -Z 1c6c6f6f8bb99dca6da53b2db99f530c +Z 8f731d1ee1a28a5f07dfda9349a595b2 diff --git a/manifest.uuid b/manifest.uuid index b9814cc0c8..ec8859317b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -10fa79d00f8091e5748c245f4cae5b5f499a5f8db20da741c130e05a21ede443 \ No newline at end of file +d31fd57ea538668238787fde10a6a57bbd8a428c73f2e54b2e95ee9a645bc75b \ No newline at end of file From 999429882edbf4fb04add7bb5338764271aead89 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 15 Jun 2020 20:05:37 +0000 Subject: [PATCH 063/186] Fix the CLI so that interrupts work in columnar output mode. FossilOrigin-Name: 9472f1fe58222b738ad10fc93ceb365dc33b65c2bbca571f52bcd5bdb74b347e --- manifest | 11 ++++++----- manifest.uuid | 2 +- src/shell.c.in | 8 ++++---- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 188f6f98bd..268c0001e3 100644 --- a/manifest +++ b/manifest @@ -1,6 +1,6 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C Fix\sthe\s--enable-update-limit\soption\sto\s./configure. -D 2020-06-15T14:38:57.043 +C Fix\sthe\sCLI\sso\sthat\sinterrupts\swork\sin\scolumnar\soutput\smode. +D 2020-06-15T20:05:37.857 F configure f594931bd7b23dad12db96b81e1dba43b41b30a4560d6eb008014e3d9f1617e8 x F configure.ac 13e4ecf89214c3aa0ba099a9e0178f13f03261ace627126737d8cee240ec5c1c F ext/fts3/fts3.c acc51e4378dd772251b31ead0ccd19070fc1774f6f6a55b11e00cb885e0f34bc @@ -8,6 +8,7 @@ F src/btree.c fabc215bd1ebab0e48108e95e0f50531da9883156b95888f479f6c696db032ad F src/expr.c 36bb737d2ca78ee9bd4fde46cf1e51a37e7e1b263e55fccfaef32922a19e9524 F src/global.c 0409ae635839e0bef26a69b68be64126ab6cba62ac19bd7694f1652e591c4c17 F src/select.c 6ddd86a7272ff1f443bd9efcbb0f5ab590674d4c732e4cb8c3d5dd8e3a70cae6 +F src/shell.c.in 0e439519aae3c08cac2c0da84bc5899bbea4d5f273d3e970febb9bf7516d680b F src/sqliteInt.h abf448e9f839964086d5508ba795e948dbf36d773b6568cf4c830f6c7ad2110e F src/test1.c e9f68f157f8fd027ee4c32c4b427f4eed274749bfb745427e2d954fa89d95ad3 F src/vdbe.c 2f5cdcd66be9bc1d1c6ca23b4a4ae003a5a36cf9830d9fa160efce66d9161c9d @@ -20,7 +21,7 @@ F test/select3.test c49fbb758903f3718e2de5aa4655eda4838131cbea24a86db908f8b6889a F test/selectA.test 68de52409e45a3313d00b8461b48bef4fb729faf36ade9067a994eae55cc86f4 F test/whereG.test 9363b2a97d914cb1b81aff5069ef0cf2a071a67e2b604eac6fe9c0114017d9aa F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c -P 10fa79d00f8091e5748c245f4cae5b5f499a5f8db20da741c130e05a21ede443 -R 53b85d8633b314f290bd62efdc804e58 +P d31fd57ea538668238787fde10a6a57bbd8a428c73f2e54b2e95ee9a645bc75b +R 9bf0d64a5e369f6303626cfabb9127fe U drh -Z 8f731d1ee1a28a5f07dfda9349a595b2 +Z b4b377f6d8e70e8e674e66c244cb5822 diff --git a/manifest.uuid b/manifest.uuid index ec8859317b..98f74649fe 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d31fd57ea538668238787fde10a6a57bbd8a428c73f2e54b2e95ee9a645bc75b \ No newline at end of file +9472f1fe58222b738ad10fc93ceb365dc33b65c2bbca571f52bcd5bdb74b347e \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index d1b1203ebe..057c95ad48 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -3052,10 +3052,7 @@ static void exec_prepared_stmt_columnar( sqlite3_free_table(azData); return; } - if( nRow==0 || nColumn==0 ){ - sqlite3_free_table(azData); - return; - } + if( nRow==0 || nColumn==0 ) goto columnar_end; if( nColumn>p->nWidth ){ p->colWidth = realloc(p->colWidth, nColumn*2*sizeof(int)); if( p->colWidth==0 ) shell_out_of_memory(); @@ -3077,6 +3074,7 @@ static void exec_prepared_stmt_columnar( j = i%nColumn; if( n>p->actualWidth[j] ) p->actualWidth[j] = n; } + if( seenInterrupt ) goto columnar_end; switch( p->cMode ){ case MODE_Column: { colSep = " "; @@ -3139,6 +3137,7 @@ static void exec_prepared_stmt_columnar( } } for(i=nColumn, j=0; icMode!=MODE_Column ){ utf8_printf(p->out, "%s", p->cMode==MODE_Box?BOX_13" ":"| "); } @@ -3159,6 +3158,7 @@ static void exec_prepared_stmt_columnar( }else if( p->cMode==MODE_Box ){ print_box_row_separator(p, nColumn, BOX_12, BOX_124, BOX_14); } +columnar_end: sqlite3_free_table(azData); } From 346a70ca1edd53f37e4c04a0eb11c63869ed8bc3 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 15 Jun 2020 20:27:35 +0000 Subject: [PATCH 064/186] Provide "sqlite_schema" as an alternative name to the table that holds the database schema. FossilOrigin-Name: 61782a7ae3c25cf59d7a676cb295eb024d17c46e532ae78c6fe871a91d712fa9 --- manifest | 25 +++++++++----- manifest.uuid | 2 +- src/alter.c | 27 ++++++++------- src/btree.c | 6 ++-- src/build.c | 72 ++++++++++++++++++++++++++-------------- src/shell.c.in | 9 +++-- src/sqliteInt.h | 20 +++++++---- src/trigger.c | 11 +++--- src/vacuum.c | 2 +- src/vdbe.c | 10 +++--- src/vtab.c | 6 ++-- test/where.test | 8 ++--- test/without_rowid3.test | 18 +++++----- 13 files changed, 127 insertions(+), 89 deletions(-) diff --git a/manifest b/manifest index 268c0001e3..208f10fd1c 100644 --- a/manifest +++ b/manifest @@ -1,17 +1,22 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C Fix\sthe\sCLI\sso\sthat\sinterrupts\swork\sin\scolumnar\soutput\smode. -D 2020-06-15T20:05:37.857 +C Provide\s"sqlite_schema"\sas\san\salternative\sname\sto\sthe\stable\sthat\sholds\sthe\ndatabase\sschema. +D 2020-06-15T20:27:35.935 F configure f594931bd7b23dad12db96b81e1dba43b41b30a4560d6eb008014e3d9f1617e8 x F configure.ac 13e4ecf89214c3aa0ba099a9e0178f13f03261ace627126737d8cee240ec5c1c F ext/fts3/fts3.c acc51e4378dd772251b31ead0ccd19070fc1774f6f6a55b11e00cb885e0f34bc -F src/btree.c fabc215bd1ebab0e48108e95e0f50531da9883156b95888f479f6c696db032ad +F src/alter.c b8ffe4acd48b4fe793d01901f28fd4f3b037854a0e99f0c977738556c31b9d2b +F src/btree.c f3a4479b0dba3a59a1d156d973be41fc1ccb3dbdb69151c4c62a791d86c9ffe2 +F src/build.c 8245e69aa1a2f8b67e76203fdbaa9f88deccd89b5ed41f7097c202b920484fd0 F src/expr.c 36bb737d2ca78ee9bd4fde46cf1e51a37e7e1b263e55fccfaef32922a19e9524 F src/global.c 0409ae635839e0bef26a69b68be64126ab6cba62ac19bd7694f1652e591c4c17 F src/select.c 6ddd86a7272ff1f443bd9efcbb0f5ab590674d4c732e4cb8c3d5dd8e3a70cae6 -F src/shell.c.in 0e439519aae3c08cac2c0da84bc5899bbea4d5f273d3e970febb9bf7516d680b -F src/sqliteInt.h abf448e9f839964086d5508ba795e948dbf36d773b6568cf4c830f6c7ad2110e +F src/shell.c.in c27ee0cd27e17db69257597f927301532a9f019445e3526828c78d348b6f0786 +F src/sqliteInt.h 0a13c93b250270c5876da65c21963eaca60c5fc55271c313d5f6cf20547134af F src/test1.c e9f68f157f8fd027ee4c32c4b427f4eed274749bfb745427e2d954fa89d95ad3 -F src/vdbe.c 2f5cdcd66be9bc1d1c6ca23b4a4ae003a5a36cf9830d9fa160efce66d9161c9d +F src/trigger.c 6b1472e6b5bbca71e13f95c61ebcd0b255450352de8254a42c40222020b7ac43 +F src/vacuum.c b196258ea36cfed5f455f18519345613bab04daf0e038a63ee715407c5a7ae9e +F src/vdbe.c 985f92b5131d62654c3c26062a2e55b1c8f71c2e10497e23021c6650d5c392b3 +F src/vtab.c 33ecf1d8b0fd1508fe23be9da40e48909c86a13db2725e273177eb47db2fc265 F src/window.c 88a63e6948ea924b3cf9ad8aff5ea1fa53bebdb2f13340867205fda16ed0f19c F test/fts3corrupt2.test e318f0676e5e78d5a4b702637e2bb25265954c08a1b1e4aaf93c7880bb0c67d0 F test/fts3corrupt4.test e77b06926348eb45b71569f9dc45e5b19c984ca1b1ef6671367f4ca9d6eaa973 @@ -19,9 +24,11 @@ F test/fuzzdata8.db b87ae726c84c3f80d457642d7650724a76eb3d7b76258959d712cc4d926d F test/istrue.test 06f92ea38750fa74df7dbbe6920205251c2310861fbbe23a3adfa918a2e2ba74 F test/select3.test c49fbb758903f3718e2de5aa4655eda4838131cbea24a86db908f8b6889aa68c F test/selectA.test 68de52409e45a3313d00b8461b48bef4fb729faf36ade9067a994eae55cc86f4 +F test/where.test f5e62453537e5b335b69f3b09f8a02ce3328289fad5d866e25371284b837d78d F test/whereG.test 9363b2a97d914cb1b81aff5069ef0cf2a071a67e2b604eac6fe9c0114017d9aa F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c -P d31fd57ea538668238787fde10a6a57bbd8a428c73f2e54b2e95ee9a645bc75b -R 9bf0d64a5e369f6303626cfabb9127fe +F test/without_rowid3.test 96426a6c9a2a5cf62bbe55ea1ad038eaaf4bf743f40a1ad517233b8e5a3d4339 +P 9472f1fe58222b738ad10fc93ceb365dc33b65c2bbca571f52bcd5bdb74b347e +R 02b044eedda1f74db4b37271f6bc932d U drh -Z b4b377f6d8e70e8e674e66c244cb5822 +Z dcba90128c816b6defcdc3a0ba95ebaa diff --git a/manifest.uuid b/manifest.uuid index 98f74649fe..1d8a33bad8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9472f1fe58222b738ad10fc93ceb365dc33b65c2bbca571f52bcd5bdb74b347e \ No newline at end of file +61782a7ae3c25cf59d7a676cb295eb024d17c46e532ae78c6fe871a91d712fa9 \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index 3332665a6c..c5b9328216 100644 --- a/src/alter.c +++ b/src/alter.c @@ -52,22 +52,22 @@ static int isAlterableTable(Parse *pParse, Table *pTab){ static void renameTestSchema(Parse *pParse, const char *zDb, int bTemp){ sqlite3NestedParse(pParse, "SELECT 1 " - "FROM \"%w\".%s " + "FROM \"%w\"." DFLT_SCHEMA_TABLE " " "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X'" " AND sql NOT LIKE 'create virtual%%'" " AND sqlite_rename_test(%Q, sql, type, name, %d)=NULL ", - zDb, MASTER_NAME, + zDb, zDb, bTemp ); if( bTemp==0 ){ sqlite3NestedParse(pParse, "SELECT 1 " - "FROM temp.%s " + "FROM temp." DFLT_SCHEMA_TABLE " " "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X'" " AND sql NOT LIKE 'create virtual%%'" " AND sqlite_rename_test(%Q, sql, type, name, 1)=NULL ", - MASTER_NAME, zDb + zDb ); } } @@ -185,17 +185,17 @@ void sqlite3AlterRenameTable( /* Rewrite all CREATE TABLE, INDEX, TRIGGER or VIEW statements in ** the schema to use the new table name. */ sqlite3NestedParse(pParse, - "UPDATE \"%w\".%s SET " + "UPDATE \"%w\"." DFLT_SCHEMA_TABLE " SET " "sql = sqlite_rename_table(%Q, type, name, sql, %Q, %Q, %d) " "WHERE (type!='index' OR tbl_name=%Q COLLATE nocase)" "AND name NOT LIKE 'sqliteX_%%' ESCAPE 'X'" - , zDb, MASTER_NAME, zDb, zTabName, zName, (iDb==1), zTabName + , zDb, zDb, zTabName, zName, (iDb==1), zTabName ); /* Update the tbl_name and name columns of the sqlite_master table ** as required. */ sqlite3NestedParse(pParse, - "UPDATE %Q.%s SET " + "UPDATE %Q." DFLT_SCHEMA_TABLE " SET " "tbl_name = %Q, " "name = CASE " "WHEN type='table' THEN %Q " @@ -205,7 +205,7 @@ void sqlite3AlterRenameTable( "ELSE name END " "WHERE tbl_name=%Q COLLATE nocase AND " "(type='table' OR type='index' OR type='trigger');", - zDb, MASTER_NAME, + zDb, zName, zName, zName, nTabName, zTabName ); @@ -382,10 +382,10 @@ void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){ } db->mDbFlags |= DBFLAG_PreferBuiltin; sqlite3NestedParse(pParse, - "UPDATE \"%w\".%s SET " + "UPDATE \"%w\"." DFLT_SCHEMA_TABLE " SET " "sql = substr(sql,1,%d) || ', ' || %Q || substr(sql,%d) " "WHERE type = 'table' AND name = %Q", - zDb, MASTER_NAME, pNew->addColOffset, zCol, pNew->addColOffset+1, + zDb, pNew->addColOffset, zCol, pNew->addColOffset+1, zTab ); sqlite3DbFree(db, zCol); @@ -595,21 +595,20 @@ void sqlite3AlterRenameColumn( assert( pNew->n>0 ); bQuote = sqlite3Isquote(pNew->z[0]); sqlite3NestedParse(pParse, - "UPDATE \"%w\".%s SET " + "UPDATE \"%w\"." DFLT_SCHEMA_TABLE " SET " "sql = sqlite_rename_column(sql, type, name, %Q, %Q, %d, %Q, %d, %d) " "WHERE name NOT LIKE 'sqliteX_%%' ESCAPE 'X' " " AND (type != 'index' OR tbl_name = %Q)" " AND sql NOT LIKE 'create virtual%%'", - zDb, MASTER_NAME, + zDb, zDb, pTab->zName, iCol, zNew, bQuote, iSchema==1, pTab->zName ); sqlite3NestedParse(pParse, - "UPDATE temp.%s SET " + "UPDATE temp." DFLT_SCHEMA_TABLE " SET " "sql = sqlite_rename_column(sql, type, name, %Q, %Q, %d, %Q, %d, 1) " "WHERE type IN ('trigger', 'view')", - MASTER_NAME, zDb, pTab->zName, iCol, zNew, bQuote ); diff --git a/src/btree.c b/src/btree.c index 6ec97f2edd..f9fb69f63b 100644 --- a/src/btree.c +++ b/src/btree.c @@ -3429,7 +3429,7 @@ int sqlite3BtreeBeginTrans(Btree *p, int wrflag, int *pSchemaVersion){ /* Any read-only or read-write transaction implies a read-lock on ** page 1. So if some other shared-cache client already has a write-lock ** on page 1, the transaction cannot be opened. */ - rc = querySharedCacheTableLock(p, MASTER_ROOT, READ_LOCK); + rc = querySharedCacheTableLock(p, SCHEMA_ROOT, READ_LOCK); if( SQLITE_OK!=rc ) goto trans_begun; pBt->btsFlags &= ~BTS_INITIALLY_EMPTY; @@ -9477,7 +9477,7 @@ void sqlite3BtreeGetMeta(Btree *p, int idx, u32 *pMeta){ sqlite3BtreeEnter(p); assert( p->inTrans>TRANS_NONE ); - assert( SQLITE_OK==querySharedCacheTableLock(p, MASTER_ROOT, READ_LOCK) ); + assert( SQLITE_OK==querySharedCacheTableLock(p, SCHEMA_ROOT, READ_LOCK) ); assert( pBt->pPage1 ); assert( idx>=0 && idx<=15 ); @@ -10360,7 +10360,7 @@ int sqlite3BtreeSchemaLocked(Btree *p){ int rc; assert( sqlite3_mutex_held(p->db->mutex) ); sqlite3BtreeEnter(p); - rc = querySharedCacheTableLock(p, MASTER_ROOT, READ_LOCK); + rc = querySharedCacheTableLock(p, SCHEMA_ROOT, READ_LOCK); assert( rc==SQLITE_OK || rc==SQLITE_LOCKED_SHAREDCACHE ); sqlite3BtreeLeave(p); return rc; diff --git a/src/build.c b/src/build.c index 03081b9654..a3f4f434cc 100644 --- a/src/build.c +++ b/src/build.c @@ -253,7 +253,7 @@ void sqlite3FinishCoding(Parse *pParse){ ** outermost parser. ** ** Not everything is nestable. This facility is designed to permit -** INSERT, UPDATE, and DELETE operations against SQLITE_MASTER. Use +** INSERT, UPDATE, and DELETE operations against the schema table. Use ** care if you decide to try to use this routine for some other purposes. */ void sqlite3NestedParse(Parse *pParse, const char *zFormat, ...){ @@ -335,9 +335,21 @@ Table *sqlite3FindTable(sqlite3 *db, const char *zName, const char *zDatabase){ } } p = sqlite3HashFind(&db->aDb[i].pSchema->tblHash, zName); - if( p==0 && i==1 && sqlite3StrICmp(zName, MASTER_NAME)==0 ){ - /* All temp.sqlite_master to be an alias for sqlite_temp_master */ - p = sqlite3HashFind(&db->aDb[1].pSchema->tblHash, TEMP_MASTER_NAME); + if( p==0 && sqlite3StrNICmp(zName, "sqlite_", 7)==0 ){ + if( i==1 ){ + if( sqlite3StrICmp(zName+7, ALT_TEMP_SCHEMA_TABLE+7)==0 + || sqlite3StrICmp(zName+7, ALT_SCHEMA_TABLE+7)==0 + || sqlite3StrICmp(zName+7, DFLT_SCHEMA_TABLE+7)==0 + ){ + p = sqlite3HashFind(&db->aDb[1].pSchema->tblHash, + DFLT_TEMP_SCHEMA_TABLE); + } + }else{ + if( sqlite3StrICmp(zName+7, ALT_SCHEMA_TABLE+7)==0 ){ + p = sqlite3HashFind(&db->aDb[i].pSchema->tblHash, + DFLT_SCHEMA_TABLE); + } + } } }else{ /* Match against TEMP first */ @@ -352,6 +364,14 @@ Table *sqlite3FindTable(sqlite3 *db, const char *zName, const char *zDatabase){ p = sqlite3HashFind(&db->aDb[i].pSchema->tblHash, zName); if( p ) break; } + if( p==0 && sqlite3StrNICmp(zName, "sqlite_", 7)==0 ){ + if( sqlite3StrICmp(zName+7, ALT_SCHEMA_TABLE+7)==0 ){ + p = sqlite3HashFind(&db->aDb[0].pSchema->tblHash, DFLT_SCHEMA_TABLE); + }else if( sqlite3StrICmp(zName+7, ALT_TEMP_SCHEMA_TABLE+7)==0 ){ + p = sqlite3HashFind(&db->aDb[1].pSchema->tblHash, + DFLT_TEMP_SCHEMA_TABLE); + } + } } return p; } @@ -746,10 +766,10 @@ char *sqlite3NameFromToken(sqlite3 *db, Token *pName){ ** Open the sqlite_master table stored in database number iDb for ** writing. The table is opened using cursor 0. */ -void sqlite3OpenMasterTable(Parse *p, int iDb){ +void sqlite3OpenSchemaTable(Parse *p, int iDb){ Vdbe *v = sqlite3GetVdbe(p); - sqlite3TableLock(p, iDb, MASTER_ROOT, 1, MASTER_NAME); - sqlite3VdbeAddOp4Int(v, OP_OpenWrite, 0, MASTER_ROOT, iDb, 5); + sqlite3TableLock(p, iDb, SCHEMA_ROOT, 1, DFLT_SCHEMA_TABLE); + sqlite3VdbeAddOp4Int(v, OP_OpenWrite, 0, SCHEMA_ROOT, iDb, 5); if( p->nTab==0 ){ p->nTab = 1; } @@ -1135,7 +1155,7 @@ void sqlite3StartTable( #endif /* Begin generating the code that will insert the table record into - ** the SQLITE_MASTER table. Note in particular that we must go ahead + ** the schema table. Note in particular that we must go ahead ** and allocate the record number for the table entry now. Before any ** PRIMARY KEY or UNIQUE keywords are parsed. Those keywords will cause ** indices to be created and the table record must come before the @@ -1189,7 +1209,7 @@ void sqlite3StartTable( pParse->addrCrTab = sqlite3VdbeAddOp3(v, OP_CreateBtree, iDb, reg2, BTREE_INTKEY); } - sqlite3OpenMasterTable(pParse, iDb); + sqlite3OpenSchemaTable(pParse, iDb); sqlite3VdbeAddOp2(v, OP_NewRowid, 0, reg1); sqlite3VdbeAddOp4(v, OP_Blob, 6, reg3, 0, nullRow, P4_STATIC); sqlite3VdbeAddOp3(v, OP_Insert, 0, reg3, reg1); @@ -2364,7 +2384,7 @@ void sqlite3EndTable( } /* If not initializing, then create a record for the new table - ** in the SQLITE_MASTER table of the database. + ** in the schema table of the database. ** ** If this is a TEMPORARY table, write the entry into the auxiliary ** file instead of into the main database file. @@ -2466,14 +2486,14 @@ void sqlite3EndTable( } /* A slot for the record has already been allocated in the - ** SQLITE_MASTER table. We just need to update that slot with all + ** schema table. We just need to update that slot with all ** the information we've collected. */ sqlite3NestedParse(pParse, - "UPDATE %Q.%s " - "SET type='%s', name=%Q, tbl_name=%Q, rootpage=#%d, sql=%Q " - "WHERE rowid=#%d", - db->aDb[iDb].zDbSName, MASTER_NAME, + "UPDATE %Q." DFLT_SCHEMA_TABLE + " SET type='%s', name=%Q, tbl_name=%Q, rootpage=#%d, sql=%Q" + " WHERE rowid=#%d", + db->aDb[iDb].zDbSName, zType, p->zName, p->zName, @@ -2601,7 +2621,7 @@ void sqlite3CreateView( sEnd.z = &z[n-1]; sEnd.n = 1; - /* Use sqlite3EndTable() to add the view to the SQLITE_MASTER table */ + /* Use sqlite3EndTable() to add the view to the schema table */ sqlite3EndTable(pParse, 0, &sEnd, 0, 0); create_view_fail: @@ -2837,8 +2857,9 @@ static void destroyRootPage(Parse *pParse, int iTable, int iDb){ ** token for additional information. */ sqlite3NestedParse(pParse, - "UPDATE %Q.%s SET rootpage=%d WHERE #%d AND rootpage=#%d", - pParse->db->aDb[iDb].zDbSName, MASTER_NAME, iTable, r1, r1); + "UPDATE %Q." DFLT_SCHEMA_TABLE + " SET rootpage=%d WHERE #%d AND rootpage=#%d", + pParse->db->aDb[iDb].zDbSName, iTable, r1, r1); #endif sqlite3ReleaseTempReg(pParse, r1); } @@ -2963,7 +2984,7 @@ void sqlite3CodeDropTable(Parse *pParse, Table *pTab, int iDb, int isView){ } #endif - /* Drop all SQLITE_MASTER table and index entries that refer to the + /* Drop all entries in the schema table that refer to the ** table. The program name loops through the master table and deletes ** every row that refers to a table of the same name as the one being ** dropped. Triggers are handled separately because a trigger can be @@ -2971,8 +2992,9 @@ void sqlite3CodeDropTable(Parse *pParse, Table *pTab, int iDb, int isView){ ** database. */ sqlite3NestedParse(pParse, - "DELETE FROM %Q.%s WHERE tbl_name=%Q and type!='trigger'", - pDb->zDbSName, MASTER_NAME, pTab->zName); + "DELETE FROM %Q." DFLT_SCHEMA_TABLE + " WHERE tbl_name=%Q and type!='trigger'", + pDb->zDbSName, pTab->zName); if( !isView && !IsVirtual(pTab) ){ destroyTable(pParse, pTab); } @@ -3979,8 +4001,8 @@ void sqlite3CreateIndex( /* Add an entry in sqlite_master for this index */ sqlite3NestedParse(pParse, - "INSERT INTO %Q.%s VALUES('index',%Q,%Q,#%d,%Q);", - db->aDb[iDb].zDbSName, MASTER_NAME, + "INSERT INTO %Q." DFLT_SCHEMA_TABLE " VALUES('index',%Q,%Q,#%d,%Q);", + db->aDb[iDb].zDbSName, pIndex->zName, pTab->zName, iMem, @@ -4150,8 +4172,8 @@ void sqlite3DropIndex(Parse *pParse, SrcList *pName, int ifExists){ if( v ){ sqlite3BeginWriteOperation(pParse, 1, iDb); sqlite3NestedParse(pParse, - "DELETE FROM %Q.%s WHERE name=%Q AND type='index'", - db->aDb[iDb].zDbSName, MASTER_NAME, pIndex->zName + "DELETE FROM %Q." DFLT_SCHEMA_TABLE " WHERE name=%Q AND type='index'", + db->aDb[iDb].zDbSName, pIndex->zName ); sqlite3ClearStatTables(pParse, iDb, "idx", pIndex->zName); sqlite3ChangeCookie(pParse, iDb); diff --git a/src/shell.c.in b/src/shell.c.in index 057c95ad48..15f8c5e659 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -9030,8 +9030,11 @@ static int do_meta_command(char *zLine, ShellState *p){ } } if( zName!=0 ){ - int isMaster = sqlite3_strlike(zName, "sqlite_master", '\\')==0; - if( isMaster || sqlite3_strlike(zName,"sqlite_temp_master", '\\')==0 ){ + int isMaster = sqlite3_strlike(zName, "sqlite_master", '\\')==0 + || sqlite3_strlike(zName, "sqlite_schema", '\\')==0 + || sqlite3_strlike(zName,"sqlite_temp_master", '\\')==0 + || sqlite3_strlike(zName,"sqlite_temp_schema", '\\')==0; + if( isMaster ){ char *new_argv[2], *new_colv[2]; new_argv[0] = sqlite3_mprintf( "CREATE TABLE %s (\n" @@ -9040,7 +9043,7 @@ static int do_meta_command(char *zLine, ShellState *p){ " tbl_name text,\n" " rootpage integer,\n" " sql text\n" - ")", isMaster ? "sqlite_master" : "sqlite_temp_master"); + ")", zName); new_argv[1] = 0; new_colv[0] = "sql"; new_colv[1] = 0; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 1afca88f61..87c2bf1a90 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1011,18 +1011,24 @@ struct BusyHandler { ** is a special table that holds the names and attributes of all ** user tables and indices. */ -#define MASTER_NAME "sqlite_master" -#define TEMP_MASTER_NAME "sqlite_temp_master" +//#define MASTER_NAME "sqlite_master" +//#define TEMP_MASTER_NAME "sqlite_temp_master" +#define DFLT_SCHEMA_TABLE "sqlite_master" +#define DFLT_TEMP_SCHEMA_TABLE "sqlite_temp_master" +#define ALT_SCHEMA_TABLE "sqlite_schema" +#define ALT_TEMP_SCHEMA_TABLE "sqlite_temp_schema" + /* -** The root-page of the master database table. +** The root-page of the schema table. */ -#define MASTER_ROOT 1 +#define SCHEMA_ROOT 1 /* -** The name of the schema table. +** The name of the schema table. The name is different for TEMP. */ -#define SCHEMA_TABLE(x) ((!OMIT_TEMPDB)&&(x==1)?TEMP_MASTER_NAME:MASTER_NAME) +#define SCHEMA_TABLE(x) \ + ((!OMIT_TEMPDB)&&(x==1)?DFLT_TEMP_SCHEMA_TABLE:DFLT_SCHEMA_TABLE) /* ** A convenience macro that returns the number of elements in @@ -4144,7 +4150,7 @@ void sqlite3DeleteColumnNames(sqlite3*,Table*); int sqlite3ColumnsFromExprList(Parse*,ExprList*,i16*,Column**); void sqlite3SelectAddColumnTypeAndCollation(Parse*,Table*,Select*,char); Table *sqlite3ResultSetOfSelect(Parse*,Select*,char); -void sqlite3OpenMasterTable(Parse *, int); +void sqlite3OpenSchemaTable(Parse *, int); Index *sqlite3PrimaryKeyIndex(Table*); i16 sqlite3TableColumnToIndex(Index*, i16); #ifdef SQLITE_OMIT_GENERATED_COLUMNS diff --git a/src/trigger.c b/src/trigger.c index 646d6942d3..fb4d89f2a8 100644 --- a/src/trigger.c +++ b/src/trigger.c @@ -128,7 +128,7 @@ void sqlite3BeginTrigger( ** ^^^^^^^^ ** ** To maintain backwards compatibility, ignore the database - ** name on pTableName if we are reparsing out of SQLITE_MASTER. + ** name on pTableName if we are reparsing out of the schema table */ if( db->init.busy && iDb!=1 ){ sqlite3DbFree(db, pTableName->a[0].zDatabase); @@ -331,8 +331,9 @@ void sqlite3FinishTrigger( z = sqlite3DbStrNDup(db, (char*)pAll->z, pAll->n); testcase( z==0 ); sqlite3NestedParse(pParse, - "INSERT INTO %Q.%s VALUES('trigger',%Q,%Q,0,'CREATE TRIGGER %q')", - db->aDb[iDb].zDbSName, MASTER_NAME, zName, + "INSERT INTO %Q." DFLT_SCHEMA_TABLE + " VALUES('trigger',%Q,%Q,0,'CREATE TRIGGER %q')", + db->aDb[iDb].zDbSName, zName, pTrig->table, z); sqlite3DbFree(db, z); sqlite3ChangeCookie(pParse, iDb); @@ -639,8 +640,8 @@ void sqlite3DropTriggerPtr(Parse *pParse, Trigger *pTrigger){ */ if( (v = sqlite3GetVdbe(pParse))!=0 ){ sqlite3NestedParse(pParse, - "DELETE FROM %Q.%s WHERE name=%Q AND type='trigger'", - db->aDb[iDb].zDbSName, MASTER_NAME, pTrigger->zName + "DELETE FROM %Q." DFLT_SCHEMA_TABLE " WHERE name=%Q AND type='trigger'", + db->aDb[iDb].zDbSName, pTrigger->zName ); sqlite3ChangeCookie(pParse, iDb); sqlite3VdbeAddOp4(v, OP_DropTrigger, iDb, 0, 0, pTrigger->zName, 0); diff --git a/src/vacuum.c b/src/vacuum.c index 920a98e018..0b3a42cab1 100644 --- a/src/vacuum.c +++ b/src/vacuum.c @@ -304,7 +304,7 @@ SQLITE_NOINLINE int sqlite3RunVacuum( /* Copy the triggers, views, and virtual tables from the main database ** over to the temporary database. None of these objects has any ** associated storage, so all we have to do is copy their entries - ** from the SQLITE_MASTER table. + ** from the schema table. */ rc = execSqlF(db, pzErrMsg, "INSERT INTO vacuum_db.sqlite_master" diff --git a/src/vdbe.c b/src/vdbe.c index c08e67612e..1ca3dc1aa0 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -3950,7 +3950,7 @@ case OP_OpenEphemeral: { rc = sqlite3BtreeCreateTable(pCx->pBtx, (int*)&pCx->pgnoRoot, BTREE_BLOBKEY | pOp->p5); if( rc==SQLITE_OK ){ - assert( pCx->pgnoRoot==MASTER_ROOT+1 ); + assert( pCx->pgnoRoot==SCHEMA_ROOT+1 ); assert( pKeyInfo->db==db ); assert( pKeyInfo->enc==ENC(db) ); rc = sqlite3BtreeCursor(pCx->pBtx, pCx->pgnoRoot, BTREE_WRCSR, @@ -3958,8 +3958,8 @@ case OP_OpenEphemeral: { } pCx->isTable = 0; }else{ - pCx->pgnoRoot = MASTER_ROOT; - rc = sqlite3BtreeCursor(pCx->pBtx, MASTER_ROOT, BTREE_WRCSR, + pCx->pgnoRoot = SCHEMA_ROOT; + rc = sqlite3BtreeCursor(pCx->pBtx, SCHEMA_ROOT, BTREE_WRCSR, 0, pCx->uc.pCursor); pCx->isTable = 1; } @@ -6066,7 +6066,7 @@ case OP_SqlExec: { /* Opcode: ParseSchema P1 * * P4 * ** -** Read and parse all entries from the SQLITE_MASTER table of database P1 +** Read and parse all entries from the schema table of database P1 ** that match the WHERE clause P4. If P4 is a NULL pointer, then the ** entire schema for P1 is reparsed. ** @@ -6103,7 +6103,7 @@ case OP_ParseSchema: { }else #endif { - zMaster = MASTER_NAME; + zMaster = DFLT_SCHEMA_TABLE; initData.db = db; initData.iDb = iDb; initData.pzErrMsg = &p->zErrMsg; diff --git a/src/vtab.c b/src/vtab.c index d94f6b5ed3..e20af38697 100644 --- a/src/vtab.c +++ b/src/vtab.c @@ -466,7 +466,7 @@ void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){ zStmt = sqlite3MPrintf(db, "CREATE VIRTUAL TABLE %T", &pParse->sNameToken); /* A slot for the record has already been allocated in the - ** SQLITE_MASTER table. We just need to update that slot with all + ** schema table. We just need to update that slot with all ** the information we've collected. ** ** The VM register number pParse->regRowid holds the rowid of an @@ -475,10 +475,10 @@ void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){ */ iDb = sqlite3SchemaToIndex(db, pTab->pSchema); sqlite3NestedParse(pParse, - "UPDATE %Q.%s " + "UPDATE %Q." DFLT_SCHEMA_TABLE " " "SET type='table', name=%Q, tbl_name=%Q, rootpage=0, sql=%Q " "WHERE rowid=#%d", - db->aDb[iDb].zDbSName, MASTER_NAME, + db->aDb[iDb].zDbSName, pTab->zName, pTab->zName, zStmt, diff --git a/test/where.test b/test/where.test index 26bf3a0402..9b072da677 100644 --- a/test/where.test +++ b/test/where.test @@ -1496,8 +1496,8 @@ do_execsql_test where-25.0 { INSERT INTO t2 VALUES(3, 'three', 'iii'); PRAGMA writable_schema = 1; - UPDATE sqlite_master SET rootpage = ( - SELECT rootpage FROM sqlite_master WHERE name = 'i2' + UPDATE sqlite_schema SET rootpage = ( + SELECT rootpage FROM sqlite_schema WHERE name = 'i2' ) WHERE name = 'i1'; } db close @@ -1524,8 +1524,8 @@ do_execsql_test where-25.3 { INSERT INTO t2 VALUES(3, 'three', 'iii'); PRAGMA writable_schema = 1; - UPDATE sqlite_master SET rootpage = ( - SELECT rootpage FROM sqlite_master WHERE name = 'i2' + UPDATE sqlite_schema SET rootpage = ( + SELECT rootpage FROM sqlite_schema WHERE name = 'i2' ) WHERE name = 'i1'; } db close diff --git a/test/without_rowid3.test b/test/without_rowid3.test index a9839e147e..eae7e3c856 100644 --- a/test/without_rowid3.test +++ b/test/without_rowid3.test @@ -942,7 +942,7 @@ ifcapable altertable { PRAGMA foreign_keys = off; ALTER TABLE t2 ADD COLUMN h DEFAULT 'text' REFERENCES t1; PRAGMA foreign_keys = on; - SELECT sql FROM sqlite_master WHERE name='t2'; + SELECT sql FROM sqlite_schema WHERE name='t2'; } } {{CREATE TABLE t2(a, b, c REFERENCES t1, d DEFAULT NULL REFERENCES t1, e REFERENCES t1 DEFAULT NULL, h DEFAULT 'text' REFERENCES t1)}} @@ -976,7 +976,7 @@ ifcapable altertable { WITHOUT rowid; CREATE TABLE t3(a REFERENCES t1, b REFERENCES t2, c REFERENCES t1); } - execsql { SELECT sql FROM sqlite_master WHERE type = 'table'} + execsql { SELECT sql FROM sqlite_schema WHERE type = 'table'} } [list \ {CREATE TABLE t1(a PRIMARY KEY, b REFERENCES t1) WITHOUT rowid} \ {CREATE TABLE t2(a PRIMARY KEY, b REFERENCES t1, c REFERENCES t2) @@ -985,7 +985,7 @@ ifcapable altertable { ] do_test without_rowid3-14.2.2.2 { execsql { ALTER TABLE t1 RENAME TO t4 } - execsql { SELECT sql FROM sqlite_master WHERE type = 'table'} + execsql { SELECT sql FROM sqlite_schema WHERE type = 'table'} } [list \ {CREATE TABLE "t4"(a PRIMARY KEY, b REFERENCES "t4") WITHOUT rowid} \ {CREATE TABLE t2(a PRIMARY KEY, b REFERENCES "t4", c REFERENCES t2) @@ -1037,7 +1037,7 @@ ifcapable altertable { PRAGMA foreign_keys = off; ALTER TABLE t2 ADD COLUMN h DEFAULT 'text' REFERENCES t1; PRAGMA foreign_keys = on; - SELECT sql FROM temp.sqlite_master WHERE name='t2'; + SELECT sql FROM temp.sqlite_schema WHERE name='t2'; } } {{CREATE TABLE t2(a, b, c REFERENCES t1, d DEFAULT NULL REFERENCES t1, e REFERENCES t1 DEFAULT NULL, h DEFAULT 'text' REFERENCES t1)}} @@ -1063,7 +1063,7 @@ ifcapable altertable { WITHOUT rowid; CREATE TEMP TABLE t3(a REFERENCES t1, b REFERENCES t2, c REFERENCES t1); } - execsql { SELECT sql FROM sqlite_temp_master WHERE type = 'table'} + execsql { SELECT sql FROM sqlite_temp_schema WHERE type = 'table'} } [list \ {CREATE TABLE t1(a PRIMARY KEY, b REFERENCES t1) WITHOUT rowid} \ {CREATE TABLE t2(a PRIMARY KEY, b REFERENCES t1, c REFERENCES t2) @@ -1072,7 +1072,7 @@ ifcapable altertable { ] do_test without_rowid3-14.2tmp.2.2 { execsql { ALTER TABLE t1 RENAME TO t4 } - execsql { SELECT sql FROM temp.sqlite_master WHERE type = 'table'} + execsql { SELECT sql FROM temp.sqlite_schema WHERE type = 'table'} } [list \ {CREATE TABLE "t4"(a PRIMARY KEY, b REFERENCES "t4") WITHOUT rowid} \ {CREATE TABLE t2(a PRIMARY KEY, b REFERENCES "t4", c REFERENCES t2) @@ -1125,7 +1125,7 @@ ifcapable altertable { PRAGMA foreign_keys = off; ALTER TABLE t2 ADD COLUMN h DEFAULT 'text' REFERENCES t1; PRAGMA foreign_keys = on; - SELECT sql FROM aux.sqlite_master WHERE name='t2'; + SELECT sql FROM aux.sqlite_schema WHERE name='t2'; } } {{CREATE TABLE t2(a, b, c REFERENCES t1, d DEFAULT NULL REFERENCES t1, e REFERENCES t1 DEFAULT NULL, h DEFAULT 'text' REFERENCES t1)}} @@ -1151,7 +1151,7 @@ ifcapable altertable { WITHOUT rowid; CREATE TABLE aux.t3(a REFERENCES t1, b REFERENCES t2, c REFERENCES t1); } - execsql { SELECT sql FROM aux.sqlite_master WHERE type = 'table'} + execsql { SELECT sql FROM aux.sqlite_schema WHERE type = 'table'} } [list \ {CREATE TABLE t1(a PRIMARY KEY, b REFERENCES t1) WITHOUT rowid} \ {CREATE TABLE t2(a PRIMARY KEY, b REFERENCES t1, c REFERENCES t2) @@ -1160,7 +1160,7 @@ ifcapable altertable { ] do_test without_rowid3-14.2aux.2.2 { execsql { ALTER TABLE t1 RENAME TO t4 } - execsql { SELECT sql FROM aux.sqlite_master WHERE type = 'table'} + execsql { SELECT sql FROM aux.sqlite_schema WHERE type = 'table'} } [list \ {CREATE TABLE "t4"(a PRIMARY KEY, b REFERENCES "t4") WITHOUT rowid} \ {CREATE TABLE t2(a PRIMARY KEY, b REFERENCES "t4", c REFERENCES t2) From b65ce3960781aacf8d80e15c2c9bca941b78e071 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 16 Jun 2020 14:06:20 +0000 Subject: [PATCH 065/186] Fix an assert() in fts3 that can fail when processing a corrupt record. FossilOrigin-Name: a58a6d6fb241a50c4c7c9af8a9c65bc4746e905b2ae12290c7182afa944053a2 --- ext/fts3/fts3.c | 2 +- manifest | 16 ++++++++-------- manifest.uuid | 2 +- test/fts3corrupt4.test | 17 +++++++++++++++++ 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index 7e2cd79055..d03e7eefb3 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -4523,7 +4523,7 @@ void sqlite3Fts3DoclistNext( assert( nDoclist>0 ); assert( *pbEof==0 ); - assert( p || *piDocid==0 ); + assert_fts3_nc( p || *piDocid==0 ); assert( !p || (p>=aDoclist && p<=&aDoclist[nDoclist]) ); if( p==0 ){ diff --git a/manifest b/manifest index 208f10fd1c..084ad09f65 100644 --- a/manifest +++ b/manifest @@ -1,9 +1,9 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C Provide\s"sqlite_schema"\sas\san\salternative\sname\sto\sthe\stable\sthat\sholds\sthe\ndatabase\sschema. -D 2020-06-15T20:27:35.935 +C Fix\san\sassert()\sin\sfts3\sthat\scan\sfail\swhen\sprocessing\sa\scorrupt\srecord. +D 2020-06-16T14:06:20.912 F configure f594931bd7b23dad12db96b81e1dba43b41b30a4560d6eb008014e3d9f1617e8 x F configure.ac 13e4ecf89214c3aa0ba099a9e0178f13f03261ace627126737d8cee240ec5c1c -F ext/fts3/fts3.c acc51e4378dd772251b31ead0ccd19070fc1774f6f6a55b11e00cb885e0f34bc +F ext/fts3/fts3.c ad3416827315a5bef8d0e23d8e90bf29940fbec23ee78aa0c5d3caed85072dec F src/alter.c b8ffe4acd48b4fe793d01901f28fd4f3b037854a0e99f0c977738556c31b9d2b F src/btree.c f3a4479b0dba3a59a1d156d973be41fc1ccb3dbdb69151c4c62a791d86c9ffe2 F src/build.c 8245e69aa1a2f8b67e76203fdbaa9f88deccd89b5ed41f7097c202b920484fd0 @@ -19,7 +19,7 @@ F src/vdbe.c 985f92b5131d62654c3c26062a2e55b1c8f71c2e10497e23021c6650d5c392b3 F src/vtab.c 33ecf1d8b0fd1508fe23be9da40e48909c86a13db2725e273177eb47db2fc265 F src/window.c 88a63e6948ea924b3cf9ad8aff5ea1fa53bebdb2f13340867205fda16ed0f19c F test/fts3corrupt2.test e318f0676e5e78d5a4b702637e2bb25265954c08a1b1e4aaf93c7880bb0c67d0 -F test/fts3corrupt4.test e77b06926348eb45b71569f9dc45e5b19c984ca1b1ef6671367f4ca9d6eaa973 +F test/fts3corrupt4.test 000cc36cf50f61e51a3ae35748ea883674a9d8b797880975e10866849eefb404 F test/fuzzdata8.db b87ae726c84c3f80d457642d7650724a76eb3d7b76258959d712cc4d926ddfc7 F test/istrue.test 06f92ea38750fa74df7dbbe6920205251c2310861fbbe23a3adfa918a2e2ba74 F test/select3.test c49fbb758903f3718e2de5aa4655eda4838131cbea24a86db908f8b6889aa68c @@ -28,7 +28,7 @@ F test/where.test f5e62453537e5b335b69f3b09f8a02ce3328289fad5d866e25371284b837d7 F test/whereG.test 9363b2a97d914cb1b81aff5069ef0cf2a071a67e2b604eac6fe9c0114017d9aa F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c F test/without_rowid3.test 96426a6c9a2a5cf62bbe55ea1ad038eaaf4bf743f40a1ad517233b8e5a3d4339 -P 9472f1fe58222b738ad10fc93ceb365dc33b65c2bbca571f52bcd5bdb74b347e -R 02b044eedda1f74db4b37271f6bc932d -U drh -Z dcba90128c816b6defcdc3a0ba95ebaa +P 61782a7ae3c25cf59d7a676cb295eb024d17c46e532ae78c6fe871a91d712fa9 +R 14b01e4dd1603edf4df42d81f4ced7a5 +U dan +Z 43e2585015a8d4d9f2bfa4334bc823ee diff --git a/manifest.uuid b/manifest.uuid index 1d8a33bad8..44a5194657 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -61782a7ae3c25cf59d7a676cb295eb024d17c46e532ae78c6fe871a91d712fa9 \ No newline at end of file +a58a6d6fb241a50c4c7c9af8a9c65bc4746e905b2ae12290c7182afa944053a2 \ No newline at end of file diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index 3bcf06af25..c79a5a2379 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -6091,7 +6091,24 @@ do_test 39.2 { } } } 0 +set sqlite_fts3_enable_parentheses $saved +#------------------------------------------------------------------------- +reset_db +set saved $sqlite_fts3_enable_parentheses +set sqlite_fts3_enable_parentheses 1 + +do_execsql_test 40.1 { + + CREATE VIRTUAL TABLE t0 USING fts3(col0 INTEGER PRIMARY KEY, col1, col2 ,col3 ); + INSERT INTO t0_segdir VALUES(0,0,0,0,'0 42', + X'0001310301020001033233340500010102000004616161bc050101020200000462626262050101030200' + ); +} + +do_execsql_test 40.2 { + SELECT 0==matchinfo(t0,'sx') FROM t0 WHERE t0 MATCH '1* 2 3 4 5 6 OR 1'; +} 0 set sqlite_fts3_enable_parentheses $saved From dc8339eaace6ca15a49f8983440ec552a694b68f Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 16 Jun 2020 14:12:43 +0000 Subject: [PATCH 066/186] Add a test case covering the previous check-in to the test/fuzzdata8.db file. FossilOrigin-Name: 95379da0e1ad5110648a5b3af24e7caab66a6f1ad6efdf374c83ae4ef1fed515 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fuzzdata8.db | Bin 1510400 -> 1518592 bytes 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 084ad09f65..e2eae1f015 100644 --- a/manifest +++ b/manifest @@ -1,6 +1,6 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C Fix\san\sassert()\sin\sfts3\sthat\scan\sfail\swhen\sprocessing\sa\scorrupt\srecord. -D 2020-06-16T14:06:20.912 +C Add\sa\stest\scase\scovering\sthe\sprevious\scheck-in\sto\sthe\stest/fuzzdata8.db\sfile. +D 2020-06-16T14:12:43.417 F configure f594931bd7b23dad12db96b81e1dba43b41b30a4560d6eb008014e3d9f1617e8 x F configure.ac 13e4ecf89214c3aa0ba099a9e0178f13f03261ace627126737d8cee240ec5c1c F ext/fts3/fts3.c ad3416827315a5bef8d0e23d8e90bf29940fbec23ee78aa0c5d3caed85072dec @@ -20,7 +20,7 @@ F src/vtab.c 33ecf1d8b0fd1508fe23be9da40e48909c86a13db2725e273177eb47db2fc265 F src/window.c 88a63e6948ea924b3cf9ad8aff5ea1fa53bebdb2f13340867205fda16ed0f19c F test/fts3corrupt2.test e318f0676e5e78d5a4b702637e2bb25265954c08a1b1e4aaf93c7880bb0c67d0 F test/fts3corrupt4.test 000cc36cf50f61e51a3ae35748ea883674a9d8b797880975e10866849eefb404 -F test/fuzzdata8.db b87ae726c84c3f80d457642d7650724a76eb3d7b76258959d712cc4d926ddfc7 +F test/fuzzdata8.db e7a6a1444adb7bd10dec870234979ddd63173314c7345e3def2d892dcf99d48f F test/istrue.test 06f92ea38750fa74df7dbbe6920205251c2310861fbbe23a3adfa918a2e2ba74 F test/select3.test c49fbb758903f3718e2de5aa4655eda4838131cbea24a86db908f8b6889aa68c F test/selectA.test 68de52409e45a3313d00b8461b48bef4fb729faf36ade9067a994eae55cc86f4 @@ -28,7 +28,7 @@ F test/where.test f5e62453537e5b335b69f3b09f8a02ce3328289fad5d866e25371284b837d7 F test/whereG.test 9363b2a97d914cb1b81aff5069ef0cf2a071a67e2b604eac6fe9c0114017d9aa F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c F test/without_rowid3.test 96426a6c9a2a5cf62bbe55ea1ad038eaaf4bf743f40a1ad517233b8e5a3d4339 -P 61782a7ae3c25cf59d7a676cb295eb024d17c46e532ae78c6fe871a91d712fa9 -R 14b01e4dd1603edf4df42d81f4ced7a5 -U dan -Z 43e2585015a8d4d9f2bfa4334bc823ee +P a58a6d6fb241a50c4c7c9af8a9c65bc4746e905b2ae12290c7182afa944053a2 +R 384b84d5739143259cb7eea7bb108567 +U drh +Z 99099ae802c1c7d548d28a65968661d6 diff --git a/manifest.uuid b/manifest.uuid index 44a5194657..4c7bec9a51 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a58a6d6fb241a50c4c7c9af8a9c65bc4746e905b2ae12290c7182afa944053a2 \ No newline at end of file +95379da0e1ad5110648a5b3af24e7caab66a6f1ad6efdf374c83ae4ef1fed515 \ No newline at end of file diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 01e4263e05f93f8c3e904e05a6ec60c39613435a..b14e3d1e42672ef0597d159beb176cc76e4d5eb5 100644 GIT binary patch delta 17494 zcmc(Gd3Y4X^LKiVY<6~LXLe_2xydHnXLcdnSHdO8l_&_vl>j0jM}nZ-WFsobl^9GR z3M7IccOpjt3M2w@h>##CB1eKJh>&=oD92m9dz?cUM(cRabwi zCT-c^w6lXVs<>{4g~=a9WxkL6=>gNxfc#;1hxmziqEr4CX|8TVs2l zvPh8V(M$MIw9-U*7E`5`$$F@@nH;CM}?Z^UH3 zukK`j!@5x1Sg|lrOWDBqI4^^%g>nP(>L?B{Q&p=zOIk;>E)vd`giN{SQj6SIv>;ODz(M`^kN!Nr~Q1oSFo&> zV*I81{rO%G(Xs$o3+3JeTAqXn4V0FDjuFo%?#}573xm8CO2UKp{zG%Ls3{sf6j+-u zaRO_z&DA!BNek-)>tnG?X)Gv<3dRQO$zj1@f5^S1B*NVGN@GZRLJ8-D&0VW168~cf z#>XiU0;*nRkWFqNg>9(DUmpN-`bJnVzP22JrPY+`g1neseihgcw)XIOf29VLM0+dY zY@hO?7@kF|;vWfH`zVR{WKCtg$d+QY}doqPbi02#GCYTPOQHL zMD0^+z<#@02jd2)TSYFmTqxRLtBStC%9kR03;x)oR)d_UlzRARl42?>28WJSa+$n} zUVR&iBOMK(?4;L*kz15fw)3tsfWgFx%2Ku#e#lqS@ud`HmdMsY&mZm8VU@)!Y%Dp- z1gO4S`JB)84)nZfKZQs4C@mN)eph@HdcUs>#%JI|?~HB2KaMJ1hLz_lR|K{hia%Bm6W&yk7!1x* zdgGYI%5uiGz_8`YSv;Si)DhWM$X%<%gORDE;nX#X&aiB`Vld3hRH}wnFb{kyl#6(I znGz+k{H&-e6>(0k5)>dITbT^hWe}ttSC(>i-i5dYWN2?@C{F0HK=JUu;=sR9iOfp4 zqVPGoKwPGhfSq!cMK%_I;&+tQ_U*SH3HnK&Z$Y_Tjf0X~N^O|@NQ4XDh#&=ypmEpG zwFCD=D02i{K8}o=Pqy=cxHFN2?G+fp;tgUfEGn}xpvZQ?;w|D39Q&M-%^rxl zHDkL&!bTGI4w3Ca`)uV`hJO^&bnHE7=yuG-Md`}3bn6h^lHd0Sngr1AbriAea7BeH zFDn(epd-TBK44jF5u{9aRL8AFN?(!fhYrWYT3GM2vN1w#B89!*hU?!8IQW9HT9Ee= z;U7T!^N#l*#baxYw@MU6WCvjX8;*ErchY_UhOQ#DyOHE*fc4IZ4MLW35caR)k3Zp$ zS2GimMmi*nyrO(1utTtaH9af%R*67=f#V{>2G^CdjC~0E*YQ4I*t^31M8^ocUZ!k` zU`=twEoHbM7ZM#uvr-HXG~A-}hm^IVfpcyvb47Lxs-!5-?3n0SDzcBVcPbW){n4(# zdW$)@@}3dd@$5ayQK;oZhmhwEz zxNYAHmkN{sG|?T!>_qlmdjRbpD3ckkcR8LE*vV``>5jcTj%yL&v7`yFJOa7x94|wk z^-45fc27tPju6eK!1ax|5x4prBLp5wN_&S2qH zC5FM))s7Z8td}D@B+XBu@Vb%?9nRTb$H;(#WcV2r{zxlYZGt1nFz$$B4Ye&CgTq;K zT+z-E%OXDCqXe5tVLwBB!*Ej2c8)K(RugG{1?c>N9oCmi({Hk#)6RA5)YwcK$JH?CmS89Z~+ z{u=I_?dZkWRmiO4AcvafAcy)rxZZNSjWInPeg-qXAf>zVqNB3Fu0dvu!^8^n9M?ql z1GqLgeteOslESV+@>pdc`0A)lutAZdFN2ob9Ear_B#d8?CAv}=7DaQ`NF6dD z79A(qZy5EJQq1toZbxH*-GZp^lvDWW`;JB;`yHdMDT;tJbtMLI=j`)f>j4_{4~!~P zQt8g03j}cs9r=)QS$rO@_jSbJk;9IW5^D#IjyuLEqHW3eU|T6{)i4MgcaU}-chpiu zdH>*G8!7BwJMMf&s6^nM?PG(jrLZdl?=L3iT(M7KT#awibr&*QxoTqdEB0mr8lzlI z7!V_=T%#$Dnc+x)-XGily0{PA)Bt)%41@SOj&YcB*72$+hztsI9l!i_ky~AK9A$z? z;nK@|sL$=y;OIMS1fKZZ-b8?*8<`yvnmFo1+BnByKAwn$>mBXbUsNFC8^`Z7f&}p` zxH5g`xNH-|aFog%_iQWzlh=A%GxQg#`vkoGhr=c@Wrw70h+rLXYlPaG$?DSZV0*l7 zS6zZ^rx`Rz9KaVsRcRrdm^fG&!Z6vTz9ldni=Lt_9@hudJO+<;S2uE!49K6Y)`W(! zYBWAtQQa*v7sicNXVJF3Q>}}eThX6bJ5o&!m*b_dui8Q4Tj~Hv`p8xf+V@kp(h7)X zdfQ-}6gGF({b!^_UosB_pRrZJ$hzuRB1H$~@#-OlM;ocF1?I)_F6se>hXZO`fmML= z?zB0^Ra6!19jnr|RT0X2sR!_IOSP?yRYu*ZmXp^Qtll8a8LCv}L{|abtxm!dLls)k z8^cr=sGC(4DV`~2aAk`+mcLXLbgxe~#DO;KA36k3;bR4ZY%sp>akc)gL$1O5>(eTzC2ijvj0 zVb)glX?%8;njr}Fn?mMOYBVf+SM@?hGu6a|Gsutnt zg=&n*8bjt0wGk}&Syf?9rg{e5nQFPfVj%d6ItYg?Ro93P|8P3Ej2bmu859d04%=d} z<1%%kU4BFgE1dzs2yF@3nbDMoeq5v@VAv$B0{GujEimkw z0s~j8Yh^lYiA^D@AFW5FHR@H7#lodXu_7c~Qf2sdin?#P^}@dwvhad*bG}8QICn_ZA!maBjLt55?oA%>V$#{6l*6PS6AD} z$TDv^o)Mtvo}fd@6~POUb+wJq;WPChi-XitY7@x2VY49Pj=B+Vo>euG#Y4_DZzR?@ zua=0cBShWM=*ahpEf)%Qk~S^QR`a1Oitg>ds1C)5E9yr)oDUbTeS9=uj4@9n2~K1 z8mlYZ{ZXZ$qf7;RcsB|fPq-xq~fjx%hM^ux+vASA&xOY(9xHDQ41@<^5R@JtOA%1}P zq3tY8?2Cy$O=1{PPy0h){jju>wwmE9Er~pciP288Corm(c1Zx^j`|@Vu|MzCAEWB= zo7xGj78InY717s1`%+>9A^Dp27(UTf+bpstA-PQJ2D7h_>%6#3dkRueYlXkZX?Bqf zg5aClPmr)taKYw!0z%3(;RdapvkjCS^Hzeqz1n#2eQLFXlzXh35oi_Lyjg6srcGm; z5r82MhG33X6YF-DgPy96)v(bCvZ^v}~`8MaK+J_=_^POox|x+E>0*61bfr1^r!f(>5$XJYlk_Lw4U;)cRj&gSTsqCVe&9~^Jz@Hrsaq* zM-~Tjp^e7GvXJ~cX}$RW$6(^mS~!Ednzsp@T_}`>C`IzIOw2e0shDlBjwpgegx3P&( zJ~+JM12Vhggr(YRB1?f(S^NO*b#=~y73at~3@g_{Sc#a5fjwHvKgfE4u}Kivr{zL| z$7w*(URx9-xx9@b;~Yu7{g>3H$!A&X9}d9)ox?8ecCsSO(znJ7$~uv)9`M0O%S+_JQkvE z24?#8LI6>P_u&w)QiP z9AmPk0;z9b$f>8t{Wlf^yxTmC%F)6_7#d}>!M^j_4SsVzq@1%hKhW-)9ElNM`IET= zHntEFfAyG9)XCWpf4HLQ0{V8?LI9Jv2ny>sJHX1W&WjIJIhQtqPMXX|Sq#AoYy$c| z)k^+v>1@vXErDPuIS<3-o&8YDfwcV21JXn5k^!z5VJGart<6H;Xwo$(I_aziX&=~{ zLs3t`4ZbUEI3F+*3R^fkV5h3i0vpSM%$C9}B;6uY%ebUg$&OMYapg@mFtqqfp}bft zf+gpele^6cm{8BTO<=EK`5EG!i+d(6Y3!WLST>e_&Tqvv(kU!HuN8;-1D0RlcTUoi>}?PYV0>X(V&7hjyCfyY*mS zNbKa?BEL!<-hf~cZPh8!-m<@OK+sXYuFfrty$NM+IgeveH)m6kt$;+QcQ@|s>Fg@9 zm5}K661fRZIufpeTuDg6goD~>k-LUiPE8Kv5_Aa#e^_?N+vZHjKB_IlO#_|%!^O9n zkHEl_+8bnrQ#BK}CzG#Wt0A$D&<@IO8PSA43JEY_hW2V!-miAddE1#p+K?hikZ_pn z(?48@;WMlOc1UOfMTeb!D0J4zCFNJl3_BwL~9DkE_4XxQmZeP(XwBAtCUhrdDJ?D31h0hC0_S;U{ z_QS+Y+~(X22e0K`=uf8d{u=|0c%RLXI74W_Svf5d@<)cY0>0hsd=(CT?7WRJuR19{ z-^xv`0&XsHJ}$xpaK6U!AYh{tNYW14TXD~FXLp$qxc7rau$9A^f#jRF3v3(2n?fZ_ zJFRsPI8Eyq+YZUPHyS1!rV0LcVqFmODLY`xGtS2#Das}z`GSQEiL$B!+X?xy5P(@H zoiD(IEN3|G%X4-S8Di-nTQ`PVzt%|02JdvHhqD2A>3ye9l=F$zJ(&5V)+VGF)BY~U zP>w)+529vhm;Oa9wz2oKihr+;(MO!6BHIh`jrDdA_q+9DNK#0WYA@LK1^kqs2yj|D zilmU+xpenKd~^K;@KqAq@m)9;^lu2OjyU6tw#fsfu)7oac9H@q#~l&(7aVB8Lp^uz zEOFLgbN;{PdV(?4>4g8k$@O4Csgt0Wk5K)}`81nzEIpdiR|nGR947BiuS)H%^eWW8 zn_ijP{PYUcZbOnyC~CdI zr>M0BN7C}%3l69Dw_q~0-v{R;(a&eWq0|-y2T^-8_$0Lj!GYB73J#$5|7r4$a(n-$ z?A`w) zQ>0~(a?_ZJqpv&P;NWuRaj8ATb*DYtztUyLyTc8E_Kq2P9vD?zbD+AeUk0DU2tdk4 zp*f_~G(v9uFytNFRgIMX=$7vEEl1l#J2m@_COyas#P94*Jb`(k4GC zgNFKi#PZ89M>-E@yMhIIeGG5INde0dih85+Ut1p(UqjMrgQ` zklW4pk&~l{J1gpkBzX`aqVW%CIv3g-j}bYiAoz|g8n;%bz!r)+J8R?XQTkYceFC|K zPVy}^b@DBzA>bi!q9pjebWaOj`ULQa|^Oz^B{l zZ;I?31Z4f*Ix(IO$zMRgt`iK?S??wiA|23lIv91+>0opL0xrD=_UWl_7uiJ!So(CF zouI#HVqhI_xwi@?|T9;8meATNGNi+T+jOCVL4~h0m$ep1N1K&tp#fc+z$~SxknJ09Lkw)tjBYi`$ zsN*rr8=&_SaN{I>0At@mZlq*FTD;y4`%c!kitIZm4N8?@&RW`snord~772&W{aC7j zal36@7>=8zgTSt0@HW@avY}EIz8=)CgiA?M*w^>beE%!DA4(F!-LK{8;V{uJ)u15O zH40$9o+w}2_Iz*{{xDy63-Z^*5S1k&_H*ymk+J7d41Z=UfY!%KIJCInh{H@dL3yYz6D zjBKBNm&rfUIKTfZo3!9x!H}6o4QPBoKSN;k{vk%Z5ONVnE}}+gX>UXB62ZijZ}beZ z&sC%+#(E(FV~*(*ZQOy<4}`r)PGLHO6&H*SIQ@h^pRv2Z7D)G?-J+-Am}(d_eFe=631{^FJAc-9g-au)u(JF4OH!zswAD!wyITfF5UewW z+wsKzsbaOskI{04Np_?|mxI>tT}NlU^n_83Vai=Si!lY_i@jCA7-W=z|Ell^_%BMM z;KEhG4;imeD(s|93P8~UfneTO^_w)7Xk`sg7`Q3)&^;vAE$DrhsL5DCF z1t(VtE{u87Aff$@C=(A?Hrg`gg5sa(^c_;nlD39V1miPdI?RqUs%OU;6(FumxD0VM zr3SDBZM7k%%ozvNkL zYot-67wxJATe55l%y~f%r<0PG7Hew*qc5`{=?`ZP6uhM;!-`(UOSqtsA=}tfm>FwK z5M`Z4stEal9t+0XdJQ;VMe;$>Q!WLoelmt6ngX#`_cv2?F3QoxDhy%$3L zs{!jSJ;FIid`LeM{R?c;C@JiBD4VaR{9Tohywxt+aQ3=X(C_NWT&pM!lYAI|POr?c z`at7rftIcGkQ6{)xL!iciAKo-MWO91Op1omqY^w&nQnMJ$*?$7A1t=b1*4NO9!i{g zB6fYs*eeid&px8VT*5r#6rmiCYT+<`y!RPCPOX2e2+)e0LdSRmZ1QM2PCEX@7B~X| z=Ahnn_B;`MS_=CGa=R;3Ht?^G`5@!Yj^!NVdOLWc8u& z2j@D%)P#nRazn6l{U>0$45?+l7bm z1{DVAb>YTYV>y4^1d27CaMhmk?ENNmSpW+kB9QLbbo|Rf$-zgXpF- zZ<;QraSu}Y;TG}*6x=l4)(U~FJ*uym*tNgME1!GOFkvA>&P(OhD)NbN-7;tYpyi zq;XuP%~EQQWz!6*wn}-R4gZT#nb|Qxd0SW zz6MQyGK$zE5S*gFirGIK<3-jDQjh3gJ_sl83!^Wd|J|V6ad%AKEX-l}!W|<`V2@() z9ifT7{BFkcJS*+7C5P?~gJQ3(JNWWk_3*jAuH_Ld1zkg2 z*9Cbn^%)L<4z`nc(rF7k9PV;x-VqS!WIG8ZH<=BK{I1&K&e5(?S)%m#E?y82$60^K zUlneDbYPT5VPU$f14CjeUx2%Ao62c>8Vg^dyHFJG_yuo|w>4l;^A*>Mol{+-CHYw? ztf0#SnL)`qSEPN+%8J2BR7ce8!TpDGU4x``u0~Kc$EC~s)H;^u@!S7Ht~Gf2An=~+ zBv#+xBBYoopG1KMiw*`$ zU9_>K@P7O7gJrIGk)=Z5fU7RVq}pac7J)RGU0S3OjE7jqD=9{_Hz3!O2os z(TE2RLVU{nd_EZiJzXb7Nb0B<@WwMXjx&pR$S(vNYh6xXJ?}d=E z%*I?7zx$`|1wwb{V6J7GMq6*5YZ3S!ah1UA1Fm$?-*qkJET&;@B_fDQ{Ww+;4ICCkDhn!wy_s5G2OK_WGqu>D(CA2t^g zUvkL|?N?mC3+zQmT<#*rc+EwQ@g>MSJ0v&#EI>(eU$9Hlq_88QvlG^Gy3etQdGzYyr(&DIoJ4nL@PKAe~p;U7!4?`-~{BZt5SUz`|$}QqPfY6xkZcs7B03j&>7({5H(1 z?`{PNmE7UjX&fhJElMeTmUSpi=E8cX#eX=N$~jq&(oDK*-_X*Z>>trG)(`m;NJO>M z+!uINs5F;%-GtIS{<|5ah5UC5q-OFNGiXM6EA?t|zgP59Hyt|juy(Bb92K+0x+!(u z(jCqNgd-wKl6b$hUVOZNvN6ujY}<8&T^Ac}cYnrfI+J(1sR&>f%_8n5iKbq6Qvt|DTI2Zl zi9ogo*nW2;yz!O09`-EYf_@L!2ksas*zI=0^e@~R_CDyQ3Yzy(I>M#07lOxV*80cY zpNqDAEfs&DnIDReyJN9^k^2xY>C8Rk_G0DJ?kgfIfTUme^k->$RtUX!yPIR{^X{V} z`v5ZcxEsUFz3yo2TjHj}_W_i?;u9Q%(#u2N;h5P9yQtO4x_`0y7f zz%fY;dzy|2HUrxBH47Y*N zznAgYbd$lSpU@NoG5om|_yh^(_X9JhaEfj4~T#FEeG7rYE8n*;fr;k2&|Gb8yN6+%16RR|6<3F@itDPowh%&ZWKX};%ooAS4MP!@Zv z*^L6-p{Bv->j^}`Ic}fVAopoA2F_16$+htZ#8^eVG2WyCtz)m4tr&=#%vyYqg%rA{ znG#-~WKx=mC~O{@`#Kh2I4q3+!hM9`nqhm}Qu0@bL@jkl)R-i4XG&AEr5<>cddTdlLhj$PBpf?0oQ= z{H0&HlSq%$zn{+m!O3h(rMLq&m_)qsJ zn6cNBLIG(dPYxvSH{YV_O{suu%pZ`LZTdKA(VU7sV)l1tCH_}Qh+!Ka|IYnYBId4y z=KqqwE(|O)M^Lfl9y9dO2mxR5Ii3#S%k|U--)K*>f6V$FjU$Ia&s*jI9DLSXD+;v7 zmmc&)lDod>>CES+RQ@P)+EP!{I{GCQe#euDlS<7D0R+io@rNZyVzZ0c5uRq8!jHsk z)f0jJ-ZYa$Ah9gVHaxZYqRuDGW{=55Bin%8Fh_&$6SIWMa?F~T@{5^8_E6E|fwWJ} z$DrD0=9frhp+Hef)F`tB)gh&shlFgOCxFHkF0>0ZJQ{8hJpCARa7onQbEpC*=3}m3 zvWkI2=E;!8lZKBnE3)i{9;zz(Q-~4Seou4Gz@)#d9)EEX%Z~Nf;hV|kH(Zisp>_Ss zszKQ==IQK~9vgIikK{uHN8-LSW=DYway|KBQC&Qj zX(dK`Dq!5lo&o{WUN>vA>~Wr!oQfl2c8bS=1M*CZ7WZ+_mmp5Qzq;*1tNS`9(idVK zB0n)p@2{@0*K=0Lo=J;aw92D}7WclWQiph66<9R*D|i;(H`V)|$UnxM%d+Qs3}{5= z%sDF!sa`j#_4U|s)F{siMu3s4B}tL%C||WjjC%?Syhf2jqQC0#o3lfrsD;T}JYhave_fB(AYeoK@tRDP}M8sIWfO%m?xp6?x~74$R|>Iq|dQ zo_Y*ARPc00vSgDHTD0X1ZEXcJJ=-|f+3@`;BDH9xhj5{^%cOV*XL~v@!jTe3)22yO z*h6};hh?wv7<|S7A+-px__)-tRiFtb#(DaP|KN)AS3i4`rxqvwi;z+@#>AkxRlt%I zld7M#d%T=;Iu_q&CB>}E0VbK!LgcRhw$D65B}@O#T0=(P(Uhl}A?6H9!o5fCpLCoK zI{$;eri?YY&tcUZ&$l9o2k$!q(v>5mEAKE*I78QZ&yNDtl}7FGWN{Ns3@Km5>>`hk zGxDWKpS+k&xsW5cY>pB3f5QAN`>e->z0aHXl`EewQ!6aoV|MtbNpeT}tiW1B;XX45 z;wpP~;J`x923~twyuv)o4X`HpP*1goy7U+(9P?~rR5j)sWl}9Y5f%C{MsClYbYo7{ ziI8|Z{AFw96vW+E?=*`Hv&UHv1z7RGo;Mf$tFJ)v6-`1)*b(w(dJb^aNV{(V*9trn zaM@+gGaNQbuIgDu`^y-U@^N8uXFf#(POBDDiq4q!z2^mqb%j8RH3b`Xu@nXuL|X*p zOtpu@zErCs4DM>ZfDM22e8#A7E-=}8m0+x2JOpEPgTPcP2AlroxoMLrmvhq2gO>J? z7iZabOtD@OIpibvpmUhzvCFfhu#IgVyx_udnw3SE(@w*>$k=SWdRcvz3d7Jyu(hCBXP@)@A&rqE(F}L*si|M)V64qP0y4C+T;$jXB#qe1_g1RzngHipJU8n=@u3~mm^6)Z1o zsbKX2-zqBr{)*O4D4K8e!!_NlVFDY%>#Hez?P+~yW5Xa}E|+~@t4O56uPB>E`OpCt z#h1xY*u&}oNvCWSBlol_QxP>u3P@7h;o~*dRQh7g(-A$xtfsO|YPec^uqLnYl7|s* zC!|xX_ED_|Qd-G##xj)=$Ri06wuV4j(AtW|80)8S+bGUWvlfs$*Qx<|b1jWaX&mB< zmPGMMSF0gZTwy&2tD0GU+_%D-8&cS(A*!Nv2#K{vSyst-JKXrivlR25vmR$`G?p*4 z5(sa~w8?O(m$e`G~fP)&QJ2-+EbKRJ&Wnq5ycIRWCxO0BCCn z1`N$p9j-356#L|Lsp<5&>dB`ch^iJB)x@`@bn@`W9!l^ZbQLg}iZaAJ{_im$A(rrFpOKCTBV zZnC}??a%rB%|jJGklD|Q!=8B-aZQ|dX9#)$L|X*kHDVK zK4^88?NZp{8JxM67(8fQr|(fPpcu-X-fm8SX2q~(#9uoFx3J&?yTFY1(q4fb5s^7oa z_o}s#@z1v97a{Nqq3J~IIfjwft*;n+33J26VJs`*Wc-hMduwl#+!CuFCb z^vRj=m^KenO086e;iC7B#1^i7o(fJ=25AF$X}JY)H>?cEK}~{W~$hwwbS|Qc% z(pO>DWKMEFBti)e&A^j)tN_XOdrIUbR`xazmkAE};l6AktCN??-F;qJlot?-S;#Ip z`_Sp}KP9)zQLF8}$q42uE>-G4Sy!k2Zwvu3R11gH^R5k*fBtCc?C<3NMK8F#c`b&V z4dpkj6lnVynd_gdEab;U8KC@kE0Gs5`u@&N&O@yUef29-J?LFN8E0;X&r9`o9a?)| z442(f*jvwLF`FN5#d#OoS1w6SchSdZPt&acoxi=!>~GE=nQlm7S-t3169{zl?y$e{ z^2l^u3R}`Eq+w9AlQ$5te0O*{)k}oFdT7q2HIBWyv$I!>U@K7S>7~!QILgL5j zEJoEe7K_klxJ0RtFnKMcp4N{*(i>FOG9la&xL^X$AS>K|0(?FA! zEwkeG(dl`n_g(~*O!{B+lKJGlQzPAil9#+=<&BxO(ml}UWpAG29qP0x5FmVMR90qd z6E5x!kH!x3ya(?ibY416Zb2!7|87NTsn^it3R2jDL0sP0J=a@Jlq-|4r_ldv!jd)K zj`r>Ir=(XRVNd+?R#m9{ws)6(+uVBT6{WCw{po&fWNW=bIH7Ji$LR~q5<4*=Z1yr6 z;c8BWMPu#l-a(37MGAX+3?BwJ?DO_x@=hXl59VI*5|};nl(#8t9VMyQsl+=pWEJmW zZYe1+eeOUUjH(H=irc+T^ z06E)@7BFX|RQ8v3)jsgf$E~Nl1HvP!QaY+#vvmT*$24Zvdpt(~f(Pvyq=e-o9eDHTd>GO?9DJ&zt8Th0M9U-A#gwI8tkG|71y*eczo@sXX z-o1N}+9tdOJa^SwUp=_IM>=I3c2sHh&i#3T=Do%DzXG}rL1AB8AM8ETHdDZp*S)d4 z4zA=g%CL4=ZflDD%e~3~vW@mP1XG1u0a3e={A)Eq90Of{6K|oLvIRphs6cpr0HXL#Y zBm`54fQcgakqA|C`276N5IoOTb_+VFR8wDSxwpOq+wZ32?wa#DywPLWN#UlJ1Y)|cv z!8X*M3$~`VG}w~bkAf|z-4kq1?e<`R+Vw#{wQocRo6%2Ruqm~LF2xHi7C!70hLzH!FKBdl4V^jD2R{;LPozZ6UNrJhGBUJXQW`A zMV;pY`_bMJzIe%52g*A6B5+!QbEasU*SvXK|8Uqm&Y6slcX6&2*{e|Eb=HFOkaZb}_Z7NyTidEb;!gen@_p`9Y)Oksqzcs|1Q|iE;MoI%rn5b+PIaRMi z={kE&jGp4WAhM8$-o4pBTGaSNS`*$Vjagfk0gWjm*e>`mx(-4O|In#{yzb>#{HBEN8c!Dq{dUN;;k@z5D( zYX%G66?;IRube}0%Ti|&V+9z~M1GV(pYzUl;fY%gJL)T(KQZdTMY#VoQa?pIWuwMKBva8Vy9DQSXkt&8Ct+j1k$|+?Y$%Fr&m7 z6d-Avb3D*1gCX;Zb1`RU9VD!GM!~W|rwe+ncY68%62QN~8I_xK$;sz<2oj2%N!Yo> zIp5CwaN;B9+l~#lx&~vdmf&wt*+@x%vIx08jPDxe#y7%9Z^LNZWpr)Cong)l0hhk& zoEoBQQ+Lm8jb>RumF8lCa+s z*}Ldi;rx~1ALTS1+X79R%QJBPTh15g*0*%ay44?O9zcI9xs>JEoC;i8?F{FF4zsas zz;fAqNLwmL;^qoxKanBC9~SFjqo1AY!>j?xvg<*vf75ZuZRgv9^*!QbCnSRWKBRf= z?cV!Mc8ctM*z>-e2px_)K7=RVr1ia)DL2MOpNfq`hO!Ix?BS0;;g8>D2Bgf8C5&>& z-w13s?D>$M72D-7^q0x!7&dmvry2VI_8jEzeCc=?_N2?h@Tx9v3S-T2d4&9wVBJAv zl;o!AUTAX6IRMgDi8^M~lxK)+FVx6(K8xd`<;5cVFz+*`3C~=2IAN{HWUjoQifmur z8RsF0{MGS5-s>cd`9-3NdL#KKf$fLPtztCZIZNsbtN(Beg2Ls_mtgWO$8I=Z<_tjd zSos7ykax!sK*!h4@eJ1n3r{ zMD$^Be;*?_f+x- z{87h2jGiW6VC)RIx3kwEsnqcU#M|UacsnTD1okDkcd<6ueujKdWM84Xm^EbBWRCo~ zz|O)RUH*hjm4@zf*3lkIH?UC*noS@zS+P)_DzVm3bFuusS2ZNON z1Q-7LnoK5fns_b4z*V^s!=|sxp9!oS+&ksFxPCc{Wbo{9$7{H4h1{F5uOX+aOb#_) zCWm?f+2oIifw1vX)@&eqx zQSK?Q?{WjrR>PWw^7nRjk(`#h8YG;O-^F9w<(4A5RAoL3u>Wp(lfW+Dw-_Xg*~;L! zQ*Mac_HwFzfDWH?b6U-oK)x!^gN(D{b^Pjp+<>tw_ss^#Y~rx|BYAw7)JC#ghSa&v zK@i~Y_LbaJWY;l9k(~n4)Da94&Nybn<_k3FPZ*=i>2&AM1%iYPauK9`ExrU-$IG$! z(f9IjiM5BOSLD%7;qJn*!3QPFn?oURMJDaMBG+>YxAzPQwv#M(J81&7wKVR-Bd zM{@z5T+bYk^oaZbWWFjN@Ru{W>bEr5pF@^0IpGC%GY*5xPy|e+_f_c zrXKLMW9TneJ`nI$4aF`o0i|eVT^Q?#n;RVs9)S4-k6r2i@8kuol~Mr@PFMEBcA9dEvFfm6go5~frqWGhHDJeRw5QX;U{66HJ57Bjq6z&{LLKBhbgr9tH#n0j1!8edqhWD7#= z7LYSjsSQg`Dn7{WuNat=uWYfix|ngmSCe7%TIGVk>Osy8r4&zXP+~<^A95}#O<|!| zRUo5C`4l}xN~ORWKyaNh7>90ER*G`Nr~H2Z$dOMu2ggDDL35`#b`!E|sq68^O+^)1TgX?!qp;2`rA%b)AVzbwgrT3< z3m`>v)_|x}_L)em;B%avoB?^Z24)Z5$@` zlq}bI5ZnzS9WF1hw(7%n%lPq982^N@O80KJxafR8wUzttCGy7QarRka=zXDih(dVqRC zV#$!IxE{gBhNv4w_6Vfvu5K{xlBmPE?dk|f`&?~{zo)1Ukv$5*UFuJev|ez-#zq1{ z+9cr`nSPF6*WT+QzkN8P~E!i@26_;uiZsuvo2&4M(Y8 zimX4T%y;FJ@~u+O!}M`#CVLG1Yt%S~ZPL|`ZEPTvE3O$hd!jm7WP_lfo2x7KoT6?Q z+2e4cs}>6>jfCEqnW;_}*R)Ylx2A8?()%nyhW$o@?YdFZDwxteQ-fV_Wu|9%;Z#=Ghs39d-N z0SlvC=~X;@&G2K$9&8W~!|X&AFzJugDpTA>!FC<9}5sgJT%zpCUX zgS1tW2KR&f?pnfsZ(rE`!)dA5>rfVuj&n9()(rd0-kh$01 z3QBtk9*Dlgp5g<}fsz5Pc;I z+C{Y?WJ(xggW?mhC6t!a(WJ14M(X^VIuK(wxG1>x%yU(; zWx8%t}W6sJck>EhGwB_*qQP(2a|D)>` z#=h&KaD6qmwQ$^6;d)er=g{>UTLS?*^I^)TwAJFyov!XyMu?y4BP^@2D;vo@Zxz^j zNHl~9%=}r67dTC;8QTDNVGNcy5c!h98u=9unDREZ=YM#&EOMMOrrGGgp?44Z!nXxuQkuT4MEG%z0UT zFr*lh{w~LLArWtZm^ak(|DqOK*w)+=zei&2i>`8!y$6YXv<{F^-FH1CDI`gC6ztmq z{^ovvfYZ`RB!%3{rHhdGm^K}vBg77TBaQ>jMgVr$FRt2lD;<^ZjN=XS? zM^Nhu4ySd!8yrUMufbGmD}pK1UI=CkrJv)$C#d}>_&BvC!9mn+4-TZZFvtVH|EF1} zPPAD6hqTlGDeIJ5>?jq)T~P3qv=gFE2!kOF>7W+%wRQzJpOYvyN_$OvjVtzU$oWVr zhO`Vl8={@k5=is8r{E};_6A3sbB;(IDWIV}-2Z{wfp@ZWfwqn}v_jAybZ0ayeFii1f2?Yd~U995reWh+6+E#F{Cz@2H@ao z+Ht#ekYu^~61Sj%D8KHj6d-DYG=qm@@6+`mrdIe4vDY&7i=6hJArs#R!FfUx^f%N# z5ecJ?ZlKSE^B1)VP-qKxW7<-Ukp8S@T9B~=kQi{a!t5*BdInLmUEz?wT2F?|*Mv5l zq{*S-4nn~w{W_<{DQ;_{?U$^N6G)m^Mbeqj&bXJTISj!y_S(2Pk|J9u9qy`+uP18H z2<&4hD0h)(>7tQmIRXJMAtjOBG&-*zh05n8LOFYB-;3-RbnuhQk4w@X4zoTXS-yJ$ zD%Wab@P~og0Ot4{Cj{vracvyO{W`;f$F(|+(s!E$2NR@_%8BU)!eH&Tm0)V|1f>7w z8-`C0(UytqBn0YdcUOz4bY%Vn0*y4nWQJ?qL;|S;O*J|tjne3p^eF@aT2JgdM%yZ~ z&mhoJdl{#tX*2EYG`K&J8$fY_tU=jT{n5O7bPmhEtef#zWxURE)i}=NVH!lbMQ89NUJQIY|fsagl@w^-XOvN9+SN)eE;iguw^OSGdR zLDL0Cr8=0f!~PJ%G0Qa&*w+}W=_d88cv8y6*9){uHfgA2`Su>b?_a0+p)ASffx>9b z2IKrv9SUOIBLUWG$<}YSycB#Ae_X411nXI1^IHu3u6;~K@}^J^uSM!^mUoGghJMsb z;rs|GbPW3rPVAQwF(F2uMxot7DGf7E>wB5j+Ryio=KdCb4mNxb6kLRLD67x<91WsGTE0{XX_a?;vZwn^Z z_9K)poi9w`kA8$ypF0Wr9pMtXim9`xUvBZuC?Hjzk9|*STN%5C(QEXX4A0jh=od>z z>kqM2r!^Z(L3U2N!>pHSoa_I}Caw54@We8`4m7) zg@S=;Ha(jnrah!6`dT3jV=rqIZ2SV{dxhOdPT^$+%Wv!P`0`b44r4cf&6Dmz*+C&1 zQl<(qP}o?ii7A!Zb9R=B$8TzW(OOA#{f6l^^@X$pljIBUYL5uw@0cE~_atFFLdw8t z!+A`9Nf5+8Ai0q?05){c!|y{GvZY_#kB1@RUnH`Qiyst6ptc1)U%Wlp^| z6U5t)9MBe5(Kd?~`~fK&e{|_4J-vhJem;L|)dxwxXalx+_3bukm}IHAm((Pcs!Kbb zWZBUsNRj{b3EYy${fm;-=br2)^<+qpyi6;2QtpE1U({!mdLCa9HCRXwfK1{fmHTYUk5&t4TGck-6r$3scc)E zPARD{NdA?@!0|T)H^#oKlhpo3lz|7^>FpUs&?gLc>^;>i8=^;xpnopB4AWBdNZREk z$XTL!A)!L}8WQSCjbS0$>qEY-)dnJ`Bd$x-2MJ7ulKK(>3p?#Z(zrRkshB@fPazRK zFD>EJDNynNH?6sPCdGT5-1T5nuH6Y4Z)-MG7x-w&Huu!~F%?p3(5bt4ua*kS$Lh0i zUT@uMC;TL*pZ=U^r2s_Ip{TYN2l{@k4t!NZiiXmeZYM@w6wWe;{!G7IC2qbwNp8sb zL8u4g&P$E%OCL%4s~D1+?P7TeIzhV~rKgejohecZw|s~F80^s`_dmE9#t3LE-))Z) zaNK;~S#CIz39P%+mD8SlpK>J1=h>wZlI3@(SgWP|LzR&H)ppu*&bk%QBK1_#DoLZO z8Ycd(Rc9DEN&i+LkiLAs6u{{ES{d;c0LvyDOrAjg3(T@Cir*fypMB8nE_g>f;+<7xO#~`L}W2g;?M>m zng1%0)rJyPTMfro2~8mFn&99TKnQmo3~twMki*+)Cojf8 zh5G>q6$@w$;o41oDS!L`oM@_1p0-%0JZ)phX)Jh={2!%}%68kU34H#?2=+hGQd<$4 zm!O0w)ehS>>pdXF=C1WxwoTf0L|<*Qj-mwhe|0OXxOnQ*6-zL?J(@OZq1N9wt7I(x zln969PlU~wP$<3$DOzw;wAuGOzSWo6t)nH&4;lYW zAyzPGaZNvBr8+996;`~i>!fOrNP}?fbv=(!4uZtKh+*C@`dERo4tlmQ5vSbLU!hzB zCU?;(JxJ@jUtsMpxtmVeus>IK1vU`eUorL|CEqoJVYt;DVQ0@^Kye=vtyI({b;R^C zZK(hhRK5l+40kDuhu~}4BFyu;$BHZg(l2TksshS;(&&d@Rd-WDIT2Gg3KF4(P&`+bphhmu4o4x-0NOR%)P zn^2h^5c9Cm6axwFkHV~DXf+1$36ro-cXyFseTW9=4Kb(WC~TJLJ}KsT>@pv;4;8|= zNg7G++%W5Nl4Wl!q$kP1&F zPF?QK5Fq=27KLSRxuY4Cfw(*JIUd1a4u6#2M+(Op$?lOMm3$N{9Uj89ZvX7|W9O0X zVk@NsPPpt;_~BpUu8z@%+*?BS`52z?@VnW-)6`yjYUu6&IN`H*hv-swBYbhZdubTK z&F-o0tAdrP1f|Cz5N|(@$6fZo{o%e2%{v$Zo$be=>;}&jC%Nm3+h)7Vtx_5>$jby0 zIP3TMtHJrBlcDq^mb~STXGlyH36y@aE1b2VSh9-lLTM@`&2NphH)c?GoqPGVCGJs@ z^?Aus{7{w5C>U}_IZ{_t3sP!+SIesV_vg9-DF@w6q2f)qW~GCv^wjEOf{%$f3Xw@%lx?y|!y$0qeH;p>$o210h(zIeYi{}^9~6IU z)vAWxhbiy635$Q4k41-ut!~=#M)9{lz`fhui6R>ffeY@25SwnF3{fw-`{S)$?umBm zc*%0a{2M=|g5%jWvB4K4OX;wx2O$Ai`LTQq2FAFLi;(h^Q-?R6wQ~@f{7WFs9Syc~ z?i8GH#GN6s=OFbL_gdUo>VC}5(!jOCeE<)icDEHNUEuEPz6J?DD^5tsbi1MK8GBdk zf7VU)BhN!B&tevLl6B7SP=<5L-IMIr7wI6@^FA@8!Bneq**(iK{;m4K36f=B^4}i* zz!#ol4im6IwGS1llyZ7Vi(bS6H^2L*QU*eIU%~>@K8g0^Qulm_e%f6I(=NEPKs)JP z%vqdBxFZonm38iEFzyX1Lb&{!J3?TSps0x>07Ku^2_oL2+Ofwi_YOOojLC1gH;3$~ z9KPM^4pM2S{Y}_v_w;2`FnN{R%FyBP{4OvmO4#Wpm#KKjWln>fZ`~CT9qtLkTe_!b znDr&ea^^3JNUR^j)asrU%*x@HAWAhocSV*(RTunsI!bjtXC2Z+$?{R?V1@OXdCst~ zOzJypL|jYANcVIhALSt*^$JXx;GsisoQDpgc8q#V5WyWK^MBVi9cHi z$&VUdNc-6nfq{M=D%Z+}%KjdLo(IyPLQWevvDaf@wILo#xG#e8$2~DvFU50CWVui> z$kP)1!#qyxJls<(5}bYRV^3{J+U=o)*(lFSj%gP?>50a=V?5^x(?%(cO9D_D&wrP| z>{isX!$i*kQGDI+hoSR5HQ=3go_08Rif0WkIGx?mLmA~v&!?jGjTZiqPI$Ew38~i% z4~lFVWOpFuqh@;uTV4*cdwAMXLds*q&aZM}R-ly4XL%E)#avkVt^dQx63$5hO3Uc3 zWn>NTrqh)s-l%;lJ;ow1NMwg7hLjV;pYEuIg+3BmHe5<)p`p9S3^$ictK%M}m!`JZ^{>;!(N! zu7kjn9>QaaJ%q=s$NDLJkaGt;^$0007~-kLg}Yk>|HmE$E`RKaU>l)mnCC%^KjPUZ zikq6Zg-s)9#)M}*8u(9o>f@v_p7jFMx$N;lwNE@hP$6jBQ=W#{b;x9Zdc=->HihaKE zP_4~YlrD0qyhp$W&HBI<&ljS7TN|f8(2`17uXy6HV})nGNF|^J-+Fvl{b$c5k!^<* z)1c{Z()4Tx)jfGyVY^$NLn7M=IcGf0V9Hrf?f3c_bS{4%CCQ-icR{&eMDdwj7zi^+ zLw7^sAGFvBWhBa;T}b_UDh6522UPpSU)TeQqCvTEuR*!+VsLje8erpU#%Yn2kWKO) zd&wsG?}rc*VN{2N#)c2$>KezXniGl|8>IXVjSHe|4i zR@A}>hwKLQPQcH}ISA#^2BB1O2BB0Rq11*CeF#!J81hoG0K5r6fKi6=pU!YCzee zG+FC@#t~60^*4vgugK)G2h+WTfyRd-I{|A)8Kk5`3^I$8gqRpjVZ%ytT5VGdDq8sj z*fFv)dclu0;ml{-3Q@p@f0Qs*Q&GGl3;o$X`!3-k`6Q1-I zQ@W zK_J+93{-e&pNpMk@bryThSCx~c{vni8BasSQezOG)<&BPpOhvEXL*^16|yo6FZw%r zOBrTwH^POy8AcsW2;H1T^YYodQ4~DQ(D`(|fCxClC-?>mUNK_ftEC1xH~xS)tA^L+ z8&u47c%9Lfv2P(JgH(=&d6h!@d_%&kiww#_5s9rrTiADaBHM_dFn5!&9Y1~7XvWz0 zTqY(aEjAt$V8h1-fn>9ccKm;CK2R5yx8xqp%`v*vdngpFUc$h3Qd3T}jdyRr$-5ky zoc~z>J#KpI-jgkj`)eqq`+-j_Gt~AQKMU*%1}}RvD2~Z6bUsZ9!2qMY8}c@g7od9{ zKG%WJTvsu0gwN&AFdTgFx_MiTh8q+B3)j7w)2RcoFxUJptAS4b@O#zS<8w?0JA_O|@T z+!y&cH=$RAcOVYAX{-_j={GF@#v4UW{EoK^r-G9Ivy4f+-|v`w(_4#F`y+2MKF_>V zIVb%A?&02#AZ51E7)go_G4J9%5s?Qe^?n>8{x&A>GKPyl(pr*NaZeI8IoWdv^f_Zt z4T6OrJ*Ig_LG({XSx9V1V#^hn1rmQTMnJ7!jSEObqQDr&%raV2Ra3sPUs&vo;Uwy) zJ4_Ph+0I@SH`Vr1L9{4&z4so`Jc__+JIeCHNC2V!MBDpfp5hIIdi?b&xrXKGBq-j6 zbN&2Z78v>8T%=YzlrJ`Z;3BRFt$nroiwYH{_f%drZ#X1#L({k+VX8NP zEr)oIiBv?ISm@moQoDQl%Ly^K#SsKM(|a3ZMtHv#n3v!2VZx8zVgWOE81-3RFK@`A zLh}8HtAf>s$)!e3QiT`17eMUirE<&vP}4D_3$OD|)j|S-sGp4Td%B>X^_~{;hR|x6 zZM+d7ZMY}U^r_xO0@acFTYF#SBauH1`8NL?V+P9`e$Nqvm@N;fZ8xel_BwFnEbnqs zkx{fxe@=gzakoRU+${2N^uI=Yy{ECfG2S-!`jCoj7xU7*GR*#)##r;ldmDwi@OL|K zC3oS}3h$HwdQW*mY(6U0Z5wEg z$tm8x;y-xfls>>EU5`sThO7UVVqUhl2Djse{LkGX>Kpu3u(J%Ry!v9;P(JRpTb_ z=6?DGfi;Jcb4ETSwDZ1)gUY?@X#RcooJq(g7I8za zE9QOVm9g4v?`1lQ@jZhK`4LRI?A^lX(~;;|2G#u&osEUOQg6t^hxVFdAz8Qn%a)#Z znlxbn-!3v+dK+TTo1}VF9LvC%|F3Qb$?Y@``KESIxXk+@*PYCJW^$#>`y4J2%x5{4 zmD=9>ChcZ(j3@FgdTVi|^>C4>A&=7qGi7tS#5zJC+nj(+Mwm_pXGMD$%wc9ac&~t$(npha1NxbT(6rgAE3n4~H=eK9^$F7Q-HS z^RZxtWZA>P>Ub`XdOE$=o32MG%R>K}2OznQxjr;5(zu;PpH9jf6M8eu7FH`oOK+=H>oS)xI_uzflCns( zKCV|KsTDk(ZKawN>kz`K%_ktUz}$@b9P=le{YlPI%hph^(yRl8D@~P4Y7F8#rbH$& z(rg0NcAGE4oBd5cez4n|5mMTr5YxuokHlUN>eSBcms>X0g&RxEY7|L^Q@QW^8%$nq zXHCJ%4Q3L7VmWpzoF8j$MRlp!-DV{NIu?Q#LkiaeN@Kz`(0ZHgF@Br5n;3q@?8W7? zpA$|1n3YhiN6dY&`E8PK!f_H}#5?9?figaU4@|-rN!kN(%3AXkfsKIZ2TcmZH<*pW ztTxHAIfPY)=81&MTTQ29%y6`Q#tdlqu0nkF3EXr|-bedZ)P z8_UO~&jgN`KZuU!{Qg#c;IC_&go{p_;SPzS%C#Jr>4-m+ zn_hv9%lpRcVx`Kz1(P{*Z7}$ac~v5GDeV%s*9p0-l62~dNxu3;eEb35+YFDmeQ^SO z`IFg@s$J9ll*6OK*6ga{PYGPHR4|pMh-)F~oa)3UZkVeW)xD<2X$CJ7ZiERpO*+F( z!pB?rR?)8at!l%<+vcMJdl`#=6B7s-8|-=~?nLYvhEXoxH;hfg0-HFLh=z%n3l zx%$OF=metkJfw#E-eQ?h;G$1xuKsFzptMA#^5C0hI#pSF#L$)+grW;-V@PS`>yI;P z`Z75D#jd;PYdQUSbvC9kUphlu9p7z<%~%Cg7n?R&9mwn9O-Rsu*^vLaD#7||Wa%W( zwT#V#^l2(>7GYH2p81BF$qUn<@ENL{d(!Z|#U)*js;$+noZw&BtiOx)ZL*dBkoZi< z)Ly~Na;h_i4u6>AImuKf--?!v&Bo)kd;yZ}53D98xAV2KSqX;z@t$lUcbJcA^b>qm z(K?-EIS<)wSKoWJzq~SdDXI_qZZJaJPB5wisTk?f{*56ZhU(!H-F>S;BC3F3gl~?(p&bkmPtNW-Fr>_?McXsmcYfb2bWh+&!M)Ju* z%tc50s4Ou4ao>W}us5{IT2wSwnmPH{-=v$3eTwG(=+-<{sVixX@&Q*s`p+7j(%zu*o9F7gqR^V-TgyKW+q}e=Bq~d& zOF`>aEdtHkw8>5QpdR{{`R;}>su_8Q+s~Rcb+Wurw#xU6_3fN`SqAi7?JJb?>7|u{ z0AXDtb934maBhdKHpZ{}*|ITPhM)N!0RYv$;fi*mZ;qXhoHwE?{mUnVff>K{9e1PRY z`f3aGwRbuS^C16}-WoE7OBH`vR`qM&9Nc`}H_#SVgK}maTCS!#ja1hFUZY0G*X6(a zo?_M_B5MZ(*J}ijuA{lr7SXq7DYtwSwe0*Go%Eeaq-4oXYzfhI!#hDz|FCFYHCeKz zMHb~aN}p|c=kDFRkp7^pHN5Bye?Zx_v}aaL$?{%}mTT@!3pDL-eEZu@*KR23XYY%B zrr4(ll*$T^NS3UwP+T{BK8&lbDq&AaL6)UvMdPlz;W}ecc(h*le5 Date: Tue, 16 Jun 2020 17:34:40 +0000 Subject: [PATCH 067/186] In the CLI, only interrupt tabular outputs at the end of a line. And print "Interrupt" on a line after stopping the output. FossilOrigin-Name: f3bd689336fecaa1e2928b826c6aedb0178d322f4633ac429dd1ae6fbc08e7f1 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/shell.c.in | 5 ++++- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index e2eae1f015..c5528e1a41 100644 --- a/manifest +++ b/manifest @@ -1,6 +1,6 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C Add\sa\stest\scase\scovering\sthe\sprevious\scheck-in\sto\sthe\stest/fuzzdata8.db\sfile. -D 2020-06-16T14:12:43.417 +C In\sthe\sCLI,\sonly\sinterrupt\stabular\soutputs\sat\sthe\send\sof\sa\sline.\s\sAnd\sprint\n"Interrupt"\son\sa\sline\safter\sstopping\sthe\soutput. +D 2020-06-16T17:34:40.898 F configure f594931bd7b23dad12db96b81e1dba43b41b30a4560d6eb008014e3d9f1617e8 x F configure.ac 13e4ecf89214c3aa0ba099a9e0178f13f03261ace627126737d8cee240ec5c1c F ext/fts3/fts3.c ad3416827315a5bef8d0e23d8e90bf29940fbec23ee78aa0c5d3caed85072dec @@ -10,7 +10,7 @@ F src/build.c 8245e69aa1a2f8b67e76203fdbaa9f88deccd89b5ed41f7097c202b920484fd0 F src/expr.c 36bb737d2ca78ee9bd4fde46cf1e51a37e7e1b263e55fccfaef32922a19e9524 F src/global.c 0409ae635839e0bef26a69b68be64126ab6cba62ac19bd7694f1652e591c4c17 F src/select.c 6ddd86a7272ff1f443bd9efcbb0f5ab590674d4c732e4cb8c3d5dd8e3a70cae6 -F src/shell.c.in c27ee0cd27e17db69257597f927301532a9f019445e3526828c78d348b6f0786 +F src/shell.c.in ffd3de9cb7294919fe1b56c49f9d62fc4b049015c4727c934f3d1880128c56e3 F src/sqliteInt.h 0a13c93b250270c5876da65c21963eaca60c5fc55271c313d5f6cf20547134af F src/test1.c e9f68f157f8fd027ee4c32c4b427f4eed274749bfb745427e2d954fa89d95ad3 F src/trigger.c 6b1472e6b5bbca71e13f95c61ebcd0b255450352de8254a42c40222020b7ac43 @@ -28,7 +28,7 @@ F test/where.test f5e62453537e5b335b69f3b09f8a02ce3328289fad5d866e25371284b837d7 F test/whereG.test 9363b2a97d914cb1b81aff5069ef0cf2a071a67e2b604eac6fe9c0114017d9aa F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c F test/without_rowid3.test 96426a6c9a2a5cf62bbe55ea1ad038eaaf4bf743f40a1ad517233b8e5a3d4339 -P a58a6d6fb241a50c4c7c9af8a9c65bc4746e905b2ae12290c7182afa944053a2 -R 384b84d5739143259cb7eea7bb108567 +P 95379da0e1ad5110648a5b3af24e7caab66a6f1ad6efdf374c83ae4ef1fed515 +R 7e790a0cce062c1755f55b7e661415e2 U drh -Z 99099ae802c1c7d548d28a65968661d6 +Z 7c2c29d35a69f3e3cd4c13d57f6827c3 diff --git a/manifest.uuid b/manifest.uuid index 4c7bec9a51..887f7e7e6e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -95379da0e1ad5110648a5b3af24e7caab66a6f1ad6efdf374c83ae4ef1fed515 \ No newline at end of file +f3bd689336fecaa1e2928b826c6aedb0178d322f4633ac429dd1ae6fbc08e7f1 \ No newline at end of file diff --git a/src/shell.c.in b/src/shell.c.in index 15f8c5e659..c527942212 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -3137,7 +3137,6 @@ static void exec_prepared_stmt_columnar( } } for(i=nColumn, j=0; icMode!=MODE_Column ){ utf8_printf(p->out, "%s", p->cMode==MODE_Box?BOX_13" ":"| "); } @@ -3149,6 +3148,7 @@ static void exec_prepared_stmt_columnar( if( j==nColumn-1 ){ utf8_printf(p->out, "%s", rowSep); j = -1; + if( seenInterrupt ) goto columnar_end; }else{ utf8_printf(p->out, "%s", colSep); } @@ -3159,6 +3159,9 @@ static void exec_prepared_stmt_columnar( print_box_row_separator(p, nColumn, BOX_12, BOX_124, BOX_14); } columnar_end: + if( seenInterrupt ){ + utf8_printf(p->out, "Interrupt\n"); + } sqlite3_free_table(azData); } From 74bbd37dae20ce353abf2b593f24d24713465be3 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 16 Jun 2020 19:51:56 +0000 Subject: [PATCH 068/186] Add new file doc/wal-lock.md, containing notes on wal-mode blocking locks. FossilOrigin-Name: c6b1d3a385751633d3ac1853e13d5e847185dd6432fb8b960a4080f61357c08c --- doc/wal-lock.md | 88 +++++++++++++++++++++++++++++++++++++++++++++++++ manifest | 13 ++++---- manifest.uuid | 2 +- 3 files changed, 96 insertions(+), 7 deletions(-) create mode 100644 doc/wal-lock.md diff --git a/doc/wal-lock.md b/doc/wal-lock.md new file mode 100644 index 0000000000..d74bb88b63 --- /dev/null +++ b/doc/wal-lock.md @@ -0,0 +1,88 @@ +# Wal-Mode Blocking Locks + +On some Unix-like systems, SQLite may be configured to use POSIX blocking locks +by: + + * building the library with SQLITE\_ENABLE\_SETLK\_TIMEOUT defined, and + * configuring a timeout in ms using the sqlite3\_busy\_timeout() API. + +Blocking locks may be advantageous as (a) waiting database clients do not +need to continuously poll the database lock, and (b) using blocking locks +facilitates transfer of OS priority between processes when a high priority +process is blocked by a lower priority one. + +Only read/write clients use blocking locks. Clients that have read-only access +to the \*-shm file nevery use blocking locks. + +Threads or processes that access a single database at a time never deadlock as +a result of blocking database locks. But it is of course possible for threads +that lock multiple databases simultaneously to do so. In most cases the OS will +detect the deadlock and return an error. + +## Wal Recovery + +Wal database "recovery" is a process required when the number of connected +database clients changes from zero to one. In this case, a client is +considered to connect to the database when it first reads data from it. +Before recovery commences, an exclusive WRITER lock is taken. + +Without blocking locks, if two clients attempt recovery simultaneously, one +fails to obtain the WRITER lock and either invokes the busy-handler callback or +returns SQLITE\_BUSY to the user. With blocking locks configured, the second +client blocks on the WRITER lock. + +## Database Readers + +Usually, read-only are not blocked by any other database clients, so they +have no need of blocking locks. + +If a read-only transaction is being opened on a snapshot, the CHECKPOINTER +lock is required briefly as part of opening the transaction (to check that a +checkpointer is not currently overwriting the snapshot being opened). A +blocking lock is used to obtain the CHECKPOINTER lock in this case. A snapshot +opener may therefore block on and transfer priority to a checkpointer in some +cases. + +## Database Writers + +A database writer must obtain the exclusive WRITER lock. It uses a blocking +lock to do so if any of the following are true: + + * the transaction is an implicit one consisting of a single DML or DDL + statement, or + * the transaction is opened using BEGIN IMMEDIATE or BEGIN EXCLUSIVE, or + * the first SQL statement executed following the BEGIN command is a DML or + DDL statement (not a read-only statement like a SELECT). + +In other words, in all cases except when an open read-transaction is upgraded +to a write-transaction. In that case a non-blocking lock is used. + +## Database Checkpointers + +Database checkpointers takes the following locks, in order: + + * The exclusive CHECKPOINTER lock. + * The exclusive WRITER lock (FULL, RESTART and TRUNCATE only). + * Exclusive lock on read-mark slots 1-N. These are immediately released after being taken. + * Exclusive lock on read-mark 0. + * Exclusive lock on read-mark slots 1-N again. These are immediately released + after being taken (RESTART and TRUNCATE only). + +All of the above use blocking locks. + +## Summary + +With blocking locks configured, the only cases in which clients should see an +SQLITE\_BUSY error are: + + * if the OS does not grant a blocking lock before the configured timeout + expires, and + * when an open read-transaction is upgraded to a write-transaction. + +In all other cases the blocking locks implementation should prevent clients +from having to handle SQLITE\_BUSY errors and facilitate appropriate transfer +of priorities between competing clients. + +Clients that lock multiple databases simultaneously must be wary of deadlock. + + diff --git a/manifest b/manifest index c5528e1a41..1c62e7fa0f 100644 --- a/manifest +++ b/manifest @@ -1,8 +1,9 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C In\sthe\sCLI,\sonly\sinterrupt\stabular\soutputs\sat\sthe\send\sof\sa\sline.\s\sAnd\sprint\n"Interrupt"\son\sa\sline\safter\sstopping\sthe\soutput. -D 2020-06-16T17:34:40.898 +C Add\snew\sfile\sdoc/wal-lock.md,\scontaining\snotes\son\swal-mode\sblocking\slocks. +D 2020-06-16T19:51:56.187 F configure f594931bd7b23dad12db96b81e1dba43b41b30a4560d6eb008014e3d9f1617e8 x F configure.ac 13e4ecf89214c3aa0ba099a9e0178f13f03261ace627126737d8cee240ec5c1c +F doc/wal-lock.md 781726aaba20bafeceb7ba9f91d5c98c6731691b30c954e37cf0b49a053d461d F ext/fts3/fts3.c ad3416827315a5bef8d0e23d8e90bf29940fbec23ee78aa0c5d3caed85072dec F src/alter.c b8ffe4acd48b4fe793d01901f28fd4f3b037854a0e99f0c977738556c31b9d2b F src/btree.c f3a4479b0dba3a59a1d156d973be41fc1ccb3dbdb69151c4c62a791d86c9ffe2 @@ -28,7 +29,7 @@ F test/where.test f5e62453537e5b335b69f3b09f8a02ce3328289fad5d866e25371284b837d7 F test/whereG.test 9363b2a97d914cb1b81aff5069ef0cf2a071a67e2b604eac6fe9c0114017d9aa F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c F test/without_rowid3.test 96426a6c9a2a5cf62bbe55ea1ad038eaaf4bf743f40a1ad517233b8e5a3d4339 -P 95379da0e1ad5110648a5b3af24e7caab66a6f1ad6efdf374c83ae4ef1fed515 -R 7e790a0cce062c1755f55b7e661415e2 -U drh -Z 7c2c29d35a69f3e3cd4c13d57f6827c3 +P f3bd689336fecaa1e2928b826c6aedb0178d322f4633ac429dd1ae6fbc08e7f1 +R 20b349aca00331020aae5b577df5847f +U dan +Z 109a0399a3983dd11a4da8f364e04d14 diff --git a/manifest.uuid b/manifest.uuid index 887f7e7e6e..863cc43bb7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f3bd689336fecaa1e2928b826c6aedb0178d322f4633ac429dd1ae6fbc08e7f1 \ No newline at end of file +c6b1d3a385751633d3ac1853e13d5e847185dd6432fb8b960a4080f61357c08c \ No newline at end of file From 5d237bfab14b5bfa2036f588ddd77662e837ca91 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 17 Jun 2020 14:14:11 +0000 Subject: [PATCH 069/186] Fix a problem with retrying constraint failures within sqlite3changeset_apply() calls with the SQLITE_CHANGESET_INVERT flag is set. FossilOrigin-Name: d73e857b833dfc29400049ca7f01ca465f980466e3aa67214c3c5e5573181419 --- ext/session/session_common.tcl | 4 ++-- ext/session/sessioninvert.test | 24 ++++++++++++++++++++++++ ext/session/sqlite3session.c | 6 +++++- manifest | 13 ++++++++----- manifest.uuid | 2 +- 5 files changed, 40 insertions(+), 9 deletions(-) diff --git a/ext/session/session_common.tcl b/ext/session/session_common.tcl index ceffdad4ba..c52ac457c0 100644 --- a/ext/session/session_common.tcl +++ b/ext/session/session_common.tcl @@ -172,8 +172,8 @@ proc compare_db {db1 db2} { set data1 [$db1 eval $sql] set data2 [$db2 eval $sql] if {$data1 != $data2} { - puts "$data1" - puts "$data2" + puts "$db1: $data1" + puts "$db2: $data2" error "table $tbl data mismatch" } } diff --git a/ext/session/sessioninvert.test b/ext/session/sessioninvert.test index 49205f6b26..b7c157d2e7 100644 --- a/ext/session/sessioninvert.test +++ b/ext/session/sessioninvert.test @@ -155,5 +155,29 @@ do_test 3.2 { compare_db db db2 } {} +#------------------------------------------------------------------------- +# +reset_db +do_execsql_test 4.0 { + CREATE TABLE t1(a INTEGER PRIMARY KEY, b UNIQUE); + INSERT INTO t1 VALUES(1, 'one'); + INSERT INTO t1 VALUES(2, 'two'); + INSERT INTO t1 VALUES(3, 'three'); + INSERT INTO t1 VALUES(4, 'four'); +} + +do_invert_test 4.1 { + DELETE FROM t1; + INSERT INTO t1 VALUES(1, 'two'); + INSERT INTO t1 VALUES(2, 'five'); + INSERT INTO t1 VALUES(3, 'one'); + INSERT INTO t1 VALUES(4, 'three'); +} { + {UPDATE t1 0 X. {i 1 t two} {{} {} t one}} + {UPDATE t1 0 X. {i 2 t five} {{} {} t two}} + {UPDATE t1 0 X. {i 3 t one} {{} {} t three}} + {UPDATE t1 0 X. {i 4 t three} {{} {} t four}} +} + finish_test diff --git a/ext/session/sqlite3session.c b/ext/session/sqlite3session.c index 78cc5875cd..cb350ab2d4 100644 --- a/ext/session/sqlite3session.c +++ b/ext/session/sqlite3session.c @@ -3479,6 +3479,7 @@ struct SessionApplyCtx { u8 *abPK; /* Boolean array - true if column is in PK */ int bStat1; /* True if table is sqlite_stat1 */ int bDeferConstraints; /* True to defer constraints */ + int bInvertConstraints; /* Invert when iterating constraints buffer */ SessionBuffer constraints; /* Deferred constraints are stored here */ SessionBuffer rebase; /* Rebase information (if any) here */ u8 bRebaseStarted; /* If table header is already in rebase */ @@ -4251,7 +4252,9 @@ static int sessionRetryConstraints( SessionBuffer cons = pApply->constraints; memset(&pApply->constraints, 0, sizeof(SessionBuffer)); - rc = sessionChangesetStart(&pIter2, 0, 0, cons.nBuf, cons.aBuf, 0); + rc = sessionChangesetStart( + &pIter2, 0, 0, cons.nBuf, cons.aBuf, pApply->bInvertConstraints + ); if( rc==SQLITE_OK ){ size_t nByte = 2*pApply->nCol*sizeof(sqlite3_value*); int rc2; @@ -4318,6 +4321,7 @@ static int sessionChangesetApply( pIter->in.bNoDiscard = 1; memset(&sApply, 0, sizeof(sApply)); sApply.bRebase = (ppRebase && pnRebase); + sApply.bInvertConstraints = !!(flags & SQLITE_CHANGESETAPPLY_INVERT); sqlite3_mutex_enter(sqlite3_db_mutex(db)); if( (flags & SQLITE_CHANGESETAPPLY_NOSAVEPOINT)==0 ){ rc = sqlite3_exec(db, "SAVEPOINT changeset_apply", 0, 0, 0); diff --git a/manifest b/manifest index 1c62e7fa0f..08766c3872 100644 --- a/manifest +++ b/manifest @@ -1,10 +1,13 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C Add\snew\sfile\sdoc/wal-lock.md,\scontaining\snotes\son\swal-mode\sblocking\slocks. -D 2020-06-16T19:51:56.187 +C Fix\sa\sproblem\swith\sretrying\sconstraint\sfailures\swithin\ssqlite3changeset_apply()\scalls\swith\sthe\sSQLITE_CHANGESET_INVERT\sflag\sis\sset. +D 2020-06-17T14:14:11.666 F configure f594931bd7b23dad12db96b81e1dba43b41b30a4560d6eb008014e3d9f1617e8 x F configure.ac 13e4ecf89214c3aa0ba099a9e0178f13f03261ace627126737d8cee240ec5c1c F doc/wal-lock.md 781726aaba20bafeceb7ba9f91d5c98c6731691b30c954e37cf0b49a053d461d F ext/fts3/fts3.c ad3416827315a5bef8d0e23d8e90bf29940fbec23ee78aa0c5d3caed85072dec +F ext/session/session_common.tcl f613174665456b2d916ae8df3e5735092a1c1712f36f46840172e9a01e8cc53e +F ext/session/sessioninvert.test 04075517a9497a80d39c495ba6b44f3982c7371129b89e2c52219819bc105a25 +F ext/session/sqlite3session.c fc8c6c13dc0456943ff24abf574ced10418eec66a548c97d3eafbebe9fc5e908 F src/alter.c b8ffe4acd48b4fe793d01901f28fd4f3b037854a0e99f0c977738556c31b9d2b F src/btree.c f3a4479b0dba3a59a1d156d973be41fc1ccb3dbdb69151c4c62a791d86c9ffe2 F src/build.c 8245e69aa1a2f8b67e76203fdbaa9f88deccd89b5ed41f7097c202b920484fd0 @@ -29,7 +32,7 @@ F test/where.test f5e62453537e5b335b69f3b09f8a02ce3328289fad5d866e25371284b837d7 F test/whereG.test 9363b2a97d914cb1b81aff5069ef0cf2a071a67e2b604eac6fe9c0114017d9aa F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c F test/without_rowid3.test 96426a6c9a2a5cf62bbe55ea1ad038eaaf4bf743f40a1ad517233b8e5a3d4339 -P f3bd689336fecaa1e2928b826c6aedb0178d322f4633ac429dd1ae6fbc08e7f1 -R 20b349aca00331020aae5b577df5847f +P c6b1d3a385751633d3ac1853e13d5e847185dd6432fb8b960a4080f61357c08c +R 1c31ce9492a1552b437bdc6502d1c44a U dan -Z 109a0399a3983dd11a4da8f364e04d14 +Z 7c6b85ada24210dbbf9cdb2233bd591e diff --git a/manifest.uuid b/manifest.uuid index 863cc43bb7..47d4d0968d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c6b1d3a385751633d3ac1853e13d5e847185dd6432fb8b960a4080f61357c08c \ No newline at end of file +d73e857b833dfc29400049ca7f01ca465f980466e3aa67214c3c5e5573181419 \ No newline at end of file From 0ad1b3284a241336fee692fc555b2ca5567e043b Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 17 Jun 2020 14:54:06 +0000 Subject: [PATCH 070/186] Fix an assert() in fts3 that could fail when processing a corrupt record. FossilOrigin-Name: 4adc0a1b0d84c2df6d6bf0d5d9d3fa9f7d048af8d232c4beb77518727890f212 --- ext/fts3/fts3.c | 2 +- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fts3corrupt4.test | 11 +++++++++++ 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index d03e7eefb3..afea064cb2 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -2338,7 +2338,7 @@ static int fts3PoslistPhraseMerge( /* Never set both isSaveLeft and isExact for the same invocation. */ assert( isSaveLeft==0 || isExact==0 ); - assert( p!=0 && *p1!=0 && *p2!=0 ); + assert_fts3_nc( p!=0 && *p1!=0 && *p2!=0 ); if( *p1==POS_COLUMN ){ p1++; p1 += fts3GetVarint32(p1, &iCol1); diff --git a/manifest b/manifest index 08766c3872..c0d32fa03d 100644 --- a/manifest +++ b/manifest @@ -1,10 +1,10 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C Fix\sa\sproblem\swith\sretrying\sconstraint\sfailures\swithin\ssqlite3changeset_apply()\scalls\swith\sthe\sSQLITE_CHANGESET_INVERT\sflag\sis\sset. -D 2020-06-17T14:14:11.666 +C Fix\san\sassert()\sin\sfts3\sthat\scould\sfail\swhen\sprocessing\sa\scorrupt\srecord. +D 2020-06-17T14:54:06.215 F configure f594931bd7b23dad12db96b81e1dba43b41b30a4560d6eb008014e3d9f1617e8 x F configure.ac 13e4ecf89214c3aa0ba099a9e0178f13f03261ace627126737d8cee240ec5c1c F doc/wal-lock.md 781726aaba20bafeceb7ba9f91d5c98c6731691b30c954e37cf0b49a053d461d -F ext/fts3/fts3.c ad3416827315a5bef8d0e23d8e90bf29940fbec23ee78aa0c5d3caed85072dec +F ext/fts3/fts3.c b0e864379ff9bdc375b6a1c5e401f79f993cc9387978aa11ba87b0c1ef73ce2e F ext/session/session_common.tcl f613174665456b2d916ae8df3e5735092a1c1712f36f46840172e9a01e8cc53e F ext/session/sessioninvert.test 04075517a9497a80d39c495ba6b44f3982c7371129b89e2c52219819bc105a25 F ext/session/sqlite3session.c fc8c6c13dc0456943ff24abf574ced10418eec66a548c97d3eafbebe9fc5e908 @@ -23,7 +23,7 @@ F src/vdbe.c 985f92b5131d62654c3c26062a2e55b1c8f71c2e10497e23021c6650d5c392b3 F src/vtab.c 33ecf1d8b0fd1508fe23be9da40e48909c86a13db2725e273177eb47db2fc265 F src/window.c 88a63e6948ea924b3cf9ad8aff5ea1fa53bebdb2f13340867205fda16ed0f19c F test/fts3corrupt2.test e318f0676e5e78d5a4b702637e2bb25265954c08a1b1e4aaf93c7880bb0c67d0 -F test/fts3corrupt4.test 000cc36cf50f61e51a3ae35748ea883674a9d8b797880975e10866849eefb404 +F test/fts3corrupt4.test 4664c72bb49400b6f3d86627760129ee7962e4834869909c55037ff21ccd36b8 F test/fuzzdata8.db e7a6a1444adb7bd10dec870234979ddd63173314c7345e3def2d892dcf99d48f F test/istrue.test 06f92ea38750fa74df7dbbe6920205251c2310861fbbe23a3adfa918a2e2ba74 F test/select3.test c49fbb758903f3718e2de5aa4655eda4838131cbea24a86db908f8b6889aa68c @@ -32,7 +32,7 @@ F test/where.test f5e62453537e5b335b69f3b09f8a02ce3328289fad5d866e25371284b837d7 F test/whereG.test 9363b2a97d914cb1b81aff5069ef0cf2a071a67e2b604eac6fe9c0114017d9aa F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c F test/without_rowid3.test 96426a6c9a2a5cf62bbe55ea1ad038eaaf4bf743f40a1ad517233b8e5a3d4339 -P c6b1d3a385751633d3ac1853e13d5e847185dd6432fb8b960a4080f61357c08c -R 1c31ce9492a1552b437bdc6502d1c44a +P d73e857b833dfc29400049ca7f01ca465f980466e3aa67214c3c5e5573181419 +R fad1962efa665077ebb220317fee79c1 U dan -Z 7c6b85ada24210dbbf9cdb2233bd591e +Z 22b7adc607746dfc70b52eaa1489f89e diff --git a/manifest.uuid b/manifest.uuid index 47d4d0968d..1ddf30e06a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d73e857b833dfc29400049ca7f01ca465f980466e3aa67214c3c5e5573181419 \ No newline at end of file +4adc0a1b0d84c2df6d6bf0d5d9d3fa9f7d048af8d232c4beb77518727890f212 \ No newline at end of file diff --git a/test/fts3corrupt4.test b/test/fts3corrupt4.test index c79a5a2379..27b4eb53b6 100644 --- a/test/fts3corrupt4.test +++ b/test/fts3corrupt4.test @@ -6112,4 +6112,15 @@ do_execsql_test 40.2 { set sqlite_fts3_enable_parentheses $saved +#------------------------------------------------------------------------- +reset_db +do_execsql_test 41.1 { + CREATE VIRTUAL TABLE t1 USING fts3(a,b,c); + INSERT INTO t1_segdir VALUES(0,0,0,0,'0 835',X'000130120106000106000106001f030001030001030000083230313630363039090107000107000107000001340901050001050001050000013509010400010400010400010730303030303030091c0400010400010400000662696e6172793c0301020200030102020003010202000301020200030102020003010202000301020200030102020003010202000301020200030102020003010202000008636f3870696c657209010200010200010200000664627374617409070300010300010300010465627567090402000102000102000006656e61626c653f07020001020001020001020001020001020001020001020001020001030001010002020001020001020001020001120001020001020001020001020001020001087874656e73696f6e091f0400010400010400000466747334090a0300010300010400030135090d03000103000103000003676363090103000103000103000106656f706f6c790910030001030001030000056a736f6e310913030001030001030000046c6f6164091f030001030001030000036d6178091c02000102000102000105656d6f7279091c03000103000103000304737973350916030001030001030000066e6f636173653c02010202000301020200030102020003010202000301020200030102020003010202000301020200030102020003010202000301020200030102020000046f6d6974091f020001020001020000057274726565091903000103000103000302696d3c010102020003010202000301020200030102020003010202000301020200030102020003010202000301020200030102020003010202000301020200000a746872656164736166650922020001020001020000047674616209070400010400010400000178b401010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200'); +} + +do_execsql_test 41.2 { + SELECT offsets(t1) FROM t1 WHERE t1 MATCH 'rtree ner "json1^enable"'; +} + finish_test From 877859f2d36990bc06b4a37b82c9739e916c10d5 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 17 Jun 2020 20:29:56 +0000 Subject: [PATCH 071/186] Fix an assert() that could fail when operating on a database with a corrupt schema. FossilOrigin-Name: 4a340c9bc7d939efc947e3b17ca79314482f74368b15567dd089d40e4270890e --- manifest | 13 +++---- manifest.uuid | 2 +- src/btree.c | 4 ++- test/corruptL.test | 84 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 95 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index c0d32fa03d..b8bd183351 100644 --- a/manifest +++ b/manifest @@ -1,6 +1,6 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C Fix\san\sassert()\sin\sfts3\sthat\scould\sfail\swhen\sprocessing\sa\scorrupt\srecord. -D 2020-06-17T14:54:06.215 +C Fix\san\sassert()\sthat\scould\sfail\swhen\soperating\son\sa\sdatabase\swith\sa\scorrupt\sschema. +D 2020-06-17T20:29:56.720 F configure f594931bd7b23dad12db96b81e1dba43b41b30a4560d6eb008014e3d9f1617e8 x F configure.ac 13e4ecf89214c3aa0ba099a9e0178f13f03261ace627126737d8cee240ec5c1c F doc/wal-lock.md 781726aaba20bafeceb7ba9f91d5c98c6731691b30c954e37cf0b49a053d461d @@ -9,7 +9,7 @@ F ext/session/session_common.tcl f613174665456b2d916ae8df3e5735092a1c1712f36f468 F ext/session/sessioninvert.test 04075517a9497a80d39c495ba6b44f3982c7371129b89e2c52219819bc105a25 F ext/session/sqlite3session.c fc8c6c13dc0456943ff24abf574ced10418eec66a548c97d3eafbebe9fc5e908 F src/alter.c b8ffe4acd48b4fe793d01901f28fd4f3b037854a0e99f0c977738556c31b9d2b -F src/btree.c f3a4479b0dba3a59a1d156d973be41fc1ccb3dbdb69151c4c62a791d86c9ffe2 +F src/btree.c e6db473ab10c52d1bc51dd8d21795dde07b7502426314b91d9d246a714e50416 F src/build.c 8245e69aa1a2f8b67e76203fdbaa9f88deccd89b5ed41f7097c202b920484fd0 F src/expr.c 36bb737d2ca78ee9bd4fde46cf1e51a37e7e1b263e55fccfaef32922a19e9524 F src/global.c 0409ae635839e0bef26a69b68be64126ab6cba62ac19bd7694f1652e591c4c17 @@ -22,6 +22,7 @@ F src/vacuum.c b196258ea36cfed5f455f18519345613bab04daf0e038a63ee715407c5a7ae9e F src/vdbe.c 985f92b5131d62654c3c26062a2e55b1c8f71c2e10497e23021c6650d5c392b3 F src/vtab.c 33ecf1d8b0fd1508fe23be9da40e48909c86a13db2725e273177eb47db2fc265 F src/window.c 88a63e6948ea924b3cf9ad8aff5ea1fa53bebdb2f13340867205fda16ed0f19c +F test/corruptL.test 16564fa7961fcce242945177c9bdaa5cb5dc85d6248612dbe4b927d059eb6014 F test/fts3corrupt2.test e318f0676e5e78d5a4b702637e2bb25265954c08a1b1e4aaf93c7880bb0c67d0 F test/fts3corrupt4.test 4664c72bb49400b6f3d86627760129ee7962e4834869909c55037ff21ccd36b8 F test/fuzzdata8.db e7a6a1444adb7bd10dec870234979ddd63173314c7345e3def2d892dcf99d48f @@ -32,7 +33,7 @@ F test/where.test f5e62453537e5b335b69f3b09f8a02ce3328289fad5d866e25371284b837d7 F test/whereG.test 9363b2a97d914cb1b81aff5069ef0cf2a071a67e2b604eac6fe9c0114017d9aa F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c F test/without_rowid3.test 96426a6c9a2a5cf62bbe55ea1ad038eaaf4bf743f40a1ad517233b8e5a3d4339 -P d73e857b833dfc29400049ca7f01ca465f980466e3aa67214c3c5e5573181419 -R fad1962efa665077ebb220317fee79c1 +P 4adc0a1b0d84c2df6d6bf0d5d9d3fa9f7d048af8d232c4beb77518727890f212 +R d5c913bb4696618860d8e215a52de60c U dan -Z 22b7adc607746dfc70b52eaa1489f89e +Z 29e5aef02689c7bbd9ca814e67e739ba diff --git a/manifest.uuid b/manifest.uuid index 1ddf30e06a..8e41a9dab6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4adc0a1b0d84c2df6d6bf0d5d9d3fa9f7d048af8d232c4beb77518727890f212 \ No newline at end of file +4a340c9bc7d939efc947e3b17ca79314482f74368b15567dd089d40e4270890e \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index f9fb69f63b..0ed295e0aa 100644 --- a/src/btree.c +++ b/src/btree.c @@ -200,16 +200,18 @@ static int hasSharedCacheTableLock( ** table. */ if( isIndex ){ HashElem *p; + int bSeen = 0; for(p=sqliteHashFirst(&pSchema->idxHash); p; p=sqliteHashNext(p)){ Index *pIdx = (Index *)sqliteHashData(p); if( pIdx->tnum==(int)iRoot ){ - if( iTab ){ + if( bSeen ){ /* Two or more indexes share the same root page. There must ** be imposter tables. So just return true. The assert is not ** useful in that case. */ return 1; } iTab = pIdx->pTable->tnum; + bSeen = 1; } } }else{ diff --git a/test/corruptL.test b/test/corruptL.test index 67d308abca..3c26f1d215 100644 --- a/test/corruptL.test +++ b/test/corruptL.test @@ -1182,5 +1182,89 @@ do_catchsql_test 14.2 { ALTER TABLE t1 RENAME TO alkjalkjdfiiiwuer987lkjwer82mx97sf98788s9789s; } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +reset_db +do_test 15.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-3afa1ca9e9c1bd.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 00 00 00 00 00 00 00 00 06 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 06 0e 88 00 0f b8 0f 6d ...............m +| 112: 0f 3a 0f 0b 0e d5 0e 88 01 00 00 00 00 00 00 00 .:.............. +| 3712: 00 00 00 00 00 00 00 00 4b 06 06 17 25 25 01 5b ........K...%%.[ +| 3728: 74 61 62 6c 65 73 71 6c 69 74 65 5f 73 74 61 74 tablesqlite_stat +| 3744: 31 73 71 6c 69 74 65 5f 73 74 61 74 31 07 43 52 1sqlite_stat1.CR +| 3760: 45 41 54 45 20 54 41 42 4c 45 20 73 71 6c 69 74 EATE TABLE sqlit +| 3776: 65 5f 73 74 61 74 31 28 74 62 6c 2c 69 64 78 2c e_stat1(tbl,idx, +| 3792: 73 74 61 74 29 34 05 06 17 13 11 01 53 69 6e 64 stat)4......Sind +| 3808: 65 78 63 31 63 63 31 06 43 52 45 41 54 45 20 55 exc1cc1.CREATE U +| 3824: 4e 49 51 55 45 20 49 4e 44 45 58 20 63 31 63 20 NIQUE INDEX c1c +| 3840: 4f 4e 20 63 31 28 63 2c 20 62 29 2d 04 06 17 13 ON c1(c, b)-.... +| 3856: 11 01 45 69 6e 64 65 78 63 31 64 63 31 05 43 52 ..Eindexc1dc1.CR +| 3872: 45 41 54 45 20 49 4e 44 45 58 20 63 31 64 20 4f EATE INDEX c1d O +| 3888: 4e 20 63 31 28 64 2c 20 62 29 31 03 06 17 13 11 N c1(d, b)1..... +| 3904: 01 4d 69 6e 64 65 78 62 31 63 62 31 05 43 52 45 .Mindexb1cb1.CRE +| 3920: 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58 ATE UNIQUE INDEX +| 3936: 20 62 31 63 20 4f 4e 20 62 31 28 63 29 49 02 06 b1c ON b1(c)I.. +| 3952: 17 11 11 0f 7f 74 61 62 6c 65 63 31 63 31 03 43 .....tablec1c1.C +| 3968: 52 45 41 54 45 20 54 41 42 4c 45 20 63 31 28 61 REATE TABLE c1(a +| 3984: 20 49 4e 54 20 50 52 49 4d 41 52 59 20 4b 45 59 INT PRIMARY KEY +| 4000: 2c 20 62 2c 20 63 2c 20 64 29 20 57 49 54 48 4f , b, c, d) WITHO +| 4016: 55 54 20 52 4f 57 49 44 46 01 06 17 11 11 01 79 UT ROWIDF......y +| 4032: 74 61 62 6c 65 62 31 62 31 02 43 52 45 41 54 45 tableb1b1.CREATE +| 4048: 20 54 41 42 4c 45 20 62 31 28 61 20 49 4e 54 20 TABLE b1(a INT +| 4064: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 2c 20 PRIMARY KEY, b, +| 4080: 63 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 c) WITHOUT ROWID +| page 2 offset 4096 +| 0: 0a 00 00 00 07 0f ca 00 0f fa 0f f2 0f ea 0f e2 ................ +| 16: 0f da 00 00 00 01 00 00 00 00 00 00 00 00 00 00 ................ +| 4032: 00 00 00 00 00 00 00 00 00 00 07 04 01 0f 01 06 ................ +| 4048: 67 07 07 04 01 0f 01 06 66 06 07 04 01 0f 01 05 g.......f....... +| 4064: 65 05 07 04 01 0f 01 04 64 04 07 04 01 0f 01 03 e.......d....... +| 4080: 63 03 07 04 01 0f 01 02 62 0f 05 04 09 0f 09 61 c.......b......a +| page 3 offset 8192 +| 0: 0a 00 00 00 07 0f bd 00 0f f9 0f ef 0f e5 0f db ................ +| 16: 0f d1 0f c7 0f bd 00 00 00 00 01 00 00 00 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 09 05 01 ................ +| 4032: 0f 01 01 07 61 07 07 09 05 01 0f 01 01 06 61 06 ....a.........a. +| 4048: 06 09 05 01 0f 01 01 05 61 05 05 09 05 01 0f 01 ........a....... +| 4064: 01 04 61 04 04 09 05 01 0f 01 01 03 61 03 03 09 ..a.........a... +| 4080: 05 01 0f 01 01 02 61 0f 02 06 05 09 0f 09 09 61 ......a........a +| page 4 offset 12288 +| 0: 0a 00 00 00 07 0f d8 00 0f fc 0f f0 0f ea 0f e4 ................ +| 16: 0f de 0f d8 0f f6 00 00 00 00 00 00 00 00 00 00 ................ +| 4048: 00 00 00 00 00 00 00 00 05 03 01 01 07 07 05 03 ................ +| 4064: 01 01 06 06 05 03 01 01 05 05 05 03 01 01 04 04 ................ +| 4080: 05 03 01 01 03 03 05 03 01 01 0f 02 03 03 09 09 ................ +| page 5 offset 16384 +| 0: 0a 00 00 00 07 0f ca 00 0f fa 0f f2 0f ea 0f 00 ................ +| 4032: 00 00 00 00 00 00 00 00 00 00 07 04 01 0f 01 07 ................ +| 4048: 61 07 07 04 01 0f 01 06 61 06 07 04 01 0f 01 05 a.......a....... +| 4064: 61 05 07 04 01 1f 01 04 61 04 07 04 01 0f 01 03 a.......a....... +| 4080: 61 03 07 04 01 0f 01 02 61 02 05 04 09 0f 09 61 a.......a......a +| page 6 offset 20480 +| 0: 0a 00 00 00 07 0f ca 00 0f fa 0f ea 0f e2 00 00 ................ +| 4032: 00 00 00 00 00 00 00 00 00 00 07 04 01 0f 01 07 ................ +| 4048: 61 07 07 04 01 0f 01 06 61 06 07 04 01 0f 01 05 a.......a....... +| 4064: 61 05 07 04 01 0f 01 04 61 04 07 04 01 0f 01 03 a.......a....... +| 4080: 61 03 07 04 01 0f 01 0f 61 02 05 04 09 0f 09 61 a.......a......a +| page 7 offset 24576 +| 0: 0d 00 00 00 05 0f 1c 00 0f f0 0f e0 0f d3 0f c5 ................ +| 16: 0f b8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 0b 05 04 11 11 13 62 31 ..............b1 +| 4032: 62 31 37 20 31 0c 04 04 11 13 13 62 31 62 31 63 b17 1......b1b1c +| 4048: 37 20 31 0b 03 04 11 11 13 63 31 63 31 37 20 31 7 1......c1c17 1 +| 4064: 0e 02 04 11 13 07 63 31 63 31 64 37 20 31 20 31 ......c1c1d7 1 1 +| 4080: 0e 01 04 11 13 17 63 31 63 31 63 37 20 31 00 00 ......c1c1c7 1.. +| end crash-3afa1ca9e9c1bd.db +}]} {} + +do_execsql_test 15.1 { + UPDATE c1 SET c= NOT EXISTS(SELECT 1 FROM c1 ORDER BY (SELECT 1 FROM c1 ORDER BY a)) +10 WHERE d BETWEEN 4 AND 7; +} {} finish_test From ccb2113a622f4d119f97185a59d088910cf827b7 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 19 Jun 2020 11:34:57 +0000 Subject: [PATCH 072/186] Refactoring various names. No changes in the resulting machine code. FossilOrigin-Name: 7bb08b1bfcf184e4b59c8c9028926a0052612ff6a6731914ccdb8dee07ea4a98 --- manifest | 33 ++++++++++++----- manifest.uuid | 2 +- src/btree.c | 8 ++--- src/btreeInt.h | 2 +- src/date.c | 6 ++-- src/loadext.c | 10 +++--- src/main.c | 6 ++-- src/mutex_unix.c | 2 +- src/mutex_w32.c | 2 +- src/notify.c | 16 ++++----- src/os.c | 8 ++--- src/os_unix.c | 8 ++--- src/os_win.c | 8 ++--- src/pager.c | 6 ++-- src/sqlite.h.in | 26 ++++++++------ src/sqliteInt.h | 18 ++++------ src/test1.c | 2 +- src/test_multiplex.c | 2 +- src/test_osinst.c | 4 +-- src/vdbeaux.c | 84 ++++++++++++++++++++++---------------------- 20 files changed, 135 insertions(+), 118 deletions(-) diff --git a/manifest b/manifest index b8bd183351..f9d8b2a0cf 100644 --- a/manifest +++ b/manifest @@ -1,6 +1,6 @@ B fd5abb1a7b5a55127d5c0d5ff448020d8bccab44e4f5afe1eb88fc19578af735 -C Fix\san\sassert()\sthat\scould\sfail\swhen\soperating\son\sa\sdatabase\swith\sa\scorrupt\sschema. -D 2020-06-17T20:29:56.720 +C Refactoring\svarious\snames.\s\sNo\schanges\sin\sthe\sresulting\smachine\scode. +D 2020-06-19T11:34:57.555 F configure f594931bd7b23dad12db96b81e1dba43b41b30a4560d6eb008014e3d9f1617e8 x F configure.ac 13e4ecf89214c3aa0ba099a9e0178f13f03261ace627126737d8cee240ec5c1c F doc/wal-lock.md 781726aaba20bafeceb7ba9f91d5c98c6731691b30c954e37cf0b49a053d461d @@ -9,17 +9,32 @@ F ext/session/session_common.tcl f613174665456b2d916ae8df3e5735092a1c1712f36f468 F ext/session/sessioninvert.test 04075517a9497a80d39c495ba6b44f3982c7371129b89e2c52219819bc105a25 F ext/session/sqlite3session.c fc8c6c13dc0456943ff24abf574ced10418eec66a548c97d3eafbebe9fc5e908 F src/alter.c b8ffe4acd48b4fe793d01901f28fd4f3b037854a0e99f0c977738556c31b9d2b -F src/btree.c e6db473ab10c52d1bc51dd8d21795dde07b7502426314b91d9d246a714e50416 +F src/btree.c d9d7813a28f9c337908858aa46d6129d43cd790bc87c62146cd6915bb412150c +F src/btreeInt.h 401f0549caa02cce8791baeb673aa570ee35c89ce53a7628a3d21804784c23d0 F src/build.c 8245e69aa1a2f8b67e76203fdbaa9f88deccd89b5ed41f7097c202b920484fd0 +F src/date.c 9f1d31ef1bfdc732a83459e05770f6d5aeb57a7e323b48f1798cb870125601ef F src/expr.c 36bb737d2ca78ee9bd4fde46cf1e51a37e7e1b263e55fccfaef32922a19e9524 F src/global.c 0409ae635839e0bef26a69b68be64126ab6cba62ac19bd7694f1652e591c4c17 +F src/loadext.c 436af4968c6954d304fce9efa12719367bd8f37b19b93b71d6ad607e85adbb47 +F src/main.c 84b2ddb649a4fb470abaa980ff41242819812b6a6c08fc0baa2c024b175bc76b +F src/mutex_unix.c dd2b3f1cc1863079bc1349ac0fec395a500090c4fe4e11ab775310a49f2f956d +F src/mutex_w32.c caa50e1c0258ac4443f52e00fe8aaea73b6d0728bd8856bedfff822cae418541 +F src/notify.c 89a97dc854c3aa62ad5f384ef50c5a4a11d70fcc69f86de3e991573421130ed6 +F src/os.c 80e4cf3e5da06be03ca641661e331ce60eeeeabf0d7354dbb1c0e166d0eedbbe +F src/os_unix.c 94bd41f5c058db79ccdf7c51627b8917d98423c0899ec5e5b9b3a6fd36e8b2ff +F src/os_win.c 92f7ed3dd12fcc30b65815fa524fb7c4c6f9a1c9aa44c4b7c46759fc42f66105 +F src/pager.c 7d6cff7a2aca0aacedb15eb67b4a7fb67c39725a1e02d1a6a7bb6573a61a51a1 F src/select.c 6ddd86a7272ff1f443bd9efcbb0f5ab590674d4c732e4cb8c3d5dd8e3a70cae6 F src/shell.c.in ffd3de9cb7294919fe1b56c49f9d62fc4b049015c4727c934f3d1880128c56e3 -F src/sqliteInt.h 0a13c93b250270c5876da65c21963eaca60c5fc55271c313d5f6cf20547134af -F src/test1.c e9f68f157f8fd027ee4c32c4b427f4eed274749bfb745427e2d954fa89d95ad3 +F src/sqlite.h.in d2c03414a8ee5d4a6855c04dd7cd5998e45139b0fe66b65bae86d4223edd091f +F src/sqliteInt.h 5f9b119efd2c628780b5cfb628170c6c2393a1ca46e75b0fe83abb9660bf02c9 +F src/test1.c 8442b50ecbbce891a9e490e54879e6bcc540590be591451c296ec6c57640847d +F src/test_multiplex.c d0ee44ec77687b35e83fd6b9fca4c5860f603b1b407fd375be62437b79af5ae3 +F src/test_osinst.c d341f9d7613e007c8c3f7eba6cd307230047506aa8f97858c1fd21f5069616bd F src/trigger.c 6b1472e6b5bbca71e13f95c61ebcd0b255450352de8254a42c40222020b7ac43 F src/vacuum.c b196258ea36cfed5f455f18519345613bab04daf0e038a63ee715407c5a7ae9e F src/vdbe.c 985f92b5131d62654c3c26062a2e55b1c8f71c2e10497e23021c6650d5c392b3 +F src/vdbeaux.c 4c4716795d47505e25e209c45f3448810d1458fee5210fd1e3759557872de10e F src/vtab.c 33ecf1d8b0fd1508fe23be9da40e48909c86a13db2725e273177eb47db2fc265 F src/window.c 88a63e6948ea924b3cf9ad8aff5ea1fa53bebdb2f13340867205fda16ed0f19c F test/corruptL.test 16564fa7961fcce242945177c9bdaa5cb5dc85d6248612dbe4b927d059eb6014 @@ -33,7 +48,7 @@ F test/where.test f5e62453537e5b335b69f3b09f8a02ce3328289fad5d866e25371284b837d7 F test/whereG.test 9363b2a97d914cb1b81aff5069ef0cf2a071a67e2b604eac6fe9c0114017d9aa F test/window1.test 9d7f4990e5b36d95af93b189da4aa75216c6690ce95cced3c8b6d3234be51c2c F test/without_rowid3.test 96426a6c9a2a5cf62bbe55ea1ad038eaaf4bf743f40a1ad517233b8e5a3d4339 -P 4adc0a1b0d84c2df6d6bf0d5d9d3fa9f7d048af8d232c4beb77518727890f212 -R d5c913bb4696618860d8e215a52de60c -U dan -Z 29e5aef02689c7bbd9ca814e67e739ba +P 4a340c9bc7d939efc947e3b17ca79314482f74368b15567dd089d40e4270890e +R 9833b56461d0ff6ff79be23099c8a427 +U drh +Z 362d8b86a61aefc35e02371751514139 diff --git a/manifest.uuid b/manifest.uuid index 8e41a9dab6..4eea227159 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4a340c9bc7d939efc947e3b17ca79314482f74368b15567dd089d40e4270890e \ No newline at end of file +7bb08b1bfcf184e4b59c8c9028926a0052612ff6a6731914ccdb8dee07ea4a98 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 0ed295e0aa..0c83bc6040 100644 --- a/src/btree.c +++ b/src/btree.c @@ -69,7 +69,7 @@ int sqlite3BtreeTrace=1; /* True to enable tracing */ ** but the test harness needs to access it so we make it global for ** test builds. ** -** Access to this variable is protected by SQLITE_MUTEX_STATIC_MASTER. +** Access to this variable is protected by SQLITE_MUTEX_STATIC_MAIN. */ #ifdef SQLITE_TEST BtShared *SQLITE_WSD sqlite3SharedCacheList = 0; @@ -2422,7 +2422,7 @@ int sqlite3BtreeOpen( #if SQLITE_THREADSAFE mutexOpen = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_OPEN); sqlite3_mutex_enter(mutexOpen); - mutexShared = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); + mutexShared = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); sqlite3_mutex_enter(mutexShared); #endif for(pBt=GLOBAL(BtShared*,sqlite3SharedCacheList); pBt; pBt=pBt->pNext){ @@ -2541,7 +2541,7 @@ int sqlite3BtreeOpen( pBt->nRef = 1; if( p->sharable ){ MUTEX_LOGIC( sqlite3_mutex *mutexShared; ) - MUTEX_LOGIC( mutexShared = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);) + MUTEX_LOGIC( mutexShared = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN);) if( SQLITE_THREADSAFE && sqlite3GlobalConfig.bCoreMutex ){ pBt->mutex = sqlite3MutexAlloc(SQLITE_MUTEX_FAST); if( pBt->mutex==0 ){ @@ -2635,7 +2635,7 @@ static int removeFromSharingList(BtShared *pBt){ int removed = 0; assert( sqlite3_mutex_notheld(pBt->mutex) ); - MUTEX_LOGIC( pMaster = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); ) + MUTEX_LOGIC( pMaster = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); ) sqlite3_mutex_enter(pMaster); pBt->nRef--; if( pBt->nRef<=0 ){ diff --git a/src/btreeInt.h b/src/btreeInt.h index ec25b54662..2e3f7105cd 100644 --- a/src/btreeInt.h +++ b/src/btreeInt.h @@ -381,7 +381,7 @@ struct Btree { ** ** Fields in this structure are accessed under the BtShared.mutex ** mutex, except for nRef and pNext which are accessed under the -** global SQLITE_MUTEX_STATIC_MASTER mutex. The pPager field +** global SQLITE_MUTEX_STATIC_MAIN mutex. The pPager field ** may not be modified once it is initially set as long as nRef>0. ** The pSchema field may be set once under BtShared.mutex and ** thereafter is unchanged as long as nRef>0. diff --git a/src/date.c b/src/date.c index fff062fb5a..9cba27f591 100644 --- a/src/date.c +++ b/src/date.c @@ -515,7 +515,7 @@ static int osLocaltime(time_t *t, struct tm *pTm){ #if !HAVE_LOCALTIME_R && !HAVE_LOCALTIME_S struct tm *pX; #if SQLITE_THREADSAFE>0 - sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); + sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); #endif sqlite3_mutex_enter(mutex); pX = localtime(t); @@ -1211,10 +1211,10 @@ static void currentTimeFunc( #if HAVE_GMTIME_R pTm = gmtime_r(&t, &sNow); #else - sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); + sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN)); pTm = gmtime(&t); if( pTm ) memcpy(&sNow, pTm, sizeof(sNow)); - sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER)); + sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN)); #endif if( pTm ){ strftime(zBuf, 20, zFormat, &sNow); diff --git a/src/loadext.c b/src/loadext.c index 067c47c17f..7007e3137d 100644 --- a/src/loadext.c +++ b/src/loadext.c @@ -689,7 +689,7 @@ int sqlite3_enable_load_extension(sqlite3 *db, int onoff){ ** The following object holds the list of automatically loaded ** extensions. ** -** This list is shared across threads. The SQLITE_MUTEX_STATIC_MASTER +** This list is shared across threads. The SQLITE_MUTEX_STATIC_MAIN ** mutex must be held while accessing this list. */ typedef struct sqlite3AutoExtList sqlite3AutoExtList; @@ -731,7 +731,7 @@ int sqlite3_auto_extension( { u32 i; #if SQLITE_THREADSAFE - sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); + sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); #endif wsdAutoextInit; sqlite3_mutex_enter(mutex); @@ -769,7 +769,7 @@ int sqlite3_cancel_auto_extension( void (*xInit)(void) ){ #if SQLITE_THREADSAFE - sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); + sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); #endif int i; int n = 0; @@ -796,7 +796,7 @@ void sqlite3_reset_auto_extension(void){ #endif { #if SQLITE_THREADSAFE - sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); + sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); #endif wsdAutoextInit; sqlite3_mutex_enter(mutex); @@ -826,7 +826,7 @@ void sqlite3AutoLoadExtensions(sqlite3 *db){ for(i=0; go; i++){ char *zErrmsg; #if SQLITE_THREADSAFE - sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); + sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); #endif #ifdef SQLITE_OMIT_LOAD_EXTENSION const sqlite3_api_routines *pThunk = 0; diff --git a/src/main.c b/src/main.c index 9f99cbdf3a..6056478519 100644 --- a/src/main.c +++ b/src/main.c @@ -241,12 +241,12 @@ int sqlite3_initialize(void){ if( rc ) return rc; /* Initialize the malloc() system and the recursive pInitMutex mutex. - ** This operation is protected by the STATIC_MASTER mutex. Note that + ** This operation is protected by the STATIC_MAIN mutex. Note that ** MutexAlloc() is called for a static mutex prior to initializing the ** malloc subsystem - this implies that the allocation of a static ** mutex must not require support from the malloc subsystem. */ - MUTEX_LOGIC( pMaster = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER); ) + MUTEX_LOGIC( pMaster = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MAIN); ) sqlite3_mutex_enter(pMaster); sqlite3GlobalConfig.isMutexInit = 1; if( !sqlite3GlobalConfig.isMallocInit ){ @@ -3112,7 +3112,7 @@ static int openDatabase( SQLITE_OPEN_MAIN_JOURNAL | SQLITE_OPEN_TEMP_JOURNAL | SQLITE_OPEN_SUBJOURNAL | - SQLITE_OPEN_MASTER_JOURNAL | + SQLITE_OPEN_SUPER_JOURNAL | SQLITE_OPEN_NOMUTEX | SQLITE_OPEN_FULLMUTEX | SQLITE_OPEN_WAL diff --git a/src/mutex_unix.c b/src/mutex_unix.c index 9282d28016..2afaddec69 100644 --- a/src/mutex_unix.c +++ b/src/mutex_unix.c @@ -112,7 +112,7 @@ static int pthreadMutexEnd(void){ return SQLITE_OK; } **