From 14101a3c28d95680f615a47effad7813a0db353c Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 11 Oct 2024 20:36:26 +0000 Subject: [PATCH 01/14] Experimental change to explain query plan to identify covering indexes on expressions. FossilOrigin-Name: 3bb03a2891e30c58b66e3665a8877a8eab4a8bac57ee153d8d31358caeaf4b7c --- manifest | 25 +++++++++-------- manifest.uuid | 2 +- src/where.c | 24 ++++++++++++---- src/whereInt.h | 8 ++++++ src/wherecode.c | 65 ++++++++++++++++++++++++++++++++++---------- test/indexexpr1.test | 24 ++++++++-------- test/indexexpr3.test | 38 ++++++++++++++++++++++++++ 7 files changed, 142 insertions(+), 44 deletions(-) diff --git a/manifest b/manifest index 9e10c216c6..524fb6f6ea 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\scomments\sin\sext/misc/sqlite3_stdio.c\sto\sreflect\sthe\slatest\senhancements.\nNo\schanges\sto\scode. -D 2024-10-11T19:57:41.456 +C Experimental\schange\sto\sexplain\squery\splan\sto\sidentify\scovering\sindexes\son\sexpressions. +D 2024-10-11T20:36:26.974 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -855,9 +855,9 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c a0d42bfdef935e1389737152394d08e59e7c48697f40a9fc2e0552cb19dc731f F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 -F src/where.c 12fe24880901997372b88fd7ca9a21457404ad35201712c02cc57978578abb10 -F src/whereInt.h a5d079c346a658b7a6e9e47bb943d021e02fa1e6aed3b964ca112112a4892192 -F src/wherecode.c 5172d647798134e7c92536ddffe7e530c393d79b5dedd648b88faf2646c65baf +F src/where.c 55defd94b89d6ef9eb9c9a8627a799d1f9ab6f8046c72f97956cd0171e0caa5c +F src/whereInt.h 1e36ec50392f7cc3d93d1152d4338064cd522b87156a0739388b7e273735f0ca +F src/wherecode.c 8a260111af36d827d218118e36ccb8c359f9517f2743f5fe758e51dd9ae4acc7 F src/whereexpr.c 0f93a29cabd3a338d09a1f5c6770620a1ac51ec1157f3229502a7e7767c60b6f F src/window.c 499d48f315a09242dc68f2fac635ed27dcf6bbb0d9ab9084857898c64489e975 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1323,9 +1323,9 @@ F test/index8.test caa097735c91dbc23d8a402f5e63a2a03c83840ba3928733ed7f9a03f8a91 F test/index9.test 2ac891806a4136ef3e91280477e23114e67575207dc331e6797fa0ed9379f997 F test/indexA.test 11d84f6995e6e5b9d8315953fb1b6d29772ee7c7803ee9112715e7e4dd3e4974 F test/indexedby.test f21eca4f7a6ffe14c8500a7ad6cd53166666c99e5ccd311842a28bc94a195fe0 -F test/indexexpr1.test 24fa85a12da384dd1d56f7b24e593c51a8a54b4c5e2e8bbb9e5fdf1099427faf +F test/indexexpr1.test 928671af9d7374bb56ed4dcfbc157f4eeddb1e86ab5615ceb3ac97a713c2dd8f F test/indexexpr2.test 1c382e81ef996d8ae8b834a74f2a9013dddf59214c32201d7c8a656d739f999a -F test/indexexpr3.test 9d893bf440937ebcc1e59c7c9c1505c40c918346a3ddde76a69078f3c733c45d +F test/indexexpr3.test 47b91bc7999805c9a34d356f672259bc49295ecc797448511cae554a309b47cd F test/indexfault.test 98d78a8ff1f5335628b62f886a1cb7c7dac1ef6d48fa39c51ec871c87dce9811 F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 F test/insert.test 4e3f0de67aac3c5be1f4aaedbcea11638f1b5cdc9a3115be14d19aa9db7623c6 @@ -2217,8 +2217,11 @@ F vsixtest/vsixtest.tcl 6195aba1f12a5e10efc2b8c0009532167be5e301abe5b31385638080 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a3e16e478b03ccc12888eb5700c2e480a446957368f4b37ed322af2f4c9cd7c4 -R 1291abc09c87e338ea2cfa1281bb85ca -U drh -Z 347c97452247d4e75e184990772431fa +P 9621c3b527702b47799538e028f96945b5697752dbb56078aa7f114c72fd4e1a +R dd12fabe1565dab7ca455bbaabb2f1b1 +T *branch * eqp-covering-index-on-expr +T *sym-eqp-covering-index-on-expr * +T -sym-trunk * +U dan +Z 46f8403a99a7acbc4dd09a2ad01f75a8 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index b9e0ede130..a0470874d6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9621c3b527702b47799538e028f96945b5697752dbb56078aa7f114c72fd4e1a +3bb03a2891e30c58b66e3665a8877a8eab4a8bac57ee153d8d31358caeaf4b7c diff --git a/src/where.c b/src/where.c index c2fc338247..e99cdb355b 100644 --- a/src/where.c +++ b/src/where.c @@ -7441,14 +7441,28 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){ pOp->p2 = x; pOp->p1 = pLevel->iIdxCur; OpcodeRewriteTrace(db, k, pOp); - }else{ - /* Unable to translate the table reference into an index - ** reference. Verify that this is harmless - that the - ** table being referenced really is open. - */ + }else if( pLoop->wsFlags & (WHERE_IDX_ONLY|WHERE_EXPRIDX) ){ if( pLoop->wsFlags & WHERE_IDX_ONLY ){ + /* An error. pLoop is supposed to be a covering index loop, + ** and yet the VM code refers to a column of the table that + ** is not part of the index. */ sqlite3ErrorMsg(pParse, "internal query planner error"); pParse->rc = SQLITE_INTERNAL; + }else{ + /* The WHERE_EXPRIDX flag is set by the planner when it is likely + ** that pLoop is a covering index loop, but it is not possible + ** to be 100% sure. In this case, any OP_Explain opcode + ** corresponding to this loop describes the index as a "COVERING + ** INDEX". But, pOp proves that pLoop is not actually a covering + ** index loop. So clear the WHERE_EXPRIDX flag and rewrite the + ** text that accompanies the OP_Explain opcode, if any. */ + pLoop->wsFlags &= ~WHERE_EXPRIDX; + sqlite3WhereAddExplainText(pParse, + pLevel->addrBody-1, + pTabList, + pLevel, + pWInfo->wctrlFlags + ); } } }else if( pOp->opcode==OP_Rowid ){ diff --git a/src/whereInt.h b/src/whereInt.h index 8247528a93..f262b0eebc 100644 --- a/src/whereInt.h +++ b/src/whereInt.h @@ -533,9 +533,17 @@ int sqlite3WhereExplainBloomFilter( const WhereInfo *pWInfo, /* WHERE clause */ const WhereLevel *pLevel /* Bloom filter on this level */ ); +void sqlite3WhereAddExplainText( + Parse *pParse, /* Parse context */ + int addr, + SrcList *pTabList, /* Table list this loop refers to */ + WhereLevel *pLevel, /* Scan to write OP_Explain opcode for */ + u16 wctrlFlags /* Flags passed to sqlite3WhereBegin() */ +); #else # define sqlite3WhereExplainOneScan(u,v,w,x) 0 # define sqlite3WhereExplainBloomFilter(u,v,w) 0 +# define sqlite3WhereAddExplainText(u,v,w,x,y) #endif /* SQLITE_OMIT_EXPLAIN */ #ifdef SQLITE_ENABLE_STMT_SCANSTATUS void sqlite3WhereAddScanStatus( diff --git a/src/wherecode.c b/src/wherecode.c index 0951e5e204..f1c6711af8 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -110,27 +110,24 @@ static void explainIndexRange(StrAccum *pStr, WhereLoop *pLoop){ } /* -** This function is a no-op unless currently processing an EXPLAIN QUERY PLAN -** command, or if stmt_scanstatus_v2() stats are enabled, or if SQLITE_DEBUG -** was defined at compile-time. If it is not a no-op, a single OP_Explain -** opcode is added to the output to describe the table scan strategy in pLevel. -** -** If an OP_Explain opcode is added to the VM, its address is returned. -** Otherwise, if no OP_Explain is coded, zero is returned. +** This function sets the P4 value of an existing OP_Explain opcode to +** text describing the loop in pLevel. If the OP_Explain opcode already has +** a P4 value, it is freed before it is overwritten. */ -int sqlite3WhereExplainOneScan( +void sqlite3WhereAddExplainText( Parse *pParse, /* Parse context */ + int addr, /* Address of OP_Explain opcode */ SrcList *pTabList, /* Table list this loop refers to */ WhereLevel *pLevel, /* Scan to write OP_Explain opcode for */ u16 wctrlFlags /* Flags passed to sqlite3WhereBegin() */ ){ - int ret = 0; #if !defined(SQLITE_DEBUG) if( sqlite3ParseToplevel(pParse)->explain==2 || IS_STMT_SCANSTATUS(pParse->db) ) #endif { + VdbeOp *pOp = sqlite3VdbeGetOp(pParse->pVdbe, addr); + SrcItem *pItem = &pTabList->a[pLevel->iFrom]; - Vdbe *v = pParse->pVdbe; /* VM being constructed */ sqlite3 *db = pParse->db; /* Database handle */ int isSearch; /* True for a SEARCH. False for SCAN. */ WhereLoop *pLoop; /* The controlling WhereLoop object */ @@ -139,9 +136,10 @@ int sqlite3WhereExplainOneScan( StrAccum str; /* EQP output string */ char zBuf[100]; /* Initial space for EQP output string */ + if( db->mallocFailed ) return; + pLoop = pLevel->pWLoop; flags = pLoop->wsFlags; - if( (flags&WHERE_MULTI_OR) || (wctrlFlags&WHERE_OR_SUBCLAUSE) ) return 0; isSearch = (flags&(WHERE_BTM_LIMIT|WHERE_TOP_LIMIT))!=0 || ((flags&WHERE_VIRTUALTABLE)==0 && (pLoop->u.btree.nEq>0)) @@ -165,7 +163,7 @@ int sqlite3WhereExplainOneScan( zFmt = "AUTOMATIC PARTIAL COVERING INDEX"; }else if( flags & WHERE_AUTO_INDEX ){ zFmt = "AUTOMATIC COVERING INDEX"; - }else if( flags & WHERE_IDX_ONLY ){ + }else if( flags & (WHERE_IDX_ONLY|WHERE_EXPRIDX) ){ zFmt = "COVERING INDEX %s"; }else{ zFmt = "INDEX %s"; @@ -219,9 +217,46 @@ int sqlite3WhereExplainOneScan( #endif zMsg = sqlite3StrAccumFinish(&str); sqlite3ExplainBreakpoint("",zMsg); - ret = sqlite3VdbeAddOp4(v, OP_Explain, sqlite3VdbeCurrentAddr(v), - pParse->addrExplain, pLoop->rRun, - zMsg, P4_DYNAMIC); + + assert( pOp->opcode==OP_Explain ); + assert( pOp->p4type==P4_DYNAMIC || pOp->p4.z==0 ); + sqlite3DbFree(db, pOp->p4.z); + pOp->p4type = P4_DYNAMIC; + pOp->p4.z = sqlite3StrAccumFinish(&str); + } +} + + +/* +** This function is a no-op unless currently processing an EXPLAIN QUERY PLAN +** command, or if stmt_scanstatus_v2() stats are enabled, or if SQLITE_DEBUG +** was defined at compile-time. If it is not a no-op, a single OP_Explain +** opcode is added to the output to describe the table scan strategy in pLevel. +** +** If an OP_Explain opcode is added to the VM, its address is returned. +** Otherwise, if no OP_Explain is coded, zero is returned. +*/ +int sqlite3WhereExplainOneScan( + Parse *pParse, /* Parse context */ + SrcList *pTabList, /* Table list this loop refers to */ + WhereLevel *pLevel, /* Scan to write OP_Explain opcode for */ + u16 wctrlFlags /* Flags passed to sqlite3WhereBegin() */ +){ + int ret = 0; +#if !defined(SQLITE_DEBUG) + if( sqlite3ParseToplevel(pParse)->explain==2 || IS_STMT_SCANSTATUS(pParse->db) ) +#endif + { + if( (pLevel->pWLoop->wsFlags & WHERE_MULTI_OR)==0 + && (wctrlFlags & WHERE_OR_SUBCLAUSE)==0 + ){ + Vdbe *v = pParse->pVdbe; + int addr = sqlite3VdbeCurrentAddr(v); + ret = sqlite3VdbeAddOp3( + v, OP_Explain, addr, pParse->addrExplain, pLevel->pWLoop->rRun + ); + sqlite3WhereAddExplainText(pParse, addr, pTabList, pLevel, wctrlFlags); + } } return ret; } diff --git a/test/indexexpr1.test b/test/indexexpr1.test index 3ba59449d5..d5c47e403e 100644 --- a/test/indexexpr1.test +++ b/test/indexexpr1.test @@ -49,7 +49,7 @@ do_execsql_test indexexpr1-130 { do_execsql_test indexexpr1-130eqp { EXPLAIN QUERY PLAN SELECT c FROM t1 WHERE b=1 AND substr(a,2,3)='nd_' ORDER BY c; -} {/USING INDEX t1ba/} +} {/USING COVERING INDEX t1ba/} do_execsql_test indexexpr1-140 { SELECT rowid, substr(a,b,3), '|' FROM t1 ORDER BY 2; @@ -61,7 +61,7 @@ do_execsql_test indexexpr1-141 { do_execsql_test indexexpr1-141eqp { EXPLAIN QUERY PLAN SELECT rowid FROM t1 WHERE substr(a,b,3)<='and' ORDER BY +rowid; -} {/USING INDEX t1abx/} +} {/USING COVERING INDEX t1abx/} do_execsql_test indexexpr1-142 { SELECT rowid FROM t1 WHERE +substr(a,b,3)<='and' ORDER BY +rowid; } {1 2 3} @@ -73,7 +73,7 @@ do_execsql_test indexexpr1-150eqp { EXPLAIN QUERY PLAN SELECT rowid FROM t1 WHERE substr(a,b,3) IN ('and','l_t','xyz') ORDER BY +rowid; -} {/USING INDEX t1abx/} +} {/USING COVERING INDEX t1abx/} ifcapable altertable { do_execsql_test indexexpr1-160 { @@ -99,14 +99,14 @@ do_execsql_test indexexpr1-170 { do_execsql_test indexexpr1-170eqp { EXPLAIN QUERY PLAN SELECT length(a) FROM t1 ORDER BY length(a); -} {/SCAN t1 USING INDEX t1alen/} +} {/SCAN t1 USING COVERING INDEX t1alen/} do_execsql_test indexexpr1-171 { SELECT length(a) FROM t1 ORDER BY length(a) DESC; } {52 38 29 27 25 20} do_execsql_test indexexpr1-171eqp { EXPLAIN QUERY PLAN SELECT length(a) FROM t1 ORDER BY length(a) DESC; -} {/SCAN t1 USING INDEX t1alen/} +} {/SCAN t1 USING COVERING INDEX t1alen/} do_execsql_test indexexpr1-200 { DROP TABLE t1; @@ -142,7 +142,7 @@ do_execsql_test indexexpr1-230 { do_execsql_test indexexpr1-230eqp { EXPLAIN QUERY PLAN SELECT c FROM t1 WHERE b=1 AND substr(a,2,3)='nd_' ORDER BY c; -} {/USING INDEX t1ba/} +} {/USING COVERING INDEX t1ba/} do_execsql_test indexexpr1-240 { SELECT id, substr(a,b,3), '|' FROM t1 ORDER BY 2; @@ -154,7 +154,7 @@ do_execsql_test indexexpr1-241 { do_execsql_test indexexpr1-241eqp { EXPLAIN QUERY PLAN SELECT id FROM t1 WHERE substr(a,b,3)<='and' ORDER BY +id; -} {/USING INDEX t1abx/} +} {/USING COVERING INDEX t1abx/} do_execsql_test indexexpr1-242 { SELECT id FROM t1 WHERE +substr(a,b,3)<='and' ORDER BY +id; } {1 2 3} @@ -166,7 +166,7 @@ do_execsql_test indexexpr1-250eqp { EXPLAIN QUERY PLAN SELECT id FROM t1 WHERE substr(a,b,3) IN ('and','l_t','xyz') ORDER BY +id; -} {/USING INDEX t1abx/} +} {/USING COVERING INDEX t1abx/} ifcapable altertable { do_execsql_test indexexpr1-260 { @@ -238,7 +238,7 @@ do_execsql_test indexexpr1-510 { do_execsql_test indexexpr1-510eqp { EXPLAIN QUERY PLAN SELECT substr(a,4,3) AS k FROM cnt, t5 WHERE k=printf('%03d',x); -} {/USING INDEX t5ax/} +} {/USING COVERING INDEX t5ax/} # Skip-scan on an indexed expression # @@ -547,7 +547,7 @@ do_execsql_test indexexpr1-2030 { (3, '{"x":1}', 6, 7); CREATE INDEX t1x ON t1(d, a, b->>'x', c); } -do_execsql_test indexexpr1-2030 { +do_execsql_test indexexpr1-2040 { SELECT a, SUM(1) AS t1, SUM(CASE WHEN b->>'x'=1 THEN 1 END) AS t2, @@ -555,7 +555,7 @@ do_execsql_test indexexpr1-2030 { SUM(CASE WHEN b->>'x'=1 THEN c END) AS t4 FROM t1; } {1 6 4 54 46} -do_execsql_test indexexpr1-2030 { +do_execsql_test indexexpr1-2050 { explain query plan SELECT a, SUM(1) AS t1, @@ -563,7 +563,7 @@ do_execsql_test indexexpr1-2030 { SUM(c) AS t3, SUM(CASE WHEN b->>'x'=1 THEN c END) AS t4 FROM t1; -} {/.*SCAN t1 USING INDEX t1x.*/} +} {/.*SCAN t1 USING COVERING INDEX t1x.*/} reset_db do_execsql_test indexexpr1-2100 { diff --git a/test/indexexpr3.test b/test/indexexpr3.test index 21e1d329ad..76d3331f75 100644 --- a/test/indexexpr3.test +++ b/test/indexexpr3.test @@ -78,6 +78,44 @@ do_hasfunction_test 1.6 { 2 {{"y":"two"}} } +#------------------------------------------------------------------------- +reset_db +do_execsql_test 2.0 { + CREATE TABLE t1(a, b, j); + CREATE INDEX i1 ON t1( a, json_extract(j, '$.x') ); +} + +do_eqp_test 2.1 { + SELECT json_extract(j, '$.x') FROM t1 WHERE a=? +} { + t1 USING COVERING INDEX i1 +} + +do_eqp_test 2.2 { + SELECT b, json_extract(j, '$.x') FROM t1 WHERE a=? +} { + t1 USING INDEX i1 +} + +do_eqp_test 2.3 { + SELECT json_insert( '{}', json_extract(j, '$.x') ) FROM t1 WHERE a=? +} { + t1 USING INDEX i1 +} + +do_eqp_test 2.4 { + SELECT sum( json_extract(j, '$.x') ) FROM t1 WHERE a=? +} { + t1 USING COVERING INDEX i1 +} + +do_eqp_test 2.5 { + SELECT json_extract(j, '$.x'), sum( json_extract(j, '$.x') ) FROM t1 WHERE a=? +} { + t1 USING INDEX i1 +} + + finish_test From e2f294a1e5594d09fb5c89fda1febb32e97aa5ae Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 21 Oct 2024 14:24:27 +0000 Subject: [PATCH 02/14] Add a case to testrunner.tcl so that mdevtest can run on openbsd. FossilOrigin-Name: e904b37fb2621e6bd5e761f3ecb75adb34350f2d1d7b229e655e74bc6a2f5321 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/testrunner.tcl | 9 +++++++++ 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 039c042011..c5b0b6e103 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\susing\sLIKE\sin\ssqlite3expert.c,\sin\scase\s"PRAGMA\scase_sensitive_like"\shas\sbeen\sused\sor\sthe\s"like"\sUDF\sreplaced\sby\ssomething\sunexpected. -D 2024-10-21T10:47:24.220 +C Add\sa\scase\sto\stestrunner.tcl\sso\sthat\smdevtest\scan\srun\son\sopenbsd. +D 2024-10-21T14:24:27.925 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1721,7 +1721,7 @@ F test/temptable2.test 76821347810ecc88203e6ef0dd6897b6036ac788e9dd3e6b04fd4d163 F test/temptable3.test d11a0974e52b347e45ee54ef1923c91ed91e4637 F test/temptrigger.test 38f0ca479b1822d3117069e014daabcaacefffcc F test/tester.tcl 7b44f1a9b9a2de8112695b908afc21dd9a68cd2d44e84b73f1b27b53492c0d59 -F test/testrunner.tcl 3dd75b45593d2afa2e3bca76121297a9f163bebb98474b13536f326829a71db1 x +F test/testrunner.tcl 6215e11be403a16947bbb3b31cf4905b417155df242e4c5229f85bcda1c28f50 x F test/testrunner_data.tcl c7b3b911e44f7e8c01cc6bc7571e16115cdc2e4db46630bd2acd7a931a46380e F test/thread001.test a0985c117eab62c0c65526e9fa5d1360dd1cac5b03bde223902763274ce21899 F test/thread002.test c24c83408e35ba5a952a3638b7ac03ccdf1ce4409289c54a050ac4c5f1de7502 @@ -2219,8 +2219,8 @@ F vsixtest/vsixtest.tcl 6195aba1f12a5e10efc2b8c0009532167be5e301abe5b31385638080 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 7a7162293c8fdb0078fe56948d697703539dd23273b2072990d4391c761e6ae2 -R 9a25b364d37dfe1d99d32efb1c760e91 +P 9f642b3dbc8febfacad97076030f44e9b40067e27222f2bcb84813c5765d3d2a +R a76584af8bedcd13de97df48304b6b29 U dan -Z 4dfdbcd58f369b4095a2bf4d76d23cc9 +Z b4a483e08cd6e73147b938d6a6273a33 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index b0a2f034c5..bb38e7fd00 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9f642b3dbc8febfacad97076030f44e9b40067e27222f2bcb84813c5765d3d2a +e904b37fb2621e6bd5e761f3ecb75adb34350f2d1d7b229e655e74bc6a2f5321 diff --git a/test/testrunner.tcl b/test/testrunner.tcl index a4a71a85e0..266d65e2dc 100755 --- a/test/testrunner.tcl +++ b/test/testrunner.tcl @@ -245,6 +245,15 @@ switch -nocase -glob -- $tcl_platform(os) { set TRG(run) run.sh set TRG(runcmd) "bash run.sh" } + *openbsd* { + set TRG(platform) linux + set TRG(make) make.sh + set TRG(makecmd) "sh make.sh" + set TRG(testfixture) testfixture + set TRG(shell) sqlite3 + set TRG(run) run.sh + set TRG(runcmd) "sh run.sh" + } *win* { set TRG(platform) win set TRG(make) make.bat From f5fb820c0f4781337faf02ed871be68d13a83d94 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 21 Oct 2024 16:30:22 +0000 Subject: [PATCH 03/14] Version 3.47.0 FossilOrigin-Name: 03a9703e27c44437c39363d0baf82db4ebc94538a0f28411c85dda156f82636e --- manifest | 13 ++++++++----- manifest.uuid | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/manifest b/manifest index c5b0b6e103..607e331693 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\scase\sto\stestrunner.tcl\sso\sthat\smdevtest\scan\srun\son\sopenbsd. -D 2024-10-21T14:24:27.925 +C Version\s3.47.0 +D 2024-10-21T16:30:22.476 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -2219,8 +2219,11 @@ F vsixtest/vsixtest.tcl 6195aba1f12a5e10efc2b8c0009532167be5e301abe5b31385638080 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9f642b3dbc8febfacad97076030f44e9b40067e27222f2bcb84813c5765d3d2a +P e904b37fb2621e6bd5e761f3ecb75adb34350f2d1d7b229e655e74bc6a2f5321 R a76584af8bedcd13de97df48304b6b29 -U dan -Z b4a483e08cd6e73147b938d6a6273a33 +T +sym-major-release * +T +sym-release * +T +sym-version-3.47.0 * +U drh +Z 06d21548d99c4222144faa895fe216f7 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index bb38e7fd00..7613608be5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e904b37fb2621e6bd5e761f3ecb75adb34350f2d1d7b229e655e74bc6a2f5321 +03a9703e27c44437c39363d0baf82db4ebc94538a0f28411c85dda156f82636e From e6c2759acb09923f73b254c8a0583fb9d7698b1a Mon Sep 17 00:00:00 2001 From: stephan Date: Mon, 21 Oct 2024 21:53:08 +0000 Subject: [PATCH 04/14] Add sqlite3rebaser_... to the API symbols accepted by the 'checksymbols' makefile target. FossilOrigin-Name: 0284590f212b2d6ac6516e60350e924a1c29602e8ac8b997d0a5fa488a2dc9c1 --- Makefile.in | 2 +- manifest | 17 +++++++---------- manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/Makefile.in b/Makefile.in index 583d81ef7e..ef40d82506 100644 --- a/Makefile.in +++ b/Makefile.in @@ -1526,7 +1526,7 @@ loadfts$(EXE): $(TOP)/tool/loadfts.c libsqlite3.la # symbols that do not begin with "sqlite3_". It is run as part of the # releasetest.tcl script. # -VALIDIDS=' sqlite3(changeset|changegroup|session)?_' +VALIDIDS=' sqlite3(changeset|changegroup|session|rebaser)?_' checksymbols: sqlite3.o nm -g --defined-only sqlite3.o nm -g --defined-only sqlite3.o | egrep -v $(VALIDIDS); test $$? -ne 0 diff --git a/manifest b/manifest index 607e331693..b9f39809b7 100644 --- a/manifest +++ b/manifest @@ -1,9 +1,9 @@ -C Version\s3.47.0 -D 2024-10-21T16:30:22.476 +C Add\ssqlite3rebaser_...\sto\sthe\sAPI\ssymbols\saccepted\sby\sthe\s'checksymbols'\smakefile\starget. +D 2024-10-21T21:53:08.916 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 -F Makefile.in 93330c792ece8b4c4bc7ea39bd52eca2a9fad37943811f9f773a725ad76f2e7c +F Makefile.in 1376a160cd98a14d118a9f8c2db88f0f906586234a0b0f49f2af13e95c1ebbcd F Makefile.linux-gcc f3842a0b1efbfbb74ac0ef60e56b301836d05b4d867d014f714fa750048f1ab6 F Makefile.msc 58b69eda1faad5d475092b8aeffab9156ee4901a82db089b166607f2ec907ee4 F README.md c3c0f19532ce28f6297a71870f3c7b424729f0e6d9ab889616d3587dd2332159 @@ -2219,11 +2219,8 @@ F vsixtest/vsixtest.tcl 6195aba1f12a5e10efc2b8c0009532167be5e301abe5b31385638080 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e904b37fb2621e6bd5e761f3ecb75adb34350f2d1d7b229e655e74bc6a2f5321 -R a76584af8bedcd13de97df48304b6b29 -T +sym-major-release * -T +sym-release * -T +sym-version-3.47.0 * -U drh -Z 06d21548d99c4222144faa895fe216f7 +P 03a9703e27c44437c39363d0baf82db4ebc94538a0f28411c85dda156f82636e +R 6ee4864245abc117fdbf4575b6f7f982 +U stephan +Z 125137dcf74d7a719c01e300208c0b76 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 7613608be5..5779696ae6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -03a9703e27c44437c39363d0baf82db4ebc94538a0f28411c85dda156f82636e +0284590f212b2d6ac6516e60350e924a1c29602e8ac8b997d0a5fa488a2dc9c1 From 0d7ede8d1c90c9781136e6f6e6d48f556c98f288 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 21 Oct 2024 22:45:59 +0000 Subject: [PATCH 05/14] In testrunner.tcl: Better estimates for ETC (Estimated Time to Completion). Show the ETC even for the single-line status reports. FossilOrigin-Name: 2a2f5f4e378338951cc2030ffbacd678e6a6eab142e39ee632c61be42345b092 --- manifest | 14 +++++------ manifest.uuid | 2 +- test/testrunner.tcl | 61 ++++++++++++++++++++++++++++++++------------- 3 files changed, 51 insertions(+), 26 deletions(-) diff --git a/manifest b/manifest index b9f39809b7..6c891d3ca4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\ssqlite3rebaser_...\sto\sthe\sAPI\ssymbols\saccepted\sby\sthe\s'checksymbols'\smakefile\starget. -D 2024-10-21T21:53:08.916 +C In\stestrunner.tcl:\s\sBetter\sestimates\sfor\sETC\s(Estimated\sTime\sto\sCompletion).\nShow\sthe\sETC\seven\sfor\sthe\ssingle-line\sstatus\sreports. +D 2024-10-21T22:45:59.158 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1721,7 +1721,7 @@ F test/temptable2.test 76821347810ecc88203e6ef0dd6897b6036ac788e9dd3e6b04fd4d163 F test/temptable3.test d11a0974e52b347e45ee54ef1923c91ed91e4637 F test/temptrigger.test 38f0ca479b1822d3117069e014daabcaacefffcc F test/tester.tcl 7b44f1a9b9a2de8112695b908afc21dd9a68cd2d44e84b73f1b27b53492c0d59 -F test/testrunner.tcl 6215e11be403a16947bbb3b31cf4905b417155df242e4c5229f85bcda1c28f50 x +F test/testrunner.tcl 1472b8c57c124c7eed934a2cbc955b0c0e0a948a4608546598195267bbd4b2fd x F test/testrunner_data.tcl c7b3b911e44f7e8c01cc6bc7571e16115cdc2e4db46630bd2acd7a931a46380e F test/thread001.test a0985c117eab62c0c65526e9fa5d1360dd1cac5b03bde223902763274ce21899 F test/thread002.test c24c83408e35ba5a952a3638b7ac03ccdf1ce4409289c54a050ac4c5f1de7502 @@ -2219,8 +2219,8 @@ F vsixtest/vsixtest.tcl 6195aba1f12a5e10efc2b8c0009532167be5e301abe5b31385638080 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 03a9703e27c44437c39363d0baf82db4ebc94538a0f28411c85dda156f82636e -R 6ee4864245abc117fdbf4575b6f7f982 -U stephan -Z 125137dcf74d7a719c01e300208c0b76 +P 0284590f212b2d6ac6516e60350e924a1c29602e8ac8b997d0a5fa488a2dc9c1 +R 2ac47cb3cae83d7727a58a5f1336d6ea +U drh +Z e2b1dfbad8a2776fb071a8b0b9eafb7e # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 5779696ae6..0d5c9c8489 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0284590f212b2d6ac6516e60350e924a1c29602e8ac8b997d0a5fa488a2dc9c1 +2a2f5f4e378338951cc2030ffbacd678e6a6eab142e39ee632c61be42345b092 diff --git a/test/testrunner.tcl b/test/testrunner.tcl index 266d65e2dc..55d1add183 100755 --- a/test/testrunner.tcl +++ b/test/testrunner.tcl @@ -324,6 +324,8 @@ set TRG(schema) { /* Fields updated as jobs run */ starttime INTEGER, -- Start time (milliseconds since 1970) endtime INTEGER, -- End time + span INTEGER, -- Total run-time in milliseconds + estwork INTEGER, -- Estimated amount of work state TEXT CHECK( state IN ('','ready','running','done','failed','omit') ), ntest INT, -- Number of test cases run nerr INT, -- Number of errors reported @@ -342,6 +344,13 @@ set TRG(schema) { } #------------------------------------------------------------------------- +# Estimated amount of work required by displaytype, relative to 'tcl' +# +set estwork(tcl) 1 +set estwork(fuzz) 11 +set estwork(bld) 56 +set estwork(make) 97 + #-------------------------------------------------------------------------- # Check if this script is being invoked to run a single file. If so, # run it. @@ -495,19 +504,21 @@ proc show_status {db cls} { }] set total 0 - foreach s {"" ready running done failed} { set S($s) 0 } + foreach s {"" ready running done failed omit} { set S($s) 0; set W($s) 0; } + set workpending 0 $db eval { - SELECT state, count(*) AS cnt FROM jobs GROUP BY 1 + SELECT state, count(*) AS cnt, sum(estwork) AS ew FROM jobs GROUP BY 1 } { incr S($state) $cnt - incr total $cnt + incr W($state) $ew + incr totalw $ew } set nt 0 set ne 0 $db eval { SELECT sum(ntest) AS nt, sum(nerr) AS ne FROM jobs HAVING nt>0 } break - set fin [expr $S(done)+$S(failed)] + set fin [expr $W(done)+$W(failed)+$W(omit)] if {$cmdline!=""} {set cmdline " $cmdline"} if {$cls} { @@ -522,15 +533,12 @@ proc show_status {db cls} { set srcdir [file dirname [file dirname $TRG(info_script)]] set line "Running: $S(running) (max: $nJob)" - if {$S(running)>0 && $fin>100 && $fin>0.05*$total} { - # Only estimate the time remaining after completing at least 100 - # jobs amounting to 10% of the total. Never estimate less than - # 2% of the total time used so far. - set tmleft [expr {($tm/$fin)*($total-$fin)}] + if {$S(running)>0 && $fin>10} { + set tmleft [expr {($tm/$fin)*($totalw-$fin)}] if {$tmleft<0.02*$tm} { set tmleft [expr {$tm*0.02}] } - append line " est time left [elapsetime $tmleft]" + append line " ETC [elapsetime $tmleft]" } puts [format %-79.79s $line] if {$S(running)>0} { @@ -914,6 +922,7 @@ proc r_get_next_job {iJob} { # Returns the jobid value for the new job. # proc add_job {args} { + global estwork set options { -displaytype -displayname -build -dirname @@ -938,25 +947,29 @@ proc add_job {args} { set state "" if {$A(-depid)==""} { set state ready } + set type $A(-displaytype) + set ew $estwork($type) trdb eval { INSERT INTO jobs( - displaytype, displayname, build, dirname, cmd, depid, priority, + displaytype, displayname, build, dirname, cmd, depid, priority, estwork, state ) VALUES ( - $A(-displaytype), + $type, $A(-displayname), $A(-build), $A(-dirname), $A(-cmd), $A(-depid), $A(-priority), + $ew, $state ) } trdb last_insert_rowid } + # Argument $build is either an empty string, or else a list of length 3 # describing the job to build testfixture. In the usual form: @@ -1283,8 +1296,8 @@ proc make_new_testset {} { trdb eval { REPLACE INTO config VALUES('start', $tm ); } add_jobs_from_cmdline $TRG(patternlist) - } + } } proc mark_job_as_finished {jobid output state endtm} { @@ -1309,10 +1322,12 @@ proc mark_job_as_finished {jobid output state endtm} { if {[info exists pltfm]} {set pltfm [string trim $pltfm]} trdb eval { UPDATE jobs - SET output=$output, state=$state, endtime=$endtm, + SET output=$output, state=$state, endtime=$endtm, span=$endtm-starttime, ntest=$ntest, nerr=$nerr, svers=$svers, pltfm=$pltfm WHERE jobid=$jobid; UPDATE jobs SET state=$childstate WHERE depid=$jobid; + UPDATE config SET value=value+$nerr WHERE name='nfail'; + UPDATE config SET value=value+$ntest WHERE name='ntest'; } } } @@ -1460,17 +1475,23 @@ proc progress_report {} { show_status trdb 1 } } else { - set tm [expr [clock_milliseconds] - $TRG(starttime)] - set tm [format "%d" [expr int($tm/1000.0 + 0.5)]] + set tmms [expr [clock_milliseconds] - $TRG(starttime)] + set tm [format "%d" [expr int($tmms/1000.0 + 0.5)]] + set wtotal 0 + set wdone 0 r_write_db { trdb eval { - SELECT displaytype, state, count(*) AS cnt + SELECT displaytype, state, count(*) AS cnt, sum(estwork) AS ew FROM jobs GROUP BY 1, 2 } { set v($state,$displaytype) $cnt incr t($displaytype) $cnt + incr wtotal $ew + if {$state=="done" || $state=="failed" || $state=="omit"} { + incr wdone $ew + } } } @@ -1486,11 +1507,15 @@ proc progress_report {} { lappend text "r$v(running,$j)" } } + if {$wdone>0} { + set tmleft [expr {($tmms/$wdone)*($wtotal-$wdone)}] + append text " ETC [elapsetime $tmleft]" + } if {[info exists TRG(reportlength)]} { puts -nonewline "[string repeat " " $TRG(reportlength)]\r" } - set report "${tm} [join $text { }]" + set report "[elapsetime $tmms] [join $text { }]" set TRG(reportlength) [string length $report] if {[string length $report]<100} { puts -nonewline "$report\r" From 49f293ba581fc54f14348c01114ecf1ff95df26c Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 22 Oct 2024 09:43:27 +0000 Subject: [PATCH 06/14] Set I/O mode to binary in Windows in sqlite3_rsync. FossilOrigin-Name: 67175287440cf363df01bed2464122c3b686a82ea82aeecd3f45fe90c359495c --- manifest | 12 ++++++------ manifest.uuid | 2 +- tool/sqlite3_rsync.c | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 6c891d3ca4..256770551b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\stestrunner.tcl:\s\sBetter\sestimates\sfor\sETC\s(Estimated\sTime\sto\sCompletion).\nShow\sthe\sETC\seven\sfor\sthe\ssingle-line\sstatus\sreports. -D 2024-10-21T22:45:59.158 +C Set\sI/O\smode\sto\sbinary\sin\sWindows\sin\ssqlite3_rsync. +D 2024-10-22T09:43:27.018 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -2181,7 +2181,7 @@ F tool/spellsift.tcl 52b4b04dc4333c7ab024f09d9d66ed6b6f7c6eb00b38497a09f338fa55d F tool/split-sqlite3c.tcl 5aa60643afca558bc732b1444ae81a522326f91e1dc5665b369c54f09e20de60 F tool/sqldiff.c 2a0987d183027c795ced13d6749061c1d2f38e24eddb428f56fa64c3a8f51e4b F tool/sqlite3_analyzer.c.in 348ba349bbdc93c9866439f9f935d7284866a2a4e6898bc906ae1204ade56918 -F tool/sqlite3_rsync.c d832c69265d32d3694e469d5ccb2da03360d2088d7871743a76a32f71854ad91 +F tool/sqlite3_rsync.c 501ffba428d5150bdf7e178369e5d70af4c93e87bb943ae11f5d3889fcb17aec F tool/sqltclsh.c.in 1bcc2e9da58fadf17b0bf6a50e68c1159e602ce057210b655d50bad5aaaef898 F tool/sqltclsh.tcl 862f4cf1418df5e1315b5db3b5ebe88969e2a784525af5fbf9596592f14ed848 F tool/src-verify.c d00f93263aa2fa6ba0cba0106d95458e6effb94fdb5fc634f56834f90c05bbb4 @@ -2219,8 +2219,8 @@ F vsixtest/vsixtest.tcl 6195aba1f12a5e10efc2b8c0009532167be5e301abe5b31385638080 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 0284590f212b2d6ac6516e60350e924a1c29602e8ac8b997d0a5fa488a2dc9c1 -R 2ac47cb3cae83d7727a58a5f1336d6ea +P 2a2f5f4e378338951cc2030ffbacd678e6a6eab142e39ee632c61be42345b092 +R bd59add05d030d8e620303bf0a3a15a0 U drh -Z e2b1dfbad8a2776fb071a8b0b9eafb7e +Z 9922bc02103a3015dbb6c18ac09bbbb9 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 0d5c9c8489..33bcc19d3a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2a2f5f4e378338951cc2030ffbacd678e6a6eab142e39ee632c61be42345b092 +67175287440cf363df01bed2464122c3b686a82ea82aeecd3f45fe90c359495c diff --git a/tool/sqlite3_rsync.c b/tool/sqlite3_rsync.c index ae8107c8cd..9f7c302cb6 100644 --- a/tool/sqlite3_rsync.c +++ b/tool/sqlite3_rsync.c @@ -240,9 +240,9 @@ static int popen2( hStdinRd, hStdoutWr, hStderr,&childPid); *pChildPid = childPid; fd = _open_osfhandle(PTR_TO_INT(hStdoutRd), 0); - *ppIn = fdopen(fd, "r"); + *ppIn = fdopen(fd, "rb"); fd = _open_osfhandle(PTR_TO_INT(hStdinWr), 0); - *ppOut = _fdopen(fd, "w"); + *ppOut = _fdopen(fd, "wb"); CloseHandle(hStdinRd); CloseHandle(hStdoutWr); return 0; From 8f90c664071ac0abc6611c6294570d5890d72e5f Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 22 Oct 2024 10:29:13 +0000 Subject: [PATCH 07/14] Further changes to sqlite3_rsync.c to work around Windows issues. FossilOrigin-Name: e2bd3219d9f7bab377ebcfa9a737ca59899c68dad1e3d1d16347bbfdd25652ee --- manifest | 12 ++++++------ manifest.uuid | 2 +- tool/sqlite3_rsync.c | 9 +++++++++ 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 256770551b..95098fae8a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Set\sI/O\smode\sto\sbinary\sin\sWindows\sin\ssqlite3_rsync. -D 2024-10-22T09:43:27.018 +C Further\schanges\sto\ssqlite3_rsync.c\sto\swork\saround\sWindows\sissues. +D 2024-10-22T10:29:13.094 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -2181,7 +2181,7 @@ F tool/spellsift.tcl 52b4b04dc4333c7ab024f09d9d66ed6b6f7c6eb00b38497a09f338fa55d F tool/split-sqlite3c.tcl 5aa60643afca558bc732b1444ae81a522326f91e1dc5665b369c54f09e20de60 F tool/sqldiff.c 2a0987d183027c795ced13d6749061c1d2f38e24eddb428f56fa64c3a8f51e4b F tool/sqlite3_analyzer.c.in 348ba349bbdc93c9866439f9f935d7284866a2a4e6898bc906ae1204ade56918 -F tool/sqlite3_rsync.c 501ffba428d5150bdf7e178369e5d70af4c93e87bb943ae11f5d3889fcb17aec +F tool/sqlite3_rsync.c 6c9cac5a9197f591985b271aeff803ec4fb4db36c8eab97e1331ff64aa1b8d94 F tool/sqltclsh.c.in 1bcc2e9da58fadf17b0bf6a50e68c1159e602ce057210b655d50bad5aaaef898 F tool/sqltclsh.tcl 862f4cf1418df5e1315b5db3b5ebe88969e2a784525af5fbf9596592f14ed848 F tool/src-verify.c d00f93263aa2fa6ba0cba0106d95458e6effb94fdb5fc634f56834f90c05bbb4 @@ -2219,8 +2219,8 @@ F vsixtest/vsixtest.tcl 6195aba1f12a5e10efc2b8c0009532167be5e301abe5b31385638080 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 2a2f5f4e378338951cc2030ffbacd678e6a6eab142e39ee632c61be42345b092 -R bd59add05d030d8e620303bf0a3a15a0 +P 67175287440cf363df01bed2464122c3b686a82ea82aeecd3f45fe90c359495c +R 58b5147977291d7ab43e6696ae456e76 U drh -Z 9922bc02103a3015dbb6c18ac09bbbb9 +Z c3d98da9f482cd0d68ad72a19eedb45b # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 33bcc19d3a..e532379d68 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -67175287440cf363df01bed2464122c3b686a82ea82aeecd3f45fe90c359495c +e2bd3219d9f7bab377ebcfa9a737ca59899c68dad1e3d1d16347bbfdd25652ee diff --git a/tool/sqlite3_rsync.c b/tool/sqlite3_rsync.c index 9f7c302cb6..7a453b6cc3 100644 --- a/tool/sqlite3_rsync.c +++ b/tool/sqlite3_rsync.c @@ -93,6 +93,7 @@ struct SQLiteRsync { ****************************************************************************/ #ifdef _WIN32 #include +#include #include /* ** Print a fatal error and quit. @@ -1756,6 +1757,10 @@ int main(int argc, char const * const *argv){ ctx.pIn = stdin; ctx.pOut = stdout; ctx.isRemote = 1; +#ifdef _WIN32 + _setmode(_fileno(ctx.pIn), _O_BINARY); + _setmode(_fileno(ctx.pOut), _O_BINARY); +#endif originSide(&ctx); return 0; } @@ -1763,6 +1768,10 @@ int main(int argc, char const * const *argv){ ctx.pIn = stdin; ctx.pOut = stdout; ctx.isRemote = 1; +#ifdef _WIN32 + _setmode(_fileno(ctx.pIn), _O_BINARY); + _setmode(_fileno(ctx.pOut), _O_BINARY); +#endif replicaSide(&ctx); return 0; } From 76e48f4d6648f514a47a4c769c931126da2a7696 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 22 Oct 2024 16:19:14 +0000 Subject: [PATCH 08/14] Do not typedef Tcl_Size if it is already #defined. FossilOrigin-Name: 53491688cf622ca317b3ff56156e601c2bdfffc94e4fe471ca82d5ba1d9e875f --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/tclsqlite.c | 2 +- src/tclsqlite.h | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 95098fae8a..e6b9e05840 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Further\schanges\sto\ssqlite3_rsync.c\sto\swork\saround\sWindows\sissues. -D 2024-10-22T10:29:13.094 +C Do\snot\stypedef\sTcl_Size\sif\sit\sis\salready\s#defined. +D 2024-10-22T16:19:14.101 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -781,8 +781,8 @@ F src/sqliteInt.h baae24292817e13e7fe748851c62efc381dcc4dac241b1182eac3d2f05eae5 F src/sqliteLimit.h 6878ab64bdeb8c24a1d762d45635e34b96da21132179023338c93f820eee6728 F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 -F src/tclsqlite.c e2b752dd08034c834e3639afa3300940d6e847fcd94207e1f2f1b83ce08b87be -F src/tclsqlite.h c6af51f31a2b2172d674608763a4b98fdf5cd587e4025053e546fb8077757262 +F src/tclsqlite.c 47d4bb6eb06aab48d643eeb8c4f65b5fa9529fa5526fdcbf223ea32277ed1b56 +F src/tclsqlite.h 529047feec49e7f463374749147f64d3f17505b0ebd84b3477a364c6f46a9de1 F src/test1.c 8bf8b74145b768f42386787f93f6d6dad7bc400a4ee2d50e4ad5a06a20a97ef1 F src/test2.c 7ebc518e6735939d8979273a6f7b1d9b5702babf059f6ad62499f7f60a9eb9a3 F src/test3.c e7573aa0f78ee4e070a4bc8c3493941c1aa64d5c66d4825c74c0f055451f432b @@ -2219,8 +2219,8 @@ F vsixtest/vsixtest.tcl 6195aba1f12a5e10efc2b8c0009532167be5e301abe5b31385638080 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 67175287440cf363df01bed2464122c3b686a82ea82aeecd3f45fe90c359495c -R 58b5147977291d7ab43e6696ae456e76 +P e2bd3219d9f7bab377ebcfa9a737ca59899c68dad1e3d1d16347bbfdd25652ee +R ca8802466a5e5918921ffde8ccadae70 U drh -Z c3d98da9f482cd0d68ad72a19eedb45b +Z ec07baffb11da349364a8e022541c4d6 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index e532379d68..36baf2fb8a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e2bd3219d9f7bab377ebcfa9a737ca59899c68dad1e3d1d16347bbfdd25652ee +53491688cf622ca317b3ff56156e601c2bdfffc94e4fe471ca82d5ba1d9e875f diff --git a/src/tclsqlite.c b/src/tclsqlite.c index 9ed6669515..e572d1d6c0 100644 --- a/src/tclsqlite.c +++ b/src/tclsqlite.c @@ -47,7 +47,7 @@ /* Compatability between Tcl8.6 and Tcl9.0 */ #if TCL_MAJOR_VERSION==9 # define CONST const -#else +#elif !defined(Tcl_Size) typedef int Tcl_Size; #endif /**** End copy of tclsqlite.h ****/ diff --git a/src/tclsqlite.h b/src/tclsqlite.h index b9a948ef14..9997e4de26 100644 --- a/src/tclsqlite.h +++ b/src/tclsqlite.h @@ -35,7 +35,7 @@ /* Compatability between Tcl8.6 and Tcl9.0 */ #if TCL_MAJOR_VERSION==9 # define CONST const -#else +#elif !defined(Tcl_Size) typedef int Tcl_Size; #endif From c8284c766a7e525898a72858540bc12365fa55f6 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 22 Oct 2024 18:00:26 +0000 Subject: [PATCH 09/14] Add the SQLITE_IOCAP_BYPASS device characteristic. Do not allow the SQLITE_DIRECT_OVERFLOW_READ optimization if that capability is missing. FossilOrigin-Name: f50ae00ce9ff572e6bd5e2788602ba356383526ab7289622a32fbf52926c6df0 --- manifest | 21 ++++++++++++--------- manifest.uuid | 2 +- src/os_unix.c | 1 + src/os_win.c | 2 +- src/pager.c | 20 ++++++++++++++------ src/sqlite.h.in | 7 +++++++ 6 files changed, 36 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index e6b9e05840..e5f6f369f7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\stypedef\sTcl_Size\sif\sit\sis\salready\s#defined. -D 2024-10-22T16:19:14.101 +C Add\sthe\sSQLITE_IOCAP_BYPASS\sdevice\scharacteristic.\s\sDo\snot\sallow\sthe\nSQLITE_DIRECT_OVERFLOW_READ\soptimization\sif\sthat\scapability\sis\smissing. +D 2024-10-22T18:00:26.006 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -756,10 +756,10 @@ F src/os.h 1ff5ae51d339d0e30d8a9d814f4b8f8e448169304d83a7ed9db66a65732f3e63 F src/os_common.h 6c0eb8dd40ef3e12fe585a13e709710267a258e2c8dd1c40b1948a1d14582e06 F src/os_kv.c 4d39e1f1c180b11162c6dc4aa8ad34053873a639bac6baae23272fc03349986a F src/os_setup.h 6011ad7af5db4e05155f385eb3a9b4470688de6f65d6166b8956e58a3d872107 -F src/os_unix.c 14d0f80e4779f5f76bcc71e7af97e3efe318fa3d0b22335623c59fab7d39302b -F src/os_win.c 6ff43bac175bd9ed79e7c0f96840b139f2f51d01689a638fd05128becf94908a +F src/os_unix.c 60dd0dbbcf82a351f62da9719bc652e866050413618c37b111e8a6e4087730ae +F src/os_win.c e682c5d822b0a4a8faa1e74aebb36c6b62a23b8f8a96cdc6cf224c1a5d830812 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c b08600ebf0db90b6d1e9b8b6577c6fa3877cbe1a100bd0b2899e4c6e9adad4b3 +F src/pager.c a621100d4b19251d9825fe0a560c12da6ad02b9bf89d6d34b2c77cfbfadf6333 F src/pager.h 4b1140d691860de0be1347474c51fee07d5420bd7f802d38cbab8ea4ab9f538a F src/parse.y a7a8d42eeff01d267444ddb476029b0b1726fb70ae3d77984140f17ad02e2d61 F src/pcache.c 588cc3c5ccaaadde689ed35ce5c5c891a1f7b1f4d1f56f6cf0143b74d8ee6484 @@ -774,7 +774,7 @@ F src/resolve.c c8a5372b97b2a2e972a280676f06ddb5b74e885d3b1f5ce383f839907b57ef68 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 F src/select.c 4b14337a2742f0c0beeba490e9a05507e9b4b12184b9cd12773501d08d48e3fe F src/shell.c.in 0662f9bcf0725461778d0254a06150e5d61c08c5a87a7281ccdf45552050c79d -F src/sqlite.h.in add9e064d6b42af8f1a4a3322bddadec76696e520aedebd83e0d3211c15ac999 +F src/sqlite.h.in 26f82d2ad6f1285b4d7f6d7c2067310a177cf39c5ffa139d724c7d8efba5cb17 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54 F src/sqliteInt.h baae24292817e13e7fe748851c62efc381dcc4dac241b1182eac3d2f05eae52c @@ -2219,8 +2219,11 @@ F vsixtest/vsixtest.tcl 6195aba1f12a5e10efc2b8c0009532167be5e301abe5b31385638080 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P e2bd3219d9f7bab377ebcfa9a737ca59899c68dad1e3d1d16347bbfdd25652ee -R ca8802466a5e5918921ffde8ccadae70 +P 53491688cf622ca317b3ff56156e601c2bdfffc94e4fe471ca82d5ba1d9e875f +R 5dd71efbba0819b90a27d697905cee09 +T *branch * bypass-iocap +T *sym-bypass-iocap * +T -sym-trunk * U drh -Z ec07baffb11da349364a8e022541c4d6 +Z 80285e6bf3f9959bc9d1afa1996b9b4a # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 36baf2fb8a..07302b8369 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -53491688cf622ca317b3ff56156e601c2bdfffc94e4fe471ca82d5ba1d9e875f +f50ae00ce9ff572e6bd5e2788602ba356383526ab7289622a32fbf52926c6df0 diff --git a/src/os_unix.c b/src/os_unix.c index f71fa8e029..d999658210 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -4128,6 +4128,7 @@ static void setDeviceCharacteristics(unixFile *pFd){ if( pFd->ctrlFlags & UNIXFILE_PSOW ){ pFd->deviceCharacteristics |= SQLITE_IOCAP_POWERSAFE_OVERWRITE; } + pFd->deviceCharacteristics |= SQLITE_IOCAP_BYPASS; pFd->sectorSize = SQLITE_DEFAULT_SECTOR_SIZE; } diff --git a/src/os_win.c b/src/os_win.c index 442c108e9d..47fff58cc9 100644 --- a/src/os_win.c +++ b/src/os_win.c @@ -3660,7 +3660,7 @@ static int winSectorSize(sqlite3_file *id){ */ static int winDeviceCharacteristics(sqlite3_file *id){ winFile *p = (winFile*)id; - return SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN | + return SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN | SQLITE_IOCAP_BYPASS | ((p->ctrlFlags & WINFILE_PSOW)?SQLITE_IOCAP_POWERSAFE_OVERWRITE:0); } diff --git a/src/pager.c b/src/pager.c index 1ac858a070..1b624a3000 100644 --- a/src/pager.c +++ b/src/pager.c @@ -808,18 +808,26 @@ static const unsigned char aJournalMagic[] = { ** Return true if page pgno can be read directly from the database file ** by the b-tree layer. This is the case if: ** -** * the database file is open, -** * there are no dirty pages in the cache, and -** * the desired page is not currently in the wal file. +** (1) the database file is open +** (2) the VFS for the database has BYPASS capability +** (3) there are no dirty pages in the cache, and +** (4) the desired page is not currently in the wal file. */ int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno){ - if( pPager->fd->pMethods==0 ) return 0; - if( sqlite3PCacheIsDirty(pPager->pPCache) ) return 0; + assert( pPager!=0 ); + assert( pPager->fd!=0 ); + if( pPager->fd->pMethods==0 ) return 0; /* Case (1) */ + assert( pPager->fd->pMethods->xDeviceCharacteristics!=0 ); + if( (pPager->fd->pMethods->xDeviceCharacteristics(pPager->fd) + & SQLITE_IOCAP_BYPASS)==0 ){ + return 0; /* Case (2) */ + } + if( sqlite3PCacheIsDirty(pPager->pPCache) ) return 0; /* Failed (3) */ #ifndef SQLITE_OMIT_WAL if( pPager->pWal ){ u32 iRead = 0; (void)sqlite3WalFindFrame(pPager->pWal, pgno, &iRead); - return iRead==0; + return iRead==0; /* Condition (4) */ } #endif return 1; diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 7097e6bb55..2db643b28a 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -652,6 +652,11 @@ int sqlite3_exec( ** filesystem supports doing multiple write operations atomically when those ** write operations are bracketed by [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] and ** [SQLITE_FCNTL_COMMIT_ATOMIC_WRITE]. +** +** The SQLITE_IOCAP_BYPASS property means that it is ok for the +** B-tree layer to bypass the pager and VFS and read content directly +** from the filesystem (the SQLITE_DIRECT_OVERFLOW_READ optimization) +** when that is beneficial for performance. */ #define SQLITE_IOCAP_ATOMIC 0x00000001 #define SQLITE_IOCAP_ATOMIC512 0x00000002 @@ -668,6 +673,7 @@ int sqlite3_exec( #define SQLITE_IOCAP_POWERSAFE_OVERWRITE 0x00001000 #define SQLITE_IOCAP_IMMUTABLE 0x00002000 #define SQLITE_IOCAP_BATCH_ATOMIC 0x00004000 +#define SQLITE_IOCAP_BYPASS 0x00008000 /* ** CAPI3REF: File Locking Levels @@ -814,6 +820,7 @@ struct sqlite3_file { **
  • [SQLITE_IOCAP_POWERSAFE_OVERWRITE] **
  • [SQLITE_IOCAP_IMMUTABLE] **
  • [SQLITE_IOCAP_BATCH_ATOMIC] +**
  • [SQLITE_IOCAP_BYPASS] ** ** ** The SQLITE_IOCAP_ATOMIC property means that all writes of From 96501c89d504d56fbef8c6d5b8f9bcab85a735d0 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 22 Oct 2024 18:26:03 +0000 Subject: [PATCH 10/14] Rename to SQLITE_IOCAP_SUBPAGE_READ. FossilOrigin-Name: dd446ef1816f4e95ce29de0b3841dd0a6c983646fd2dd271c2db8f3263478164 --- manifest | 21 +++++++++------------ manifest.uuid | 2 +- src/os_unix.c | 2 +- src/os_win.c | 2 +- src/pager.c | 4 ++-- src/sqlite.h.in | 14 ++++++++------ 6 files changed, 22 insertions(+), 23 deletions(-) diff --git a/manifest b/manifest index e5f6f369f7..3a2a48bdaa 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\sSQLITE_IOCAP_BYPASS\sdevice\scharacteristic.\s\sDo\snot\sallow\sthe\nSQLITE_DIRECT_OVERFLOW_READ\soptimization\sif\sthat\scapability\sis\smissing. -D 2024-10-22T18:00:26.006 +C Rename\sto\sSQLITE_IOCAP_SUBPAGE_READ. +D 2024-10-22T18:26:03.401 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -756,10 +756,10 @@ F src/os.h 1ff5ae51d339d0e30d8a9d814f4b8f8e448169304d83a7ed9db66a65732f3e63 F src/os_common.h 6c0eb8dd40ef3e12fe585a13e709710267a258e2c8dd1c40b1948a1d14582e06 F src/os_kv.c 4d39e1f1c180b11162c6dc4aa8ad34053873a639bac6baae23272fc03349986a F src/os_setup.h 6011ad7af5db4e05155f385eb3a9b4470688de6f65d6166b8956e58a3d872107 -F src/os_unix.c 60dd0dbbcf82a351f62da9719bc652e866050413618c37b111e8a6e4087730ae -F src/os_win.c e682c5d822b0a4a8faa1e74aebb36c6b62a23b8f8a96cdc6cf224c1a5d830812 +F src/os_unix.c 0ad4e0885294b3a0e135a18533590ec9ad91ffe82f6a08e55b40babd51772928 +F src/os_win.c 69fa1aaff68270423c85cff4327ba17ef99a1eb017e1a2bfb97416d9b8398b05 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c a621100d4b19251d9825fe0a560c12da6ad02b9bf89d6d34b2c77cfbfadf6333 +F src/pager.c d57287cd0864c88740d20618e5e595b144b85bfdaefccafd353d596f254a7b35 F src/pager.h 4b1140d691860de0be1347474c51fee07d5420bd7f802d38cbab8ea4ab9f538a F src/parse.y a7a8d42eeff01d267444ddb476029b0b1726fb70ae3d77984140f17ad02e2d61 F src/pcache.c 588cc3c5ccaaadde689ed35ce5c5c891a1f7b1f4d1f56f6cf0143b74d8ee6484 @@ -774,7 +774,7 @@ F src/resolve.c c8a5372b97b2a2e972a280676f06ddb5b74e885d3b1f5ce383f839907b57ef68 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 F src/select.c 4b14337a2742f0c0beeba490e9a05507e9b4b12184b9cd12773501d08d48e3fe F src/shell.c.in 0662f9bcf0725461778d0254a06150e5d61c08c5a87a7281ccdf45552050c79d -F src/sqlite.h.in 26f82d2ad6f1285b4d7f6d7c2067310a177cf39c5ffa139d724c7d8efba5cb17 +F src/sqlite.h.in 29fc900a58f394c7488d093fd7a8dcb14d3fa6399d5178cb20adcf88dbedfe39 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54 F src/sqliteInt.h baae24292817e13e7fe748851c62efc381dcc4dac241b1182eac3d2f05eae52c @@ -2219,11 +2219,8 @@ F vsixtest/vsixtest.tcl 6195aba1f12a5e10efc2b8c0009532167be5e301abe5b31385638080 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 53491688cf622ca317b3ff56156e601c2bdfffc94e4fe471ca82d5ba1d9e875f -R 5dd71efbba0819b90a27d697905cee09 -T *branch * bypass-iocap -T *sym-bypass-iocap * -T -sym-trunk * +P f50ae00ce9ff572e6bd5e2788602ba356383526ab7289622a32fbf52926c6df0 +R ca0e4d7e96f02509781264c3f3c418db U drh -Z 80285e6bf3f9959bc9d1afa1996b9b4a +Z d00e64e05989e514a073b51697b3ec37 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 07302b8369..bc89b0f2b4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f50ae00ce9ff572e6bd5e2788602ba356383526ab7289622a32fbf52926c6df0 +dd446ef1816f4e95ce29de0b3841dd0a6c983646fd2dd271c2db8f3263478164 diff --git a/src/os_unix.c b/src/os_unix.c index d999658210..c13c5cece0 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -4128,7 +4128,7 @@ static void setDeviceCharacteristics(unixFile *pFd){ if( pFd->ctrlFlags & UNIXFILE_PSOW ){ pFd->deviceCharacteristics |= SQLITE_IOCAP_POWERSAFE_OVERWRITE; } - pFd->deviceCharacteristics |= SQLITE_IOCAP_BYPASS; + pFd->deviceCharacteristics |= SQLITE_IOCAP_SUBPAGE_READ; pFd->sectorSize = SQLITE_DEFAULT_SECTOR_SIZE; } diff --git a/src/os_win.c b/src/os_win.c index 47fff58cc9..97743412e9 100644 --- a/src/os_win.c +++ b/src/os_win.c @@ -3660,7 +3660,7 @@ static int winSectorSize(sqlite3_file *id){ */ static int winDeviceCharacteristics(sqlite3_file *id){ winFile *p = (winFile*)id; - return SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN | SQLITE_IOCAP_BYPASS | + return SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN | SQLITE_IOCAP_SUBPAGE_READ | ((p->ctrlFlags & WINFILE_PSOW)?SQLITE_IOCAP_POWERSAFE_OVERWRITE:0); } diff --git a/src/pager.c b/src/pager.c index 1b624a3000..baaf4afbfe 100644 --- a/src/pager.c +++ b/src/pager.c @@ -809,7 +809,7 @@ static const unsigned char aJournalMagic[] = { ** by the b-tree layer. This is the case if: ** ** (1) the database file is open -** (2) the VFS for the database has BYPASS capability +** (2) the VFS for the database is able to do unaligned sub-page reads ** (3) there are no dirty pages in the cache, and ** (4) the desired page is not currently in the wal file. */ @@ -819,7 +819,7 @@ int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno){ if( pPager->fd->pMethods==0 ) return 0; /* Case (1) */ assert( pPager->fd->pMethods->xDeviceCharacteristics!=0 ); if( (pPager->fd->pMethods->xDeviceCharacteristics(pPager->fd) - & SQLITE_IOCAP_BYPASS)==0 ){ + & SQLITE_IOCAP_SUBPAGE_READ)==0 ){ return 0; /* Case (2) */ } if( sqlite3PCacheIsDirty(pPager->pPCache) ) return 0; /* Failed (3) */ diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 2db643b28a..f91088a772 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -653,10 +653,12 @@ int sqlite3_exec( ** write operations are bracketed by [SQLITE_FCNTL_BEGIN_ATOMIC_WRITE] and ** [SQLITE_FCNTL_COMMIT_ATOMIC_WRITE]. ** -** The SQLITE_IOCAP_BYPASS property means that it is ok for the -** B-tree layer to bypass the pager and VFS and read content directly -** from the filesystem (the SQLITE_DIRECT_OVERFLOW_READ optimization) -** when that is beneficial for performance. +** The SQLITE_IOCAP_SUBPAGE_READ property means that it is ok to read +** from the database file in amounts that are not a multiple of the +** page size and that do not begin at a page boundary. Without this +** property, SQLite is careful to only do full-page reads and write +** on aligned pages, with the one exception that it will do a sub-page +** read of the first page to access the database header. */ #define SQLITE_IOCAP_ATOMIC 0x00000001 #define SQLITE_IOCAP_ATOMIC512 0x00000002 @@ -673,7 +675,7 @@ int sqlite3_exec( #define SQLITE_IOCAP_POWERSAFE_OVERWRITE 0x00001000 #define SQLITE_IOCAP_IMMUTABLE 0x00002000 #define SQLITE_IOCAP_BATCH_ATOMIC 0x00004000 -#define SQLITE_IOCAP_BYPASS 0x00008000 +#define SQLITE_IOCAP_SUBPAGE_READ 0x00008000 /* ** CAPI3REF: File Locking Levels @@ -820,7 +822,7 @@ struct sqlite3_file { **
  • [SQLITE_IOCAP_POWERSAFE_OVERWRITE] **
  • [SQLITE_IOCAP_IMMUTABLE] **
  • [SQLITE_IOCAP_BATCH_ATOMIC] -**
  • [SQLITE_IOCAP_BYPASS] +**
  • [SQLITE_IOCAP_SUBPAGE_READ] ** ** ** The SQLITE_IOCAP_ATOMIC property means that all writes of From f896e2bd5b4d095ec22955eb359aad17aa125928 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 22 Oct 2024 20:09:18 +0000 Subject: [PATCH 11/14] Add the "halt" command to testrunner.tcl FossilOrigin-Name: 2cc25d5dbbc729f3b6deb8c6a45b975c535b4d20ad240e4ec0c85b3733a170ed --- manifest | 13 ++++++------- manifest.uuid | 2 +- test/testrunner.tcl | 18 ++++++++++++++++-- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index dd3c34e811..cdd5eab5b9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\sSQLITE_IOCAP_SUBPAGE_READ\sbit\sto\sthe\spossible\sreturns\svalues\nfrom\sxDeviceCharacteristics\smethod\sof\sthe\ssystem-IO\sabstract\sclass.\s\sThe\ndirect-overflow-read\soptimization\sis\sdisabled\sfor\sany\sVFS\sthat\sdoes\snot\nset\sthis\sbit.\s\sThe\sbit\sis\sset\sfor\sstandard\sVFSes. -D 2024-10-22T19:33:20.597 +C Add\sthe\s"halt"\scommand\sto\stestrunner.tcl +D 2024-10-22T20:09:18.729 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -1721,7 +1721,7 @@ F test/temptable2.test 76821347810ecc88203e6ef0dd6897b6036ac788e9dd3e6b04fd4d163 F test/temptable3.test d11a0974e52b347e45ee54ef1923c91ed91e4637 F test/temptrigger.test 38f0ca479b1822d3117069e014daabcaacefffcc F test/tester.tcl 7b44f1a9b9a2de8112695b908afc21dd9a68cd2d44e84b73f1b27b53492c0d59 -F test/testrunner.tcl 1472b8c57c124c7eed934a2cbc955b0c0e0a948a4608546598195267bbd4b2fd x +F test/testrunner.tcl bc1a8d21a1aa3a5cf7c4883cbee4b6748790fe960fad06ca5db74ec914bd6525 x F test/testrunner_data.tcl c7b3b911e44f7e8c01cc6bc7571e16115cdc2e4db46630bd2acd7a931a46380e F test/thread001.test a0985c117eab62c0c65526e9fa5d1360dd1cac5b03bde223902763274ce21899 F test/thread002.test c24c83408e35ba5a952a3638b7ac03ccdf1ce4409289c54a050ac4c5f1de7502 @@ -2219,9 +2219,8 @@ F vsixtest/vsixtest.tcl 6195aba1f12a5e10efc2b8c0009532167be5e301abe5b31385638080 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 53491688cf622ca317b3ff56156e601c2bdfffc94e4fe471ca82d5ba1d9e875f dd446ef1816f4e95ce29de0b3841dd0a6c983646fd2dd271c2db8f3263478164 -R ca0e4d7e96f02509781264c3f3c418db -T +closed dd446ef1816f4e95ce29de0b3841dd0a6c983646fd2dd271c2db8f3263478164 +P 6e7d498cda1d8fa76f3efac0ee0540dd8241db75e85b863097cab2ed530aabb0 +R 3f2f8232d3d7a010fd492d1d7a07579d U drh -Z c62b27a13345423a196a9df8f7a1e878 +Z 0f04567a08f24373cd91fb87cc03186b # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 8982839893..ea81351092 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6e7d498cda1d8fa76f3efac0ee0540dd8241db75e85b863097cab2ed530aabb0 +2cc25d5dbbc729f3b6deb8c6a45b975c535b4d20ad240e4ec0c85b3733a170ed diff --git a/test/testrunner.tcl b/test/testrunner.tcl index 55d1add183..964465d9b2 100755 --- a/test/testrunner.tcl +++ b/test/testrunner.tcl @@ -91,6 +91,7 @@ Usage: $a0 njob ?NJOB? $a0 script ?-msvc? CONFIG $a0 status ?-d SECS? ?--cls? + $a0 halt where SWITCHES are: --buildonly Build test exes but do not run tests @@ -326,7 +327,7 @@ set TRG(schema) { endtime INTEGER, -- End time span INTEGER, -- Total run-time in milliseconds estwork INTEGER, -- Estimated amount of work - state TEXT CHECK( state IN ('','ready','running','done','failed','omit') ), + state TEXT CHECK( state IN ('','ready','running','done','failed','omit','halt') ), ntest INT, -- Number of test cases run nerr INT, -- Number of errors reported svers TEXT, -- Reported SQLite version @@ -424,6 +425,19 @@ if {([llength $argv]==2 || [llength $argv]==1) } #-------------------------------------------------------------------------- +#-------------------------------------------------------------------------- +# Check if this is the "halt" command: +# +if {[llength $argv]==1 + && [string compare -nocase halt [lindex $argv 0]]==0 +} { + sqlite3 mydb $TRG(dbname) + mydb eval {UPDATE jobs SET state='halt' WHERE state IN ('ready','')} + mydb close + exit +} +#-------------------------------------------------------------------------- + #-------------------------------------------------------------------------- # Check if this is the "help" command: # @@ -1325,7 +1339,7 @@ proc mark_job_as_finished {jobid output state endtm} { SET output=$output, state=$state, endtime=$endtm, span=$endtm-starttime, ntest=$ntest, nerr=$nerr, svers=$svers, pltfm=$pltfm WHERE jobid=$jobid; - UPDATE jobs SET state=$childstate WHERE depid=$jobid; + UPDATE jobs SET state=$childstate WHERE depid=$jobid AND state!='halt'; UPDATE config SET value=value+$nerr WHERE name='nfail'; UPDATE config SET value=value+$ntest WHERE name='ntest'; } From 2c264ad060378a389b2fd0517bb0e7fe0b54ec79 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 23 Oct 2024 10:36:02 +0000 Subject: [PATCH 12/14] Add two new #include statements to the composite "fts5.c" file that is constructed as part of the build process. These #includes are no-ops in the SQLite amalgamation (and are commented out automatically by the amalgamation builder) but are needed if the FTS5 extension is built separately, it seems. [https://bugzilla.mozilla.org/show_bug.cgi?id=1926321#c3|Enhancement request]. FossilOrigin-Name: 1bf8daeb24142044e1b5d4b205317c42353004643fadb6b34f9ae6bfa4e3a6bc --- ext/fts5/tool/mkfts5c.tcl | 30 ++++++++++++++++++++++++++++-- manifest | 15 +++++++-------- manifest.uuid | 2 +- 3 files changed, 36 insertions(+), 11 deletions(-) diff --git a/ext/fts5/tool/mkfts5c.tcl b/ext/fts5/tool/mkfts5c.tcl index b1a55fa4ae..9ea34a01e2 100644 --- a/ext/fts5/tool/mkfts5c.tcl +++ b/ext/fts5/tool/mkfts5c.tcl @@ -23,7 +23,27 @@ set G(src) [string map [list %dir% $srcdir] { }] set G(hdr) { - +/* +** This, the "fts5.c" source file, is a composite file that is itself +** assembled from the following files: +** +** fts5.h +** fts5Int.h +** fts5parse.h <--- Generated from fts5parse.y by Lemon +** fts5parse.c <--- Generated from fts5parse.y by Lemon +** fts5_aux.c +** fts5_buffer.c +** fts5_config.c +** fts5_expr.c +** fts5_hash.c +** fts5_index.c +** fts5_main.c +** fts5_storage.c +** fts5_tokenize.c +** fts5_unicode2.c +** fts5_varint.c +** fts5_vocab.c +*/ #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS5) #if !defined(NDEBUG) && !defined(SQLITE_DEBUG) @@ -33,10 +53,16 @@ set G(hdr) { # undef NDEBUG #endif +#ifdef HAVE_STDINT_H +#include +#endif +#ifdef HAVE_INTTYPES_H +#include +#endif } set G(footer) { - +/* Here ends the fts5.c composite file. */ #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS5) */ } diff --git a/manifest b/manifest index f5b9b0fcf2..b465f70eb3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Changes\sto\sEXPLAIN\sQUERY\sPLAN\sto\sidentify\scovering\sindex\splan\sthat\suse\sindexes\son\sexpressions. -D 2024-10-22T20:16:41.027 +C Add\stwo\snew\s#include\sstatements\sto\sthe\scomposite\s"fts5.c"\sfile\sthat\nis\sconstructed\sas\spart\sof\sthe\sbuild\sprocess.\s\sThese\s#includes\sare\sno-ops\nin\sthe\sSQLite\samalgamation\s(and\sare\scommented\sout\sautomatically\sby\sthe\namalgamation\sbuilder)\sbut\sare\sneeded\sif\sthe\sFTS5\sextension\sis\sbuilt\nseparately,\sit\sseems.\n[https://bugzilla.mozilla.org/show_bug.cgi?id=1926321#c3|Enhancement\srequest]. +D 2024-10-23T10:36:02.768 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -258,7 +258,7 @@ F ext/fts5/test/fts5vocab2.test bbba149c254375d00055930c1a501c9a51e80b0d20bf7b98 F ext/fts5/tool/fts5speed.tcl b0056f91a55b2d1a3684ec05729de92b042e2f85 F ext/fts5/tool/fts5txt2db.tcl c0d43c8590656f8240e622b00957b3a0facc49482411a9fdc2870b45c0c82f9f F ext/fts5/tool/loadfts5.tcl 95b03429ee6b138645703c6ca192c3ac96eaf093 -F ext/fts5/tool/mkfts5c.tcl 3eba8e9bee4221ed165f3304b51b2a74a705f4ec5df3d044573a2be539534af8 +F ext/fts5/tool/mkfts5c.tcl 6649ed963a9135e36866f7cc9f8de5c8dcec85b5df089388274cee6381702cb7 F ext/fts5/tool/showfts5.tcl d54da0e067306663e2d5d523965ca487698e722c F ext/icu/README.txt 7ab7ced8ae78e3a645b57e78570ff589d4c672b71370f5aa9e1cd7024f400fc9 F ext/icu/icu.c 3add8197e0a86c1761771a39500ebae749438bcf1836160b407a56b4eaa8721c @@ -2219,9 +2219,8 @@ F vsixtest/vsixtest.tcl 6195aba1f12a5e10efc2b8c0009532167be5e301abe5b31385638080 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 2cc25d5dbbc729f3b6deb8c6a45b975c535b4d20ad240e4ec0c85b3733a170ed 3bb03a2891e30c58b66e3665a8877a8eab4a8bac57ee153d8d31358caeaf4b7c -R 15f28231c08df955e5429fb2ddbc37e9 -T +closed 3bb03a2891e30c58b66e3665a8877a8eab4a8bac57ee153d8d31358caeaf4b7c -U dan -Z ab6831b500df3a1cef4b8dd808d1b189 +P 29fb4919b6118b3b9ae411ec2ed5b59db7fae281909501c5fa238221ba635db5 +R 462eb90cd57fbab6c1cc9ab949c5cec7 +U drh +Z 54d605f0ae44fd417398f5aefbd89d12 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index a0e2c25761..f962e87c6b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -29fb4919b6118b3b9ae411ec2ed5b59db7fae281909501c5fa238221ba635db5 +1bf8daeb24142044e1b5d4b205317c42353004643fadb6b34f9ae6bfa4e3a6bc From 98772d6e75f4033373c806e4e44f675971e55e38 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 23 Oct 2024 11:06:56 +0000 Subject: [PATCH 13/14] Fix harmless compiler warnings in wherecode.c. One such warning was identified by [forum:/forumpost/721675f007|forum post 721675f007] and the other was found by tool/warnings.sh. FossilOrigin-Name: 987b96aa636c1801f87d3e1c75d34d45c5b6f437bcc6d150298675447ed16b5d --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/wherecode.c | 7 ++++++- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index b465f70eb3..fdd7df6e43 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\stwo\snew\s#include\sstatements\sto\sthe\scomposite\s"fts5.c"\sfile\sthat\nis\sconstructed\sas\spart\sof\sthe\sbuild\sprocess.\s\sThese\s#includes\sare\sno-ops\nin\sthe\sSQLite\samalgamation\s(and\sare\scommented\sout\sautomatically\sby\sthe\namalgamation\sbuilder)\sbut\sare\sneeded\sif\sthe\sFTS5\sextension\sis\sbuilt\nseparately,\sit\sseems.\n[https://bugzilla.mozilla.org/show_bug.cgi?id=1926321#c3|Enhancement\srequest]. -D 2024-10-23T10:36:02.768 +C Fix\sharmless\scompiler\swarnings\sin\swherecode.c.\s\sOne\ssuch\swarning\swas\nidentified\sby\s[forum:/forumpost/721675f007|forum\spost\s721675f007]\sand\sthe\nother\swas\sfound\sby\stool/warnings.sh. +D 2024-10-23T11:06:56.384 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -859,7 +859,7 @@ F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 F src/where.c 4de9e7ca5f49e4a21c1d733e2b2fbbc8b62b1a157a58a562c569da84cfcb005b F src/whereInt.h 1e36ec50392f7cc3d93d1152d4338064cd522b87156a0739388b7e273735f0ca -F src/wherecode.c 8a260111af36d827d218118e36ccb8c359f9517f2743f5fe758e51dd9ae4acc7 +F src/wherecode.c 81b9af89f4f85c8097d0da6a31499f015eabc4d3584963d30ba7b7b782e26514 F src/whereexpr.c 0f93a29cabd3a338d09a1f5c6770620a1ac51ec1157f3229502a7e7767c60b6f F src/window.c 499d48f315a09242dc68f2fac635ed27dcf6bbb0d9ab9084857898c64489e975 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -2219,8 +2219,8 @@ F vsixtest/vsixtest.tcl 6195aba1f12a5e10efc2b8c0009532167be5e301abe5b31385638080 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 29fb4919b6118b3b9ae411ec2ed5b59db7fae281909501c5fa238221ba635db5 -R 462eb90cd57fbab6c1cc9ab949c5cec7 +P 1bf8daeb24142044e1b5d4b205317c42353004643fadb6b34f9ae6bfa4e3a6bc +R 8b3d6cd7e3f896ed28460cc14e806ffb U drh -Z 54d605f0ae44fd417398f5aefbd89d12 +Z 09e3d32bb2ddf741657be04c5623243d # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index f962e87c6b..226b1716d4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1bf8daeb24142044e1b5d4b205317c42353004643fadb6b34f9ae6bfa4e3a6bc +987b96aa636c1801f87d3e1c75d34d45c5b6f437bcc6d150298675447ed16b5d diff --git a/src/wherecode.c b/src/wherecode.c index f1c6711af8..0bd1733b76 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -132,7 +132,9 @@ void sqlite3WhereAddExplainText( int isSearch; /* True for a SEARCH. False for SCAN. */ WhereLoop *pLoop; /* The controlling WhereLoop object */ u32 flags; /* Flags that describe this loop */ +#if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_EXPLAIN) char *zMsg; /* Text to add to EQP output */ +#endif StrAccum str; /* EQP output string */ char zBuf[100]; /* Initial space for EQP output string */ @@ -215,8 +217,10 @@ void sqlite3WhereAddExplainText( sqlite3_str_append(&str, " (~1 row)", 9); } #endif +#if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_EXPLAIN) zMsg = sqlite3StrAccumFinish(&str); sqlite3ExplainBreakpoint("",zMsg); +#endif assert( pOp->opcode==OP_Explain ); assert( pOp->p4type==P4_DYNAMIC || pOp->p4.z==0 ); @@ -355,9 +359,10 @@ void sqlite3WhereAddScanStatus( } }else{ int addr; + VdbeOp *pOp; assert( pSrclist->a[pLvl->iFrom].fg.isSubquery ); addr = pSrclist->a[pLvl->iFrom].u4.pSubq->addrFillSub; - VdbeOp *pOp = sqlite3VdbeGetOp(v, addr-1); + pOp = sqlite3VdbeGetOp(v, addr-1); assert( sqlite3VdbeDb(v)->mallocFailed || pOp->opcode==OP_InitCoroutine ); assert( sqlite3VdbeDb(v)->mallocFailed || pOp->p2>addr ); sqlite3VdbeScanStatusRange(v, addrExplain, addr, pOp->p2-1); From deb5ad6297490ddb910a1fcec61875b109d0a34e Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 23 Oct 2024 11:33:56 +0000 Subject: [PATCH 14/14] Reorder conditions in sqlite3PagerDirectReadOk() for coverage. FossilOrigin-Name: da9124fee28c155c4d1cc0d3949eb7b588a7236c12883a010af7909ad8e534ef --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/pager.c | 10 +++++----- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index fdd7df6e43..35446e6e5b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\scompiler\swarnings\sin\swherecode.c.\s\sOne\ssuch\swarning\swas\nidentified\sby\s[forum:/forumpost/721675f007|forum\spost\s721675f007]\sand\sthe\nother\swas\sfound\sby\stool/warnings.sh. -D 2024-10-23T11:06:56.384 +C Reorder\sconditions\sin\ssqlite3PagerDirectReadOk()\sfor\scoverage. +D 2024-10-23T11:33:56.073 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -759,7 +759,7 @@ F src/os_setup.h 6011ad7af5db4e05155f385eb3a9b4470688de6f65d6166b8956e58a3d87210 F src/os_unix.c 0ad4e0885294b3a0e135a18533590ec9ad91ffe82f6a08e55b40babd51772928 F src/os_win.c 69fa1aaff68270423c85cff4327ba17ef99a1eb017e1a2bfb97416d9b8398b05 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c d57287cd0864c88740d20618e5e595b144b85bfdaefccafd353d596f254a7b35 +F src/pager.c 9656ad4e8331efb8a4f94f7a0c6440b98caea073950a367ea0c728a53b8e62c9 F src/pager.h 4b1140d691860de0be1347474c51fee07d5420bd7f802d38cbab8ea4ab9f538a F src/parse.y a7a8d42eeff01d267444ddb476029b0b1726fb70ae3d77984140f17ad02e2d61 F src/pcache.c 588cc3c5ccaaadde689ed35ce5c5c891a1f7b1f4d1f56f6cf0143b74d8ee6484 @@ -2219,8 +2219,8 @@ F vsixtest/vsixtest.tcl 6195aba1f12a5e10efc2b8c0009532167be5e301abe5b31385638080 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 1bf8daeb24142044e1b5d4b205317c42353004643fadb6b34f9ae6bfa4e3a6bc -R 8b3d6cd7e3f896ed28460cc14e806ffb +P 987b96aa636c1801f87d3e1c75d34d45c5b6f437bcc6d150298675447ed16b5d +R 83c78bc9e17ebe61e54351f39cf78374 U drh -Z 09e3d32bb2ddf741657be04c5623243d +Z cf7f2e26bfd189f11890320a8c9dc42f # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 226b1716d4..612129bdfe 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -987b96aa636c1801f87d3e1c75d34d45c5b6f437bcc6d150298675447ed16b5d +da9124fee28c155c4d1cc0d3949eb7b588a7236c12883a010af7909ad8e534ef diff --git a/src/pager.c b/src/pager.c index baaf4afbfe..4f616f0c7f 100644 --- a/src/pager.c +++ b/src/pager.c @@ -817,11 +817,6 @@ int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno){ assert( pPager!=0 ); assert( pPager->fd!=0 ); if( pPager->fd->pMethods==0 ) return 0; /* Case (1) */ - assert( pPager->fd->pMethods->xDeviceCharacteristics!=0 ); - if( (pPager->fd->pMethods->xDeviceCharacteristics(pPager->fd) - & SQLITE_IOCAP_SUBPAGE_READ)==0 ){ - return 0; /* Case (2) */ - } if( sqlite3PCacheIsDirty(pPager->pPCache) ) return 0; /* Failed (3) */ #ifndef SQLITE_OMIT_WAL if( pPager->pWal ){ @@ -830,6 +825,11 @@ int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno){ return iRead==0; /* Condition (4) */ } #endif + assert( pPager->fd->pMethods->xDeviceCharacteristics!=0 ); + if( (pPager->fd->pMethods->xDeviceCharacteristics(pPager->fd) + & SQLITE_IOCAP_SUBPAGE_READ)==0 ){ + return 0; /* Case (2) */ + } return 1; } #endif