From e0190a6984207b7a3f4da58f6a9ff06c790447a3 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 28 Dec 2024 12:32:01 +0000 Subject: [PATCH 001/220] Fixes to the substr() SQL function so that it can handle ridiculously large numbers in its 2nd and 3rd arguments without signed integer overflows. FossilOrigin-Name: c1de8f916ea617109a903c436c57d082756fbb2b933ba9ce6998b9b912b12dea --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/func.c | 23 +++++++++++------------ 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/manifest b/manifest index 2e54ede973..04000a5492 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sthe\s(debugging)\srtreenode()\sfunction,\sdo\snot\soverride\san\serror\scoming\sout\nof\ssqlite3_result_text(). -D 2024-12-22T21:17:27.858 +C Fixes\sto\sthe\ssubstr()\sSQL\sfunction\sso\sthat\sit\scan\shandle\sridiculously\slarge\nnumbers\sin\sits\s2nd\sand\s3rd\sarguments\swithout\ssigned\sinteger\soverflows. +D 2024-12-28T12:32:01.085 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -730,7 +730,7 @@ F src/delete.c 03a77ba20e54f0f42ebd8eddf15411ed6bdb06a2c472ac4b6b336521bf7cea42 F src/expr.c 3329173aacc6c37da3971b6253827799b32e301673be00126df8271bf018e15f F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 928ed2517e8732113d2b9821aa37af639688d752f4ea9ac6e0e393d713eeb76f -F src/func.c e6e997efb9ffaf8b07842e745159695669fdfa020f03635a2f774adab8b0f4af +F src/func.c 89b733a5f513c4bc06b7271384363d5693d62782de8295bc87b97d79862c9714 F src/global.c a19e4b1ca1335f560e9560e590fc13081e21f670643367f99cb9e8f9dc7d615b F src/hash.c 9ee4269fb1d6632a6fecfb9479c93a1f29271bddbbaf215dd60420bcb80c7220 F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51 @@ -2202,8 +2202,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 536fff14acb3335ad00fb1165cfb2f97e7a31c36273b9b97ffdb4b572fe72c08 -R 4447fcd0ccb80498c83515e29fbbdcc2 +P 286559dfb3ad01fcf34360991a108dbe6bf81e7919c461ada6c691ee8f43868f +R 6fd56d72396565e46db9a7e82d5a2906 U drh -Z 75ed33204df12b76c729fccd2a0270dd +Z 2ed81eb220ab467fd47b108b1040a471 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 7604fcbe51..7b634f4341 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -286559dfb3ad01fcf34360991a108dbe6bf81e7919c461ada6c691ee8f43868f +c1de8f916ea617109a903c436c57d082756fbb2b933ba9ce6998b9b912b12dea diff --git a/src/func.c b/src/func.c index a4b72ecc4d..7a4774527d 100644 --- a/src/func.c +++ b/src/func.c @@ -354,7 +354,6 @@ static void substrFunc( int len; int p0type; i64 p1, p2; - int negP2 = 0; assert( argc==3 || argc==2 ); if( sqlite3_value_type(argv[1])==SQLITE_NULL @@ -389,18 +388,17 @@ static void substrFunc( #endif if( argc==3 ){ p2 = sqlite3_value_int64(argv[2]); - if( p2<0 ){ - p2 = -p2; - negP2 = 1; - } }else{ p2 = sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH]; } if( p1<0 ){ p1 += len; if( p1<0 ){ - p2 += p1; - if( p2<0 ) p2 = 0; + if( p2<0 ){ + p2 = 0; + }else{ + p2 += p1; + } p1 = 0; } }else if( p1>0 ){ @@ -408,12 +406,13 @@ static void substrFunc( }else if( p2>0 ){ p2--; } - if( negP2 ){ - p1 -= p2; - if( p1<0 ){ - p2 += p1; - p1 = 0; + if( p2<0 ){ + if( p2<-p1 ){ + p2 = p1; + }else{ + p2 = -p2; } + p1 -= p2; } assert( p1>=0 && p2>=0 ); if( p0type!=SQLITE_BLOB ){ From 8b689021281d8297003ad580b81ff6c3f743432c Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 28 Dec 2024 13:04:31 +0000 Subject: [PATCH 002/220] Show ETC in fuzzcheck with the --spinner option when there is only one input file. FossilOrigin-Name: 809699aeaaa4bae67e7ddeae3d42c7133f7deadbb4eb869cfb7e99dd97bdea99 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzcheck.c | 29 +++++++++++++++++++++++++---- 3 files changed, 32 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 04000a5492..83b9298fd6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fixes\sto\sthe\ssubstr()\sSQL\sfunction\sso\sthat\sit\scan\shandle\sridiculously\slarge\nnumbers\sin\sits\s2nd\sand\s3rd\sarguments\swithout\ssigned\sinteger\soverflows. -D 2024-12-28T12:32:01.085 +C Show\sETC\sin\sfuzzcheck\swith\sthe\s--spinner\soption\swhen\sthere\sis\sonly\sone\sinput\nfile. +D 2024-12-28T13:04:31.448 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -1274,7 +1274,7 @@ F test/fuzz3.test 70ba57260364b83e964707b9d4b5625284239768ab907dd387c740c0370ce3 F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c 89b71d92b150a532e945e489d6e0721a4b15353c9255e079c198ed2a1958018b +F test/fuzzcheck.c 1671559091b3e134ec807490f624d306b24bd9a8f03b12aa97e292f4b31e5d96 F test/fuzzdata1.db 3e86d9cf5aea68ddb8e27c02d7dfdaa226347426c7eb814918e4d95475bf8517 F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -2202,8 +2202,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 286559dfb3ad01fcf34360991a108dbe6bf81e7919c461ada6c691ee8f43868f -R 6fd56d72396565e46db9a7e82d5a2906 +P c1de8f916ea617109a903c436c57d082756fbb2b933ba9ce6998b9b912b12dea +R c040710ee01619bb4db43dcfabab289e U drh -Z 2ed81eb220ab467fd47b108b1040a471 +Z 7ae0fec8e974918548c014471849b63b # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 7b634f4341..9d76ba4003 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c1de8f916ea617109a903c436c57d082756fbb2b933ba9ce6998b9b912b12dea +809699aeaaa4bae67e7ddeae3d42c7133f7deadbb4eb869cfb7e99dd97bdea99 diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index 9f339096bc..390d804df1 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -1917,6 +1917,7 @@ int main(int argc, char **argv){ int bTimer = 0; /* Show elapse time for each test */ int nV; /* How much to increase verbosity with -vvvv */ sqlite3_int64 tmStart; /* Start of each test */ + int iEstTime = 0; /* LPF for the time-to-go */ sqlite3_config(SQLITE_CONFIG_URI,1); registerOomSimulator(); @@ -2416,9 +2417,29 @@ int main(int argc, char **argv){ if( bScript ){ /* No progress output */ }else if( bSpinner ){ - int nTotal =g.nSql; + int nTotal = g.nSql; int idx = pSql->seq; - printf("\r%s: %d/%d ", zDbName, idx, nTotal); + if( nSrcDb==1 && nTotal>idx && idx>=20 ){ + int iToGo = (timeOfDay() - iBegin)*(nTotal-idx)/(idx*1000); + int hr, min, sec; + if( idx==20 ){ + iEstTime = iToGo; + }else{ + iEstTime = (iToGo + 7*iEstTime)/8; + } + hr = iEstTime/3600; + min = (iEstTime/60)%60; + sec = iEstTime%60; + if( hr>0 ){ + printf("\r%s: %d/%d ETC %d:%02d:%02d ", + zDbName, idx, nTotal, hr, min, sec); + }else{ + printf("\r%s: %d/%d ETC %02d:%02d ", + zDbName, idx, nTotal, min, sec); + } + }else{ + printf("\r%s: %d/%d ", zDbName, idx, nTotal); + } fflush(stdout); }else if( verboseFlag>1 ){ printf("%s\n", g.zTestName); @@ -2457,7 +2478,7 @@ int main(int argc, char **argv){ }else if( bSpinner ){ int nTotal = g.nDb*g.nSql; int idx = pSql->seq*g.nDb + pDb->id - 1; - printf("\r%s: %d/%d ", zDbName, idx, nTotal); + printf("\r%s: %d/%d ", zDbName, idx, nTotal); fflush(stdout); }else if( verboseFlag>1 ){ printf("%s\n", g.zTestName); @@ -2560,7 +2581,7 @@ int main(int argc, char **argv){ /* No progress output */ }else if( bSpinner ){ int nTotal = g.nDb*g.nSql; - printf("\r%s: %d/%d \n", zDbName, nTotal, nTotal); + printf("\r%s: %d/%d \n", zDbName, nTotal, nTotal); }else if( !quietFlag && verboseFlag<2 ){ printf(" 100%% - %d tests\n", g.nDb*g.nSql); } From 4112a63b8fa8357133f2c8e089dcd9193fc2926b Mon Sep 17 00:00:00 2001 From: drh <> Date: Sun, 29 Dec 2024 11:54:12 +0000 Subject: [PATCH 003/220] Four new assert() statements to help with static analysis. FossilOrigin-Name: e7f7c9d22be8a17b9a4d8f954fcdd40591ba9da5fb674f1184f960bca5f3d30b --- ext/fts5/fts5_index.c | 4 ++++ manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 8730b69509..242258af70 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -6651,6 +6651,7 @@ static void fts5SetupPrefixIter( } pData = fts5IdxMalloc(p, sizeof(*pData)+s.doclist.n+FTS5_DATA_ZERO_PADDING); + assert( pData!=0 || p->rc!=SQLITE_OK ); if( pData ){ pData->p = (u8*)&pData[1]; pData->nn = pData->szLeaf = s.doclist.n; @@ -6658,6 +6659,7 @@ static void fts5SetupPrefixIter( fts5MultiIterNew2(p, pData, bDesc, ppIter); } + assert( (*ppIter)!=0 || p->rc!=SQLITE_OK ); if( p->rc==SQLITE_OK && s.pTokendata ){ fts5TokendataIterSortMap(p, s2.pT); (*ppIter)->pTokenDataIter = s2.pT; @@ -7289,6 +7291,7 @@ int sqlite3Fts5IndexQuery( int iIdx = 0; /* Index to search */ int iPrefixIdx = 0; /* +1 prefix index */ int bTokendata = pConfig->bTokendata; + assert( buf.p!=0 ); if( nToken>0 ) memcpy(&buf.p[1], pToken, nToken); /* The NOTOKENDATA flag is set when each token in a tokendata=1 table @@ -7450,6 +7453,7 @@ static int fts5SetupPrefixIterTokendata( memset(&ctx, 0, sizeof(ctx)); fts5BufferGrow(&p->rc, &token, nToken+1); + assert( token.p!=0 || p->rc!=SQLITE_OK ); ctx.pT = (Fts5TokenDataIter*)sqlite3Fts5MallocZero(&p->rc, sizeof(*ctx.pT)); if( p->rc==SQLITE_OK ){ diff --git a/manifest b/manifest index 83b9298fd6..b26114a8c1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Show\sETC\sin\sfuzzcheck\swith\sthe\s--spinner\soption\swhen\sthere\sis\sonly\sone\sinput\nfile. -D 2024-12-28T13:04:31.448 +C Four\snew\sassert()\sstatements\sto\shelp\swith\sstatic\sanalysis. +D 2024-12-29T11:54:12.033 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -111,7 +111,7 @@ F ext/fts5/fts5_buffer.c 0eec58bff585f1a44ea9147eae5da2447292080ea435957f7488c70 F ext/fts5/fts5_config.c e7d8dd062b44a66cd77e5a0f74f23a2354cd1f3f8575afb967b2773c3384f7f8 F ext/fts5/fts5_expr.c 69b8d976058512c07dfe86e229521b7a871768157bd1607cedf1a5038dfd72c9 F ext/fts5/fts5_hash.c adda4272be401566a6e0ba1acbe70ee5cb97fce944bc2e04dc707152a0ec91b1 -F ext/fts5/fts5_index.c cef6791bd9f9db4305494292d6dd5d24a7379aabf370a4d6b559e16b740fa88e +F ext/fts5/fts5_index.c 1a7312b7bb0fd0853266d211764cd519a803f01bbf6e486df9a85551ad4257cb F ext/fts5/fts5_main.c 72527efa1d634054b93a21eafe854763cbc5c270e8a4ab99bbb589557b818482 F ext/fts5/fts5_storage.c 337b05e4c66fc822d031e264d65bde807ec2fab08665ca2cc8aaf9c5fa06792c F ext/fts5/fts5_tcl.c 7fb5a3d3404099075aaa2457307cb459bbc257c0de3dbd52b1e80a5b503e0329 @@ -2202,8 +2202,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P c1de8f916ea617109a903c436c57d082756fbb2b933ba9ce6998b9b912b12dea -R c040710ee01619bb4db43dcfabab289e +P 809699aeaaa4bae67e7ddeae3d42c7133f7deadbb4eb869cfb7e99dd97bdea99 +R e65009700ed066053c3d65387514268c U drh -Z 7ae0fec8e974918548c014471849b63b +Z c0857ad3c43398292371098755c936e4 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 9d76ba4003..c280946b6a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -809699aeaaa4bae67e7ddeae3d42c7133f7deadbb4eb869cfb7e99dd97bdea99 +e7f7c9d22be8a17b9a4d8f954fcdd40591ba9da5fb674f1184f960bca5f3d30b From 6b19c72f26d15317a445b4dd1165b2cba1cd83c5 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 30 Dec 2024 12:29:18 +0000 Subject: [PATCH 004/220] Add an extra assert() to releaseMemArray() just to prove that the sqlite3_value.db field is never NULL. FossilOrigin-Name: b969ef1def5121c7ff54e3586528274f006ca994b308cf88ccaa9d4f56bf30df --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbeaux.c | 1 + 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index b26114a8c1..5571665cf9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Four\snew\sassert()\sstatements\sto\shelp\swith\sstatic\sanalysis. -D 2024-12-29T11:54:12.033 +C Add\san\sextra\sassert()\sto\sreleaseMemArray()\sjust\sto\sprove\sthat\sthe\nsqlite3_value.db\sfield\sis\snever\sNULL. +D 2024-12-30T12:29:18.018 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -850,7 +850,7 @@ F src/vdbe.c 8a6eb02823b424b273614bae41579392a5c495424592b60423dd2c443a583df0 F src/vdbe.h 9676348d342bd04e21e384c63b57224171ce84fac77853357334ef94c4d33cf4 F src/vdbeInt.h bf294a0c8fc4cc80779e74b04b8bd82c6e1197b3137cefe0b16cdf002fc7dfd6 F src/vdbeapi.c 38c252a202d70b56cfb734460bc888ddbd581afec1a10cd4d6c894c9e0b5baea -F src/vdbeaux.c f0706ad786b8a6c5bc7ea622f3916c2ba2b883abc872d0b4911c4f021945c0e5 +F src/vdbeaux.c 1969b208ab554f0a6560a86c339dad5faf68d3ef861f96be86792d7eec23575d F src/vdbeblob.c 255be187436da38b01f276c02e6a08103489bbe2a7c6c21537b7aecbe0e1f797 F src/vdbemem.c df568ef0187e4be2788c35174f6d9b8566ab9475f9aff2d73907ed05aa5684b2 F src/vdbesort.c d0a3c7056c081703c8b6d91ad60f17da5e062a5c64bf568ed0fa1b5f4cae311f @@ -2202,8 +2202,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 809699aeaaa4bae67e7ddeae3d42c7133f7deadbb4eb869cfb7e99dd97bdea99 -R e65009700ed066053c3d65387514268c +P e7f7c9d22be8a17b9a4d8f954fcdd40591ba9da5fb674f1184f960bca5f3d30b +R f8a1fde40935ca24cba561f520c119c6 U drh -Z c0857ad3c43398292371098755c936e4 +Z 3a5e22afa8456e78923838b8f35ae4a2 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index c280946b6a..98b845261c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e7f7c9d22be8a17b9a4d8f954fcdd40591ba9da5fb674f1184f960bca5f3d30b +b969ef1def5121c7ff54e3586528274f006ca994b308cf88ccaa9d4f56bf30df diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 4414f7a2ec..3d918be32e 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -2169,6 +2169,7 @@ static void releaseMemArray(Mem *p, int N){ if( p && N ){ Mem *pEnd = &p[N]; sqlite3 *db = p->db; + assert( db!=0 ); if( db->pnBytesFreed ){ do{ if( p->szMalloc ) sqlite3DbFree(db, p->zMalloc); From 71d6456f59c7008ccb0a8e917d4a9117081bdd66 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 30 Dec 2024 13:54:52 +0000 Subject: [PATCH 005/220] New assert() statements to show that the sqlite3_value.db field is initialized for MemArrays. FossilOrigin-Name: 7cd8ccf57d1ae0f597ec5004201395f61ef4750728f3c1b9c4dd52d28916a4f7 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/vdbeaux.c | 2 ++ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 5571665cf9..8f744aa29b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\san\sextra\sassert()\sto\sreleaseMemArray()\sjust\sto\sprove\sthat\sthe\nsqlite3_value.db\sfield\sis\snever\sNULL. -D 2024-12-30T12:29:18.018 +C New\sassert()\sstatements\sto\sshow\sthat\sthe\ssqlite3_value.db\sfield\sis\sinitialized\nfor\sMemArrays. +D 2024-12-30T13:54:52.618 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -850,7 +850,7 @@ F src/vdbe.c 8a6eb02823b424b273614bae41579392a5c495424592b60423dd2c443a583df0 F src/vdbe.h 9676348d342bd04e21e384c63b57224171ce84fac77853357334ef94c4d33cf4 F src/vdbeInt.h bf294a0c8fc4cc80779e74b04b8bd82c6e1197b3137cefe0b16cdf002fc7dfd6 F src/vdbeapi.c 38c252a202d70b56cfb734460bc888ddbd581afec1a10cd4d6c894c9e0b5baea -F src/vdbeaux.c 1969b208ab554f0a6560a86c339dad5faf68d3ef861f96be86792d7eec23575d +F src/vdbeaux.c 5fcbc642a3d3d88c5ea15cadf2c8b8e4e067cb9ff374beb1875c9d209001299e F src/vdbeblob.c 255be187436da38b01f276c02e6a08103489bbe2a7c6c21537b7aecbe0e1f797 F src/vdbemem.c df568ef0187e4be2788c35174f6d9b8566ab9475f9aff2d73907ed05aa5684b2 F src/vdbesort.c d0a3c7056c081703c8b6d91ad60f17da5e062a5c64bf568ed0fa1b5f4cae311f @@ -2202,8 +2202,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P e7f7c9d22be8a17b9a4d8f954fcdd40591ba9da5fb674f1184f960bca5f3d30b -R f8a1fde40935ca24cba561f520c119c6 +P b969ef1def5121c7ff54e3586528274f006ca994b308cf88ccaa9d4f56bf30df +R 18406ff7db8174f76f6c592dc7e8fcab U drh -Z 3a5e22afa8456e78923838b8f35ae4a2 +Z 815773c1659cf7d73e9358310c714bdb # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 98b845261c..0b15193ff2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b969ef1def5121c7ff54e3586528274f006ca994b308cf88ccaa9d4f56bf30df +7cd8ccf57d1ae0f597ec5004201395f61ef4750728f3c1b9c4dd52d28916a4f7 diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 3d918be32e..b9e8b3cdf8 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -2144,6 +2144,7 @@ void sqlite3VdbePrintOp(FILE *pOut, int pc, VdbeOp *pOp){ ** will be initialized before use. */ static void initMemArray(Mem *p, int N, sqlite3 *db, u16 flags){ + assert( db!=0 ); if( N>0 ){ do{ p->flags = flags; @@ -2650,6 +2651,7 @@ void sqlite3VdbeMakeReady( assert( pParse!=0 ); assert( p->eVdbeState==VDBE_INIT_STATE ); assert( pParse==p->pParse ); + assert( pParse->db==p->db ); p->pVList = pParse->pVList; pParse->pVList = 0; db = p->db; From 95f6df5b8d55e67d1e34d2bff217305a2f21b1fb Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 30 Dec 2024 21:23:53 +0000 Subject: [PATCH 006/220] Add the convenience makefile target (unix-only) "src-archives" that builds the various tarballs and ZIP archives that go on the download page. This is intended to make it easier and less error prone to put up new "draft" download pages for testing. FossilOrigin-Name: 2b17bc49655c577029919c2d409de994b0d252f8efb5da1ba0913f2c96bee552 --- main.mk | 15 +++++++++++++++ manifest | 14 ++++++++------ manifest.uuid | 2 +- tool/mkamalzip.tcl | 15 +++++++++++++++ tool/mksrczip.tcl | 14 ++++++++++++++ 5 files changed, 53 insertions(+), 7 deletions(-) create mode 100644 tool/mkamalzip.tcl create mode 100644 tool/mksrczip.tcl diff --git a/main.mk b/main.mk index f98850731e..660cf54bd3 100644 --- a/main.mk +++ b/main.mk @@ -1929,6 +1929,21 @@ amalgamation-tarball: sqlite3.c sqlite3rc.h snapshot-tarball: sqlite3.c sqlite3rc.h TOP=$(TOP) sh $(TOP)/tool/mkautoconfamal.sh --snapshot +# Build a ZIP archive snapshot of the latest check-in. +# +sqlite-src.zip: $(TOP)/tool/mksrczip.tcl + $(TCLSH_CMD) $(TOP)/tool/mksrczip.tcl + +# Build a ZIP archive of the amaglamation +# +sqlite-amalgamation.zip: $(TOP)/tool/mkamalzip.tcl sqlite3.c sqlite3.h shell.c sqlite3ext.h + $(TCLSH_CMD) $(TOP)/tool/mkamalzip.tcl + +# Build all the source code deliverables +# +src-archives: sqlite-amalgamation.zip amalgamation-tarball sqlite-src.zip + ls -ltr *.zip *.tar.gz | tail -3 + # Build a ZIP archive containing various command-line tools. # tool-zip: testfixture$(T.exe) sqlite3$(T.exe) sqldiff$(T.exe) \ diff --git a/manifest b/manifest index 8f744aa29b..2f45824ace 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\sassert()\sstatements\sto\sshow\sthat\sthe\ssqlite3_value.db\sfield\sis\sinitialized\nfor\sMemArrays. -D 2024-12-30T13:54:52.618 +C Add\sthe\sconvenience\smakefile\starget\s(unix-only)\s"src-archives"\sthat\sbuilds\nthe\svarious\starballs\sand\sZIP\sarchives\sthat\sgo\son\sthe\sdownload\spage.\s\sThis\sis\nintended\sto\smake\sit\seasier\sand\sless\serror\sprone\sto\sput\sup\snew\s"draft"\sdownload\npages\sfor\stesting. +D 2024-12-30T21:23:53.148 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -699,7 +699,7 @@ F ext/wasm/tests/opfs/concurrency/test.js d08889a5bb6e61937d0b8cbb78c9efbefbf65a F ext/wasm/tests/opfs/concurrency/worker.js 0a8c1a3e6ebb38aabbee24f122693f1fb29d599948915c76906681bb7da1d3d2 F ext/wasm/wasmfs.make bc8bb227f35d5bd3863a7bd2233437c37472a0d81585979f058f9b9b503bef35 F magic.txt 5ade0bc977aa135e79e3faaea894d5671b26107cc91e70783aa7dc83f22f3ba0 -F main.mk 1ec3c7a81198397b14bf75c9304f01e891a5d464797cd402d4f3781feadd3331 +F main.mk fde6ef9167ab1972f6273c0cc06a7d2d776f562d06f44f4987868335910f3803 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 F mptest/crash01.test 61e61469e257df0850df4293d7d4d6c2af301421 @@ -2138,6 +2138,7 @@ F tool/loadfts.c c3c64e4d5e90e8ba41159232c2189dba4be7b862 F tool/logest.c c34e5944318415de513d29a6098df247a9618c96d83c38d4abd88641fe46e669 F tool/max-limits.c cbb635fbb37ae4d05f240bfb5b5270bb63c54439 F tool/merge-test.tcl de76b62f2de2a92d4c1ca4f976bce0aea6899e0229e250479b229b2a1914b176 +F tool/mkamalzip.tcl 8a1b21fb6a7f990eb9625e08daa2dd0e03cb551bccc69ccd1cdd5bd975e8177a F tool/mkautoconfamal.sh cbdcf993fa83dccbef7fb77b39cdeb31ef9f77d9d88c9e343b58d35ca3898a6a F tool/mkccode.tcl 210159febe0ef0ecbc53c79833500663ceaba0115b2b374405818dc835b5f84b x F tool/mkctimec.tcl ef6a67ec82e5b6fc19152a4c79f237227b18bf67ff16d155bac7adb94355d9cf x @@ -2154,6 +2155,7 @@ F tool/mksqlite3c-noext.tcl 4f7cfef5152b0c91920355cbfc1d608a4ad242cb819f1aea07f6 F tool/mksqlite3c.tcl 9e88a30981280e33489fe4782f4ab1e5349ba1866603fba7f1a948d5599b9124 F tool/mksqlite3h.tcl 7a4648fef5efb33308d575c7775eb242855d71d5bf89065df3f006b9a634a0a1 F tool/mksqlite3internalh.tcl eb994013e833359137eb53a55acdad0b5ae1049b +F tool/mksrczip.tcl 81efd9974dbb36005383f2cd655520057a2ae5aa85ac2441a80c7c28f803ac52 F tool/mktoolzip.tcl 34b4e92be544f820e2cc26f143f7d5aec511e826ec394cc82969a5dcf7c7a27c F tool/mkvsix.tcl 67b40996a50f985a573278eea32fc5a5eb6110bdf14d33f1d8086e48c69e540a F tool/offsets.c 8ed2b344d33f06e71366a9b93ccedaa38c096cc1dbd4c3c26ad08c6115285845 @@ -2202,8 +2204,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P b969ef1def5121c7ff54e3586528274f006ca994b308cf88ccaa9d4f56bf30df -R 18406ff7db8174f76f6c592dc7e8fcab +P 7cd8ccf57d1ae0f597ec5004201395f61ef4750728f3c1b9c4dd52d28916a4f7 +R f56cb98bdebf27e28da45a1d08491799 U drh -Z 815773c1659cf7d73e9358310c714bdb +Z 0ad30bdc3b0bb40aad0de043d83aa269 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 0b15193ff2..60af841357 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7cd8ccf57d1ae0f597ec5004201395f61ef4750728f3c1b9c4dd52d28916a4f7 +2b17bc49655c577029919c2d409de994b0d252f8efb5da1ba0913f2c96bee552 diff --git a/tool/mkamalzip.tcl b/tool/mkamalzip.tcl new file mode 100644 index 0000000000..a7c6587566 --- /dev/null +++ b/tool/mkamalzip.tcl @@ -0,0 +1,15 @@ +#!/usr/bin/tclsh +# +# Build a ZIP archive for the amalgamation source code found in the current +# directory. +# +set VERSION-file [file dirname [file dirname [file normalize $argv0]]]/VERSION +set fd [open ${VERSION-file} rb] +set vers [read $fd] +close $fd +scan $vers %d.%d.%d major minor patch +set numvers [format {3%02d%02d00} $minor $patch] +set cmd "zip sqlite-amalgamation-$numvers.zip\ + sqlite3.c sqlite3.h shell.c sqlite3ext.h" +puts $cmd +exec {*}$cmd diff --git a/tool/mksrczip.tcl b/tool/mksrczip.tcl new file mode 100644 index 0000000000..4431c3d666 --- /dev/null +++ b/tool/mksrczip.tcl @@ -0,0 +1,14 @@ +#!/usr/bin/tclsh +# +# Build a ZIP archive for the complete, unedited source code that +# corresponds to the current check-out. +# +set VERSION-file [file dirname [file dirname [file normalize $argv0]]]/VERSION +set fd [open ${VERSION-file} rb] +set vers [read $fd] +close $fd +scan $vers %d.%d.%d major minor patch +set numvers [format {3%02d%02d00} $minor $patch] +set cmd "fossil zip current sqlite-src-$numvers.zip --name sqlite-src-$numvers" +puts $cmd +exec {*}$cmd From f7fcf7f910dcbc765eac670d74f36ccddbfe81c3 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 1 Jan 2025 12:24:01 +0000 Subject: [PATCH 007/220] Fix the vfstrace.c extension so that it supports xFetch and xUnfetch. FossilOrigin-Name: c7132b7e62422378f0560dcf0837888db5aa70cded9d783ab389581aa43dc5c8 --- ext/misc/vfstrace.c | 29 ++++++++++++++++++++++++++++- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/ext/misc/vfstrace.c b/ext/misc/vfstrace.c index e8b51cdd03..fed87e88f3 100644 --- a/ext/misc/vfstrace.c +++ b/ext/misc/vfstrace.c @@ -188,6 +188,7 @@ struct vfstrace_file { #define VTR_SLEEP 0x02000000 #define VTR_CURTIME 0x04000000 #define VTR_LASTERR 0x08000000 +#define VTR_FETCH 0x10000000 /* Also coverse xUnfetch */ /* ** Method declarations for vfstrace_file. @@ -617,6 +618,7 @@ static int vfstraceFileControl(sqlite3_file *pFile, int op, void *pArg){ { "currenttime", VTR_CURTIME }, { "currenttimeint64", VTR_CURTIME }, { "getlasterror", VTR_LASTERR }, + { "fetch", VTR_FETCH }, }; int onOff = 1; while( zArg[0] ){ @@ -844,7 +846,28 @@ static int vfstraceShmUnmap(sqlite3_file *pFile, int delFlag){ vfstrace_print_errcode(pInfo, " -> %s\n", rc); return rc; } - +static int vfstraceFetch(sqlite3_file *pFile, i64 iOff, int nAmt, void **pptr){ + vfstrace_file *p = (vfstrace_file *)pFile; + vfstrace_info *pInfo = p->pInfo; + int rc; + vfstraceOnOff(pInfo, VTR_FETCH); + vfstrace_printf(pInfo, "%s.xFetch(%s,iOff=%lld,nAmt=%d,p=%p)", + pInfo->zVfsName, p->zFName, iOff, nAmt, *pptr); + rc = p->pReal->pMethods->xFetch(p->pReal, iOff, nAmt, pptr); + vfstrace_print_errcode(pInfo, " -> %s\n", rc); + return rc; +} +static int vfstraceUnfetch(sqlite3_file *pFile, i64 iOff, void *ptr){ + vfstrace_file *p = (vfstrace_file *)pFile; + vfstrace_info *pInfo = p->pInfo; + int rc; + vfstraceOnOff(pInfo, VTR_FETCH); + vfstrace_printf(pInfo, "%s.xUnfetch(%s,iOff=%lld,p=%p)", + pInfo->zVfsName, p->zFName, iOff, ptr); + rc = p->pReal->pMethods->xUnfetch(p->pReal, iOff, ptr); + vfstrace_print_errcode(pInfo, " -> %s\n", rc); + return rc; +} /* @@ -891,6 +914,10 @@ static int vfstraceOpen( pNew->xShmBarrier = pSub->xShmBarrier ? vfstraceShmBarrier : 0; pNew->xShmUnmap = pSub->xShmUnmap ? vfstraceShmUnmap : 0; } + if( pNew->iVersion>=3 ){ + pNew->xFetch = pSub->xFetch ? vfstraceFetch : 0; + pNew->xUnfetch = pSub->xUnfetch ? vfstraceUnfetch : 0; + } pFile->pMethods = pNew; } vfstrace_print_errcode(pInfo, " -> %s", rc); diff --git a/manifest b/manifest index 2f45824ace..72166caccb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\sconvenience\smakefile\starget\s(unix-only)\s"src-archives"\sthat\sbuilds\nthe\svarious\starballs\sand\sZIP\sarchives\sthat\sgo\son\sthe\sdownload\spage.\s\sThis\sis\nintended\sto\smake\sit\seasier\sand\sless\serror\sprone\sto\sput\sup\snew\s"draft"\sdownload\npages\sfor\stesting. -D 2024-12-30T21:23:53.148 +C Fix\sthe\svfstrace.c\sextension\sso\sthat\sit\ssupports\sxFetch\sand\sxUnfetch. +D 2025-01-01T12:24:01.620 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -453,7 +453,7 @@ F ext/misc/urifuncs.c f71360d14fa9e7626b563f1f781c6148109462741c5235ac63ae0f8917 F ext/misc/uuid.c 5bb2264c1b64d163efa46509544fd7500cb8769cb7c16dd52052da8d961505cf F ext/misc/vfslog.c 3932ab932eeb2601dbc4447cb14d445aaa9fbe43b863ef5f014401c3420afd20 F ext/misc/vfsstat.c a85df08654743922a19410d7b1e3111de41bb7cd07d20dd16eda4e2b808d269d -F ext/misc/vfstrace.c 4d8b39570cbede1a05928c77e2142f8a744468443bf649cf86da3924e5e60fca +F ext/misc/vfstrace.c 9c4abd2f67ae2760e7a241eca2e8517c64480ac2c3e66a499326e688a9bbee22 F ext/misc/vtablog.c 1100250ce8782db37c833e3a9a5c9a3ecf1af5e15b8325572b82e6e0a138ffb5 F ext/misc/vtshim.c 1976e6dd68dd0d64508c91a6dfab8e75f8aaf6cd F ext/misc/wholenumber.c 0fa0c082676b7868bf2fa918e911133f2b349bcdceabd1198bba5f65b4fc0668 @@ -2204,8 +2204,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 7cd8ccf57d1ae0f597ec5004201395f61ef4750728f3c1b9c4dd52d28916a4f7 -R f56cb98bdebf27e28da45a1d08491799 +P 2b17bc49655c577029919c2d409de994b0d252f8efb5da1ba0913f2c96bee552 +R 1a7b3740d0d7b0156ecda7d86d9b3eae U drh -Z 0ad30bdc3b0bb40aad0de043d83aa269 +Z ba39083b8910dae572ba02a04ab64577 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 60af841357..1eb7acbbfc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2b17bc49655c577029919c2d409de994b0d252f8efb5da1ba0913f2c96bee552 +c7132b7e62422378f0560dcf0837888db5aa70cded9d783ab389581aa43dc5c8 From 66985fb8fff34b7d46980202b9a245f3bb9db26a Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 1 Jan 2025 18:18:49 +0000 Subject: [PATCH 008/220] Fix the tool/omittest.tcl script, broken by [d8c0e0184226bdae]. FossilOrigin-Name: 4f6c36a61c2b27e204c00bd7467453098f756c7e596b7e62d47da8784fbd2026 --- manifest | 12 ++++++------ manifest.uuid | 2 +- tool/omittest.tcl | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 72166caccb..a4764f5808 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\svfstrace.c\sextension\sso\sthat\sit\ssupports\sxFetch\sand\sxUnfetch. -D 2025-01-01T12:24:01.620 +C Fix\sthe\stool/omittest.tcl\sscript,\sbroken\sby\s[d8c0e0184226bdae]. +D 2025-01-01T18:18:49.769 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -2160,7 +2160,7 @@ F tool/mktoolzip.tcl 34b4e92be544f820e2cc26f143f7d5aec511e826ec394cc82969a5dcf7c F tool/mkvsix.tcl 67b40996a50f985a573278eea32fc5a5eb6110bdf14d33f1d8086e48c69e540a F tool/offsets.c 8ed2b344d33f06e71366a9b93ccedaa38c096cc1dbd4c3c26ad08c6115285845 F tool/omittest-msvc.tcl d6b8f501ac1d7798c4126065030f89812379012cad98a1735d6d7221492abc08 -F tool/omittest.tcl 5ca5e4e01716d5f35b48b00fd351d929f01fbb98169a5a3cd00baf3d2e2019a9 +F tool/omittest.tcl bec70ef0e16255c8d9eb06ecd7edf823c07a60a836186cdbce3528fb34b67995 F tool/opcodesum.tcl 740ed206ba8c5040018988129abbf3089a0ccf4a F tool/pagesig.c f98909b4168d9cac11a2de7f031adea0e2f3131faa7515a72807c03ec58eafeb F tool/replace.tcl 511c61acfe563dfb58675efb4628bb158a13d48ff8322123ac447e9d25a82d9a @@ -2204,8 +2204,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 2b17bc49655c577029919c2d409de994b0d252f8efb5da1ba0913f2c96bee552 -R 1a7b3740d0d7b0156ecda7d86d9b3eae +P c7132b7e62422378f0560dcf0837888db5aa70cded9d783ab389581aa43dc5c8 +R b61fb2d8724df93fbff2b6eed5e91f66 U drh -Z ba39083b8910dae572ba02a04ab64577 +Z 966756dbeab414c1a4d72e1421c875b3 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 1eb7acbbfc..5f61c67895 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c7132b7e62422378f0560dcf0837888db5aa70cded9d783ab389581aa43dc5c8 +4f6c36a61c2b27e204c00bd7467453098f756c7e596b7e62d47da8784fbd2026 diff --git a/tool/omittest.tcl b/tool/omittest.tcl index e9033c0bdd..0452a4c6f6 100644 --- a/tool/omittest.tcl +++ b/tool/omittest.tcl @@ -200,8 +200,8 @@ foreach sym $CompileOptionsToTest { } else { set opts OPT_FEATURE_FLAGS=-D$sym } - puts "make tidy sqlite3.lo $opts" - if {[catch {exec make tidy sqlite3.lo $opts >& $logfile}]} { + puts "make tidy sqlite3.o $opts" + if {[catch {exec make tidy sqlite3.o $opts >& $logfile}]} { puts "BUILD FAILED: see $logfile for details" if {[info exists FailIsOk($sym)]} { set Failure($sym) 1 From e0b6ee51859720138fcaafd042eb605a2ecdeeb4 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 2 Jan 2025 12:14:01 +0000 Subject: [PATCH 009/220] Update the build instructions for Windows to note that VS2015 or later is required to avoid the need to install tclsh.exe. FossilOrigin-Name: da0ef0567be55648413bcbf2e129f348776a908dbad2ac8582ee3e27ac459e3b --- doc/compile-for-windows.md | 9 +++++++++ manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/doc/compile-for-windows.md b/doc/compile-for-windows.md index b3a48549a6..5cecfbf547 100644 --- a/doc/compile-for-windows.md +++ b/doc/compile-for-windows.md @@ -7,6 +7,15 @@ canonical source on a new Windows 11 PC, as of 2024-10-09: will work fine. Do a standard install for C++ development. SQLite only needs the "cl" compiler and the "nmake" build tool. + 2. Under the "Start" menu, find "All Apps" then go to "Visual Studio 20XX" and find "x64 Native Tools Command Prompt for VS 20XX". Pin that diff --git a/manifest b/manifest index a4764f5808..677b44875c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\stool/omittest.tcl\sscript,\sbroken\sby\s[d8c0e0184226bdae]. -D 2025-01-01T18:18:49.769 +C Update\sthe\sbuild\sinstructions\sfor\sWindows\sto\snote\sthat\sVS2015\sor\slater\sis\nrequired\sto\savoid\sthe\sneed\sto\sinstall\stclsh.exe. +D 2025-01-02T12:14:01.327 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -56,7 +56,7 @@ F configure 9a00b21dfd13757bbfb8d89b30660a89ec1f8f3a79402b8f9f9b6fc475c3303a x F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad F doc/F2FS.txt c1d4a0ae9711cfe0e1d8b019d154f1c29e0d3abfe820787ba1e9ed7691160fcd F doc/compile-for-unix.md 7d6a5770611ea0643de456b385581923dac7c0a7c3758825dda810d12fc3e5b2 -F doc/compile-for-windows.md 17e1491897a117ff0247531a61671b26d487bc1dad25c3894c04ad4fca936a7f +F doc/compile-for-windows.md 791f1754fcd669b0a8fdcdc0fdd56eff8c148add7457e8bf4863b46829966fc1 F doc/json-enhancements.md e356fc834781f1f1aa22ee300027a270b2c960122468499bf347bb123ce1ea4f F doc/jsonb.md 5fab4b8613aa9153fbeb6259297bd4697988af8b3d23900deba588fa7841456b F doc/lemon.html 8b266ff711d2ec7f867c3dca37634963f48a630329908cc282beebfa8c708706 @@ -2204,8 +2204,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P c7132b7e62422378f0560dcf0837888db5aa70cded9d783ab389581aa43dc5c8 -R b61fb2d8724df93fbff2b6eed5e91f66 +P 4f6c36a61c2b27e204c00bd7467453098f756c7e596b7e62d47da8784fbd2026 +R c359455d12a83b16327a4eb96d1245c3 U drh -Z 966756dbeab414c1a4d72e1421c875b3 +Z 5fb03700b1eda71764ba1102db353cb9 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 5f61c67895..cf83b9aeb5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4f6c36a61c2b27e204c00bd7467453098f756c7e596b7e62d47da8784fbd2026 +da0ef0567be55648413bcbf2e129f348776a908dbad2ac8582ee3e27ac459e3b From a683b055fbecd8a9e78602003bad558eb1a61420 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 2 Jan 2025 15:03:13 +0000 Subject: [PATCH 010/220] Improvements to the way that truncation is implemented in sqlite_dbpage(). FossilOrigin-Name: ac4bb2e4ecf0bdb0d8ac12b1ccb42d51af02f519a038cfc79faab5c216971056 --- manifest | 16 ++++---- manifest.uuid | 2 +- src/dbpage.c | 36 +++++++++++------ test/dbpage.test | 92 +++++++++++++++++++++++++++++++++++++++++++ test/dbpagefault.test | 26 ++++++++++++ 5 files changed, 152 insertions(+), 20 deletions(-) diff --git a/manifest b/manifest index 677b44875c..62bfd24b2b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sthe\sbuild\sinstructions\sfor\sWindows\sto\snote\sthat\sVS2015\sor\slater\sis\nrequired\sto\savoid\sthe\sneed\sto\sinstall\stclsh.exe. -D 2025-01-02T12:14:01.327 +C Improvements\sto\sthe\sway\sthat\struncation\sis\simplemented\sin\ssqlite_dbpage(). +D 2025-01-02T15:03:13.323 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -724,7 +724,7 @@ F src/callback.c db3a45e376deff6a16c0058163fe0ae2b73a2945f3f408ca32cf74960b28d49 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c d35723024b963edce9c0fad5b3303e8bb9266083784844baed10a6dedfe26f3b F src/date.c 89ce1ff20512a7fa5070ba6e7dd5c171148ca7d580955795bf97c79c2456144a -F src/dbpage.c b1aeb47c1004f26c39c6800f0045b8d729d232aca24f6aa430c491b83003d033 +F src/dbpage.c cfa9ed0a490bd2e07e4cdba68503ccd5e587dcb4ac9c7ae9ed382a9cd924f29b F src/dbstat.c 73362c0df0f40ad5523a6f5501224959d0976757b511299bf892313e79d14f5c F src/delete.c 03a77ba20e54f0f42ebd8eddf15411ed6bdb06a2c472ac4b6b336521bf7cea42 F src/expr.c 3329173aacc6c37da3971b6253827799b32e301673be00126df8271bf018e15f @@ -1076,8 +1076,8 @@ F test/dbfuzz.c 73047c920d6210e5912c87cdffd9a1c281d4252e F test/dbfuzz001.test 6c9a4622029d69dc38926f115864b055cb2f39badd25ec22cbfb130c8ba8e9c3 F test/dbfuzz2-seed1.db e6225c6f3d7b63f9c5b6867146a5f329d997ab105bee64644dc2b3a2f2aebaee F test/dbfuzz2.c 4b3c12de4d98b1b2d908ab03d217d4619e47c8b23d5e67f8a6f2b1bdee7cae23 -F test/dbpage.test fce29035c7566fd7835ec0f19422cb4b9c6944ce0e1b936ff8452443f92e887d -F test/dbpagefault.test 35f06cfb2ef100a9b19d25754e8141b9cba9b7daabd4c60fa5af93fcce884435 +F test/dbpage.test dba7b6048c461125595278bd838e66d01bba67d8ad1da94489a7851439e8fa86 +F test/dbpagefault.test ea39de2ca86041a9c6df1135645180a76d0a8da93ac159e2fafe38e39636530b F test/dbstatus.test 4a4221a883025ffd39696b3d1b3910b928fb097d77e671351acb35f3aed42759 F test/dbstatus2.test f5fe0afed3fa45e57cfa70d1147606c20d2ba23feac78e9a172f2fe8ab5b78ef F test/decimal.test ef731887b43ee32ef86e1c8fddb61a40789f988332c029c601dcf2c319277e9e @@ -2204,8 +2204,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 4f6c36a61c2b27e204c00bd7467453098f756c7e596b7e62d47da8784fbd2026 -R c359455d12a83b16327a4eb96d1245c3 +P da0ef0567be55648413bcbf2e129f348776a908dbad2ac8582ee3e27ac459e3b +R 963301e91789659974012d48c99b5d2d U drh -Z 5fb03700b1eda71764ba1102db353cb9 +Z dc0b704adc2bca53154303a0d3643971 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index cf83b9aeb5..be9b420eed 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -da0ef0567be55648413bcbf2e129f348776a908dbad2ac8582ee3e27ac459e3b +ac4bb2e4ecf0bdb0d8ac12b1ccb42d51af02f519a038cfc79faab5c216971056 diff --git a/src/dbpage.c b/src/dbpage.c index 74f345570e..e435dcfec7 100644 --- a/src/dbpage.c +++ b/src/dbpage.c @@ -317,6 +317,24 @@ static int dbpageRowid(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){ return SQLITE_OK; } +/* +** Open write transactions. Since we do not know in advance which database +** files will be written by the sqlite_dbpage virtual table, start a write +** transaction on them all. +** +** Return SQLITE_OK if successful, or an SQLite error code otherwise. +*/ +static int dbpageBeginTrans(DbpageTable *pTab){ + sqlite3 *db = pTab->db; + int rc = SQLITE_OK; + int i; + for(i=0; rc==SQLITE_OK && inDb; i++){ + Btree *pBt = db->aDb[i].pBt; + if( pBt ) rc = sqlite3BtreeBeginTrans(pBt, 1, 0); + } + return rc; +} + static int dbpageUpdate( sqlite3_vtab *pVtab, int argc, @@ -384,6 +402,12 @@ static int dbpageUpdate( goto update_fail; } } + + if( dbpageBeginTrans(pTab)!=SQLITE_OK ){ + zErr = "failed to open transaction"; + goto update_fail; + } + pPager = sqlite3BtreePager(pBt); rc = sqlite3PagerGet(pPager, pgno, (DbPage**)&pDbPage, 0); if( rc==SQLITE_OK ){ @@ -405,18 +429,8 @@ update_fail: return SQLITE_ERROR; } -/* Since we do not know in advance which database files will be -** written by the sqlite_dbpage virtual table, start a write transaction -** on them all. -*/ static int dbpageBegin(sqlite3_vtab *pVtab){ DbpageTable *pTab = (DbpageTable *)pVtab; - sqlite3 *db = pTab->db; - int i; - for(i=0; inDb; i++){ - Btree *pBt = db->aDb[i].pBt; - if( pBt ) (void)sqlite3BtreeBeginTrans(pBt, 1, 0); - } pTab->pgnoTrunc = 0; return SQLITE_OK; } @@ -474,7 +488,7 @@ int sqlite3DbpageRegister(sqlite3 *db){ 0, /* xRename */ 0, /* xSavepoint */ 0, /* xRelease */ - dbpageRollbackTo, /* xRollbackTo */ + 0/*dbpageRollbackTo*/, /* xRollbackTo */ 0, /* xShadowName */ 0 /* xIntegrity */ }; diff --git a/test/dbpage.test b/test/dbpage.test index 0646a70b02..2c07253073 100644 --- a/test/dbpage.test +++ b/test/dbpage.test @@ -108,4 +108,96 @@ do_execsql_test 300 { SELECT * FROM sqlite_temp_schema, sqlite_dbpage; } {} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 400 { + ATTACH ':memory:' AS aux1; + BEGIN; + CREATE VIRTUAL TABLE aux1.t1 USING sqlite_dbpage; + INSERT INTO t1 VALUES(17, NULL); + COMMIT; +} + +#------------------------------------------------------------------------- +reset_db +forcedelete test.db2 +sqlite3 db2 test.db2 +db2 eval { + CREATE TABLE t1(x, y); +} + +do_execsql_test 500 { + CREATE TABLE x1(a); + INSERT INTO x1 VALUES( hex(randomblob(2000)) ); + INSERT INTO x1 VALUES( hex(randomblob(2000)) ); + INSERT INTO x1 VALUES( hex(randomblob(2000)) ); + INSERT INTO x1 VALUES( hex(randomblob(2000)) ); + PRAGMA page_count; +} {18} + +do_test 510 { + db eval BEGIN + db2 eval { PRAGMA page_count } { + db eval { + INSERT INTO sqlite_dbpage values($page_count, NULL); + } + } + db2 eval { SELECT pgno, data FROM sqlite_dbpage } { + db eval { + INSERT INTO sqlite_dbpage values($pgno, $data); + } + } + + db eval COMMIT +} {} + +db close +sqlite3 db test.db + +do_execsql_test 520 { + PRAGMA page_count; + SELECT * FROM t1; +} {2} + +#------------------------------------------------------------------------- +reset_db +forcedelete test.db2 +do_execsql_test 610 { + ATTACH 'test.db2' AS aux; + CREATE TABLE t1(x); + CREATE TABLE t2(y); + INSERT INTO t1 VALUES(1234); + CREATE TABLE aux.x1(z); +} + +set pgno [db one {SELECT max(rootpage) FROM sqlite_schema}] +sqlite3 db2 test.db2 +db2 eval { + BEGIN; + SELECT * FROM x1; +} + +do_catchsql_test 620 { + UPDATE sqlite_dbpage SET data = ( + SELECT data FROM sqlite_dbpage WHERE pgno=$pgno-1 + ) WHERE pgno = $pgno; +} {1 {database is locked}} + +db2 eval { + COMMIT; +} + +do_catchsql_test 630 { + UPDATE sqlite_dbpage SET data = ( + SELECT data FROM sqlite_dbpage WHERE pgno=$pgno-1 + ) WHERE pgno = $pgno; +} {0 {}} + +db close +sqlite3 db test.db + +do_execsql_test 640 { + SELECT * FROM t2; +} {1234} + finish_test diff --git a/test/dbpagefault.test b/test/dbpagefault.test index f27741cba1..e5b246fc94 100644 --- a/test/dbpagefault.test +++ b/test/dbpagefault.test @@ -82,5 +82,31 @@ do_catchsql_test 3.2 { # faultsim_test_result {0 {}} #} +reset_db +forcedelete test.db2 +do_execsql_test 4.0 { + CREATE TABLE t1(x); + INSERT INTO t1 VALUES('one'); + CREATE TABLE t2(x); + INSERT INTO t2 VALUES('two'); + ATTACH 'test.db2' AS aux; + CREATE TABLE aux.x1(x); +} + +set pgno [db one {SELECT max(rootpage) FROM sqlite_schema}] + +faultsim_save_and_close +do_faultsim_test 4 -prep { + faultsim_restore_and_reopen + execsql { ATTACH 'test.db2' AS aux; } +} -body { + execsql { + UPDATE sqlite_dbpage SET data = ( + SELECT data FROM sqlite_dbpage WHERE pgno=($pgno-1) + ) WHERE pgno = $pgno; + } +} -test { + faultsim_test_result {0 {}} {1 {unable to open a temporary database file for storing temporary tables}} +} finish_test From 3835cf6ea1f0bee954426c9c196fda9f2ee4662d Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 2 Jan 2025 15:27:15 +0000 Subject: [PATCH 011/220] Add a test case for ROLLBACK TO of database truncate operations made through the sqlite_dbpage vtab. FossilOrigin-Name: eb335beb1eb9ebbea4cb793d24f65787d0d9d8539bc6b5971e4e4298fdfce0c2 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/dbpage.c | 4 ++-- test/dbpage.test | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 57 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 62bfd24b2b..0cfa467e80 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improvements\sto\sthe\sway\sthat\struncation\sis\simplemented\sin\ssqlite_dbpage(). -D 2025-01-02T15:03:13.323 +C Add\sa\stest\scase\sfor\sROLLBACK\sTO\sof\sdatabase\struncate\soperations\smade\sthrough\sthe\ssqlite_dbpage\svtab. +D 2025-01-02T15:27:15.310 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -724,7 +724,7 @@ F src/callback.c db3a45e376deff6a16c0058163fe0ae2b73a2945f3f408ca32cf74960b28d49 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c d35723024b963edce9c0fad5b3303e8bb9266083784844baed10a6dedfe26f3b F src/date.c 89ce1ff20512a7fa5070ba6e7dd5c171148ca7d580955795bf97c79c2456144a -F src/dbpage.c cfa9ed0a490bd2e07e4cdba68503ccd5e587dcb4ac9c7ae9ed382a9cd924f29b +F src/dbpage.c e90410e5d4c0217dfddc4184a81e38ec4903c25d4ec0f201060a0e54e7c2099f F src/dbstat.c 73362c0df0f40ad5523a6f5501224959d0976757b511299bf892313e79d14f5c F src/delete.c 03a77ba20e54f0f42ebd8eddf15411ed6bdb06a2c472ac4b6b336521bf7cea42 F src/expr.c 3329173aacc6c37da3971b6253827799b32e301673be00126df8271bf018e15f @@ -1076,7 +1076,7 @@ F test/dbfuzz.c 73047c920d6210e5912c87cdffd9a1c281d4252e F test/dbfuzz001.test 6c9a4622029d69dc38926f115864b055cb2f39badd25ec22cbfb130c8ba8e9c3 F test/dbfuzz2-seed1.db e6225c6f3d7b63f9c5b6867146a5f329d997ab105bee64644dc2b3a2f2aebaee F test/dbfuzz2.c 4b3c12de4d98b1b2d908ab03d217d4619e47c8b23d5e67f8a6f2b1bdee7cae23 -F test/dbpage.test dba7b6048c461125595278bd838e66d01bba67d8ad1da94489a7851439e8fa86 +F test/dbpage.test 901ff31a7f5c80875b909d8cb5241e7d3ddfc08cd812a2f0ab9630e720e9e9c2 F test/dbpagefault.test ea39de2ca86041a9c6df1135645180a76d0a8da93ac159e2fafe38e39636530b F test/dbstatus.test 4a4221a883025ffd39696b3d1b3910b928fb097d77e671351acb35f3aed42759 F test/dbstatus2.test f5fe0afed3fa45e57cfa70d1147606c20d2ba23feac78e9a172f2fe8ab5b78ef @@ -2204,8 +2204,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P da0ef0567be55648413bcbf2e129f348776a908dbad2ac8582ee3e27ac459e3b -R 963301e91789659974012d48c99b5d2d -U drh -Z dc0b704adc2bca53154303a0d3643971 +P ac4bb2e4ecf0bdb0d8ac12b1ccb42d51af02f519a038cfc79faab5c216971056 +R ae6fe4d4378dd5bb82a68cd1b247b9d9 +U dan +Z 138def969ceba9d851c4d9f22f7101e9 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index be9b420eed..0832c70d5f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ac4bb2e4ecf0bdb0d8ac12b1ccb42d51af02f519a038cfc79faab5c216971056 +eb335beb1eb9ebbea4cb793d24f65787d0d9d8539bc6b5971e4e4298fdfce0c2 diff --git a/src/dbpage.c b/src/dbpage.c index e435dcfec7..40ebe4f14a 100644 --- a/src/dbpage.c +++ b/src/dbpage.c @@ -466,7 +466,7 @@ static int dbpageRollbackTo(sqlite3_vtab *pVtab, int notUsed1){ */ int sqlite3DbpageRegister(sqlite3 *db){ static sqlite3_module dbpage_module = { - 0, /* iVersion */ + 2, /* iVersion */ dbpageConnect, /* xCreate */ dbpageConnect, /* xConnect */ dbpageBestIndex, /* xBestIndex */ @@ -488,7 +488,7 @@ int sqlite3DbpageRegister(sqlite3 *db){ 0, /* xRename */ 0, /* xSavepoint */ 0, /* xRelease */ - 0/*dbpageRollbackTo*/, /* xRollbackTo */ + dbpageRollbackTo, /* xRollbackTo */ 0, /* xShadowName */ 0 /* xIntegrity */ }; diff --git a/test/dbpage.test b/test/dbpage.test index 2c07253073..5344937c95 100644 --- a/test/dbpage.test +++ b/test/dbpage.test @@ -200,4 +200,50 @@ do_execsql_test 640 { SELECT * FROM t2; } {1234} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 700 { + CREATE TABLE t1(x); + INSERT INTO t1 VALUES( hex(randomblob(1000)) ); + INSERT INTO t1 VALUES( hex(randomblob(1000)) ); + INSERT INTO t1 VALUES( hex(randomblob(1000)) ); +} + +forcedelete test.db2 +sqlite3 db2 test.db2 +db2 eval { + CREATE TABLE y1(y); + INSERT INTO y1 VALUES( hex(randomblob(1000)) ); +} + +set max [db2 one {PRAGMA page_count}] + +do_test 710 { + execsql { + BEGIN; + } + + for {set ii 1} {$ii <= $max} {incr ii} { + set data [db2 one {SELECT data FROM sqlite_dbpage WHERE pgno=$ii}] + execsql { + UPDATE sqlite_dbpage SET data=$data WHERE pgno=$ii + } + } + + execsql { + SAVEPOINT abc; + INSERT INTO sqlite_dbpage VALUES(2, NULL); + ROLLBACK TO abc; + COMMIT; + } +} {} + +db close +sqlite3 db test.db + +do_execsql_test 720 { + PRAGMA integrity_check +} {ok} + + finish_test From 52c87ac084ddb84901580c86ff2acbd7e30ff1df Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 2 Jan 2025 15:39:54 +0000 Subject: [PATCH 012/220] Fix recent test cases so that they work even when auto_vacuum defaults to on. FossilOrigin-Name: 41f6e46695b547dece4daf2f3714e29f231aa04774f57fbd31aeb0a4290c0e7d --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/dbpage.test | 2 ++ 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 0cfa467e80..97c5634d26 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\stest\scase\sfor\sROLLBACK\sTO\sof\sdatabase\struncate\soperations\smade\sthrough\sthe\ssqlite_dbpage\svtab. -D 2025-01-02T15:27:15.310 +C Fix\srecent\stest\scases\sso\sthat\sthey\swork\seven\swhen\sauto_vacuum\sdefaults\sto\son. +D 2025-01-02T15:39:54.534 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -1076,7 +1076,7 @@ F test/dbfuzz.c 73047c920d6210e5912c87cdffd9a1c281d4252e F test/dbfuzz001.test 6c9a4622029d69dc38926f115864b055cb2f39badd25ec22cbfb130c8ba8e9c3 F test/dbfuzz2-seed1.db e6225c6f3d7b63f9c5b6867146a5f329d997ab105bee64644dc2b3a2f2aebaee F test/dbfuzz2.c 4b3c12de4d98b1b2d908ab03d217d4619e47c8b23d5e67f8a6f2b1bdee7cae23 -F test/dbpage.test 901ff31a7f5c80875b909d8cb5241e7d3ddfc08cd812a2f0ab9630e720e9e9c2 +F test/dbpage.test 6ff0b526c4781ef3383ada4aba60c9e12233df66d0355a38dd5ed3e0936abefd F test/dbpagefault.test ea39de2ca86041a9c6df1135645180a76d0a8da93ac159e2fafe38e39636530b F test/dbstatus.test 4a4221a883025ffd39696b3d1b3910b928fb097d77e671351acb35f3aed42759 F test/dbstatus2.test f5fe0afed3fa45e57cfa70d1147606c20d2ba23feac78e9a172f2fe8ab5b78ef @@ -2204,8 +2204,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P ac4bb2e4ecf0bdb0d8ac12b1ccb42d51af02f519a038cfc79faab5c216971056 -R ae6fe4d4378dd5bb82a68cd1b247b9d9 -U dan -Z 138def969ceba9d851c4d9f22f7101e9 +P eb335beb1eb9ebbea4cb793d24f65787d0d9d8539bc6b5971e4e4298fdfce0c2 +R 599467a5ae33e37cee7d650d64a24003 +U drh +Z c0514aaa061ec3b7bb05aecaa83b03ff # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 0832c70d5f..4ffc4a615d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -eb335beb1eb9ebbea4cb793d24f65787d0d9d8539bc6b5971e4e4298fdfce0c2 +41f6e46695b547dece4daf2f3714e29f231aa04774f57fbd31aeb0a4290c0e7d diff --git a/test/dbpage.test b/test/dbpage.test index 5344937c95..27d532bf98 100644 --- a/test/dbpage.test +++ b/test/dbpage.test @@ -123,10 +123,12 @@ reset_db forcedelete test.db2 sqlite3 db2 test.db2 db2 eval { + PRAGMA auto_vacuum=NONE; CREATE TABLE t1(x, y); } do_execsql_test 500 { + PRAGMA auto_vacuum=NONE; CREATE TABLE x1(a); INSERT INTO x1 VALUES( hex(randomblob(2000)) ); INSERT INTO x1 VALUES( hex(randomblob(2000)) ); From 1426d2a26473f1a9cb197d18d50c142b2f306e48 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 2 Jan 2025 17:56:11 +0000 Subject: [PATCH 013/220] Close database connections in test/dbpage.test, for Windows. FossilOrigin-Name: 322d255ed89c1dee08745e89f3c2bcf495283fd87b7526e70d6525a6e96b0ecf --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/dbpage.test | 4 ++++ 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 97c5634d26..4f1c7060e7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\srecent\stest\scases\sso\sthat\sthey\swork\seven\swhen\sauto_vacuum\sdefaults\sto\son. -D 2025-01-02T15:39:54.534 +C Close\sdatabase\sconnections\sin\stest/dbpage.test,\sfor\sWindows. +D 2025-01-02T17:56:11.889 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -1076,7 +1076,7 @@ F test/dbfuzz.c 73047c920d6210e5912c87cdffd9a1c281d4252e F test/dbfuzz001.test 6c9a4622029d69dc38926f115864b055cb2f39badd25ec22cbfb130c8ba8e9c3 F test/dbfuzz2-seed1.db e6225c6f3d7b63f9c5b6867146a5f329d997ab105bee64644dc2b3a2f2aebaee F test/dbfuzz2.c 4b3c12de4d98b1b2d908ab03d217d4619e47c8b23d5e67f8a6f2b1bdee7cae23 -F test/dbpage.test 6ff0b526c4781ef3383ada4aba60c9e12233df66d0355a38dd5ed3e0936abefd +F test/dbpage.test 63fab1eb026bada121107e53436fa749bbf83281dc9dea17af422f7a5c0f289f F test/dbpagefault.test ea39de2ca86041a9c6df1135645180a76d0a8da93ac159e2fafe38e39636530b F test/dbstatus.test 4a4221a883025ffd39696b3d1b3910b928fb097d77e671351acb35f3aed42759 F test/dbstatus2.test f5fe0afed3fa45e57cfa70d1147606c20d2ba23feac78e9a172f2fe8ab5b78ef @@ -2204,8 +2204,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P eb335beb1eb9ebbea4cb793d24f65787d0d9d8539bc6b5971e4e4298fdfce0c2 -R 599467a5ae33e37cee7d650d64a24003 +P 41f6e46695b547dece4daf2f3714e29f231aa04774f57fbd31aeb0a4290c0e7d +R ad33df8723391488642db5cd87f0ab29 U drh -Z c0514aaa061ec3b7bb05aecaa83b03ff +Z 2ad32d699feaca719fd3e1c4c9618a89 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 4ffc4a615d..532729f0d0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -41f6e46695b547dece4daf2f3714e29f231aa04774f57fbd31aeb0a4290c0e7d +322d255ed89c1dee08745e89f3c2bcf495283fd87b7526e70d6525a6e96b0ecf diff --git a/test/dbpage.test b/test/dbpage.test index 27d532bf98..8039e0e1be 100644 --- a/test/dbpage.test +++ b/test/dbpage.test @@ -161,6 +161,8 @@ do_execsql_test 520 { SELECT * FROM t1; } {2} +db2 close + #------------------------------------------------------------------------- reset_db forcedelete test.db2 @@ -202,6 +204,8 @@ do_execsql_test 640 { SELECT * FROM t2; } {1234} +db2 close + #------------------------------------------------------------------------- reset_db do_execsql_test 700 { From db258d8ff74163dcd1c58730581c99bd08ef03c6 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 2 Jan 2025 18:43:29 +0000 Subject: [PATCH 014/220] Improvements to the display of subqueries in the FROM clause for treeview output. (Debug and analysis code only - does not affect production builds.) FossilOrigin-Name: 4a2d65cdcdd3d21bb7d9ea0efb434484f1b8642c2bb6457db58bc2a5f4fc16e5 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/treeview.c | 3 --- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 4f1c7060e7..bc7d18e071 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Close\sdatabase\sconnections\sin\stest/dbpage.test,\sfor\sWindows. -D 2025-01-02T17:56:11.889 +C Improvements\sto\sthe\sdisplay\sof\ssubqueries\sin\sthe\sFROM\sclause\sfor\streeview\noutput.\s\s(Debug\sand\sanalysis\scode\sonly\s-\sdoes\snot\saffect\sproduction\sbuilds.) +D 2025-01-02T18:43:29.883 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -839,7 +839,7 @@ F src/test_window.c 6d80e11fba89a1796525e6f0048ff0c7789aa2c6b0b11c80827dc1437bd8 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c fe17e03175cae35b6694d0f879e7bc3d1ddea2fd4ab148cba9bbd025b7a7bb12 -F src/treeview.c 921392561385e05ef5703f20a7a72f0a0a45c1fb749558d7467fae2c3f525006 +F src/treeview.c e5848f30a6000ca0f9a918131c220f5dff652aa08b220c1de4dc45862ca27c88 F src/trigger.c 247e2d712d5edc6021d52a169f6ac9a9c10d7144bc4ac7ea06c1ed2aa414659f F src/update.c 0e01aa6a3edf9ec112b33eb714b9016a81241497b1fb7c3e74332f4f71756508 F src/upsert.c 215328c3f91623c520ec8672c44323553f12caeb4f01b1090ebdca99fdf7b4f1 @@ -2204,8 +2204,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 41f6e46695b547dece4daf2f3714e29f231aa04774f57fbd31aeb0a4290c0e7d -R ad33df8723391488642db5cd87f0ab29 +P 322d255ed89c1dee08745e89f3c2bcf495283fd87b7526e70d6525a6e96b0ecf +R 880caaa332dedbabd2ac0f19d743a7f2 U drh -Z 2ad32d699feaca719fd3e1c4c9618a89 +Z 4a0cd1fd6c1443c6320e9f6723abbf4c # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 532729f0d0..b0e812626c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -322d255ed89c1dee08745e89f3c2bcf495283fd87b7526e70d6525a6e96b0ecf +4a2d65cdcdd3d21bb7d9ea0efb434484f1b8642c2bb6457db58bc2a5f4fc16e5 diff --git a/src/treeview.c b/src/treeview.c index 30592d35b2..ab32774d4b 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -246,9 +246,6 @@ void sqlite3TreeViewSrcList(TreeView *pView, const SrcList *pSrc){ sqlite3TreeViewColumnList(pView, pTab->aCol, pTab->nCol, 1); } assert( (int)pItem->fg.isNestedFrom == IsNestedFrom(pItem) ); - sqlite3TreeViewPush(&pView, 0); - sqlite3TreeViewLine(pView, "SUBQUERY"); - sqlite3TreeViewPop(&pView); sqlite3TreeViewSelect(pView, pItem->u4.pSubq->pSelect, 0); } if( pItem->fg.isTabFunc ){ From 04364cb3cc108a044a0d9dc7162f4d550adb2f99 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 2 Jan 2025 21:23:25 +0000 Subject: [PATCH 015/220] Improve the treeview output for CteUse objects. FossilOrigin-Name: 2b16d6947ca4a102ddab4d5ba3e340a75e1e5c28e45e874ee5ff52f9b5fb964f --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/treeview.c | 5 ++++- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index bc7d18e071..f56dd89bbd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improvements\sto\sthe\sdisplay\sof\ssubqueries\sin\sthe\sFROM\sclause\sfor\streeview\noutput.\s\s(Debug\sand\sanalysis\scode\sonly\s-\sdoes\snot\saffect\sproduction\sbuilds.) -D 2025-01-02T18:43:29.883 +C Improve\sthe\streeview\soutput\sfor\sCteUse\sobjects. +D 2025-01-02T21:23:25.211 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -839,7 +839,7 @@ F src/test_window.c 6d80e11fba89a1796525e6f0048ff0c7789aa2c6b0b11c80827dc1437bd8 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c fe17e03175cae35b6694d0f879e7bc3d1ddea2fd4ab148cba9bbd025b7a7bb12 -F src/treeview.c e5848f30a6000ca0f9a918131c220f5dff652aa08b220c1de4dc45862ca27c88 +F src/treeview.c d1f3003cb21846828f314a304cf9117f5e80ce0be259315a681d25147004d26d F src/trigger.c 247e2d712d5edc6021d52a169f6ac9a9c10d7144bc4ac7ea06c1ed2aa414659f F src/update.c 0e01aa6a3edf9ec112b33eb714b9016a81241497b1fb7c3e74332f4f71756508 F src/upsert.c 215328c3f91623c520ec8672c44323553f12caeb4f01b1090ebdca99fdf7b4f1 @@ -2204,8 +2204,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 322d255ed89c1dee08745e89f3c2bcf495283fd87b7526e70d6525a6e96b0ecf -R 880caaa332dedbabd2ac0f19d743a7f2 +P 4a2d65cdcdd3d21bb7d9ea0efb434484f1b8642c2bb6457db58bc2a5f4fc16e5 +R c71f9b806da01da7c4d2eda55e40e335 U drh -Z 4a0cd1fd6c1443c6320e9f6723abbf4c +Z 07fa7dcff94b36dfa3368297cbe48fff # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index b0e812626c..66ca9c4f52 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4a2d65cdcdd3d21bb7d9ea0efb434484f1b8642c2bb6457db58bc2a5f4fc16e5 +2b16d6947ca4a102ddab4d5ba3e340a75e1e5c28e45e874ee5ff52f9b5fb964f diff --git a/src/treeview.c b/src/treeview.c index ab32774d4b..2cfcfb69b0 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -215,7 +215,10 @@ void sqlite3TreeViewSrcList(TreeView *pView, const SrcList *pSrc){ sqlite3_str_appendf(&x, " DDL"); } if( pItem->fg.isCte ){ - sqlite3_str_appendf(&x, " CteUse=0x%p", pItem->u2.pCteUse); + static const char *aMat[] = {",MAT", "", ",NO-MAT"}; + sqlite3_str_appendf(&x, " CteUse=%d%s", + pItem->u2.pCteUse->nUse, + aMat[pItem->u2.pCteUse->eM10d]); } if( pItem->fg.isOn || (pItem->fg.isUsing==0 && pItem->u3.pOn!=0) ){ sqlite3_str_appendf(&x, " isOn"); From 8d6e3f513c049a07d34f77ab526259c916418af6 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 3 Jan 2025 11:22:01 +0000 Subject: [PATCH 016/220] Avoid using Int32x32To64() with a 64-bit argument in fileio.c - this level of micro-optimization is not really necessary there. FossilOrigin-Name: 1291b013a8c93e7001fe25783bc98d12f5f7c341d1f728e6852632e18a38af58 --- ext/misc/fileio.c | 2 +- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ext/misc/fileio.c b/ext/misc/fileio.c index 483ef0187f..80ac3b3e7c 100644 --- a/ext/misc/fileio.c +++ b/ext/misc/fileio.c @@ -437,7 +437,7 @@ static int writeFile( GetSystemTime(¤tTime); SystemTimeToFileTime(¤tTime, &lastAccess); - intervals = Int32x32To64(mtime, 10000000) + 116444736000000000; + intervals = (mtime*10000000) + 116444736000000000; lastWrite.dwLowDateTime = (DWORD)intervals; lastWrite.dwHighDateTime = intervals >> 32; zUnicodeName = sqlite3_win32_utf8_to_unicode(zFile); diff --git a/manifest b/manifest index f56dd89bbd..db2048f8a2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improve\sthe\streeview\soutput\sfor\sCteUse\sobjects. -D 2025-01-02T21:23:25.211 +C Avoid\susing\sInt32x32To64()\swith\sa\s64-bit\sargument\sin\sfileio.c\s-\sthis\slevel\sof\smicro-optimization\sis\snot\sreally\snecessary\sthere. +D 2025-01-03T11:22:01.656 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -415,7 +415,7 @@ F ext/misc/dbdump.c b8592f6f2da292c62991a13864a60d6c573c47a9cc58362131b9e6a64f82 F ext/misc/decimal.c 172cf81a8634e6a0f0bedaf71a8372fee63348cf5a3c4e1b78bb233c35889fdc F ext/misc/eval.c 04bc9aada78c888394204b4ed996ab834b99726fb59603b0ee3ed6e049755dc1 F ext/misc/explain.c 606100185fb90d6a1eade1ed0414d53503c86820d8956a06e3b0a56291894f2b -F ext/misc/fileio.c e6b34db4df4b55b96265086c0010264e257b6eab1644e665697a6da587659403 +F ext/misc/fileio.c 07cf3109ec6452789e3a989a010234e2a17b599ce82ea29212c948572456abac F ext/misc/fossildelta.c 8c026e086e406e2b69947f1856fa3b848fff5379962276430d10085b8756b05a F ext/misc/fuzzer.c 8b28acf1a7e95d50e332bdd47e792ff27054ad99d3f9bc2e91273814d4b31a5a F ext/misc/ieee754.c 62a90978204d2c956d5036eb89e548e736ca5fac0e965912867ddd7bb833256d @@ -2204,8 +2204,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 4a2d65cdcdd3d21bb7d9ea0efb434484f1b8642c2bb6457db58bc2a5f4fc16e5 -R c71f9b806da01da7c4d2eda55e40e335 -U drh -Z 07fa7dcff94b36dfa3368297cbe48fff +P 2b16d6947ca4a102ddab4d5ba3e340a75e1e5c28e45e874ee5ff52f9b5fb964f +R 5009b44122ef97a1941b73b1f68f9841 +U dan +Z 3d41d92a3c50a0c7b4d04240befaa9e5 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 66ca9c4f52..a708ba3fee 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2b16d6947ca4a102ddab4d5ba3e340a75e1e5c28e45e874ee5ff52f9b5fb964f +1291b013a8c93e7001fe25783bc98d12f5f7c341d1f728e6852632e18a38af58 From ded37f337b7b2e916657a83732aaec40eb146282 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 3 Jan 2025 11:51:50 +0000 Subject: [PATCH 017/220] Add comment to the columnIsGoodIndexCandidate() routine to record the results of a failed experiment. No changes to code. FossilOrigin-Name: 9ee57a30a49d9813bf2669a5d8346f7e018e3fbf1792739951311a8d3a249d45 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/where.c | 5 +++++ 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index db2048f8a2..dbe9f57581 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\susing\sInt32x32To64()\swith\sa\s64-bit\sargument\sin\sfileio.c\s-\sthis\slevel\sof\smicro-optimization\sis\snot\sreally\snecessary\sthere. -D 2025-01-03T11:22:01.656 +C Add\scomment\sto\sthe\scolumnIsGoodIndexCandidate()\sroutine\sto\srecord\sthe\sresults\nof\sa\sfailed\sexperiment.\s\sNo\schanges\sto\scode. +D 2025-01-03T11:51:50.103 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -861,7 +861,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 4e6181d8780ab0af2e1388d0754cbe6f2f04593d2b1ab6c41699a89942fd8997 F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 -F src/where.c 9ad3dea8003a8913da6a4ca8322e2fe30773f46e88a0d4fbf9db13bdb999efa2 +F src/where.c d519bc93b4a05928f10ba4925b1afc77cbd71c1b1b5148583ab4868925c639fb F src/whereInt.h 1e36ec50392f7cc3d93d1152d4338064cd522b87156a0739388b7e273735f0ca F src/wherecode.c 0c3d3199a2b769a5e2bb70feb5003dc85b3d86842ecaf903a47f2b4205ca5dab F src/whereexpr.c 0f93a29cabd3a338d09a1f5c6770620a1ac51ec1157f3229502a7e7767c60b6f @@ -2204,8 +2204,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 2b16d6947ca4a102ddab4d5ba3e340a75e1e5c28e45e874ee5ff52f9b5fb964f -R 5009b44122ef97a1941b73b1f68f9841 -U dan -Z 3d41d92a3c50a0c7b4d04240befaa9e5 +P 1291b013a8c93e7001fe25783bc98d12f5f7c341d1f728e6852632e18a38af58 +R 0507e66ed59bfa5a55bc14583a9d765f +U drh +Z 3304d535a779543ccf066c65753e6b08 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index a708ba3fee..d506d57c15 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1291b013a8c93e7001fe25783bc98d12f5f7c341d1f728e6852632e18a38af58 +9ee57a30a49d9813bf2669a5d8346f7e018e3fbf1792739951311a8d3a249d45 diff --git a/src/where.c b/src/where.c index c9698699b3..4325374bce 100644 --- a/src/where.c +++ b/src/where.c @@ -860,6 +860,11 @@ static int constraintCompatibleWithOuterJoin( ** more than 20, then return false. ** ** 3. If no disqualifying conditions above are found, return true. +** +** 2025-01-03: I experimented with a new rule that returns false if the +** the datatype of the column is "BOOLEAN". This did not improve +** performance on any queries at hand, but it did burn CPU cycles, so the +** idea was not committed. */ static SQLITE_NOINLINE int columnIsGoodIndexCandidate( const Table *pTab, From 8f1bdc0f73af1b80989c1624bef6633cf9259180 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 4 Jan 2025 14:10:45 +0000 Subject: [PATCH 018/220] Add new tcl-extension-testing.md document. The Windows side is not yet working. FossilOrigin-Name: 9dc805df1b1c26196ca53baa6b1b8c2f7e59e0150d02ead53228c77a63ad40f4 --- doc/tcl-extension-testing.md | 142 +++++++++++++++++++++++++++++++++++ manifest | 14 ++-- manifest.uuid | 2 +- 3 files changed, 152 insertions(+), 6 deletions(-) create mode 100644 doc/tcl-extension-testing.md diff --git a/doc/tcl-extension-testing.md b/doc/tcl-extension-testing.md new file mode 100644 index 0000000000..7dab3eafbd --- /dev/null +++ b/doc/tcl-extension-testing.md @@ -0,0 +1,142 @@ +# Test Procedures For The SQLite TCL Extension + + +## 1.0 Testing On Unix-like Systems (Including Mac) + +### 1.1 Setup + +
    +
  1. + [Fossil](https://fossil-scm.org/) installed. +
  2. + A Fossil check-out of the TCL source tree. Let the directory + of this check-out be called **$TCLCO** (mnemonic: "TCL Check-Out"). +
  3. + A Fossil check-out of the SQLite source tree. Let the directory + of this check-out be called **$SRCCO** (mnemonic: "SouRCe Check-Out"). +
  4. + Let **$TCLTD** (mnemonic: "TCL Test Directory") be the name of a directory + that does not exist at the start of the test, and which will be + deleted at the end of the test, that will contain the test builds + of the TCL libraries and the SQLite TCL Extensions. +
+ +### 1.2 Building the TCL libraries and tclsh executables + +
    +
  1. `mkdir $TCLTD $TCLTD/tcl86 $TCLTD/tcl90` +
  2. `cd $TCLCO/unix` +
  3. `fossil up core-8-6-16` ← or some other version of Tcl8.6. +
  4. `fossil clean -x` +
  5. `./configure --prefix=$TCLTD/tcl86` +
  6. `make install` +
  7. `fossil up core-9-0-0` ← or some other version of Tcl9 +
  8. `fossil clean -x` +
  9. `./configure --prefix=$TCLTD/tcl90` +
  10. `make install` +
+ +### 1.3 Building the SQLite TCL extension + +
    +
  1. `cd $SRCCO` +
  2. `fossil clean -x` +
  3. `./configure --with-tclsh=$TCLTD/tcl86/bin/tclsh8.6` +
  4. `make tclextension-install` +
  5. → Verify extension installed at $TCLTD/tcl86/lib/tcl8.6/sqlite3.* +
  6. `fossil clean -x` +
  7. `./configure --with-tclsh=$TCLTD/tcl90/bin/tclsh9.0` +
  8. `make tclextension-install` +
  9. → Verify extension installed at $TCLTD/tcl90/lib/sqlite3.* +
+ +### 1.4 Testing the extension + +
    +
  1. + `$TCLTD/tcl86/bin/tclsh8.6 test/testrunner.tcl release --explain` +
  2. ↑ Verify thousands of lines of output with no errors +
  3. `$TCLTD/tcl90/bin/tclsh9.0 test/testrunner.tcl release --explain` +
  4. ↑ Verify thousands of lines of output with no errors +
+ +### 1.5 Cleanup + +
    +
  1. `rm -rf $TCLTD` +
+ +## 2.0 Testing On Windows + +### 2.1 Setup for Windows + +
    +
  1. + [Fossil](https://fossil-scm.org/) installed. +
  2. + A Fossil check-out of the TCL source tree. Let the directory + of this check-out be called **%TCLCO%** (mnemonic: "TCL Check-Out"). +
  3. + A Fossil check-out of the SQLite source tree. Let the directory + of this check-out be called **%SRCCO%** (mnemonic: "SouRCe Check-Out"). +
  4. + Let **%TCLTD%** (mnemonic: "TCL Test Directory") be the name of a directory + that does not exist at the start of the test, and which will be + deleted at the end of the test, that will contain the test builds + of the TCL libraries and the SQLite TCL Extensions. +
  5. + Unix-like command-line tools installed. Example: + [unxutils](https://unxutils.sourceforge.net/) +
  6. [Visual Studio](https://visualstudio.microsoft.com/vs/community/) + installed. VS2015 or later required. +
  7. `set ORIGINALPATH=%PATH%` ← remember the original %PATH% value +
+ +### 2.2 Building the TCL libraries and tclsh.exe executables on Windows + +
    +
  1. `mkdir %TCLTD% %TCLTD%\tcl86 %TCLTD%\tcl90` +
  2. `cd %TCLCO%\win` +
  3. `fossil up core-8-6-16` ← or some other version of Tcl8.6. +
  4. `fossil clean -x` +
  5. `nmake /f makefile.vc INSTALLDIR=%TCLTD%\tcl86 release install` +
  6. `fossil up core-9-0-0` ← or some other version of Tcl9 +
  7. `fossil clean -x` +
  8. `nmake /f makefile.vc INSTALLDIR=%TCLTD%\tcl86 release install` +
+ +### 2.3 Building the SQLite TCL extension on Windows + +
    +
  1. `cd %SRCCO%` +
  2. `fossil clean -x` +
  3. `set TCLDIR=%TCLTD%\tcl86` +
  4. `set PATH=%TCLTD%\tcl86\bin;%ORIGINALPATH%` +
  5. `set TCLSH_CMD=%TCLTD%\tcl86\bin\tclsh86t.exe` +
  6. `nmake /f Makefile.msc tclextension-install` +
  7. → Verify extension installed at %TCLTD%\tcl86\lib\tcl8.6\sqlite3.* +
  8. `fossil clean -x` +
  9. `set TCLDIR=%TCLTD%\tcl90` +
  10. `set PATH=%TCLTD%\tcl90\bin;%ORIGINALPATH%` +
  11. `set TCLSH_CMD=%TCLTD%\tcl90\bin\tclsh90.exe` +
  12. `nmake /f Makefile.msc tclextension-install` +
  13. → Verify extension installed at %TCLTD%\tcl906\lib\sqlite3.* +
+ +### 2.4 Testing on Windows + +
    +
  1. + `set PATH=%TCLTD%\tcl86\bin;%ORIGINALPATH%` +
  2. `tclsh86t test/testrunner.tcl release --explain` +
  3. ↑ Verify thousands of lines of output with no errors +
  4. `set PATH=%TCLTD%\tcl90\bin;%ORIGINALPATH%` +
  5. `tclsh90 test/testrunner.tcl release --explain` +
  6. ↑ Verify thousands of lines of output with no errors +
+ +### 2.5 Cleanup + +
    +
  1. `rm -rf %TCLTD%` +
diff --git a/manifest b/manifest index dbe9f57581..ceadd6eb7b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\scomment\sto\sthe\scolumnIsGoodIndexCandidate()\sroutine\sto\srecord\sthe\sresults\nof\sa\sfailed\sexperiment.\s\sNo\schanges\sto\scode. -D 2025-01-03T11:51:50.103 +C Add\snew\stcl-extension-testing.md\sdocument.\s\sThe\sWindows\sside\sis\snot\syet\nworking. +D 2025-01-04T14:10:45.730 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -61,6 +61,7 @@ F doc/json-enhancements.md e356fc834781f1f1aa22ee300027a270b2c960122468499bf347b F doc/jsonb.md 5fab4b8613aa9153fbeb6259297bd4697988af8b3d23900deba588fa7841456b F doc/lemon.html 8b266ff711d2ec7f867c3dca37634963f48a630329908cc282beebfa8c708706 F doc/pager-invariants.txt 27fed9a70ddad2088750c4a2b493b63853da2710 +F doc/tcl-extension-testing.md e7ce7dbd7394c411d5d3c1d29b86455e81203d750af1765304d603fd12973a27 F doc/testrunner.md 15583cf8c7d8a1c3378fd5d4319ca769a14c4d950a5df9b015d01d5be290dc69 F doc/trusted-schema.md 33625008620e879c7bcfbbfa079587612c434fa094d338b08242288d358c3e8a F doc/vdbesort-memory.md 4da2639c14cd24a31e0af694b1a8dd37eaf277aff3867e9a8cc14046bc49df56 @@ -2204,8 +2205,11 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 1291b013a8c93e7001fe25783bc98d12f5f7c341d1f728e6852632e18a38af58 -R 0507e66ed59bfa5a55bc14583a9d765f +P 9ee57a30a49d9813bf2669a5d8346f7e018e3fbf1792739951311a8d3a249d45 +R 33caf2e9f23e286037be195e768a7a16 +T *branch * test-procedures +T *sym-test-procedures * +T -sym-trunk * U drh -Z 3304d535a779543ccf066c65753e6b08 +Z a6ccc4c86b9da5c35c8534fa7413feee # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index d506d57c15..ce9315f27f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9ee57a30a49d9813bf2669a5d8346f7e018e3fbf1792739951311a8d3a249d45 +9dc805df1b1c26196ca53baa6b1b8c2f7e59e0150d02ead53228c77a63ad40f4 From 8272128211e195e46eb3470156d50cf6f1e7dca8 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 4 Jan 2025 15:51:30 +0000 Subject: [PATCH 019/220] Adjust the Windows Makefile.msc so that it can build the tclextension with Tcl8.6 successfully. Updates to the tcl-extension test procedure document. FossilOrigin-Name: 0c2cdc632f26d6acac2d508def4ecfcc97462ebcddc20c84f8847e02e42b3a1d --- Makefile.msc | 10 ++++-- doc/tcl-extension-testing.md | 69 ++++++++++++++++++++++-------------- manifest | 17 ++++----- manifest.uuid | 2 +- 4 files changed, 57 insertions(+), 41 deletions(-) diff --git a/Makefile.msc b/Makefile.msc index 942f759eed..7ebfcc8a32 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -984,10 +984,14 @@ TCLLIBS = !ENDIF !IFNDEF LIBTCLSTUB -!IF EXISTS("$(TCLLIBDIR)\tclstub$(TCLSUFFIX).lib") -LIBTCLSTUB = tclstub$(TCLSUFFIX).lib -!ELSE +!IF EXISTS("$(TCLLIBDIR)\tclstub$(TCLVERSION)$(TCLSUFFIX).lib") LIBTCLSTUB = tclstub$(TCLVERSION)$(TCLSUFFIX).lib +!ELSEIF EXISTS("$(TCLLIBDIR)\tclstub$(TCLSUFFIX).lib") +LIBTCLSTUB = tclstub$(TCLSUFFIX).lib +!ELSEIF EXISTS("$(TCLLIBDIR)\tclstub$(TCLVERSION).lib") +LIBTCLSTUB = tclstub$(TCLVERSION).lib +!ELSE +LIBTCLSTUB = tclstub.lib !ENDIF !ENDIF diff --git a/doc/tcl-extension-testing.md b/doc/tcl-extension-testing.md index 7dab3eafbd..0b81b922c9 100644 --- a/doc/tcl-extension-testing.md +++ b/doc/tcl-extension-testing.md @@ -26,11 +26,13 @@
  1. `mkdir $TCLTD $TCLTD/tcl86 $TCLTD/tcl90`
  2. `cd $TCLCO/unix` -
  3. `fossil up core-8-6-16` ← or some other version of Tcl8.6. +
  4. `fossil up core-8-6-16`
    + ↑ Or some other version of Tcl8.6.
  5. `fossil clean -x`
  6. `./configure --prefix=$TCLTD/tcl86`
  7. `make install` -
  8. `fossil up core-9-0-0` ← or some other version of Tcl9 +
  9. `fossil up core-9-0-0`
    + ↑ Or some other version of Tcl9
  10. `fossil clean -x`
  11. `./configure --prefix=$TCLTD/tcl90`
  12. `make install` @@ -42,28 +44,28 @@
  13. `cd $SRCCO`
  14. `fossil clean -x`
  15. `./configure --with-tclsh=$TCLTD/tcl86/bin/tclsh8.6` -
  16. `make tclextension-install` -
  17. → Verify extension installed at $TCLTD/tcl86/lib/tcl8.6/sqlite3.* +
  18. `make tclextension-install`
    + ↑ Verify extension installed at $TCLTD/tcl86/lib/tcl8.6/sqlite3.*
  19. `fossil clean -x`
  20. `./configure --with-tclsh=$TCLTD/tcl90/bin/tclsh9.0` -
  21. `make tclextension-install` -
  22. → Verify extension installed at $TCLTD/tcl90/lib/sqlite3.* +
  23. `make tclextension-install`
    + ↑ Verify extension installed at $TCLTD/tcl90/lib/sqlite3.*
### 1.4 Testing the extension
    -
  1. - `$TCLTD/tcl86/bin/tclsh8.6 test/testrunner.tcl release --explain` -
  2. ↑ Verify thousands of lines of output with no errors -
  3. `$TCLTD/tcl90/bin/tclsh9.0 test/testrunner.tcl release --explain` -
  4. ↑ Verify thousands of lines of output with no errors +
  5. + `$TCLTD/tcl86/bin/tclsh8.6 test/testrunner.tcl release --explain`
    + ↑ Verify thousands of lines of output with no errors +
  6. `$TCLTD/tcl90/bin/tclsh9.0 test/testrunner.tcl release --explain`
    + ↑ Verify thousands of lines of output with no errors
### 1.5 Cleanup
    -
  1. `rm -rf $TCLTD` +
  2. `rm -rf $TCLTD`
## 2.0 Testing On Windows @@ -89,7 +91,8 @@ [unxutils](https://unxutils.sourceforge.net/)
  • [Visual Studio](https://visualstudio.microsoft.com/vs/community/) installed. VS2015 or later required. -
  • `set ORIGINALPATH=%PATH%` ← remember the original %PATH% value +
  • `set ORIGINALPATH=%PATH%`
    + ↑ remember the original %PATH% value ### 2.2 Building the TCL libraries and tclsh.exe executables on Windows @@ -97,42 +100,54 @@
    1. `mkdir %TCLTD% %TCLTD%\tcl86 %TCLTD%\tcl90`
    2. `cd %TCLCO%\win` -
    3. `fossil up core-8-6-16` ← or some other version of Tcl8.6. +
    4. `fossil up core-8-6-16`
      + ↑ Or some other version of Tcl8.6.
    5. `fossil clean -x` -
    6. `nmake /f makefile.vc INSTALLDIR=%TCLTD%\tcl86 release install` -
    7. `fossil up core-9-0-0` ← or some other version of Tcl9 +
    8. `set INSTALLDIR=%TCLTD%\tcl86` +
    9. `nmake /f makefile.vc release`
      + ⇅ You *must* invoke the "release" and "install" targets + using separate invocations of "nmake" or tclsh86t.exe won't be + installed. +
    10. `nmake /f makefile.vc install` +
    11. `fossil up core-9-0-0`
      + ↑ Or some other version of Tcl9
    12. `fossil clean -x` -
    13. `nmake /f makefile.vc INSTALLDIR=%TCLTD%\tcl86 release install` +
    14. `set INSTALLDIR=%TCLTD%\tcl90` +
    15. `nmake /f makefile.vc release`
      + ⇅ You *must* invoke the "release" and "install" targets + using separate invocations of "nmake" or tclsh90.exe won't be + installed. +
    16. `nmake /f makefile.vc install`
    ### 2.3 Building the SQLite TCL extension on Windows
      -
    1. `cd %SRCCO%` +
    2. `cd %SRCCO%`
    3. `fossil clean -x`
    4. `set TCLDIR=%TCLTD%\tcl86`
    5. `set PATH=%TCLTD%\tcl86\bin;%ORIGINALPATH%`
    6. `set TCLSH_CMD=%TCLTD%\tcl86\bin\tclsh86t.exe` -
    7. `nmake /f Makefile.msc tclextension-install` -
    8. → Verify extension installed at %TCLTD%\tcl86\lib\tcl8.6\sqlite3.* +
    9. `nmake /f Makefile.msc tclextension-install`
      + ↑ Verify extension installed at %TCLTD%\\tcl86\\lib\\tcl8.6\\sqlite3.*
    10. `fossil clean -x`
    11. `set TCLDIR=%TCLTD%\tcl90`
    12. `set PATH=%TCLTD%\tcl90\bin;%ORIGINALPATH%`
    13. `set TCLSH_CMD=%TCLTD%\tcl90\bin\tclsh90.exe` -
    14. `nmake /f Makefile.msc tclextension-install` -
    15. → Verify extension installed at %TCLTD%\tcl906\lib\sqlite3.* +
    16. `nmake /f Makefile.msc tclextension-install`
      + ↑ Verify extension installed at %TCLTD%\\tcl90\\lib\\sqlite3.*
    ### 2.4 Testing on Windows
      -
    1. +
    2. `set PATH=%TCLTD%\tcl86\bin;%ORIGINALPATH%` -
    3. `tclsh86t test/testrunner.tcl release --explain` -
    4. ↑ Verify thousands of lines of output with no errors +
    5. `tclsh86t test/testrunner.tcl release --explain`
      + ↑ Verify thousands of lines of output with no errors
    6. `set PATH=%TCLTD%\tcl90\bin;%ORIGINALPATH%` -
    7. `tclsh90 test/testrunner.tcl release --explain` -
    8. ↑ Verify thousands of lines of output with no errors +
    9. `tclsh90 test/testrunner.tcl release --explain`
      + ↑ Verify thousands of lines of output with no errors
    ### 2.5 Cleanup diff --git a/manifest b/manifest index ceadd6eb7b..81708d8dda 100644 --- a/manifest +++ b/manifest @@ -1,11 +1,11 @@ -C Add\snew\stcl-extension-testing.md\sdocument.\s\sThe\sWindows\sside\sis\snot\syet\nworking. -D 2025-01-04T14:10:45.730 +C Adjust\sthe\sWindows\sMakefile.msc\sso\sthat\sit\scan\sbuild\sthe\stclextension\swith\nTcl8.6\ssuccessfully.\s\sUpdates\sto\sthe\stcl-extension\stest\sprocedure\sdocument. +D 2025-01-04T15:51:30.848 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d F Makefile.in ad349acf91b3569033439fe498fa197aa530cafaa01362eb7daad2f84e43d265 F Makefile.linux-generic bd3e3cacd369821a6241d4ea1967395c962dfe3057e38cb0a435cee0e8b789d0 -F Makefile.msc eed0c40c365d100f3329e8fb7d0e18bad09a6f0c026aa1e4dc7f88270378929d +F Makefile.msc a62f84e521a23168c61018420c6844a9fbb424950010dc6a3e084ffd8618312e F README.md c3c0f19532ce28f6297a71870f3c7b424729f0e6d9ab889616d3587dd2332159 F VERSION 8dc0c3df15fd5ff0622f88fc483533fce990b1cbb2f5fb9fdfb4dbd71eef2889 F art/icon-243x273.gif 9750b734f82fdb3dc43127753d5e6fbf3b62c9f4e136c2fbf573b2f57ea87af5 @@ -61,7 +61,7 @@ F doc/json-enhancements.md e356fc834781f1f1aa22ee300027a270b2c960122468499bf347b F doc/jsonb.md 5fab4b8613aa9153fbeb6259297bd4697988af8b3d23900deba588fa7841456b F doc/lemon.html 8b266ff711d2ec7f867c3dca37634963f48a630329908cc282beebfa8c708706 F doc/pager-invariants.txt 27fed9a70ddad2088750c4a2b493b63853da2710 -F doc/tcl-extension-testing.md e7ce7dbd7394c411d5d3c1d29b86455e81203d750af1765304d603fd12973a27 +F doc/tcl-extension-testing.md 1c7225115cede8dadd8fb173d5a1ada31d0ac566d53dcbec2013bbf97464933d F doc/testrunner.md 15583cf8c7d8a1c3378fd5d4319ca769a14c4d950a5df9b015d01d5be290dc69 F doc/trusted-schema.md 33625008620e879c7bcfbbfa079587612c434fa094d338b08242288d358c3e8a F doc/vdbesort-memory.md 4da2639c14cd24a31e0af694b1a8dd37eaf277aff3867e9a8cc14046bc49df56 @@ -2205,11 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 9ee57a30a49d9813bf2669a5d8346f7e018e3fbf1792739951311a8d3a249d45 -R 33caf2e9f23e286037be195e768a7a16 -T *branch * test-procedures -T *sym-test-procedures * -T -sym-trunk * +P 9dc805df1b1c26196ca53baa6b1b8c2f7e59e0150d02ead53228c77a63ad40f4 +R c39856b8b1c55486d94efa9f4d6e65f7 U drh -Z a6ccc4c86b9da5c35c8534fa7413feee +Z 7ec4aefc8fdf87ac85e59e4d4ae3a188 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index ce9315f27f..aaa74e46f9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9dc805df1b1c26196ca53baa6b1b8c2f7e59e0150d02ead53228c77a63ad40f4 +0c2cdc632f26d6acac2d508def4ecfcc97462ebcddc20c84f8847e02e42b3a1d From 7a3d03b1fd8241899ab6fadce5a8e9d605f73537 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 4 Jan 2025 16:30:05 +0000 Subject: [PATCH 020/220] Fix a problem in the sessions extension allowing changesets containing foreign key violations to be committed under some circumstances. FossilOrigin-Name: e09a0c022903d88d5d6de34b2527565ef60c6bb049f2fb42f037e1520abf0f93 --- ext/session/session1.test | 6 +++-- ext/session/session9.test | 20 ++++++++++------ ext/session/sessionnoact.test | 44 ++++++++++++++++++++++++++++++++++- ext/session/sqlite3session.c | 4 ++-- manifest | 23 +++++++++--------- manifest.uuid | 2 +- test/fkey6.test | 27 +++++++++++++++++++++ 7 files changed, 101 insertions(+), 25 deletions(-) diff --git a/ext/session/session1.test b/ext/session/session1.test index bcd7b03d5c..dfc1aa8957 100644 --- a/ext/session/session1.test +++ b/ext/session/session1.test @@ -204,7 +204,9 @@ proc do_conflict_test {tn args} { foreach t $O(-tables) { S attach $t } execsql $O(-sql) set ::xConflict [list] - sqlite3changeset_apply db2 [S changeset] xConflict + catch { + sqlite3changeset_apply db2 [S changeset] xConflict + } set conflicts [list] foreach c $O(-conflicts) { @@ -283,7 +285,7 @@ do_conflict_test $tn.3.2.3 -tables t2 -sql { {FOREIGN_KEY 1} } do_execsql_test $tn.3.2.4 "SELECT * FROM t2" {} -do_db2_test $tn.3.2.5 "SELECT * FROM t2" {4 five} +do_db2_test $tn.3.2.5 "SELECT * FROM t2" {1 one 2 two 4 five} # Test UPDATE changesets. # diff --git a/ext/session/session9.test b/ext/session/session9.test index ebb88ffade..6b7d1648b2 100644 --- a/ext/session/session9.test +++ b/ext/session/session9.test @@ -80,8 +80,10 @@ foreach {tn delrow trans conflictargs conflictret} { 8 3 1 {FOREIGN_KEY 1} ABORT } { - set A(OMIT) {0 {}} - set A(ABORT) {1 SQLITE_CONSTRAINT} + set A(OMIT,0) {1 SQLITE_CONSTRAINT} + set A(OMIT,1) {0 {}} + set A(ABORT,0) {1 SQLITE_CONSTRAINT} + set A(ABORT,1) {1 SQLITE_CONSTRAINT} do_test 1.2.$tn.1 { populate_db execsql { DELETE FROM p1 WHERE a=($delrow+0) } @@ -89,20 +91,24 @@ foreach {tn delrow trans conflictargs conflictret} { set ::xConflict [list] list [catch {sqlite3changeset_apply db $::cc xConflict} msg] $msg - } $A($conflictret) + } $A($conflictret,$trans) do_test 1.2.$tn.2 { set ::xConflict } $conflictargs - set A(OMIT) {1 1} - set A(ABORT) {0 0} + set A(OMIT,0) {0 0} + set A(OMIT,1) {1 1} + set A(ABORT,0) {0 0} + set A(ABORT,1) {0 0} + do_test 1.2.$tn.3 { execsql { SELECT count(*) FROM c1 UNION ALL SELECT count(*) FROM c2 } - } $A($conflictret) + } $A($conflictret,$trans) do_test 1.2.$tn.4 { expr ![sqlite3_get_autocommit db] } $trans do_test 1.2.$tn.5 { - if { $trans } { execsql COMMIT } + if { $trans && $conflictret=="ABORT" } { execsql COMMIT } } {} + catchsql ROLLBACK } #-------------------------------------------------------------------- diff --git a/ext/session/sessionnoact.test b/ext/session/sessionnoact.test index aa1cde4749..f605e6108e 100644 --- a/ext/session/sessionnoact.test +++ b/ext/session/sessionnoact.test @@ -82,7 +82,6 @@ do_execsql_test 1.5 { UPDATE p1 SET c=12345 WHERE a = 45; } -breakpoint sqlite3changeset_apply_v2 -noaction db $C conflict do_execsql_test 1.6 { SELECT * FROM c1 @@ -108,4 +107,47 @@ do_execsql_test 1.8 { PRAGMA foreign_key_check } +#------------------------------------------------------------------------- +# Check that a changeset that causes an FK violation may not be applied, +# even if SQLITE_CHANGESETAPPLY_FKNOACTION is specified. +# +reset_db +do_execsql_test 2.0 { + CREATE TABLE p1(a INTEGER PRIMARY KEY, b, c UNIQUE); + INSERT INTO p1 VALUES(1, 1, 'one'); + INSERT INTO p1 VALUES(2, 2, 'two'); + + CREATE TABLE c1(x REFERENCES p1(c) ON DELETE CASCADE); + INSERT INTO c1 VALUES('two'); +} + +db_save + +set C [changeset_from_sql { + DELETE FROM p1 WHERE a=2; +}] + +db_restore_and_reopen + +do_test 2.1 { + sqlite3changeset_apply_v2 -noaction db $C conflict +} {} +do_execsql_test 2.2 { + SELECT * FROM p1 +} {1 1 one} + +db_restore_and_reopen +db eval { PRAGMA foreign_keys = 1 } + +do_test 2.3 { + list [catch { sqlite3changeset_apply_v2 -noaction db $C conflict } msg] $msg +} {1 SQLITE_CONSTRAINT} +do_execsql_test 2.4 { + SELECT * FROM p1; +} {1 1 one 2 2 two} +do_execsql_test 2.5 { + SELECT * FROM c1; +} {two} + finish_test + diff --git a/ext/session/sqlite3session.c b/ext/session/sqlite3session.c index f2eb942e68..a3f132add8 100644 --- a/ext/session/sqlite3session.c +++ b/ext/session/sqlite3session.c @@ -5283,12 +5283,12 @@ static int sessionChangesetApply( } } } - sqlite3_exec(db, "PRAGMA defer_foreign_keys = 0", 0, 0, 0); if( (flags & SQLITE_CHANGESETAPPLY_NOSAVEPOINT)==0 ){ if( rc==SQLITE_OK ){ rc = sqlite3_exec(db, "RELEASE changeset_apply", 0, 0, 0); - }else{ + } + if( rc!=SQLITE_OK ){ sqlite3_exec(db, "ROLLBACK TO changeset_apply", 0, 0, 0); sqlite3_exec(db, "RELEASE changeset_apply", 0, 0, 0); } diff --git a/manifest b/manifest index 3cdc3c3865..1063bced5f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\sdocument\sdescribing\stest\sprocedures\sfor\sthe\sTCL\sextension\sbuild\nprocess.\s\sUpdate\sthe\sWindows\smakefile\sso\sthat\sit\sbuilds\sthe\sTCL\sextensions\nsuccessfully\swith\sa\sdefault\sinstallation\sof\sTcl8.6. -D 2025-01-04T15:52:40.069 +C Fix\sa\sproblem\sin\sthe\ssessions\sextension\sallowing\schangesets\scontaining\sforeign\skey\sviolations\sto\sbe\scommitted\sunder\ssome\scircumstances. +D 2025-01-04T16:30:05.359 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -576,14 +576,14 @@ F ext/rtree/visual01.txt e9c2564083bcd30ec51b07f881bffbf0e12b50a3f6fced0c222c5c1 F ext/session/changeset.c 7a1e6a14c7e92d36ca177e92e88b5281acd709f3b726298dc34ec0fb58869cb5 F ext/session/changesetfuzz.c 227076ab0ae4447d742c01ee88a564da6478bbf26b65108bf8fac9cd8b0b24aa F ext/session/changesetfuzz1.test 15b629004e58d5ffcc852e6842a603775bb64b1ce51254831f3d12b113b616cd -F ext/session/session1.test e94f764fbfb672147c0ef7026b195988133b371dc8cf9e52423eba6cad69717e +F ext/session/session1.test 8d0509cd3fcfdee6a33422d5fe5c95a9770d62a0b8588adb0177ecdf79b2c345 F ext/session/session2.test ee83bb973b9ce17ccce4db931cdcdae65eb40bbb22089b2fe6aa4f6be3b9303f F ext/session/session3.test 2cc1629cfb880243aec1a7251145e07b78411d851b39b2aa1390704550db8e6a F ext/session/session4.test 823f6f018fcbb8dacf61e2960f8b3b848d492b094f8b495eae1d9407d9ab7219 F ext/session/session5.test 716bc6fafd625ce60dfa62ae128971628c1a1169 F ext/session/session6.test 35279f2ec45448cd2e24a61688219dc6cf7871757716063acf4a8b5455e1e926 F ext/session/session8.test 326f3273abf9d5d2d7d559eee8f5994c4ea74a5d935562454605e6607ee29904 -F ext/session/session9.test 5409d90d8141881d08285ed1c2c0d8d10fb92069 +F ext/session/session9.test be090b1420f3824a573da9e56ff542b1e1c2a4f772118e9ab2f75774e66d25d0 F ext/session/sessionA.test 1feeab0b8e03527f08f2f1defb442da25480138f F ext/session/sessionB.test c4fb7f8a688787111606e123a555f18ee04f65bb9f2a4bb2aa71d55ce4e6d02c F ext/session/sessionC.test f8a5508bc059ae646e5ec9bdbca66ad24bc92fe99fda5790ac57e1f59fce2fdf @@ -606,7 +606,7 @@ F ext/session/sessionfault2.test b0d6a7c1d7398a7e800d84657404909c7d385965ea8576d F ext/session/sessionfault3.test ce0b5d182133935c224d72507dbf1c5be1a1febf7e85d0b0fbd6d2f724b32b96 F ext/session/sessioninvert.test 04075517a9497a80d39c495ba6b44f3982c7371129b89e2c52219819bc105a25 F ext/session/sessionmem.test f2a735db84a3e9e19f571033b725b0b2daf847f3f28b1da55a0c1a4e74f1de09 -F ext/session/sessionnoact.test 2563dff62a2a80dc7c88002241b2fd1578c3e5438735e180fb7e941ebbc66214 +F ext/session/sessionnoact.test 1ea34324b7be2fa9d63870d44969e6bb5290a6d1603ddfd4151c51df73fad291 F ext/session/sessionnoop.test a9366a36a95ef85f8a3687856ebef46983df399541174cb1ede2ee53b8011bc7 F ext/session/sessionnoop2.test de4672dce88464396ec9f30ed08c6c01643a69c53ae540fadbbf6d30642d64e8 F ext/session/sessionrebase.test 702378bdcb5062f1106e74457beca8797d09c113a81768734a58b197b5b334e2 @@ -614,7 +614,7 @@ F ext/session/sessionrowid.test 85187c2f1b38861a5844868126f69f9ec62223a03449a98a F ext/session/sessionsize.test 8fcf4685993c3dbaa46a24183940ab9f5aa9ed0d23e5fb63bfffbdb56134b795 F ext/session/sessionstat1.test 5e718d5888c0c49bbb33a7a4f816366db85f59f6a4f97544a806421b85dc2dec F ext/session/sessionwor.test 6fd9a2256442cebde5b2284936ae9e0d54bde692d0f5fd009ecef8511f4cf3fc -F ext/session/sqlite3session.c 3d0a7f0f7a1c946e01818c716a55a40ae30542a29a9045cb05daf7fb658cdafa +F ext/session/sqlite3session.c d6f5e3e83b9b0bbc4a8db4837284f0ecc6af5321d4c8e7136380b456b278c46a F ext/session/sqlite3session.h 683ccbf16e2c2521661fc4c1cf918ce57002039efbcabcd8097fa4bca569104b F ext/session/test_session.c aa29abdcc9011ac02f4fa38e8ede226106eaeee7c3ea7d8b2b999a124e0c368c F ext/wasm/EXPORTED_FUNCTIONS.fiddle.in 27450c8b8c70875a260aca55435ec927068b34cef801a96205adb81bdcefc65c @@ -1153,7 +1153,7 @@ F test/fkey2.test 1063d65e5923c054cfb8f0555a92a3ae0fa8c067275a33ee1715bd856cdb30 F test/fkey3.test 76d475c80b84ee7a5d062e56ccb6ea68882e2b49 F test/fkey4.test 86446017011273aad8f9a99c1a65019e7bd9ca9d F test/fkey5.test 6727452e163a427147e84e739da18713da553d79f9783559b04fdcd36d5c7421 -F test/fkey6.test d078a1e323a740062bed38df32b8a736fd320dc0 +F test/fkey6.test bdb9c808349a149575b87cf4bfd82d4c81612f0c4d954d27b3f42f043a385396 F test/fkey7.test 64fb28da03da5dfe3cdef5967aa7e832c2507bf7fb8f0780cacbca1f2338d031 F test/fkey8.test 51deda7f1a1448bca95875e4a6e1a3a75b4bd7215e924e845bd60de60e4d84bf F test/fkey_malloc.test 594a7ea1fbab553c036c70813cd8bd9407d63749 @@ -2205,9 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 9ee57a30a49d9813bf2669a5d8346f7e018e3fbf1792739951311a8d3a249d45 0c2cdc632f26d6acac2d508def4ecfcc97462ebcddc20c84f8847e02e42b3a1d -R c39856b8b1c55486d94efa9f4d6e65f7 -T +closed 0c2cdc632f26d6acac2d508def4ecfcc97462ebcddc20c84f8847e02e42b3a1d -U drh -Z 0b107a7817bd289dd55ee148db24c6d9 +P 3263db9249444203b7a9a9f2b0be309c74944315dde7ed192366b709fff93f1b +R dd67c57d38ae3918a7498e739dc242d4 +U dan +Z 0beeea9f83c0978752782d269e0f987a # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index f286bc29e1..613d99cd96 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3263db9249444203b7a9a9f2b0be309c74944315dde7ed192366b709fff93f1b +e09a0c022903d88d5d6de34b2527565ef60c6bb049f2fb42f037e1520abf0f93 diff --git a/test/fkey6.test b/test/fkey6.test index b658f20fea..8658759523 100644 --- a/test/fkey6.test +++ b/test/fkey6.test @@ -225,5 +225,32 @@ do_execsql_test 3.3.4 { SELECT * FROM p2; } {0 one 1 deleted!} +#------------------------------------------------------------------------- +# Verify that, even with "PRAGMA defer_foreign_keys", a transaction cannot +# be committed if there are outstanding foreign key violations. +# +reset_db +do_execsql_test 4.0 { + CREATE TABLE p1(a INTEGER PRIMARY KEY, b UNIQUE); + CREATE TABLE c1(x REFERENCES p1(b)); + + INSERT INTO p1 VALUES(1, 'one'), (2, 'two'), (3, 'three'); + INSERT INTO c1 VALUES('two'); + + PRAGMA foreign_keys = 1; + PRAGMA defer_foreign_keys = 1; +} + +do_execsql_test 4.1 { + BEGIN; + DELETE FROM p1 WHERE a=2; +} + +do_catchsql_test 4.2 { + COMMIT; +} {1 {FOREIGN KEY constraint failed}} + + + finish_test From 1388a716908e2ca8beffe7a7abc8e3321800d7ea Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 4 Jan 2025 19:50:44 +0000 Subject: [PATCH 021/220] Allow the 2nd argument to ".param set" to use previously bound parameters, as suggested by [forum:/forumpost/823e1bd746|forum post 823e1bd746]. FossilOrigin-Name: 13a35ad792dc0afe1f7b60230aef392ae01e702972b963d732e332f21848f38b --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/shell.c.in | 1 + 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 1063bced5f..cc01879f7d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\sin\sthe\ssessions\sextension\sallowing\schangesets\scontaining\sforeign\skey\sviolations\sto\sbe\scommitted\sunder\ssome\scircumstances. -D 2025-01-04T16:30:05.359 +C Allow\sthe\s2nd\sargument\sto\s".param\sset"\sto\suse\spreviously\sbound\sparameters,\nas\ssuggested\sby\s[forum:/forumpost/823e1bd746|forum\spost\s823e1bd746]. +D 2025-01-04T19:50:44.608 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -779,7 +779,7 @@ F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c F src/resolve.c c8a5372b97b2a2e972a280676f06ddb5b74e885d3b1f5ce383f839907b57ef68 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 F src/select.c 83e88fbb36f89b6703b348777491619554f0fd6f917c9fdf51e4c2e9cda6c04e -F src/shell.c.in ee54de10e9bd5572f689a6bc0c8e6fa58a8870e1670978ded44412d2715fd908 +F src/shell.c.in a9c0f8066eac40f1f97b8554bb0462b07263d5c02380cc1ef74734c5d1c67637 F src/sqlite.h.in 6afbcaae44140216704a6c82e4c4ea4118c46d5f6573d6c5fa4fc901ed9d369e F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54 @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 3263db9249444203b7a9a9f2b0be309c74944315dde7ed192366b709fff93f1b -R dd67c57d38ae3918a7498e739dc242d4 -U dan -Z 0beeea9f83c0978752782d269e0f987a +P e09a0c022903d88d5d6de34b2527565ef60c6bb049f2fb42f037e1520abf0f93 +R 364f6f3884762438edb0a3db4be13b55 +U drh +Z 24b57e7db6ae465e4c0bb8fa905414ba # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 613d99cd96..c7e903bba5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e09a0c022903d88d5d6de34b2527565ef60c6bb049f2fb42f037e1520abf0f93 +13a35ad792dc0afe1f7b60230aef392ae01e702972b963d732e332f21848f38b diff --git a/src/shell.c.in b/src/shell.c.in index cad8c92c57..27028ccb0f 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -10237,6 +10237,7 @@ static int do_meta_command(char *zLine, ShellState *p){ rc = 1; } } + bind_prepared_stmt(p, pStmt); sqlite3_step(pStmt); sqlite3_finalize(pStmt); }else From 1c1b3a0f2db572bff16f66fcb07fd990b0425552 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 4 Jan 2025 20:13:54 +0000 Subject: [PATCH 022/220] Show the values of $(JIM_TCLSH) and $(VISUALSTUDIOVERSION) in the output of "nmake tcl-env". FossilOrigin-Name: 4270abc071ced9e7ec1fed3c387262cc1912e321e37e45e547a1088dbb022702 --- Makefile.msc | 2 ++ manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/Makefile.msc b/Makefile.msc index 7ebfcc8a32..a1c6ea8e18 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -2796,6 +2796,8 @@ tcl-env: @echo LIBTCL = $(LIBTCL) @echo LIBTCLSTUB = $(LIBTCLSTUB) @echo TCLSH_CMD = $(TCLSH_CMD) + @echo JIM_TCLSH = $(JIM_TCLSH) + @echo VISUALSTUDIOVERSION = $(VISUALSTUDIOVERSION) LSMDIR=$(TOP)\ext\lsm1 !INCLUDE $(LSMDIR)\Makefile.msc diff --git a/manifest b/manifest index cc01879f7d..01871cbabd 100644 --- a/manifest +++ b/manifest @@ -1,11 +1,11 @@ -C Allow\sthe\s2nd\sargument\sto\s".param\sset"\sto\suse\spreviously\sbound\sparameters,\nas\ssuggested\sby\s[forum:/forumpost/823e1bd746|forum\spost\s823e1bd746]. -D 2025-01-04T19:50:44.608 +C Show\sthe\svalues\sof\s$(JIM_TCLSH)\sand\s$(VISUALSTUDIOVERSION)\sin\sthe\s\noutput\sof\s"nmake\stcl-env". +D 2025-01-04T20:13:54.343 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d F Makefile.in ad349acf91b3569033439fe498fa197aa530cafaa01362eb7daad2f84e43d265 F Makefile.linux-generic bd3e3cacd369821a6241d4ea1967395c962dfe3057e38cb0a435cee0e8b789d0 -F Makefile.msc a62f84e521a23168c61018420c6844a9fbb424950010dc6a3e084ffd8618312e +F Makefile.msc fd49fbfca5077436a4e7e9f38ec0f1ed900c3e5dc627a8ee00ff15d18649c00c F README.md c3c0f19532ce28f6297a71870f3c7b424729f0e6d9ab889616d3587dd2332159 F VERSION 8dc0c3df15fd5ff0622f88fc483533fce990b1cbb2f5fb9fdfb4dbd71eef2889 F art/icon-243x273.gif 9750b734f82fdb3dc43127753d5e6fbf3b62c9f4e136c2fbf573b2f57ea87af5 @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P e09a0c022903d88d5d6de34b2527565ef60c6bb049f2fb42f037e1520abf0f93 -R 364f6f3884762438edb0a3db4be13b55 +P 13a35ad792dc0afe1f7b60230aef392ae01e702972b963d732e332f21848f38b +R b249c902701d086f7fc1e9c45b94a036 U drh -Z 24b57e7db6ae465e4c0bb8fa905414ba +Z aade41f2b6bccecf69fadf6f2f547775 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index c7e903bba5..3e076d8a56 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -13a35ad792dc0afe1f7b60230aef392ae01e702972b963d732e332f21848f38b +4270abc071ced9e7ec1fed3c387262cc1912e321e37e45e547a1088dbb022702 From 1e03bd8a89e57c465a1975c0a17408448cc56985 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 4 Jan 2025 20:50:21 +0000 Subject: [PATCH 023/220] Improvements to testing and validation of the SQLite TCL extension. FossilOrigin-Name: 9d7597cad4a167aef7688e85513d8695e8d919e41f5cd44909aefee5ddf13345 --- Makefile.msc | 3 +++ doc/tcl-extension-testing.md | 16 ++++++++++------ main.mk | 7 +++++++ manifest | 18 +++++++++--------- manifest.uuid | 2 +- tool/buildtclext.tcl | 36 ++++++++++++++++++++++++++++++++++++ 6 files changed, 66 insertions(+), 16 deletions(-) diff --git a/Makefile.msc b/Makefile.msc index a1c6ea8e18..5d3d4c01d0 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -1894,6 +1894,9 @@ tclextension-uninstall: tclextension-list: $(TCLSH_CMD) $(TOP)\tool\buildtclext.tcl --info +tclextension-verify: sqlite3.h + $(TCLSH_CMD) $(TOP)\tool\buildtclext.tcl --version-check + # <> diff --git a/doc/tcl-extension-testing.md b/doc/tcl-extension-testing.md index 0b81b922c9..10c57b7c36 100644 --- a/doc/tcl-extension-testing.md +++ b/doc/tcl-extension-testing.md @@ -46,16 +46,18 @@
  • `./configure --with-tclsh=$TCLTD/tcl86/bin/tclsh8.6`
  • `make tclextension-install`
    ↑ Verify extension installed at $TCLTD/tcl86/lib/tcl8.6/sqlite3.* +
  • `make tclextension-verify`
  • `fossil clean -x`
  • `./configure --with-tclsh=$TCLTD/tcl90/bin/tclsh9.0`
  • `make tclextension-install`
    ↑ Verify extension installed at $TCLTD/tcl90/lib/sqlite3.* +
  • `make tclextension-verify` -### 1.4 Testing the extension +### 1.4 Additional sanity tests
      -
    1. +
    2. `$TCLTD/tcl86/bin/tclsh8.6 test/testrunner.tcl release --explain`
      ↑ Verify thousands of lines of output with no errors
    3. `$TCLTD/tcl90/bin/tclsh9.0 test/testrunner.tcl release --explain`
      @@ -65,7 +67,7 @@ ### 1.5 Cleanup
        -
      1. `rm -rf $TCLTD` +
      2. `rm -rf $TCLTD`
      ## 2.0 Testing On Windows @@ -130,18 +132,20 @@
    4. `set TCLSH_CMD=%TCLTD%\tcl86\bin\tclsh86t.exe`
    5. `nmake /f Makefile.msc tclextension-install`
      ↑ Verify extension installed at %TCLTD%\\tcl86\\lib\\tcl8.6\\sqlite3.* +
    6. `nmake /f Makefile.msc tclextension-verify`
    7. `fossil clean -x`
    8. `set TCLDIR=%TCLTD%\tcl90`
    9. `set PATH=%TCLTD%\tcl90\bin;%ORIGINALPATH%`
    10. `set TCLSH_CMD=%TCLTD%\tcl90\bin\tclsh90.exe`
    11. `nmake /f Makefile.msc tclextension-install`
      ↑ Verify extension installed at %TCLTD%\\tcl90\\lib\\sqlite3.* +
    12. `nmake /f Makefile.msc tclextension-verify`
    -### 2.4 Testing on Windows +### 2.4 Additional sanity tests for Windows
      -
    1. +
    2. `set PATH=%TCLTD%\tcl86\bin;%ORIGINALPATH%`
    3. `tclsh86t test/testrunner.tcl release --explain`
      ↑ Verify thousands of lines of output with no errors @@ -153,5 +157,5 @@ ### 2.5 Cleanup
        -
      1. `rm -rf %TCLTD%` +
      2. `rm -rf %TCLTD%`
      diff --git a/main.mk b/main.mk index 660cf54bd3..28c4245aab 100644 --- a/main.mk +++ b/main.mk @@ -1574,6 +1574,13 @@ tclextension-uninstall: tclextension-list: $(TCLSH_CMD) $(TOP)/tool/buildtclext.tcl --info +# Verify that the SQLite TCL extension that is loaded by default +# in $(TCLSH_CMD) is the same as the version of SQLite for the +# current source tree +# +tclextension-verify: sqlite3.h + $(TCLSH_CMD) $(TOP)/tool/buildtclext.tcl --version-check + # # FTS5 things # diff --git a/manifest b/manifest index 01871cbabd..28f03fcd38 100644 --- a/manifest +++ b/manifest @@ -1,11 +1,11 @@ -C Show\sthe\svalues\sof\s$(JIM_TCLSH)\sand\s$(VISUALSTUDIOVERSION)\sin\sthe\s\noutput\sof\s"nmake\stcl-env". -D 2025-01-04T20:13:54.343 +C Improvements\sto\stesting\sand\svalidation\sof\sthe\sSQLite\sTCL\sextension. +D 2025-01-04T20:50:21.155 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d F Makefile.in ad349acf91b3569033439fe498fa197aa530cafaa01362eb7daad2f84e43d265 F Makefile.linux-generic bd3e3cacd369821a6241d4ea1967395c962dfe3057e38cb0a435cee0e8b789d0 -F Makefile.msc fd49fbfca5077436a4e7e9f38ec0f1ed900c3e5dc627a8ee00ff15d18649c00c +F Makefile.msc 9180dae8de9534393c8a7c7d3b660deb6de5d29910471991738eed1b19c1aaa1 F README.md c3c0f19532ce28f6297a71870f3c7b424729f0e6d9ab889616d3587dd2332159 F VERSION 8dc0c3df15fd5ff0622f88fc483533fce990b1cbb2f5fb9fdfb4dbd71eef2889 F art/icon-243x273.gif 9750b734f82fdb3dc43127753d5e6fbf3b62c9f4e136c2fbf573b2f57ea87af5 @@ -61,7 +61,7 @@ F doc/json-enhancements.md e356fc834781f1f1aa22ee300027a270b2c960122468499bf347b F doc/jsonb.md 5fab4b8613aa9153fbeb6259297bd4697988af8b3d23900deba588fa7841456b F doc/lemon.html 8b266ff711d2ec7f867c3dca37634963f48a630329908cc282beebfa8c708706 F doc/pager-invariants.txt 27fed9a70ddad2088750c4a2b493b63853da2710 -F doc/tcl-extension-testing.md 1c7225115cede8dadd8fb173d5a1ada31d0ac566d53dcbec2013bbf97464933d +F doc/tcl-extension-testing.md ab39979265fd0e0aa1d31dfb9d468761470d8d84a285d49f11b3ed748224e2f4 F doc/testrunner.md 15583cf8c7d8a1c3378fd5d4319ca769a14c4d950a5df9b015d01d5be290dc69 F doc/trusted-schema.md 33625008620e879c7bcfbbfa079587612c434fa094d338b08242288d358c3e8a F doc/vdbesort-memory.md 4da2639c14cd24a31e0af694b1a8dd37eaf277aff3867e9a8cc14046bc49df56 @@ -700,7 +700,7 @@ F ext/wasm/tests/opfs/concurrency/test.js d08889a5bb6e61937d0b8cbb78c9efbefbf65a F ext/wasm/tests/opfs/concurrency/worker.js 0a8c1a3e6ebb38aabbee24f122693f1fb29d599948915c76906681bb7da1d3d2 F ext/wasm/wasmfs.make bc8bb227f35d5bd3863a7bd2233437c37472a0d81585979f058f9b9b503bef35 F magic.txt 5ade0bc977aa135e79e3faaea894d5671b26107cc91e70783aa7dc83f22f3ba0 -F main.mk fde6ef9167ab1972f6273c0cc06a7d2d776f562d06f44f4987868335910f3803 +F main.mk 566aff71e11c52e10f81548e60f79c48cc267cb4b9971e71720047105da4304b F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 F mptest/crash01.test 61e61469e257df0850df4293d7d4d6c2af301421 @@ -2110,7 +2110,7 @@ F tool/GetTclKit.bat d84033c6a93dfe735d247f48ba00292a1cc284dcf69963e5e672444e045 F tool/Replace.cs 02c67258801c2fb5f63231e0ac0f220b4b36ba91 F tool/build-all-msvc.bat c817b716e0edeecaf265a6775b63e5f45c34a6544f1d4114a222701ed5ac79ab x F tool/build-shell.sh 369c4b171cc877ad974fef691e4da782b4c1e99fe8f4361316c735f64d49280f -F tool/buildtclext.tcl 5e1f1aa843e635c8b7480c7d1ec1f149a5e52136ae2fca1226304053a1a60587 +F tool/buildtclext.tcl e82120d672b34b507e1d9cb220ce18c5c36c3ee0ff0328e35f1806ce74ed2266 F tool/cg_anno.tcl c1f875f5a4c9caca3d59937b16aff716f8b1883935f1b4c9ae23124705bc8099 x F tool/checkSpacing.c 810e51703529a204fc4e1eb060e9ab663e3c06d2 F tool/cktclsh.sh 6075eef9c6b9ba4b38fef2ca2a66d25f2311bd3c610498d18a9b01f861629cca @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 13a35ad792dc0afe1f7b60230aef392ae01e702972b963d732e332f21848f38b -R b249c902701d086f7fc1e9c45b94a036 +P 4270abc071ced9e7ec1fed3c387262cc1912e321e37e45e547a1088dbb022702 +R e76bc68f8d16f2d1c5c9148746df5950 U drh -Z aade41f2b6bccecf69fadf6f2f547775 +Z 3470080ccfb271429f7dd29c45e9a752 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 3e076d8a56..8f0477bff4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4270abc071ced9e7ec1fed3c387262cc1912e321e37e45e547a1088dbb022702 +9d7597cad4a167aef7688e85513d8695e8d919e41f5cd44909aefee5ddf13345 diff --git a/tool/buildtclext.tcl b/tool/buildtclext.tcl index c74540c9ea..26f9b6dcc9 100644 --- a/tool/buildtclext.tcl +++ b/tool/buildtclext.tcl @@ -15,6 +15,7 @@ Options: --info Show info on existing SQLite TCL extension installs --install-only Install an extension previously build --uninstall Uninstall the extension + --version-check Check extension version against this source tree --destdir DIR Installation root (used by "make install DESTDIR=...") Other options are retained and passed through into the compiler.} @@ -24,6 +25,7 @@ set build 1 set install 1 set uninstall 0 set infoonly 0 +set versioncheck 0 set CC {} set OPTS {} set DESTDIR ""; # --destdir "$(DESTDIR)" @@ -36,11 +38,18 @@ for {set ii 0} {$ii<[llength $argv]} {incr ii} { } elseif {$a0=="--uninstall"} { set build 0 set install 0 + set versioncheck 0 set uninstall 1 } elseif {$a0=="--info"} { set build 0 set install 0 + set versioncheck 0 set infoonly 1 + } elseif {$a0=="--version-check"} { + set build 0 + set install 0 + set infoonly 0 + set versioncheck 1 } elseif {$a0=="--cc" && $ii+1<[llength $argv]} { incr ii set CC [lindex $argv $ii] @@ -156,6 +165,33 @@ if {$tcl_platform(platform)=="windows"} { set CMD [subst $cmd] } +# Check the SQLite TCL extension that is loaded by default by this running +# TCL interpreter to see if it has the same SQLITE_SOURCE_ID as the source +# code in the directory holding this script. +# +if {$versioncheck} { + if {[catch {package require sqlite3} msg]} { + puts stderr "No SQLite TCL extension available: $msg" + exit 1 + } + sqlite3 db :memory: + set extvers [db one {SELECT sqlite_source_id()}] + db close + set fd [open sqlite3.h rb] + set sqlite3h [read $fd] + close $fd + regexp {#define SQLITE_SOURCE_ID +"([^"]+)"} $sqlite3h all srcvers + set srcvers [string range $srcvers 0 78] + set extvers [string range $extvers 0 78] + if {$srcvers==$extvers} { + puts "source code and extension versions aligned:\n$extvers" + exit 0 + } + puts stderr "source code and extension versions differ" + puts stderr "source: $srcvers\nextension: $extvers" + exit 1 +} + # Show information about prior installs # if {$infoonly} { From 8b53358f8f2179e920bbe58d2e8f257d50dcfaac Mon Sep 17 00:00:00 2001 From: drh <> Date: Sun, 5 Jan 2025 11:19:32 +0000 Subject: [PATCH 024/220] Improvements to TCL extension test procedure description. Improvements to the tclextension-list and tclextension-verify makefile targets to suppress unnecessary output. FossilOrigin-Name: 3e92fea09af13259d61afd2953fe5f3fc16e3cedfef09e350903aa5299b8e469 --- Makefile.msc | 4 ++-- doc/tcl-extension-testing.md | 37 ++++++++++++++++++++++++------------ main.mk | 4 ++-- manifest | 16 ++++++++-------- manifest.uuid | 2 +- 5 files changed, 38 insertions(+), 25 deletions(-) diff --git a/Makefile.msc b/Makefile.msc index 5d3d4c01d0..33c5ef107e 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -1892,10 +1892,10 @@ tclextension-uninstall: $(TCLSH_CMD) $(TOP)\tool\buildtclext.tcl --uninstall tclextension-list: - $(TCLSH_CMD) $(TOP)\tool\buildtclext.tcl --info + @ $(TCLSH_CMD) $(TOP)\tool\buildtclext.tcl --info tclextension-verify: sqlite3.h - $(TCLSH_CMD) $(TOP)\tool\buildtclext.tcl --version-check + @ $(TCLSH_CMD) $(TOP)\tool\buildtclext.tcl --version-check # <> diff --git a/doc/tcl-extension-testing.md b/doc/tcl-extension-testing.md index 10c57b7c36..4835fe1be9 100644 --- a/doc/tcl-extension-testing.md +++ b/doc/tcl-extension-testing.md @@ -1,9 +1,22 @@ # Test Procedures For The SQLite TCL Extension +## 1.0 Background -## 1.0 Testing On Unix-like Systems (Including Mac) +The SQLite TCL extension logic (in the +"[tclsqlite.c](/file/src/tclsqlite3.c)" source +file) is statically linked into "textfixture" executable +which is the program used to do more of the testing +associated with "make test", "make devtest", and/or +"make releasetest". So the functionality of the SQLite +TCL extension is thoroughly vetted during normal testing. The +procedures below are designed to test the loadable extension +aspect of the SQLite TCL extension, and in particular to verify +that the "make tclextension-install" build target works and that +an ordinary tclsh can subsequently run "package require sqlite3". -### 1.1 Setup +## 2.0 Testing On Unix-like Systems (Including Mac) + +### 2.1 Setup
      1. @@ -21,7 +34,7 @@ of the TCL libraries and the SQLite TCL Extensions.
      -### 1.2 Building the TCL libraries and tclsh executables +### 2.2 Building the TCL libraries and tclsh executables
      1. `mkdir $TCLTD $TCLTD/tcl86 $TCLTD/tcl90` @@ -38,7 +51,7 @@
      2. `make install`
      -### 1.3 Building the SQLite TCL extension +### 2.3 Building the SQLite TCL extension
      1. `cd $SRCCO` @@ -54,7 +67,7 @@
      2. `make tclextension-verify`
      -### 1.4 Additional sanity tests +### 2.4 Additional sanity tests
      1. @@ -64,15 +77,15 @@ ↑ Verify thousands of lines of output with no errors
      -### 1.5 Cleanup +### 2.5 Cleanup
      1. `rm -rf $TCLTD`
      -## 2.0 Testing On Windows +## 3.0 Testing On Windows -### 2.1 Setup for Windows +### 3.1 Setup for Windows
      1. @@ -97,7 +110,7 @@ ↑ remember the original %PATH% value
      -### 2.2 Building the TCL libraries and tclsh.exe executables on Windows +### 3.2 Building the TCL libraries and tclsh.exe executables on Windows
      1. `mkdir %TCLTD% %TCLTD%\tcl86 %TCLTD%\tcl90` @@ -122,7 +135,7 @@
      2. `nmake /f makefile.vc install`
      -### 2.3 Building the SQLite TCL extension on Windows +### 3.3 Building the SQLite TCL extension on Windows
      1. `cd %SRCCO%` @@ -142,7 +155,7 @@
      2. `nmake /f Makefile.msc tclextension-verify`
      -### 2.4 Additional sanity tests for Windows +### 3.4 Additional sanity tests for Windows
      1. @@ -154,7 +167,7 @@ ↑ Verify thousands of lines of output with no errors
      -### 2.5 Cleanup +### 3.5 Cleanup
      1. `rm -rf %TCLTD%` diff --git a/main.mk b/main.mk index 28c4245aab..a22b0dfcdf 100644 --- a/main.mk +++ b/main.mk @@ -1572,14 +1572,14 @@ tclextension-uninstall: # by $TCLSH_CMD, including prior versions. # tclextension-list: - $(TCLSH_CMD) $(TOP)/tool/buildtclext.tcl --info + @ $(TCLSH_CMD) $(TOP)/tool/buildtclext.tcl --info # Verify that the SQLite TCL extension that is loaded by default # in $(TCLSH_CMD) is the same as the version of SQLite for the # current source tree # tclextension-verify: sqlite3.h - $(TCLSH_CMD) $(TOP)/tool/buildtclext.tcl --version-check + @ $(TCLSH_CMD) $(TOP)/tool/buildtclext.tcl --version-check # # FTS5 things diff --git a/manifest b/manifest index 28f03fcd38..57402835e3 100644 --- a/manifest +++ b/manifest @@ -1,11 +1,11 @@ -C Improvements\sto\stesting\sand\svalidation\sof\sthe\sSQLite\sTCL\sextension. -D 2025-01-04T20:50:21.155 +C Improvements\sto\sTCL\sextension\stest\sprocedure\sdescription.\s\sImprovements\sto\nthe\stclextension-list\sand\stclextension-verify\smakefile\stargets\sto\ssuppress\nunnecessary\soutput. +D 2025-01-05T11:19:32.428 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d F Makefile.in ad349acf91b3569033439fe498fa197aa530cafaa01362eb7daad2f84e43d265 F Makefile.linux-generic bd3e3cacd369821a6241d4ea1967395c962dfe3057e38cb0a435cee0e8b789d0 -F Makefile.msc 9180dae8de9534393c8a7c7d3b660deb6de5d29910471991738eed1b19c1aaa1 +F Makefile.msc 39785ec45f9ae0311e49094eff2ee079562246fed6be3b9f632a99d4df20056a F README.md c3c0f19532ce28f6297a71870f3c7b424729f0e6d9ab889616d3587dd2332159 F VERSION 8dc0c3df15fd5ff0622f88fc483533fce990b1cbb2f5fb9fdfb4dbd71eef2889 F art/icon-243x273.gif 9750b734f82fdb3dc43127753d5e6fbf3b62c9f4e136c2fbf573b2f57ea87af5 @@ -61,7 +61,7 @@ F doc/json-enhancements.md e356fc834781f1f1aa22ee300027a270b2c960122468499bf347b F doc/jsonb.md 5fab4b8613aa9153fbeb6259297bd4697988af8b3d23900deba588fa7841456b F doc/lemon.html 8b266ff711d2ec7f867c3dca37634963f48a630329908cc282beebfa8c708706 F doc/pager-invariants.txt 27fed9a70ddad2088750c4a2b493b63853da2710 -F doc/tcl-extension-testing.md ab39979265fd0e0aa1d31dfb9d468761470d8d84a285d49f11b3ed748224e2f4 +F doc/tcl-extension-testing.md 2d9c2b443ff978c679266cc77c505bc750ad41cad95c7ff57bcd261894db7685 F doc/testrunner.md 15583cf8c7d8a1c3378fd5d4319ca769a14c4d950a5df9b015d01d5be290dc69 F doc/trusted-schema.md 33625008620e879c7bcfbbfa079587612c434fa094d338b08242288d358c3e8a F doc/vdbesort-memory.md 4da2639c14cd24a31e0af694b1a8dd37eaf277aff3867e9a8cc14046bc49df56 @@ -700,7 +700,7 @@ F ext/wasm/tests/opfs/concurrency/test.js d08889a5bb6e61937d0b8cbb78c9efbefbf65a F ext/wasm/tests/opfs/concurrency/worker.js 0a8c1a3e6ebb38aabbee24f122693f1fb29d599948915c76906681bb7da1d3d2 F ext/wasm/wasmfs.make bc8bb227f35d5bd3863a7bd2233437c37472a0d81585979f058f9b9b503bef35 F magic.txt 5ade0bc977aa135e79e3faaea894d5671b26107cc91e70783aa7dc83f22f3ba0 -F main.mk 566aff71e11c52e10f81548e60f79c48cc267cb4b9971e71720047105da4304b +F main.mk fe86d83158b547e02f8d08aa6af2130540746a4a61de7c61ea8b9d09eb06acd4 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 F mptest/crash01.test 61e61469e257df0850df4293d7d4d6c2af301421 @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 4270abc071ced9e7ec1fed3c387262cc1912e321e37e45e547a1088dbb022702 -R e76bc68f8d16f2d1c5c9148746df5950 +P 9d7597cad4a167aef7688e85513d8695e8d919e41f5cd44909aefee5ddf13345 +R dea89f80d3d0e645bc0886ea1ea08414 U drh -Z 3470080ccfb271429f7dd29c45e9a752 +Z 5cb00fd50654015e2128f97c99b05bfe # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 8f0477bff4..cd948c9ac2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9d7597cad4a167aef7688e85513d8695e8d919e41f5cd44909aefee5ddf13345 +3e92fea09af13259d61afd2953fe5f3fc16e3cedfef09e350903aa5299b8e469 From 85900c04b01f28ae8b3b352dc58c124d32dbf7d9 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sun, 5 Jan 2025 11:40:15 +0000 Subject: [PATCH 025/220] Fix typo in the tcl-extension-testing.md document. FossilOrigin-Name: 28150c615cb601dfc9e4f660627228d6a8a715d64c65f7bc77931c9daf8a0dd7 --- doc/tcl-extension-testing.md | 2 +- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/doc/tcl-extension-testing.md b/doc/tcl-extension-testing.md index 4835fe1be9..3371d514bb 100644 --- a/doc/tcl-extension-testing.md +++ b/doc/tcl-extension-testing.md @@ -3,7 +3,7 @@ ## 1.0 Background The SQLite TCL extension logic (in the -"[tclsqlite.c](/file/src/tclsqlite3.c)" source +"[tclsqlite.c](/file/src/tclsqlite.c)" source file) is statically linked into "textfixture" executable which is the program used to do more of the testing associated with "make test", "make devtest", and/or diff --git a/manifest b/manifest index 57402835e3..ae7e6830ec 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improvements\sto\sTCL\sextension\stest\sprocedure\sdescription.\s\sImprovements\sto\nthe\stclextension-list\sand\stclextension-verify\smakefile\stargets\sto\ssuppress\nunnecessary\soutput. -D 2025-01-05T11:19:32.428 +C Fix\stypo\sin\sthe\stcl-extension-testing.md\sdocument. +D 2025-01-05T11:40:15.277 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -61,7 +61,7 @@ F doc/json-enhancements.md e356fc834781f1f1aa22ee300027a270b2c960122468499bf347b F doc/jsonb.md 5fab4b8613aa9153fbeb6259297bd4697988af8b3d23900deba588fa7841456b F doc/lemon.html 8b266ff711d2ec7f867c3dca37634963f48a630329908cc282beebfa8c708706 F doc/pager-invariants.txt 27fed9a70ddad2088750c4a2b493b63853da2710 -F doc/tcl-extension-testing.md 2d9c2b443ff978c679266cc77c505bc750ad41cad95c7ff57bcd261894db7685 +F doc/tcl-extension-testing.md 97f90ebaac1569c77395f715a4074ddf8b40984d1dae3af7ab693ec256e43853 F doc/testrunner.md 15583cf8c7d8a1c3378fd5d4319ca769a14c4d950a5df9b015d01d5be290dc69 F doc/trusted-schema.md 33625008620e879c7bcfbbfa079587612c434fa094d338b08242288d358c3e8a F doc/vdbesort-memory.md 4da2639c14cd24a31e0af694b1a8dd37eaf277aff3867e9a8cc14046bc49df56 @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 9d7597cad4a167aef7688e85513d8695e8d919e41f5cd44909aefee5ddf13345 -R dea89f80d3d0e645bc0886ea1ea08414 +P 3e92fea09af13259d61afd2953fe5f3fc16e3cedfef09e350903aa5299b8e469 +R 62604835e027bab1689bab4a8c0e956a U drh -Z 5cb00fd50654015e2128f97c99b05bfe +Z adbf7e41d03db62cbc628242472f462e # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index cd948c9ac2..63309c3c39 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3e92fea09af13259d61afd2953fe5f3fc16e3cedfef09e350903aa5299b8e469 +28150c615cb601dfc9e4f660627228d6a8a715d64c65f7bc77931c9daf8a0dd7 From 15e388d91057ca381510ace3e094210b33626452 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sun, 5 Jan 2025 17:16:33 +0000 Subject: [PATCH 026/220] Refactor the TCL extension test procedure to deal with TCL8.6 and TCL9.0 separately, to simplify the procedures and reduce cognative stress on the tester. FossilOrigin-Name: 5281536327d244ba9507548f7ed607e86e59b98a003e63f6da767471411c8ffc --- doc/tcl-extension-testing.md | 104 +++++++++++++++++------------------ manifest | 12 ++-- manifest.uuid | 2 +- 3 files changed, 59 insertions(+), 59 deletions(-) diff --git a/doc/tcl-extension-testing.md b/doc/tcl-extension-testing.md index 3371d514bb..65baa15469 100644 --- a/doc/tcl-extension-testing.md +++ b/doc/tcl-extension-testing.md @@ -34,53 +34,56 @@ an ordinary tclsh can subsequently run "package require sqlite3". of the TCL libraries and the SQLite TCL Extensions.
      -### 2.2 Building the TCL libraries and tclsh executables +### 2.2 Testing TCL 8.6 on unix
        -
      1. `mkdir $TCLTD $TCLTD/tcl86 $TCLTD/tcl90` +
      2. `mkdir $TCLTD/tcl86`
      3. `cd $TCLCO/unix`
      4. `fossil up core-8-6-16`
        ↑ Or some other version of Tcl8.6.
      5. `fossil clean -x`
      6. `./configure --prefix=$TCLTD/tcl86`
      7. `make install` +
      8. `cd $SRCCO` +
      9. `fossil clean -x` +
      10. `./configure --with-tclsh=$TCLTD/tcl86/bin/tclsh8.6` +
      11. `make tclextension-install`
        + ↑ Verify extension installed at $TCLTD/tcl86/lib/tcl8.6/sqlite3.* +
      12. `makek tclextension-list`
        + ↑ Verify TCL extension correctly installed. +
      13. `make tclextension-verify`
        + ↑ Verify that the correct version is installed. +
      14. `$TCLTD/tcl86/bin/tclsh8.6 test/testrunner.tcl release --explain`
        + ↑ Verify thousands of lines of output with no errors. Or + consider running "devtest" without --explain instead of "release". +
      + +### 2.3 Testing TCL 9.0 on unix + +
        +
      1. `mkdir $TCLTD/tcl90`
      2. `fossil up core-9-0-0`
        ↑ Or some other version of Tcl9
      3. `fossil clean -x`
      4. `./configure --prefix=$TCLTD/tcl90`
      5. `make install` -
      - -### 2.3 Building the SQLite TCL extension - -
        -
      1. `cd $SRCCO` -
      2. `fossil clean -x` -
      3. `./configure --with-tclsh=$TCLTD/tcl86/bin/tclsh8.6` -
      4. `make tclextension-install`
        - ↑ Verify extension installed at $TCLTD/tcl86/lib/tcl8.6/sqlite3.* -
      5. `make tclextension-verify` +
      6. `cd $SRCCO`
      7. `fossil clean -x`
      8. `./configure --with-tclsh=$TCLTD/tcl90/bin/tclsh9.0`
      9. `make tclextension-install`
        ↑ Verify extension installed at $TCLTD/tcl90/lib/sqlite3.* +
      10. `makek tclextension-list`
        + ↑ Verify TCL extension correctly installed.
      11. `make tclextension-verify` -
      - -### 2.4 Additional sanity tests - -
        -
      1. - `$TCLTD/tcl86/bin/tclsh8.6 test/testrunner.tcl release --explain`
        - ↑ Verify thousands of lines of output with no errors
      2. `$TCLTD/tcl90/bin/tclsh9.0 test/testrunner.tcl release --explain`
        - ↑ Verify thousands of lines of output with no errors + ↑ Verify thousands of lines of output with no errors. Or + consider running "devtest" without --explain instead of "release".
      -### 2.5 Cleanup +### 2.4 Cleanup
        -
      1. `rm -rf $TCLTD` +
      2. `rm -rf $TCLTD`
      ## 3.0 Testing On Windows @@ -110,10 +113,10 @@ an ordinary tclsh can subsequently run "package require sqlite3". ↑ remember the original %PATH% value
    -### 3.2 Building the TCL libraries and tclsh.exe executables on Windows +### 3.2 Testing TCL 8.6 on Windows
      -
    1. `mkdir %TCLTD% %TCLTD%\tcl86 %TCLTD%\tcl90` +
    2. `mkdir %TCLTD%\tcl86`
    3. `cd %TCLCO%\win`
    4. `fossil up core-8-6-16`
      ↑ Or some other version of Tcl8.6. @@ -124,6 +127,24 @@ an ordinary tclsh can subsequently run "package require sqlite3". using separate invocations of "nmake" or tclsh86t.exe won't be installed.
    5. `nmake /f makefile.vc install` +
    6. `cd %SRCCO%` +
    7. `fossil clean -x` +
    8. `set TCLDIR=%TCLTD%\tcl86` +
    9. `set PATH=%TCLTD%\tcl86\bin;%ORIGINALPATH%` +
    10. `set TCLSH_CMD=%TCLTD%\tcl86\bin\tclsh86t.exe` +
    11. `nmake /f Makefile.msc tclextension-install`
      + ↑ Verify extension installed at %TCLTD%\\tcl86\\lib\\tcl8.6\\sqlite3.* +
    12. `nmake /f Makefile.msc tclextension-verify` +
    13. `tclsh86t test/testrunner.tcl release --explain`
      + ↑ Verify thousands of lines of output with no errors. Or + consider running "devtest" without --explain instead of "release". +
    + +### 3.3 Testing TCL 9.0 on Windows + +
      +
    1. `mkdir %TCLTD%\tcl90` +
    2. `cd %TCLCO%\win`
    3. `fossil up core-9-0-0`
      ↑ Or some other version of Tcl9
    4. `fossil clean -x` @@ -133,19 +154,7 @@ an ordinary tclsh can subsequently run "package require sqlite3". using separate invocations of "nmake" or tclsh90.exe won't be installed.
    5. `nmake /f makefile.vc install` -
    - -### 3.3 Building the SQLite TCL extension on Windows - -
      -
    1. `cd %SRCCO%` -
    2. `fossil clean -x` -
    3. `set TCLDIR=%TCLTD%\tcl86` -
    4. `set PATH=%TCLTD%\tcl86\bin;%ORIGINALPATH%` -
    5. `set TCLSH_CMD=%TCLTD%\tcl86\bin\tclsh86t.exe` -
    6. `nmake /f Makefile.msc tclextension-install`
      - ↑ Verify extension installed at %TCLTD%\\tcl86\\lib\\tcl8.6\\sqlite3.* -
    7. `nmake /f Makefile.msc tclextension-verify` +
    8. `cd %SRCCO%`
    9. `fossil clean -x`
    10. `set TCLDIR=%TCLTD%\tcl90`
    11. `set PATH=%TCLTD%\tcl90\bin;%ORIGINALPATH%` @@ -153,22 +162,13 @@ an ordinary tclsh can subsequently run "package require sqlite3".
    12. `nmake /f Makefile.msc tclextension-install`
      ↑ Verify extension installed at %TCLTD%\\tcl90\\lib\\sqlite3.*
    13. `nmake /f Makefile.msc tclextension-verify` -
    - -### 3.4 Additional sanity tests for Windows - -
      -
    1. - `set PATH=%TCLTD%\tcl86\bin;%ORIGINALPATH%` -
    2. `tclsh86t test/testrunner.tcl release --explain`
      - ↑ Verify thousands of lines of output with no errors -
    3. `set PATH=%TCLTD%\tcl90\bin;%ORIGINALPATH%`
    4. `tclsh90 test/testrunner.tcl release --explain`
      - ↑ Verify thousands of lines of output with no errors + ↑ Verify thousands of lines of output with no errors. Or + consider running "devtest" without --explain instead of "release".
    -### 3.5 Cleanup +### 3.4 Cleanup
      -
    1. `rm -rf %TCLTD%` +
    2. `rm -rf %TCLTD%`
    diff --git a/manifest b/manifest index ae7e6830ec..06e0e02351 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\stypo\sin\sthe\stcl-extension-testing.md\sdocument. -D 2025-01-05T11:40:15.277 +C Refactor\sthe\sTCL\sextension\stest\sprocedure\sto\sdeal\swith\sTCL8.6\sand\sTCL9.0\nseparately,\sto\ssimplify\sthe\sprocedures\sand\sreduce\scognative\sstress\son\sthe\ntester. +D 2025-01-05T17:16:33.231 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -61,7 +61,7 @@ F doc/json-enhancements.md e356fc834781f1f1aa22ee300027a270b2c960122468499bf347b F doc/jsonb.md 5fab4b8613aa9153fbeb6259297bd4697988af8b3d23900deba588fa7841456b F doc/lemon.html 8b266ff711d2ec7f867c3dca37634963f48a630329908cc282beebfa8c708706 F doc/pager-invariants.txt 27fed9a70ddad2088750c4a2b493b63853da2710 -F doc/tcl-extension-testing.md 97f90ebaac1569c77395f715a4074ddf8b40984d1dae3af7ab693ec256e43853 +F doc/tcl-extension-testing.md 37722ac070d15ed687fbde2c444b97fd1b423b631a89897142f708594aafba47 F doc/testrunner.md 15583cf8c7d8a1c3378fd5d4319ca769a14c4d950a5df9b015d01d5be290dc69 F doc/trusted-schema.md 33625008620e879c7bcfbbfa079587612c434fa094d338b08242288d358c3e8a F doc/vdbesort-memory.md 4da2639c14cd24a31e0af694b1a8dd37eaf277aff3867e9a8cc14046bc49df56 @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 3e92fea09af13259d61afd2953fe5f3fc16e3cedfef09e350903aa5299b8e469 -R 62604835e027bab1689bab4a8c0e956a +P 28150c615cb601dfc9e4f660627228d6a8a715d64c65f7bc77931c9daf8a0dd7 +R 866ce61f7bd1663ef897c7b2791f707c U drh -Z adbf7e41d03db62cbc628242472f462e +Z c10b13ae5e892d2f5ddbaa1f9222567d # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 63309c3c39..f10a9cf7e3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -28150c615cb601dfc9e4f660627228d6a8a715d64c65f7bc77931c9daf8a0dd7 +5281536327d244ba9507548f7ed607e86e59b98a003e63f6da767471411c8ffc From f19d7b4de163f56f4cbe7298e3b347e0caefa540 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sun, 5 Jan 2025 19:58:30 +0000 Subject: [PATCH 027/220] Further refactoring of the TCL extension test procedure document, for improved clarity and usability. FossilOrigin-Name: bcdaef434142973a0805117495e561b2dcd1ec1465cacc9b944a3707291afc0d --- doc/tcl-extension-testing.md | 121 ++++++++++++++++++----------------- manifest | 12 ++-- manifest.uuid | 2 +- 3 files changed, 68 insertions(+), 67 deletions(-) diff --git a/doc/tcl-extension-testing.md b/doc/tcl-extension-testing.md index 65baa15469..ec624ceb5b 100644 --- a/doc/tcl-extension-testing.md +++ b/doc/tcl-extension-testing.md @@ -5,7 +5,7 @@ The SQLite TCL extension logic (in the "[tclsqlite.c](/file/src/tclsqlite.c)" source file) is statically linked into "textfixture" executable -which is the program used to do more of the testing +which is the program used to do most of the testing associated with "make test", "make devtest", and/or "make releasetest". So the functionality of the SQLite TCL extension is thoroughly vetted during normal testing. The @@ -21,39 +21,39 @@ an ordinary tclsh can subsequently run "package require sqlite3".
    1. [Fossil](https://fossil-scm.org/) installed. -
    2. - A Fossil check-out of the TCL source tree. Let the directory - of this check-out be called **$TCLCO** (mnemonic: "TCL Check-Out"). -
    3. - A Fossil check-out of the SQLite source tree. Let the directory - of this check-out be called **$SRCCO** (mnemonic: "SouRCe Check-Out"). -
    4. - Let **$TCLTD** (mnemonic: "TCL Test Directory") be the name of a directory - that does not exist at the start of the test, and which will be - deleted at the end of the test, that will contain the test builds - of the TCL libraries and the SQLite TCL Extensions. +
    5. Check out source code and set environment variables: +
        +
      1. **TCLSOURCE** → + The top-level directory of a Fossil check-out of the TCL source tree. +
      2. **SQLITESOURCE** → + A Fossil check-out of the SQLite source tree. +
      3. **TCLBUILD** → + A directory that does not exist at the start of the test and which + will be deleted at the end of the test, and that will contain the + test builds of the TCL libraries and the SQLite TCL Extensions. +
    ### 2.2 Testing TCL 8.6 on unix
      -
    1. `mkdir $TCLTD/tcl86` -
    2. `cd $TCLCO/unix` +
    3. `mkdir -p $TCLBUILD/tcl86` +
    4. `cd $TCLSOURCE/unix`
    5. `fossil up core-8-6-16`
      ↑ Or some other version of Tcl8.6.
    6. `fossil clean -x` -
    7. `./configure --prefix=$TCLTD/tcl86` +
    8. `./configure --prefix=$TCLBUILD/tcl86`
    9. `make install` -
    10. `cd $SRCCO` +
    11. `cd $SQLITESOURCE`
    12. `fossil clean -x` -
    13. `./configure --with-tclsh=$TCLTD/tcl86/bin/tclsh8.6` +
    14. `./configure --with-tclsh=$TCLBUILD/tcl86/bin/tclsh8.6`
    15. `make tclextension-install`
      - ↑ Verify extension installed at $TCLTD/tcl86/lib/tcl8.6/sqlite3.* -
    16. `makek tclextension-list`
      + ↑ Verify extension installed at $TCLBUILD/tcl86/lib/tcl8.6/sqlite3.* +
    17. `make tclextension-list`
      ↑ Verify TCL extension correctly installed.
    18. `make tclextension-verify`
      ↑ Verify that the correct version is installed. -
    19. `$TCLTD/tcl86/bin/tclsh8.6 test/testrunner.tcl release --explain`
      +
    20. `$TCLBUILD/tcl86/bin/tclsh8.6 test/testrunner.tcl release --explain`
      ↑ Verify thousands of lines of output with no errors. Or consider running "devtest" without --explain instead of "release".
    @@ -61,21 +61,21 @@ an ordinary tclsh can subsequently run "package require sqlite3". ### 2.3 Testing TCL 9.0 on unix
      -
    1. `mkdir $TCLTD/tcl90` +
    2. `mkdir -p $TCLBUILD/tcl90`
    3. `fossil up core-9-0-0`
      ↑ Or some other version of Tcl9
    4. `fossil clean -x` -
    5. `./configure --prefix=$TCLTD/tcl90` +
    6. `./configure --prefix=$TCLBUILD/tcl90`
    7. `make install` -
    8. `cd $SRCCO` +
    9. `cd $SQLITESOURCE`
    10. `fossil clean -x` -
    11. `./configure --with-tclsh=$TCLTD/tcl90/bin/tclsh9.0` +
    12. `./configure --with-tclsh=$TCLBUILD/tcl90/bin/tclsh9.0`
    13. `make tclextension-install`
      - ↑ Verify extension installed at $TCLTD/tcl90/lib/sqlite3.* -
    14. `makek tclextension-list`
      + ↑ Verify extension installed at $TCLBUILD/tcl90/lib/sqlite3.* +
    15. `make tclextension-list`
      ↑ Verify TCL extension correctly installed.
    16. `make tclextension-verify` -
    17. `$TCLTD/tcl90/bin/tclsh9.0 test/testrunner.tcl release --explain`
      +
    18. `$TCLBUILD/tcl90/bin/tclsh9.0 test/testrunner.tcl release --explain`
      ↑ Verify thousands of lines of output with no errors. Or consider running "devtest" without --explain instead of "release".
    @@ -83,7 +83,7 @@ an ordinary tclsh can subsequently run "package require sqlite3". ### 2.4 Cleanup
      -
    1. `rm -rf $TCLTD` +
    2. `rm -rf $TCLBUILD`
    ## 3.0 Testing On Windows @@ -93,47 +93,48 @@ an ordinary tclsh can subsequently run "package require sqlite3".
    1. [Fossil](https://fossil-scm.org/) installed. -
    2. - A Fossil check-out of the TCL source tree. Let the directory - of this check-out be called **%TCLCO%** (mnemonic: "TCL Check-Out"). -
    3. - A Fossil check-out of the SQLite source tree. Let the directory - of this check-out be called **%SRCCO%** (mnemonic: "SouRCe Check-Out"). -
    4. - Let **%TCLTD%** (mnemonic: "TCL Test Directory") be the name of a directory - that does not exist at the start of the test, and which will be - deleted at the end of the test, that will contain the test builds - of the TCL libraries and the SQLite TCL Extensions.
    5. Unix-like command-line tools installed. Example: [unxutils](https://unxutils.sourceforge.net/)
    6. [Visual Studio](https://visualstudio.microsoft.com/vs/community/) installed. VS2015 or later required. -
    7. `set ORIGINALPATH=%PATH%`
      - ↑ remember the original %PATH% value +
    8. Check out source code and set environment variables. +
        +
      1. **TCLSOURCE** → + The top-level directory of a Fossil check-out of the TCL source tree. +
      2. **SQLITESOURCE** → + A Fossil check-out of the SQLite source tree. +
      3. **TCLBUILD** → + A directory that does not exist at the start of the test and which + will be deleted at the end of the test, and that will contain the + test builds of the TCL libraries and the SQLite TCL Extensions. +
      4. **ORIGINALPATH** → + The original value of %PATH%. In other words, set as follows: + `set ORIGINALPATH %PATH%` +
    ### 3.2 Testing TCL 8.6 on Windows
      -
    1. `mkdir %TCLTD%\tcl86` -
    2. `cd %TCLCO%\win` +
    3. `mkdir %TCLBUILD%\tcl86` +
    4. `cd %TCLSOURCE%\win`
    5. `fossil up core-8-6-16`
      ↑ Or some other version of Tcl8.6.
    6. `fossil clean -x` -
    7. `set INSTALLDIR=%TCLTD%\tcl86` +
    8. `set INSTALLDIR=%TCLBUILD%\tcl86`
    9. `nmake /f makefile.vc release`
      ⇅ You *must* invoke the "release" and "install" targets - using separate invocations of "nmake" or tclsh86t.exe won't be + using separate "nmake" commands or tclsh86t.exe won't be installed.
    10. `nmake /f makefile.vc install` -
    11. `cd %SRCCO%` +
    12. `cd %SQLITESOURCE%`
    13. `fossil clean -x` -
    14. `set TCLDIR=%TCLTD%\tcl86` -
    15. `set PATH=%TCLTD%\tcl86\bin;%ORIGINALPATH%` -
    16. `set TCLSH_CMD=%TCLTD%\tcl86\bin\tclsh86t.exe` +
    17. `set TCLDIR=%TCLBUILD%\tcl86` +
    18. `set PATH=%TCLBUILD%\tcl86\bin;%ORIGINALPATH%` +
    19. `set TCLSH_CMD=%TCLBUILD%\tcl86\bin\tclsh86t.exe`
    20. `nmake /f Makefile.msc tclextension-install`
      - ↑ Verify extension installed at %TCLTD%\\tcl86\\lib\\tcl8.6\\sqlite3.* + ↑ Verify extension installed at %TCLBUILD%\\tcl86\\lib\\tcl8.6\\sqlite3.*
    21. `nmake /f Makefile.msc tclextension-verify`
    22. `tclsh86t test/testrunner.tcl release --explain`
      ↑ Verify thousands of lines of output with no errors. Or @@ -143,24 +144,24 @@ an ordinary tclsh can subsequently run "package require sqlite3". ### 3.3 Testing TCL 9.0 on Windows
        -
      1. `mkdir %TCLTD%\tcl90` -
      2. `cd %TCLCO%\win` +
      3. `mkdir %TCLBUILD%\tcl90` +
      4. `cd %TCLSOURCE%\win`
      5. `fossil up core-9-0-0`
        ↑ Or some other version of Tcl9
      6. `fossil clean -x` -
      7. `set INSTALLDIR=%TCLTD%\tcl90` +
      8. `set INSTALLDIR=%TCLBUILD%\tcl90`
      9. `nmake /f makefile.vc release`
        ⇅ You *must* invoke the "release" and "install" targets - using separate invocations of "nmake" or tclsh90.exe won't be + using separate "nmake" commands or tclsh90.exe won't be installed.
      10. `nmake /f makefile.vc install` -
      11. `cd %SRCCO%` +
      12. `cd %SQLITESOURCE%`
      13. `fossil clean -x` -
      14. `set TCLDIR=%TCLTD%\tcl90` -
      15. `set PATH=%TCLTD%\tcl90\bin;%ORIGINALPATH%` -
      16. `set TCLSH_CMD=%TCLTD%\tcl90\bin\tclsh90.exe` +
      17. `set TCLDIR=%TCLBUILD%\tcl90` +
      18. `set PATH=%TCLBUILD%\tcl90\bin;%ORIGINALPATH%` +
      19. `set TCLSH_CMD=%TCLBUILD%\tcl90\bin\tclsh90.exe`
      20. `nmake /f Makefile.msc tclextension-install`
        - ↑ Verify extension installed at %TCLTD%\\tcl90\\lib\\sqlite3.* + ↑ Verify extension installed at %TCLBUILD%\\tcl90\\lib\\sqlite3.*
      21. `nmake /f Makefile.msc tclextension-verify`
      22. `tclsh90 test/testrunner.tcl release --explain`
        ↑ Verify thousands of lines of output with no errors. Or @@ -170,5 +171,5 @@ an ordinary tclsh can subsequently run "package require sqlite3". ### 3.4 Cleanup
          -
        1. `rm -rf %TCLTD%` +
        2. `rm -rf %TCLBUILD%`
        diff --git a/manifest b/manifest index 06e0e02351..73825f1a17 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Refactor\sthe\sTCL\sextension\stest\sprocedure\sto\sdeal\swith\sTCL8.6\sand\sTCL9.0\nseparately,\sto\ssimplify\sthe\sprocedures\sand\sreduce\scognative\sstress\son\sthe\ntester. -D 2025-01-05T17:16:33.231 +C Further\srefactoring\sof\sthe\sTCL\sextension\stest\sprocedure\sdocument,\sfor\nimproved\sclarity\sand\susability. +D 2025-01-05T19:58:30.967 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -61,7 +61,7 @@ F doc/json-enhancements.md e356fc834781f1f1aa22ee300027a270b2c960122468499bf347b F doc/jsonb.md 5fab4b8613aa9153fbeb6259297bd4697988af8b3d23900deba588fa7841456b F doc/lemon.html 8b266ff711d2ec7f867c3dca37634963f48a630329908cc282beebfa8c708706 F doc/pager-invariants.txt 27fed9a70ddad2088750c4a2b493b63853da2710 -F doc/tcl-extension-testing.md 37722ac070d15ed687fbde2c444b97fd1b423b631a89897142f708594aafba47 +F doc/tcl-extension-testing.md fca7b123e6f6c94f87c5e9285342fa08d17f118d47bea22c0b045485755fe9c3 F doc/testrunner.md 15583cf8c7d8a1c3378fd5d4319ca769a14c4d950a5df9b015d01d5be290dc69 F doc/trusted-schema.md 33625008620e879c7bcfbbfa079587612c434fa094d338b08242288d358c3e8a F doc/vdbesort-memory.md 4da2639c14cd24a31e0af694b1a8dd37eaf277aff3867e9a8cc14046bc49df56 @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 28150c615cb601dfc9e4f660627228d6a8a715d64c65f7bc77931c9daf8a0dd7 -R 866ce61f7bd1663ef897c7b2791f707c +P 5281536327d244ba9507548f7ed607e86e59b98a003e63f6da767471411c8ffc +R 789a42abc3bc046ab3689d41ea48cbbd U drh -Z c10b13ae5e892d2f5ddbaa1f9222567d +Z a57fb295edbde74d3aaadaf4afebbd36 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index f10a9cf7e3..1a4dca11c7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5281536327d244ba9507548f7ed607e86e59b98a003e63f6da767471411c8ffc +bcdaef434142973a0805117495e561b2dcd1ec1465cacc9b944a3707291afc0d From cee8b04d33e78b2227fdb6007b9991f998469a7d Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 6 Jan 2025 17:01:35 +0000 Subject: [PATCH 028/220] Add test case for using both SQLITE_CHANGESETAPPLY_IGNORENOOP and SQLITE_CHANGESETAPPLY_FKNOACTION. FossilOrigin-Name: b1cc53fa3fb2ac3abeadd3282d8751f4d533315754159f16ca7f7f300ccdd8c8 --- ext/session/sessionnoact.test | 15 +++++++++++++++ manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/ext/session/sessionnoact.test b/ext/session/sessionnoact.test index f605e6108e..e447bc8a16 100644 --- a/ext/session/sessionnoact.test +++ b/ext/session/sessionnoact.test @@ -149,5 +149,20 @@ do_execsql_test 2.5 { SELECT * FROM c1; } {two} +db_restore_and_reopen +db eval { PRAGMA foreign_keys = 1 } + +do_test 2.6 { + list [catch { + sqlite3changeset_apply_v2 -ignorenoop -noaction db $C conflict + } msg] $msg +} {1 SQLITE_CONSTRAINT} +do_execsql_test 2.7 { + SELECT * FROM p1; +} {1 1 one 2 2 two} +do_execsql_test 2.8 { + SELECT * FROM c1; +} {two} + finish_test diff --git a/manifest b/manifest index 73825f1a17..cedab9b504 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Further\srefactoring\sof\sthe\sTCL\sextension\stest\sprocedure\sdocument,\sfor\nimproved\sclarity\sand\susability. -D 2025-01-05T19:58:30.967 +C Add\stest\scase\sfor\susing\sboth\sSQLITE_CHANGESETAPPLY_IGNORENOOP\sand\sSQLITE_CHANGESETAPPLY_FKNOACTION. +D 2025-01-06T17:01:35.295 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -606,7 +606,7 @@ F ext/session/sessionfault2.test b0d6a7c1d7398a7e800d84657404909c7d385965ea8576d F ext/session/sessionfault3.test ce0b5d182133935c224d72507dbf1c5be1a1febf7e85d0b0fbd6d2f724b32b96 F ext/session/sessioninvert.test 04075517a9497a80d39c495ba6b44f3982c7371129b89e2c52219819bc105a25 F ext/session/sessionmem.test f2a735db84a3e9e19f571033b725b0b2daf847f3f28b1da55a0c1a4e74f1de09 -F ext/session/sessionnoact.test 1ea34324b7be2fa9d63870d44969e6bb5290a6d1603ddfd4151c51df73fad291 +F ext/session/sessionnoact.test 0f552bd318b764bbc5b2cd6f3518435254a1c830fdaa5aab9c688f507ebc301e F ext/session/sessionnoop.test a9366a36a95ef85f8a3687856ebef46983df399541174cb1ede2ee53b8011bc7 F ext/session/sessionnoop2.test de4672dce88464396ec9f30ed08c6c01643a69c53ae540fadbbf6d30642d64e8 F ext/session/sessionrebase.test 702378bdcb5062f1106e74457beca8797d09c113a81768734a58b197b5b334e2 @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 5281536327d244ba9507548f7ed607e86e59b98a003e63f6da767471411c8ffc -R 789a42abc3bc046ab3689d41ea48cbbd -U drh -Z a57fb295edbde74d3aaadaf4afebbd36 +P bcdaef434142973a0805117495e561b2dcd1ec1465cacc9b944a3707291afc0d +R 39da0f1150c2b7d20d41e16df982bdbc +U dan +Z 0e33be44116920d8dfb3948dc71a5c16 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 1a4dca11c7..5d5632f5c9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bcdaef434142973a0805117495e561b2dcd1ec1465cacc9b944a3707291afc0d +b1cc53fa3fb2ac3abeadd3282d8751f4d533315754159f16ca7f7f300ccdd8c8 From a5dbae3781a21ea91c210c41402e1213b97df649 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 6 Jan 2025 18:32:53 +0000 Subject: [PATCH 029/220] Fix a minor problem with the sqlite3_get_table_printf() test interface. No core changes. FossilOrigin-Name: a0df29c7a3eb4f558aba00598d827643830591def3101a4d5464543527b8d13c --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/test1.c | 1 + 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index cedab9b504..dfe068dcb6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\stest\scase\sfor\susing\sboth\sSQLITE_CHANGESETAPPLY_IGNORENOOP\sand\sSQLITE_CHANGESETAPPLY_FKNOACTION. -D 2025-01-06T17:01:35.295 +C Fix\sa\sminor\sproblem\swith\sthe\ssqlite3_get_table_printf()\stest\sinterface.\nNo\score\schanges. +D 2025-01-06T18:32:53.875 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -789,7 +789,7 @@ F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 F src/tclsqlite.c 90441d3cc16f966a23499d9096a3d2d971e5e8fddb4d1413b096b79c2b2cff07 F src/tclsqlite.h 65e2c761446e1c9fa0342b7d2612a703483643c8b6a316d12a65b745a4727395 -F src/test1.c 2d507751bfb4aa254dc22588ef1e3c5c5cfcb2e636d0e6e1fa0bbd307669c2a8 +F src/test1.c 7f5579f2786c11cf4391ec2abb7b5b5b234ca1408599d7a0d6dd32360e5f58d8 F src/test2.c 7ebc518e6735939d8979273a6f7b1d9b5702babf059f6ad62499f7f60a9eb9a3 F src/test3.c e7573aa0f78ee4e070a4bc8c3493941c1aa64d5c66d4825c74c0f055451f432b F src/test4.c 13e57ae7ec7a959ee180970aef09deed141252fe9bb07c61054f0dfa4f1dfd5d @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P bcdaef434142973a0805117495e561b2dcd1ec1465cacc9b944a3707291afc0d -R 39da0f1150c2b7d20d41e16df982bdbc -U dan -Z 0e33be44116920d8dfb3948dc71a5c16 +P b1cc53fa3fb2ac3abeadd3282d8751f4d533315754159f16ca7f7f300ccdd8c8 +R b841ee7b12f689b8a9384b533ea34d09 +U drh +Z b3de29be7899c08cf5113466b37b5222 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 5d5632f5c9..c9d8176551 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b1cc53fa3fb2ac3abeadd3282d8751f4d533315754159f16ca7f7f300ccdd8c8 +a0df29c7a3eb4f558aba00598d827643830591def3101a4d5464543527b8d13c diff --git a/src/test1.c b/src/test1.c index cf5d484e9e..a1a96d2b3c 100644 --- a/src/test1.c +++ b/src/test1.c @@ -600,6 +600,7 @@ static int SQLITE_TCLAPI test_get_table_printf( } sqlite3_free(zSql); sqlite3_snprintf(sizeof(zBuf), zBuf, "%d", rc); + Tcl_ResetResult(interp); Tcl_AppendElement(interp, zBuf); if( rc==SQLITE_OK ){ if( argc==4 ){ From 885f546f97374e9aaabb202bb4935bee56081ad5 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 6 Jan 2025 21:36:16 +0000 Subject: [PATCH 030/220] Fix a problem with tool/mksqlite3h.tcl that prevents it from running out of a read-only check-out. FossilOrigin-Name: cb54f0063edd284996b225183b8e35d71ffcd3c0fb4f56a0e316181f1a186d46 --- manifest | 12 ++++++------ manifest.uuid | 2 +- tool/mksqlite3h.tcl | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index dfe068dcb6..466d999e03 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sminor\sproblem\swith\sthe\ssqlite3_get_table_printf()\stest\sinterface.\nNo\score\schanges. -D 2025-01-06T18:32:53.875 +C Fix\sa\sproblem\swith\stool/mksqlite3h.tcl\sthat\sprevents\sit\sfrom\srunning\sout\sof\na\sread-only\scheck-out. +D 2025-01-06T21:36:16.287 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -2154,7 +2154,7 @@ F tool/mksourceid.c 36aa8020014aed0836fd13c51d6dc9219b0df1761d6b5f58ff5b616211b0 F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 F tool/mksqlite3c-noext.tcl 4f7cfef5152b0c91920355cbfc1d608a4ad242cb819f1aea07f6d0274f584a7f F tool/mksqlite3c.tcl 9e88a30981280e33489fe4782f4ab1e5349ba1866603fba7f1a948d5599b9124 -F tool/mksqlite3h.tcl 7a4648fef5efb33308d575c7775eb242855d71d5bf89065df3f006b9a634a0a1 +F tool/mksqlite3h.tcl 5a8d23f35462bfcf74324a19465abd0ad6717b92a404d177160963c292df5d04 F tool/mksqlite3internalh.tcl eb994013e833359137eb53a55acdad0b5ae1049b F tool/mksrczip.tcl 81efd9974dbb36005383f2cd655520057a2ae5aa85ac2441a80c7c28f803ac52 F tool/mktoolzip.tcl 34b4e92be544f820e2cc26f143f7d5aec511e826ec394cc82969a5dcf7c7a27c @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P b1cc53fa3fb2ac3abeadd3282d8751f4d533315754159f16ca7f7f300ccdd8c8 -R b841ee7b12f689b8a9384b533ea34d09 +P a0df29c7a3eb4f558aba00598d827643830591def3101a4d5464543527b8d13c +R a69cbcd64a4b6b9f51efe8537d38ddcf U drh -Z b3de29be7899c08cf5113466b37b5222 +Z c3ef709b705fad2b3868091e66557171 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index c9d8176551..eb6e9849fd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a0df29c7a3eb4f558aba00598d827643830591def3101a4d5464543527b8d13c +cb54f0063edd284996b225183b8e35d71ffcd3c0fb4f56a0e316181f1a186d46 diff --git a/tool/mksqlite3h.tcl b/tool/mksqlite3h.tcl index c242005a07..b409d306b2 100644 --- a/tool/mksqlite3h.tcl +++ b/tool/mksqlite3h.tcl @@ -62,7 +62,7 @@ set nVersion [eval format "%d%03d%03d" [split $zVersion .]] # set PWD [pwd] cd $TOP -set tmpfile tmp-[clock millisec]-[expr {int(rand()*100000000000)}].txt +set tmpfile $PWD/tmp-[clock millisec]-[expr {int(rand()*100000000000)}].txt exec $PWD/mksourceid manifest > $tmpfile set fd [open $tmpfile rb] set zSourceId [string trim [read $fd]] From fbbe26282092d2d1cb980cad9a90aa73748fd16b Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 6 Jan 2025 23:33:45 +0000 Subject: [PATCH 031/220] Enhance the makefile to make it easier to build from a read-only source tree. FossilOrigin-Name: f99a70eca2fd8a54be3a6629dabd62efc623488706eed5e5a1bd0be577ac1acb --- main.mk | 4 ++-- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/main.mk b/main.mk index a22b0dfcdf..a0b08e5773 100644 --- a/main.mk +++ b/main.mk @@ -1043,9 +1043,9 @@ T.link.tcl = $(T.tcl.env.source); $(T.link) rm -rf tsrc mkdir tsrc cp -f $(SRC) tsrc - rm tsrc/sqlite.h.in tsrc/parse.y + rm -f tsrc/sqlite.h.in tsrc/parse.y $(B.tclsh) $(TOP)/tool/vdbe-compress.tcl $(OPTS) vdbe.new - mv vdbe.new tsrc/vdbe.c + mv -f vdbe.new tsrc/vdbe.c cp fts5.c fts5.h tsrc touch .target_source diff --git a/manifest b/manifest index 466d999e03..877d0877f2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\stool/mksqlite3h.tcl\sthat\sprevents\sit\sfrom\srunning\sout\sof\na\sread-only\scheck-out. -D 2025-01-06T21:36:16.287 +C Enhance\sthe\smakefile\sto\smake\sit\seasier\sto\sbuild\sfrom\sa\sread-only\ssource\stree. +D 2025-01-06T23:33:45.755 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -700,7 +700,7 @@ F ext/wasm/tests/opfs/concurrency/test.js d08889a5bb6e61937d0b8cbb78c9efbefbf65a F ext/wasm/tests/opfs/concurrency/worker.js 0a8c1a3e6ebb38aabbee24f122693f1fb29d599948915c76906681bb7da1d3d2 F ext/wasm/wasmfs.make bc8bb227f35d5bd3863a7bd2233437c37472a0d81585979f058f9b9b503bef35 F magic.txt 5ade0bc977aa135e79e3faaea894d5671b26107cc91e70783aa7dc83f22f3ba0 -F main.mk fe86d83158b547e02f8d08aa6af2130540746a4a61de7c61ea8b9d09eb06acd4 +F main.mk 0b62344246f8a3e920edb8a52b0c3296dde829d7eb450f67b89c63d79536de85 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 F mptest/crash01.test 61e61469e257df0850df4293d7d4d6c2af301421 @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P a0df29c7a3eb4f558aba00598d827643830591def3101a4d5464543527b8d13c -R a69cbcd64a4b6b9f51efe8537d38ddcf +P cb54f0063edd284996b225183b8e35d71ffcd3c0fb4f56a0e316181f1a186d46 +R 5feebefef2332c303303ce808be74cd6 U drh -Z c3ef709b705fad2b3868091e66557171 +Z 96dcc4cb8c6c1962175be17c438abbe8 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index eb6e9849fd..80e347be0c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cb54f0063edd284996b225183b8e35d71ffcd3c0fb4f56a0e316181f1a186d46 +f99a70eca2fd8a54be3a6629dabd62efc623488706eed5e5a1bd0be577ac1acb From 4a6896379f8e45b04804e2606fa12371f02b1151 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 7 Jan 2025 00:17:54 +0000 Subject: [PATCH 032/220] Minor fixes to tclsqlite.c to promote portability. FossilOrigin-Name: dd934f032fa6fc790a951006512e3ed76a5f2930858932918eafdbe3ceec4620 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/tclsqlite.c | 5 +++-- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 877d0877f2..c1482a11b0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sthe\smakefile\sto\smake\sit\seasier\sto\sbuild\sfrom\sa\sread-only\ssource\stree. -D 2025-01-06T23:33:45.755 +C Minor\sfixes\sto\stclsqlite.c\sto\spromote\sportability. +D 2025-01-07T00:17:54.439 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -787,7 +787,7 @@ F src/sqliteInt.h 3f20dfb5ae54e787b2643edc0b5bae0cecddfb89988e28afdc3c0b05892e25 F src/sqliteLimit.h 1bbdbf72bd0411d003267ffebc59a262f061df5653027a75627d03f48ca30523 F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 -F src/tclsqlite.c 90441d3cc16f966a23499d9096a3d2d971e5e8fddb4d1413b096b79c2b2cff07 +F src/tclsqlite.c ada7d3ffeabcec94776693c841dae28cdee93a256989ce024c8227134d733958 F src/tclsqlite.h 65e2c761446e1c9fa0342b7d2612a703483643c8b6a316d12a65b745a4727395 F src/test1.c 7f5579f2786c11cf4391ec2abb7b5b5b234ca1408599d7a0d6dd32360e5f58d8 F src/test2.c 7ebc518e6735939d8979273a6f7b1d9b5702babf059f6ad62499f7f60a9eb9a3 @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P cb54f0063edd284996b225183b8e35d71ffcd3c0fb4f56a0e316181f1a186d46 -R 5feebefef2332c303303ce808be74cd6 +P f99a70eca2fd8a54be3a6629dabd62efc623488706eed5e5a1bd0be577ac1acb +R 5a83df004b6c0337f81b894fe038a2a2 U drh -Z 96dcc4cb8c6c1962175be17c438abbe8 +Z 202998befd372783ac123e095ab97a9d # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 80e347be0c..070063b5ed 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f99a70eca2fd8a54be3a6629dabd62efc623488706eed5e5a1bd0be577ac1acb +dd934f032fa6fc790a951006512e3ed76a5f2930858932918eafdbe3ceec4620 diff --git a/src/tclsqlite.c b/src/tclsqlite.c index f0b5c3e814..ea9d468a99 100644 --- a/src/tclsqlite.c +++ b/src/tclsqlite.c @@ -341,7 +341,7 @@ static int SQLITE_TCLAPI incrblobInput( */ static int SQLITE_TCLAPI incrblobOutput( ClientData instanceData, - CONST char *buf, + const char *buf, int toWrite, int *errorCodePtr ){ @@ -1843,7 +1843,8 @@ static Tcl_Obj *dbEvalColumnValue(DbEvalContext *p, int iCol){ ** are 8.6 or newer, the code still tests the Tcl version at runtime. ** This allows stubs-enabled builds to be used with older Tcl libraries. */ -#if TCL_MAJOR_VERSION>8 || (TCL_MAJOR_VERSION==8 && TCL_MINOR_VERSION>=6) +#if TCL_MAJOR_VERSION>8 || !defined(TCL_MINOR_VERSION) \ + || TCL_MAJOR_VERSION>=6 # define SQLITE_TCL_NRE 1 static int DbUseNre(void){ int major, minor; From e53393250ae446f97d3d8ad37ffa1a25d857b7fb Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 7 Jan 2025 11:54:43 +0000 Subject: [PATCH 033/220] Fix a typo in the previous check-in. FossilOrigin-Name: 7d41885e85b0e2ef28bac34d663af07c35b21ee3e8b14481d2371f623bce681d --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/tclsqlite.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index c1482a11b0..ecfcaef04e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\sfixes\sto\stclsqlite.c\sto\spromote\sportability. -D 2025-01-07T00:17:54.439 +C Fix\sa\stypo\sin\sthe\sprevious\scheck-in. +D 2025-01-07T11:54:43.065 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -787,7 +787,7 @@ F src/sqliteInt.h 3f20dfb5ae54e787b2643edc0b5bae0cecddfb89988e28afdc3c0b05892e25 F src/sqliteLimit.h 1bbdbf72bd0411d003267ffebc59a262f061df5653027a75627d03f48ca30523 F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 -F src/tclsqlite.c ada7d3ffeabcec94776693c841dae28cdee93a256989ce024c8227134d733958 +F src/tclsqlite.c 9004ed7a517e106087f70d2ec54a2a6819e55765151fa53d0d2cd408e698f99e F src/tclsqlite.h 65e2c761446e1c9fa0342b7d2612a703483643c8b6a316d12a65b745a4727395 F src/test1.c 7f5579f2786c11cf4391ec2abb7b5b5b234ca1408599d7a0d6dd32360e5f58d8 F src/test2.c 7ebc518e6735939d8979273a6f7b1d9b5702babf059f6ad62499f7f60a9eb9a3 @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P f99a70eca2fd8a54be3a6629dabd62efc623488706eed5e5a1bd0be577ac1acb -R 5a83df004b6c0337f81b894fe038a2a2 +P dd934f032fa6fc790a951006512e3ed76a5f2930858932918eafdbe3ceec4620 +R 1ccf02cc09665431fcc21407330e398e U drh -Z 202998befd372783ac123e095ab97a9d +Z c9e32c83a7281ddac240e198b5bce057 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 070063b5ed..c4fbf1e0c3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -dd934f032fa6fc790a951006512e3ed76a5f2930858932918eafdbe3ceec4620 +7d41885e85b0e2ef28bac34d663af07c35b21ee3e8b14481d2371f623bce681d diff --git a/src/tclsqlite.c b/src/tclsqlite.c index ea9d468a99..21437909ba 100644 --- a/src/tclsqlite.c +++ b/src/tclsqlite.c @@ -1844,7 +1844,7 @@ static Tcl_Obj *dbEvalColumnValue(DbEvalContext *p, int iCol){ ** This allows stubs-enabled builds to be used with older Tcl libraries. */ #if TCL_MAJOR_VERSION>8 || !defined(TCL_MINOR_VERSION) \ - || TCL_MAJOR_VERSION>=6 + || TCL_MINOR_VERSION>=6 # define SQLITE_TCL_NRE 1 static int DbUseNre(void){ int major, minor; From 4717d573e44db999b305902a68c4bd83bd14f713 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 7 Jan 2025 12:14:32 +0000 Subject: [PATCH 034/220] Make the TCL extension aware of the booleanString type within TCL. FossilOrigin-Name: 14b38ae6ab86a314a63ca9513850b43fcc670864f94d03a2706eff469980da88 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/tclsqlite.c | 5 ++++- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index ecfcaef04e..8e3fb1f0fe 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\stypo\sin\sthe\sprevious\scheck-in. -D 2025-01-07T11:54:43.065 +C Make\sthe\sTCL\sextension\saware\sof\sthe\sbooleanString\stype\swithin\sTCL. +D 2025-01-07T12:14:32.905 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -787,7 +787,7 @@ F src/sqliteInt.h 3f20dfb5ae54e787b2643edc0b5bae0cecddfb89988e28afdc3c0b05892e25 F src/sqliteLimit.h 1bbdbf72bd0411d003267ffebc59a262f061df5653027a75627d03f48ca30523 F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 -F src/tclsqlite.c 9004ed7a517e106087f70d2ec54a2a6819e55765151fa53d0d2cd408e698f99e +F src/tclsqlite.c 6e25a72d3f3769f779b05b2c618ae0388639d8e27d6434c2ff3926f3267342fe F src/tclsqlite.h 65e2c761446e1c9fa0342b7d2612a703483643c8b6a316d12a65b745a4727395 F src/test1.c 7f5579f2786c11cf4391ec2abb7b5b5b234ca1408599d7a0d6dd32360e5f58d8 F src/test2.c 7ebc518e6735939d8979273a6f7b1d9b5702babf059f6ad62499f7f60a9eb9a3 @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P dd934f032fa6fc790a951006512e3ed76a5f2930858932918eafdbe3ceec4620 -R 1ccf02cc09665431fcc21407330e398e +P 7d41885e85b0e2ef28bac34d663af07c35b21ee3e8b14481d2371f623bce681d +R 7defba456aa3fec0b02242de054d2a9a U drh -Z c9e32c83a7281ddac240e198b5bce057 +Z 915ad0926614914c31505681a5658ee7 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index c4fbf1e0c3..4f85e88e04 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7d41885e85b0e2ef28bac34d663af07c35b21ee3e8b14481d2371f623bce681d +14b38ae6ab86a314a63ca9513850b43fcc670864f94d03a2706eff469980da88 diff --git a/src/tclsqlite.c b/src/tclsqlite.c index 21437909ba..344b3e07c7 100644 --- a/src/tclsqlite.c +++ b/src/tclsqlite.c @@ -1098,6 +1098,7 @@ static void tclSqlFunc(sqlite3_context *context, int argc, sqlite3_value**argv){ ** has no string representation. */ eType = SQLITE_BLOB; }else if( (c=='b' && strcmp(zType,"boolean")==0) + || (c=='b' && strcmp(zType,"booleanString")==0 && pVar->bytes==0) || (c=='w' && strcmp(zType,"wideInt")==0) || (c=='i' && strcmp(zType,"int")==0) ){ @@ -1505,7 +1506,9 @@ static int dbPrepareAndBind( sqlite3_bind_blob(pStmt, i, data, n, SQLITE_STATIC); Tcl_IncrRefCount(pVar); pPreStmt->apParm[iParm++] = pVar; - }else if( c=='b' && strcmp(zType,"boolean")==0 ){ + }else if( (c=='b' && strcmp(zType,"boolean")==0) + || (c=='b' && strcmp(zType,"booleanString")==0 + && pVar->bytes==0) ){ int nn; Tcl_GetIntFromObj(interp, pVar, &nn); sqlite3_bind_int(pStmt, i, nn); From 311990d74ed31b3622000d5e1ca85f31be6a0af7 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 7 Jan 2025 14:55:49 +0000 Subject: [PATCH 035/220] Enhancements to the Tcl SQLite extension testing procedures so that they install a full-featured SQLite and so that Tcl is build statically so that there is no need to worry with LD_LIBRARY_PATH. FossilOrigin-Name: c8972e652ebe62a8583904b5bc1d96b2d598222c037a714c8ff114ca84b52c7a --- doc/tcl-extension-testing.md | 12 ++++++++---- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/doc/tcl-extension-testing.md b/doc/tcl-extension-testing.md index ec624ceb5b..dfe47922e0 100644 --- a/doc/tcl-extension-testing.md +++ b/doc/tcl-extension-testing.md @@ -42,11 +42,13 @@ an ordinary tclsh can subsequently run "package require sqlite3".
      23. `fossil up core-8-6-16`
        ↑ Or some other version of Tcl8.6.
      24. `fossil clean -x` -
      25. `./configure --prefix=$TCLBUILD/tcl86` +
      26. `./configure --prefix=$TCLBUILD/tcl86 --disable-shared`
        + ↑ The --disable-shared is to avoid the need to set LD_LIBRARY_PATH + when using this Tcl build.
      27. `make install`
      28. `cd $SQLITESOURCE`
      29. `fossil clean -x` -
      30. `./configure --with-tclsh=$TCLBUILD/tcl86/bin/tclsh8.6` +
      31. `./configure --with-tclsh=$TCLBUILD/tcl86/bin/tclsh8.6 --all`
      32. `make tclextension-install`
        ↑ Verify extension installed at $TCLBUILD/tcl86/lib/tcl8.6/sqlite3.*
      33. `make tclextension-list`
        @@ -65,11 +67,13 @@ an ordinary tclsh can subsequently run "package require sqlite3".
      34. `fossil up core-9-0-0`
        ↑ Or some other version of Tcl9
      35. `fossil clean -x` -
      36. `./configure --prefix=$TCLBUILD/tcl90` +
      37. `./configure --prefix=$TCLBUILD/tcl90 --disable-shared` + ↑ The --disable-shared is to avoid the need to set LD_LIBRARY_PATH + when using this Tcl build.
      38. `make install`
      39. `cd $SQLITESOURCE`
      40. `fossil clean -x` -
      41. `./configure --with-tclsh=$TCLBUILD/tcl90/bin/tclsh9.0` +
      42. `./configure --with-tclsh=$TCLBUILD/tcl90/bin/tclsh9.0 --all`
      43. `make tclextension-install`
        ↑ Verify extension installed at $TCLBUILD/tcl90/lib/sqlite3.*
      44. `make tclextension-list`
        diff --git a/manifest b/manifest index 8e3fb1f0fe..c5215c7f12 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\sthe\sTCL\sextension\saware\sof\sthe\sbooleanString\stype\swithin\sTCL. -D 2025-01-07T12:14:32.905 +C Enhancements\sto\sthe\sTcl\sSQLite\sextension\stesting\sprocedures\sso\sthat\sthey\ninstall\sa\sfull-featured\sSQLite\sand\sso\sthat\sTcl\sis\sbuild\sstatically\sso\sthat\nthere\sis\sno\sneed\sto\sworry\swith\sLD_LIBRARY_PATH. +D 2025-01-07T14:55:49.344 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -61,7 +61,7 @@ F doc/json-enhancements.md e356fc834781f1f1aa22ee300027a270b2c960122468499bf347b F doc/jsonb.md 5fab4b8613aa9153fbeb6259297bd4697988af8b3d23900deba588fa7841456b F doc/lemon.html 8b266ff711d2ec7f867c3dca37634963f48a630329908cc282beebfa8c708706 F doc/pager-invariants.txt 27fed9a70ddad2088750c4a2b493b63853da2710 -F doc/tcl-extension-testing.md fca7b123e6f6c94f87c5e9285342fa08d17f118d47bea22c0b045485755fe9c3 +F doc/tcl-extension-testing.md 059992abc132fcec1a0c811b7d0f8c4fb08763e9833247b60b411e60a7e6128d F doc/testrunner.md 15583cf8c7d8a1c3378fd5d4319ca769a14c4d950a5df9b015d01d5be290dc69 F doc/trusted-schema.md 33625008620e879c7bcfbbfa079587612c434fa094d338b08242288d358c3e8a F doc/vdbesort-memory.md 4da2639c14cd24a31e0af694b1a8dd37eaf277aff3867e9a8cc14046bc49df56 @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 7d41885e85b0e2ef28bac34d663af07c35b21ee3e8b14481d2371f623bce681d -R 7defba456aa3fec0b02242de054d2a9a +P 14b38ae6ab86a314a63ca9513850b43fcc670864f94d03a2706eff469980da88 +R 811d0a9276e161f39f1993aa5a481734 U drh -Z 915ad0926614914c31505681a5658ee7 +Z c4fb188a31a7551b0e4fe1e776f9db48 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 4f85e88e04..3d4d8f52f4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -14b38ae6ab86a314a63ca9513850b43fcc670864f94d03a2706eff469980da88 +c8972e652ebe62a8583904b5bc1d96b2d598222c037a714c8ff114ca84b52c7a From 4a833113706cc8a26f749f837e6492ac2ea79c6a Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 7 Jan 2025 15:00:00 +0000 Subject: [PATCH 036/220] Typo in the previous check-in. FossilOrigin-Name: 5872d7a0a7d4959562e1218bbba1115df8b292d980234273d0d38749edf19822 --- doc/tcl-extension-testing.md | 2 +- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/doc/tcl-extension-testing.md b/doc/tcl-extension-testing.md index dfe47922e0..e2edf2ef1c 100644 --- a/doc/tcl-extension-testing.md +++ b/doc/tcl-extension-testing.md @@ -67,7 +67,7 @@ an ordinary tclsh can subsequently run "package require sqlite3".
      45. `fossil up core-9-0-0`
        ↑ Or some other version of Tcl9
      46. `fossil clean -x` -
      47. `./configure --prefix=$TCLBUILD/tcl90 --disable-shared` +
      48. `./configure --prefix=$TCLBUILD/tcl90 --disable-shared`
        ↑ The --disable-shared is to avoid the need to set LD_LIBRARY_PATH when using this Tcl build.
      49. `make install` diff --git a/manifest b/manifest index c5215c7f12..732add5baf 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhancements\sto\sthe\sTcl\sSQLite\sextension\stesting\sprocedures\sso\sthat\sthey\ninstall\sa\sfull-featured\sSQLite\sand\sso\sthat\sTcl\sis\sbuild\sstatically\sso\sthat\nthere\sis\sno\sneed\sto\sworry\swith\sLD_LIBRARY_PATH. -D 2025-01-07T14:55:49.344 +C Typo\sin\sthe\sprevious\scheck-in. +D 2025-01-07T15:00:00.521 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -61,7 +61,7 @@ F doc/json-enhancements.md e356fc834781f1f1aa22ee300027a270b2c960122468499bf347b F doc/jsonb.md 5fab4b8613aa9153fbeb6259297bd4697988af8b3d23900deba588fa7841456b F doc/lemon.html 8b266ff711d2ec7f867c3dca37634963f48a630329908cc282beebfa8c708706 F doc/pager-invariants.txt 27fed9a70ddad2088750c4a2b493b63853da2710 -F doc/tcl-extension-testing.md 059992abc132fcec1a0c811b7d0f8c4fb08763e9833247b60b411e60a7e6128d +F doc/tcl-extension-testing.md b6e9180a86aa65b53b5ced9c88b22e369e31fb779011c94435b6368d9e18d43d F doc/testrunner.md 15583cf8c7d8a1c3378fd5d4319ca769a14c4d950a5df9b015d01d5be290dc69 F doc/trusted-schema.md 33625008620e879c7bcfbbfa079587612c434fa094d338b08242288d358c3e8a F doc/vdbesort-memory.md 4da2639c14cd24a31e0af694b1a8dd37eaf277aff3867e9a8cc14046bc49df56 @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 14b38ae6ab86a314a63ca9513850b43fcc670864f94d03a2706eff469980da88 -R 811d0a9276e161f39f1993aa5a481734 +P c8972e652ebe62a8583904b5bc1d96b2d598222c037a714c8ff114ca84b52c7a +R 48f035d8ef2866d48331e5816d8b1a78 U drh -Z c4fb188a31a7551b0e4fe1e776f9db48 +Z 152a8e1b3ff1b7672d585ac11e0307c5 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 3d4d8f52f4..895b83beaa 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c8972e652ebe62a8583904b5bc1d96b2d598222c037a714c8ff114ca84b52c7a +5872d7a0a7d4959562e1218bbba1115df8b292d980234273d0d38749edf19822 From ece17299582b7766d26422e91019fcc535ca93c9 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 7 Jan 2025 15:39:57 +0000 Subject: [PATCH 037/220] Fix a memory error in test logic introduced by [8704034254938662]. FossilOrigin-Name: 8a56e98d257e280d308b9fdc26e17e202f00a70fb9a780e30924e87a189fc7f4 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/test1.c | 6 +++++- test/pragma4.test | 2 +- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 732add5baf..ba5fcdfbf6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Typo\sin\sthe\sprevious\scheck-in. -D 2025-01-07T15:00:00.521 +C Fix\sa\smemory\serror\sin\stest\slogic\sintroduced\sby\s[8704034254938662]. +D 2025-01-07T15:39:57.880 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -789,7 +789,7 @@ F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 F src/tclsqlite.c 6e25a72d3f3769f779b05b2c618ae0388639d8e27d6434c2ff3926f3267342fe F src/tclsqlite.h 65e2c761446e1c9fa0342b7d2612a703483643c8b6a316d12a65b745a4727395 -F src/test1.c 7f5579f2786c11cf4391ec2abb7b5b5b234ca1408599d7a0d6dd32360e5f58d8 +F src/test1.c 07c9b523f90b96f6e9a701476602fa1f82075da19955823316b3fe13eaaa52cc F src/test2.c 7ebc518e6735939d8979273a6f7b1d9b5702babf059f6ad62499f7f60a9eb9a3 F src/test3.c e7573aa0f78ee4e070a4bc8c3493941c1aa64d5c66d4825c74c0f055451f432b F src/test4.c 13e57ae7ec7a959ee180970aef09deed141252fe9bb07c61054f0dfa4f1dfd5d @@ -1533,7 +1533,7 @@ F test/pg_common.tcl 3b27542224db1e713ae387459b5d117c836a5f6e328846922993b6d2b76 F test/pragma.test 11cb9310c42f921918f7f563e3c0b6e70f9f9c3a6a1cf12af8fccb6c574f3882 F test/pragma2.test e5d5c176360c321344249354c0c16aec46214c9f F test/pragma3.test 92a46bbea12322dd94a404f49edcfbfc913a2c98115f0d030a7459bb4712ef31 -F test/pragma4.test 336b99c2a9fd35af3cc6da94f794b4cba09bbdb18f0ecbd3f734bb6bb8e1c15c +F test/pragma4.test 396ef9bff1fb966d41721545ad4b12bfc26aae315f5fe51d9b917828d49e6f8e F test/pragma5.test 7b33fc43e2e41abf17f35fb73f71b49671a380ea92a6c94b6ce530a25f8d9102 F test/pragma6.test c5ec577ba087954b4dfa619a3cbe97b155b60a0af487527abe89b10fc17e6512 F test/pragmafault.test 275edaf3161771d37de60e5c2b412627ac94cef11739236bec12ed1258b240f8 @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P c8972e652ebe62a8583904b5bc1d96b2d598222c037a714c8ff114ca84b52c7a -R 48f035d8ef2866d48331e5816d8b1a78 +P 5872d7a0a7d4959562e1218bbba1115df8b292d980234273d0d38749edf19822 +R 2dc5969771af2d8527fa6ca2001dd4f3 U drh -Z 152a8e1b3ff1b7672d585ac11e0307c5 +Z 0fbc54108ea801128f403bfa92cfd727 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 895b83beaa..77e363b6bd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5872d7a0a7d4959562e1218bbba1115df8b292d980234273d0d38749edf19822 +8a56e98d257e280d308b9fdc26e17e202f00a70fb9a780e30924e87a189fc7f4 diff --git a/src/test1.c b/src/test1.c index a1a96d2b3c..4212c73232 100644 --- a/src/test1.c +++ b/src/test1.c @@ -7553,6 +7553,10 @@ static int SQLITE_TCLAPI test_wal_autocheckpoint( /* ** tclcmd: test_sqlite3_log ?SCRIPT? +** +** Caution: If you register a log callback, you must deregister it (by +** invoking test_sqlite3_log with no arguments) prior to closing the +** Tcl interpreter or else a memory error will occur. */ static struct LogCallback { Tcl_Interp *pInterp; @@ -7584,7 +7588,7 @@ static int SQLITE_TCLAPI test_sqlite3_log( logcallback.pInterp = 0; sqlite3_config(SQLITE_CONFIG_LOG, (void*)0, (void*)0); } - if( objc>1 ){ + if( objc>1 && Tcl_GetString(objv[1])[0]!=0 ){ logcallback.pObj = objv[1]; Tcl_IncrRefCount(logcallback.pObj); logcallback.pInterp = interp; diff --git a/test/pragma4.test b/test/pragma4.test index 0466960cab..2ba87c0c60 100644 --- a/test/pragma4.test +++ b/test/pragma4.test @@ -301,7 +301,7 @@ ifcapable vtab { do_test 6.3 { set ::log } {} - test_sqlite3_log {} + test_sqlite3_log } # 2024-05-08 https://sqlite.org/forum/forumpost/cf29a33e94 From fd11e5c082e98d865c46a4a0d1069f55a484537f Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 7 Jan 2025 16:36:47 +0000 Subject: [PATCH 038/220] Improvements to [14b38ae6ab86a314] so that the Tcl interface is better able to work with boolean values in both Tcl86 and Tcl90. FossilOrigin-Name: 4e85343d6107a46682b549667410c296d7f4d17e3ac04ded7357afcbbfbe3e6d --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/tclsqlite.c | 13 +++++++------ 3 files changed, 14 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index ba5fcdfbf6..bceb3b8591 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\smemory\serror\sin\stest\slogic\sintroduced\sby\s[8704034254938662]. -D 2025-01-07T15:39:57.880 +C Improvements\sto\s[14b38ae6ab86a314]\sso\sthat\sthe\sTcl\sinterface\sis\sbetter\sable\nto\swork\swith\sboolean\svalues\sin\sboth\sTcl86\sand\sTcl90. +D 2025-01-07T16:36:47.331 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -787,7 +787,7 @@ F src/sqliteInt.h 3f20dfb5ae54e787b2643edc0b5bae0cecddfb89988e28afdc3c0b05892e25 F src/sqliteLimit.h 1bbdbf72bd0411d003267ffebc59a262f061df5653027a75627d03f48ca30523 F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 -F src/tclsqlite.c 6e25a72d3f3769f779b05b2c618ae0388639d8e27d6434c2ff3926f3267342fe +F src/tclsqlite.c c6b9d3a0b1100e1e028460c418c41ca180dac5958e96bef79f6799b552522a37 F src/tclsqlite.h 65e2c761446e1c9fa0342b7d2612a703483643c8b6a316d12a65b745a4727395 F src/test1.c 07c9b523f90b96f6e9a701476602fa1f82075da19955823316b3fe13eaaa52cc F src/test2.c 7ebc518e6735939d8979273a6f7b1d9b5702babf059f6ad62499f7f60a9eb9a3 @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 5872d7a0a7d4959562e1218bbba1115df8b292d980234273d0d38749edf19822 -R 2dc5969771af2d8527fa6ca2001dd4f3 +P 8a56e98d257e280d308b9fdc26e17e202f00a70fb9a780e30924e87a189fc7f4 +R 9f37d9e0a5a710d92c078118174ed306 U drh -Z 0fbc54108ea801128f403bfa92cfd727 +Z 1267df4caaf383b5de45df3c7a06eba4 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 77e363b6bd..f17f9bb53b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8a56e98d257e280d308b9fdc26e17e202f00a70fb9a780e30924e87a189fc7f4 +4e85343d6107a46682b549667410c296d7f4d17e3ac04ded7357afcbbfbe3e6d diff --git a/src/tclsqlite.c b/src/tclsqlite.c index 344b3e07c7..598c9355ff 100644 --- a/src/tclsqlite.c +++ b/src/tclsqlite.c @@ -1097,8 +1097,8 @@ static void tclSqlFunc(sqlite3_context *context, int argc, sqlite3_value**argv){ /* Only return a BLOB type if the Tcl variable is a bytearray and ** has no string representation. */ eType = SQLITE_BLOB; - }else if( (c=='b' && strcmp(zType,"boolean")==0) - || (c=='b' && strcmp(zType,"booleanString")==0 && pVar->bytes==0) + }else if( (c=='b' && pVar->bytes==0 && strcmp(zType,"boolean")==0 ) + || (c=='b' && pVar->bytes==0 && strcmp(zType,"booleanString")==0 ) || (c=='w' && strcmp(zType,"wideInt")==0) || (c=='i' && strcmp(zType,"int")==0) ){ @@ -1506,11 +1506,12 @@ static int dbPrepareAndBind( sqlite3_bind_blob(pStmt, i, data, n, SQLITE_STATIC); Tcl_IncrRefCount(pVar); pPreStmt->apParm[iParm++] = pVar; - }else if( (c=='b' && strcmp(zType,"boolean")==0) - || (c=='b' && strcmp(zType,"booleanString")==0 - && pVar->bytes==0) ){ + }else if( c=='b' && pVar->bytes==0 + && (strcmp(zType,"booleanString")==0 + || strcmp(zType,"boolean")==0) + ){ int nn; - Tcl_GetIntFromObj(interp, pVar, &nn); + Tcl_GetBooleanFromObj(interp, pVar, &nn); sqlite3_bind_int(pStmt, i, nn); }else if( c=='d' && strcmp(zType,"double")==0 ){ double r; From 6962f3d8144a4aba8f19961381593f20874f5776 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 7 Jan 2025 18:50:19 +0000 Subject: [PATCH 039/220] Further refinement to the Tcl extension testing procedure. FossilOrigin-Name: 32b8b078d16b8931afa56e587cf840412c65b68da0bc6fd6280ac773295116cf --- doc/tcl-extension-testing.md | 17 ++++++++++++++++- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/doc/tcl-extension-testing.md b/doc/tcl-extension-testing.md index e2edf2ef1c..c82d336a25 100644 --- a/doc/tcl-extension-testing.md +++ b/doc/tcl-extension-testing.md @@ -14,6 +14,18 @@ aspect of the SQLite TCL extension, and in particular to verify that the "make tclextension-install" build target works and that an ordinary tclsh can subsequently run "package require sqlite3". +This procedure can also be used as a template for how to set up +a local TCL+SQLite development environment. In other words, it +can be be used as a guide on how to compile per-user copies of +Tcl that are used to develop, test, and debug SQLite. In that +case, perhaps make minor changes to the procedure such as: + + * Make TCLBUILD directory is permanent. + * Enable debugging symbols on the Tcl library build. + * Reduce the optimization level to -O0 for easier debugging. + * Also compile "wish" to go with each "tclsh". + + ## 2.0 Testing On Unix-like Systems (Including Mac) ### 2.1 Setup @@ -71,6 +83,9 @@ an ordinary tclsh can subsequently run "package require sqlite3". ↑ The --disable-shared is to avoid the need to set LD_LIBRARY_PATH when using this Tcl build.
      50. `make install` +
      51. `cp -r ../library $TCLBUILD/tcl90/lib/tcl9.0`
        + ↑ The Tcl library is not installed in the expected place by + "make install" in Tcl9.0. This step is not required when building Tcl8.6.
      52. `cd $SQLITESOURCE`
      53. `fossil clean -x`
      54. `./configure --with-tclsh=$TCLBUILD/tcl90/bin/tclsh9.0 --all` @@ -87,7 +102,7 @@ an ordinary tclsh can subsequently run "package require sqlite3". ### 2.4 Cleanup
          -
        1. `rm -rf $TCLBUILD` +
        2. `rm -rf $TCLBUILD`
        ## 3.0 Testing On Windows diff --git a/manifest b/manifest index bceb3b8591..ea9d0e4fd4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improvements\sto\s[14b38ae6ab86a314]\sso\sthat\sthe\sTcl\sinterface\sis\sbetter\sable\nto\swork\swith\sboolean\svalues\sin\sboth\sTcl86\sand\sTcl90. -D 2025-01-07T16:36:47.331 +C Further\srefinement\sto\sthe\sTcl\sextension\stesting\sprocedure. +D 2025-01-07T18:50:19.567 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -61,7 +61,7 @@ F doc/json-enhancements.md e356fc834781f1f1aa22ee300027a270b2c960122468499bf347b F doc/jsonb.md 5fab4b8613aa9153fbeb6259297bd4697988af8b3d23900deba588fa7841456b F doc/lemon.html 8b266ff711d2ec7f867c3dca37634963f48a630329908cc282beebfa8c708706 F doc/pager-invariants.txt 27fed9a70ddad2088750c4a2b493b63853da2710 -F doc/tcl-extension-testing.md b6e9180a86aa65b53b5ced9c88b22e369e31fb779011c94435b6368d9e18d43d +F doc/tcl-extension-testing.md 4c0f45c9d9923b120573a006f71f1558a18aecc71bd66e5b1a182c49a2ee8c65 F doc/testrunner.md 15583cf8c7d8a1c3378fd5d4319ca769a14c4d950a5df9b015d01d5be290dc69 F doc/trusted-schema.md 33625008620e879c7bcfbbfa079587612c434fa094d338b08242288d358c3e8a F doc/vdbesort-memory.md 4da2639c14cd24a31e0af694b1a8dd37eaf277aff3867e9a8cc14046bc49df56 @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 8a56e98d257e280d308b9fdc26e17e202f00a70fb9a780e30924e87a189fc7f4 -R 9f37d9e0a5a710d92c078118174ed306 +P 4e85343d6107a46682b549667410c296d7f4d17e3ac04ded7357afcbbfbe3e6d +R 28cb3fd95e62d91bdc02718299c22dad U drh -Z 1267df4caaf383b5de45df3c7a06eba4 +Z 6cf3497825f1341be717f1a079f18695 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index f17f9bb53b..cf808db214 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4e85343d6107a46682b549667410c296d7f4d17e3ac04ded7357afcbbfbe3e6d +32b8b078d16b8931afa56e587cf840412c65b68da0bc6fd6280ac773295116cf From 45d19952c394d32e67789929242185a57f4390a7 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 8 Jan 2025 12:25:33 +0000 Subject: [PATCH 040/220] In the doc/tcl-extension-testing.md document, provide enhanced explanation for why the tcl library needs to be copied into the install directory. FossilOrigin-Name: cff70c859fff37f886fd622b7335a73836ff8cf15e6cb7aabcff449a7e427fa8 --- doc/tcl-extension-testing.md | 10 ++++++++-- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/doc/tcl-extension-testing.md b/doc/tcl-extension-testing.md index c82d336a25..e5ae6dc731 100644 --- a/doc/tcl-extension-testing.md +++ b/doc/tcl-extension-testing.md @@ -84,8 +84,14 @@ case, perhaps make minor changes to the procedure such as: when using this Tcl build.
      55. `make install`
      56. `cp -r ../library $TCLBUILD/tcl90/lib/tcl9.0`
        - ↑ The Tcl library is not installed in the expected place by - "make install" in Tcl9.0. This step is not required when building Tcl8.6. + ↑ The Tcl library is not installed by "make install" for Tcl9.0 unless + you also include the --disable-zipfs to ./configure. But if you do that + then the generated tclsh9.0 is no longer stand-alone. On the other hand, + if you don't install the Tcl library, other programs like testfixture + won't be able to find the Tcl library and hence won't work. This + extra installation step resolves the dilemma. + This step is not required when building Tcl8.6, which lacks support for + zipfs and hence always installs its Tcl library.
      57. `cd $SQLITESOURCE`
      58. `fossil clean -x`
      59. `./configure --with-tclsh=$TCLBUILD/tcl90/bin/tclsh9.0 --all` diff --git a/manifest b/manifest index ea9d0e4fd4..4fea8ee35a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Further\srefinement\sto\sthe\sTcl\sextension\stesting\sprocedure. -D 2025-01-07T18:50:19.567 +C In\sthe\sdoc/tcl-extension-testing.md\sdocument,\sprovide\senhanced\sexplanation\sfor\nwhy\sthe\stcl\slibrary\sneeds\sto\sbe\scopied\sinto\sthe\sinstall\sdirectory. +D 2025-01-08T12:25:33.217 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -61,7 +61,7 @@ F doc/json-enhancements.md e356fc834781f1f1aa22ee300027a270b2c960122468499bf347b F doc/jsonb.md 5fab4b8613aa9153fbeb6259297bd4697988af8b3d23900deba588fa7841456b F doc/lemon.html 8b266ff711d2ec7f867c3dca37634963f48a630329908cc282beebfa8c708706 F doc/pager-invariants.txt 27fed9a70ddad2088750c4a2b493b63853da2710 -F doc/tcl-extension-testing.md 4c0f45c9d9923b120573a006f71f1558a18aecc71bd66e5b1a182c49a2ee8c65 +F doc/tcl-extension-testing.md 45dfc22b414d0b928f9c45aef2c8ae0a2f1d31b38c5582fe6283258a86d7e45f F doc/testrunner.md 15583cf8c7d8a1c3378fd5d4319ca769a14c4d950a5df9b015d01d5be290dc69 F doc/trusted-schema.md 33625008620e879c7bcfbbfa079587612c434fa094d338b08242288d358c3e8a F doc/vdbesort-memory.md 4da2639c14cd24a31e0af694b1a8dd37eaf277aff3867e9a8cc14046bc49df56 @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 4e85343d6107a46682b549667410c296d7f4d17e3ac04ded7357afcbbfbe3e6d -R 28cb3fd95e62d91bdc02718299c22dad +P 32b8b078d16b8931afa56e587cf840412c65b68da0bc6fd6280ac773295116cf +R 52cb466101bde28f58c7d46df96d4072 U drh -Z 6cf3497825f1341be717f1a079f18695 +Z cbebb7dddd96cd0f0ae4da260aa15c99 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index cf808db214..0080029df3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -32b8b078d16b8931afa56e587cf840412c65b68da0bc6fd6280ac773295116cf +cff70c859fff37f886fd622b7335a73836ff8cf15e6cb7aabcff449a7e427fa8 From af8af121ab77bb761ccd975d97d216c932a9ba08 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 8 Jan 2025 12:51:28 +0000 Subject: [PATCH 041/220] Cross-link and otherwise improve the various how-to-compile documents. No code changes. FossilOrigin-Name: 5e6ede92afae77ce6023f3b294dc565651631c7976d898d800988f1b3ff2e83f --- doc/compile-for-unix.md | 6 +++++- doc/compile-for-windows.md | 10 ++++++---- doc/tcl-extension-testing.md | 8 ++++++++ manifest | 16 ++++++++-------- manifest.uuid | 2 +- 5 files changed, 28 insertions(+), 14 deletions(-) diff --git a/doc/compile-for-unix.md b/doc/compile-for-unix.md index 7e3784d695..ce76b97bae 100644 --- a/doc/compile-for-unix.md +++ b/doc/compile-for-unix.md @@ -4,6 +4,8 @@ Here are step-by-step instructions on how to build SQLite from canonical source on any modern machine that isn't Windows. These notes are tested (on 2024-10-11) on Ubuntu and on MacOS, but they are general and should work on most any modern unix platform. +See the companion document ([](./compile-for-windows.md>)) for +guidance on building for Windows. 1. Install a C-compiler. GCC or Clang both work fine. If you are reading this document, you've probably already done that. @@ -12,6 +14,8 @@ are general and should work on most any modern unix platform. we'll do a private install in the $HOME/local directory, but you can make adjustments to install TCL wherever you like. This document assumes you are working with TCL version 9.0. + See also the [](./tcl-extension-testing.md) document that contains + more details on compiling Tcl for use with SQLite.
        1. Get the TCL source archive, perhaps from @@ -45,7 +49,7 @@ are general and should work on most any modern unix platform.
        2. `make sqldiff`
        3. `make sqlite3_rsync` -

          None of the targets above require TCL. TCL is only needed +

          None of the targets above require TCL. TCL is needed for the following targets:

          • `make tclextension-install` diff --git a/doc/compile-for-windows.md b/doc/compile-for-windows.md index 5cecfbf547..717569dd78 100644 --- a/doc/compile-for-windows.md +++ b/doc/compile-for-windows.md @@ -1,7 +1,9 @@ # Notes On Compiling SQLite On Windows 11 -Here are step-by-step instructions on how to build SQLite from -canonical source on a new Windows 11 PC, as of 2024-10-09: +Below are step-by-step instructions on how to build SQLite from +canonical source on a new Windows 11 PC, as of 2024-10-09. +See [](./compile-for-unix.md) for a similar guide for unix-like +systems, including MacOS. 1. Install Microsoft Visual Studio. The free "community edition" will work fine. Do a standard install for C++ development. @@ -33,8 +35,8 @@ canonical source on a new Windows 11 PC, as of 2024-10-09: "tclsh90.exe" command-line tool as part of the build process, and the "tcl90.lib" and "tclstub.lib" libraries in order to run tests. This document assumes you are working with TCL version 9.0. - See versions of this document from prior to 2024-10-10 for - instructions on how to build using TCL version 8.6. + See [](./tcl-extension-testing.md#windows) for guidance on how + to compile TCL version 8.6 for use with SQLite.
            1. Get the TCL source archive, perhaps from diff --git a/doc/tcl-extension-testing.md b/doc/tcl-extension-testing.md index e5ae6dc731..df5f6537ba 100644 --- a/doc/tcl-extension-testing.md +++ b/doc/tcl-extension-testing.md @@ -26,8 +26,12 @@ case, perhaps make minor changes to the procedure such as: * Also compile "wish" to go with each "tclsh". + ## 2.0 Testing On Unix-like Systems (Including Mac) +See also the [](./compile-for-unix.md) document which provides another +perspective on how to compile SQLite on unix-like systems. + ### 2.1 Setup
                @@ -111,8 +115,12 @@ case, perhaps make minor changes to the procedure such as:
              1. `rm -rf $TCLBUILD`
              + ## 3.0 Testing On Windows +See also the [](./compile-for-windows.md) document which provides another +perspective on how to compile SQLite on Windows. + ### 3.1 Setup for Windows
                diff --git a/manifest b/manifest index 4fea8ee35a..a8b5736857 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sthe\sdoc/tcl-extension-testing.md\sdocument,\sprovide\senhanced\sexplanation\sfor\nwhy\sthe\stcl\slibrary\sneeds\sto\sbe\scopied\sinto\sthe\sinstall\sdirectory. -D 2025-01-08T12:25:33.217 +C Cross-link\sand\sotherwise\simprove\sthe\svarious\show-to-compile\sdocuments.\nNo\scode\schanges. +D 2025-01-08T12:51:28.347 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -55,13 +55,13 @@ F autosetup/system.tcl 51d4be76cd9a9074704b584e5c9cbba616202c8468cf9ba8a4f8294a7 F configure 9a00b21dfd13757bbfb8d89b30660a89ec1f8f3a79402b8f9f9b6fc475c3303a x F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad F doc/F2FS.txt c1d4a0ae9711cfe0e1d8b019d154f1c29e0d3abfe820787ba1e9ed7691160fcd -F doc/compile-for-unix.md 7d6a5770611ea0643de456b385581923dac7c0a7c3758825dda810d12fc3e5b2 -F doc/compile-for-windows.md 791f1754fcd669b0a8fdcdc0fdd56eff8c148add7457e8bf4863b46829966fc1 +F doc/compile-for-unix.md c9dce1ddd4bf0d25efccc5c63eb047e78c01ce06a6ff29c73e0a8af4a0f4adbc +F doc/compile-for-windows.md 31cddda1d5f34027f1f2b7484d580e7558f22a9875884805b6fdc84d56cab848 F doc/json-enhancements.md e356fc834781f1f1aa22ee300027a270b2c960122468499bf347bb123ce1ea4f F doc/jsonb.md 5fab4b8613aa9153fbeb6259297bd4697988af8b3d23900deba588fa7841456b F doc/lemon.html 8b266ff711d2ec7f867c3dca37634963f48a630329908cc282beebfa8c708706 F doc/pager-invariants.txt 27fed9a70ddad2088750c4a2b493b63853da2710 -F doc/tcl-extension-testing.md 45dfc22b414d0b928f9c45aef2c8ae0a2f1d31b38c5582fe6283258a86d7e45f +F doc/tcl-extension-testing.md 864875c3b672db79e7d42348dd726f9a4fbd852b1d8e5efcf09fe3d1ff6bf2a2 F doc/testrunner.md 15583cf8c7d8a1c3378fd5d4319ca769a14c4d950a5df9b015d01d5be290dc69 F doc/trusted-schema.md 33625008620e879c7bcfbbfa079587612c434fa094d338b08242288d358c3e8a F doc/vdbesort-memory.md 4da2639c14cd24a31e0af694b1a8dd37eaf277aff3867e9a8cc14046bc49df56 @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 32b8b078d16b8931afa56e587cf840412c65b68da0bc6fd6280ac773295116cf -R 52cb466101bde28f58c7d46df96d4072 +P cff70c859fff37f886fd622b7335a73836ff8cf15e6cb7aabcff449a7e427fa8 +R 9e488272febec3d17c3861ccb9f3e0b0 U drh -Z cbebb7dddd96cd0f0ae4da260aa15c99 +Z 5539a934602dd195ca384aa9f37e29a3 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 0080029df3..d3b8030481 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cff70c859fff37f886fd622b7335a73836ff8cf15e6cb7aabcff449a7e427fa8 +5e6ede92afae77ce6023f3b294dc565651631c7976d898d800988f1b3ff2e83f From ad460db7eb21cbcdd4f509653f86acbcf43029dc Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 8 Jan 2025 15:54:44 +0000 Subject: [PATCH 042/220] Fix a crash in fts5 that could occur if shadow tables are modified or removed. FossilOrigin-Name: c0b691095ae72fc07530777ef6d23688fb4196ce2e0feff14fc3c597c572252d --- ext/fts5/fts5_index.c | 6 +- ext/fts5/fts5_storage.c | 5 + ext/fts5/test/fts5circref.test | 2 +- ext/fts5/test/fts5corrupt3.test | 233 +++++++++++++++++++++++++++++++ ext/fts5/test/fts5savepoint.test | 2 +- manifest | 22 +-- manifest.uuid | 2 +- 7 files changed, 257 insertions(+), 15 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 242258af70..2e512fd215 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -891,9 +891,13 @@ static int fts5IndexPrepareStmt( ){ if( p->rc==SQLITE_OK ){ if( zSql ){ - p->rc = sqlite3_prepare_v3(p->pConfig->db, zSql, -1, + int rc = sqlite3_prepare_v3(p->pConfig->db, zSql, -1, SQLITE_PREPARE_PERSISTENT|SQLITE_PREPARE_NO_VTAB, ppStmt, 0); + /* If this prepare() call fails with SQLITE_ERROR, then one of the + ** %_idx or %_data tables has been removed or modified. Call this + ** corruption. */ + p->rc = (rc==SQLITE_ERROR ? SQLITE_CORRUPT : rc); }else{ p->rc = SQLITE_NOMEM; } diff --git a/ext/fts5/fts5_storage.c b/ext/fts5/fts5_storage.c index 31f5fc5dc3..2b43016bef 100644 --- a/ext/fts5/fts5_storage.c +++ b/ext/fts5/fts5_storage.c @@ -205,6 +205,11 @@ static int fts5StorageGetStmt( if( rc!=SQLITE_OK && pzErrMsg ){ *pzErrMsg = sqlite3_mprintf("%s", sqlite3_errmsg(pC->db)); } + if( rc==SQLITE_ERROR && eStmt>FTS5_STMT_LOOKUP2 && eStmt Date: Wed, 8 Jan 2025 20:43:03 +0000 Subject: [PATCH 043/220] Fix another assert() failure in fts5. FossilOrigin-Name: 6da37893f5b5729ea5fd632e8d98789e867488a67501d4a4dad92f8e7cb6bda0 --- ext/fts5/fts5_main.c | 3 +- ext/fts5/test/fts5corrupt5.test | 235 ++++++++++++++++++++++++++++++++ manifest | 14 +- manifest.uuid | 2 +- 4 files changed, 245 insertions(+), 9 deletions(-) diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index 876420f24d..474f7441e9 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -1913,7 +1913,7 @@ static int fts5UpdateMethod( ); assert( pTab->p.pConfig->pzErrmsg==0 ); if( pConfig->pgsz==0 ){ - rc = sqlite3Fts5IndexLoadConfig(pTab->p.pIndex); + rc = sqlite3Fts5ConfigLoad(pTab->p.pConfig, pTab->p.pConfig->iCookie); if( rc!=SQLITE_OK ) return rc; } @@ -2126,6 +2126,7 @@ static int fts5RollbackMethod(sqlite3_vtab *pVtab){ Fts5FullTable *pTab = (Fts5FullTable*)pVtab; fts5CheckTransactionState(pTab, FTS5_ROLLBACK, 0); rc = sqlite3Fts5StorageRollback(pTab->pStorage); + pTab->p.pConfig->pgsz = 0; return rc; } diff --git a/ext/fts5/test/fts5corrupt5.test b/ext/fts5/test/fts5corrupt5.test index 19f0538418..ddb22f870d 100644 --- a/ext/fts5/test/fts5corrupt5.test +++ b/ext/fts5/test/fts5corrupt5.test @@ -1451,6 +1451,241 @@ do_catchsql_test 9.2 { DELETE FROM t1; } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +reset_db +do_test 10.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +.open --hexdb +| size 32768 pagesize 4096 filename crash-b06f016068bcea.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 08 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 09 00 00 00 04 ................ +| 96: 00 00 00 00 0d 0f c7 00 07 0d 92 00 0f 8d 0f 36 ...............6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d 92 0d 92 00 00 00 00 ...k............ +| 3472: 00 00 22 08 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3488: 32 74 32 08 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3504: 20 74 32 28 78 29 56 07 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 42 4c 4f 42 29 5e 05 07 17 21 Y, sz BLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 74 31 5f 63 6f 6e 74 !...tablet1_cont +| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19 c0, c1, c2)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 ...-tablet1_idxt +| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 00 00 00 00 00 00 (a,b,c)......... +| page 3 offset 8192 +| 0: 0d 00 00 00 03 0c 94 00 0f e6 0f ef 0c 94 00 00 ................ +| 3216: 00 00 00 00 86 4a 84 80 80 80 80 01 04 00 8d 18 .....J.......... +| 3232: 00 00 03 2b 02 30 30 01 02 06 01 02 06 01 02 06 ...+.00......... +| 3248: 1f 02 03 01 02 03 01 02 03 01 08 32 30 31 36 30 ...........20160 +| 3264: 36 30 39 01 02 07 01 02 07 01 02 07 01 01 34 01 609...........4. +| 3280: 02 05 01 02 05 01 02 05 01 01 35 01 02 04 01 02 ..........5..... +| 3296: 04 01 02 04 02 07 30 30 30 30 30 30 30 1c 02 04 ......0000000... +| 3312: 01 02 04 01 02 04 01 06 62 69 6e 61 72 79 03 06 ........binary.. +| 3328: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3344: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3360: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3376: 03 06 01 02 02 03 06 01 02 02 01 08 63 6f 6d 70 ............comp +| 3392: 69 6c 65 72 01 02 02 01 02 02 01 02 02 01 06 64 iler...........d +| 3408: 62 73 74 61 74 07 02 03 01 02 03 01 02 03 02 04 bstat........... +| 3424: 65 62 75 67 04 02 02 01 02 02 01 02 02 01 06 65 ebug...........e +| 3440: 6e 61 62 6c 65 07 02 02 01 02 02 01 02 02 01 02 nable........... +| 3456: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 ................ +| 3472: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 ................ +| 3488: 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 ................ +| 3504: 02 01 02 02 02 08 78 74 65 6e 73 69 6f 6e 1f 02 ......xtension.. +| 3520: 04 01 02 04 01 02 04 01 04 66 74 73 34 0a 02 03 .........fts4... +| 3536: 01 02 03 01 02 03 04 01 35 0d 02 03 01 02 03 01 ........5....... +| 3552: 02 03 01 03 67 63 63 01 02 03 01 02 03 01 02 03 ....gcc......... +| 3568: 02 06 65 6f 70 6f 6c 79 10 02 03 01 02 03 01 02 ..eopoly........ +| 3584: 03 01 05 6a 73 6f 6e 31 13 02 03 01 02 03 01 02 ...json1........ +| 3600: 03 01 04 6c 6f 61 64 1f 02 03 01 02 03 01 02 03 ...load......... +| 3616: 01 03 6d 61 78 1c 02 02 01 02 02 01 02 02 02 05 ..max........... +| 3632: 65 6d 6f 72 79 1c 02 03 01 02 03 01 02 03 04 04 emory........... +| 3648: 73 79 73 35 16 02 03 01 02 02 03 01 03 01 06 6e sys5...........n +| 3664: 6f 63 61 73 65 02 06 01 02 02 03 06 01 02 02 03 ocase........... +| 3680: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 ................ +| 3696: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3712: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3728: 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 02 02 ...omit......... +| 3744: 01 05 72 74 72 65 65 19 02 03 01 02 03 01 02 03 ..rtree......... +| 3760: 04 02 69 6d 01 06 01 02 02 03 06 01 02 02 03 06 ..im............ +| 3776: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3792: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3808: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3824: 01 0a 74 68 72 65 61 64 73 61 66 65 03 57 34 56 ..threadsafe.W4V +| 3840: 94 64 91 46 85 84 04 76 74 61 62 07 02 04 01 02 .d.F...vtab..... +| 3856: 04 01 02 04 01 01 78 01 06 01 01 02 01 06 01 01 ......x......... +| 3872: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 10 02 ................ +| 3888: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3904: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3920: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3936: 01 02 01 06 01 01 10 01 06 01 01 02 01 06 01 01 ................ +| 3952: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3968: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3984: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 4000: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 4016: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 4032: 02 01 06 01 01 02 01 06 01 01 02 04 15 13 0c 0c ................ +| 4048: 12 44 13 11 0f 47 13 0f 0c 0e 11 10 0f 0e 10 0f .D...G.......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 24 5a 24 24 0f D..@.......$Z$$. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 01 0f fa 00 00 00 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 24 0c 0a 00 0f d8 0f af 0f 86 0f 74 ....$..........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d5 ...t.[.@.$...... +| 48: 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 00 00 00 00 00 00 00 00 00 ................ +| 3072: 00 00 00 00 00 00 00 00 00 00 18 24 05 00 25 0f ...........$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 31 46 45 3d ..%..THREADS1FE= +| 3152: 30 58 52 64 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRdRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX MEMORY=50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LE RTREEXNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4b 45 20 4d 45 4d 53 59 53 35 58 42 49 NABKE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 42 60 2d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 B`-EMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 46 ....)..ENABLE MF +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 42 4c 45 20 47 45 4f 50 4f 4c 59 58 42 49 4e 41 BLE GEOPOLYXBINA +| 3616: 52 59 1a 11 05 00 39 0f 19 45 4e 41 42 4c 45 2e RY....9..ENABLE. +| 3632: 41 40 47 45 4f 50 4f 4c 59 58 4e 4f 43 41 53 40 A@GEOPOLYXNOCAS@ +| 3648: 4f 4c 59 58 55 09 10 05 00 29 0f 17 45 4e 41 42 OLYXU....)..ENAB +| 3664: 4c 45 20 47 45 4f 52 54 52 49 4d 17 0f 05 00 23 LE GEORTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f 17 45 4e 41 42 4c 45 20 46 54 53 35 58 .#..ENABLE FTS5X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 17 0b LE FTS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 34 ..#..ENABLE FTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 24 15 48 4e 4f 43 41 53 45 1d TAT VT$.HNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XRTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 6 offset 20480 +| 0: 0d 00 00 00 24 0e e0 00 0f f8 0f f0 0f e8 0f e0 ....$........... +| 16: 0f d8 0f d0 0f c8 0f c0 0f b8 0f b0 0f a8 0f a0 ................ +| 32: 1f 98 0f 90 0f 88 0f 80 0f 78 0f 70 0f 68 0f 60 .........x.p.h.` +| 48: 0f 58 0f 50 0f 48 0f 40 0f 38 0f 30 0f 28 0f 20 .X.P.H.@.8.0.(. +| 64: 0f 18 0f 10 0f 08 0f 00 0e f8 0e f0 0e e8 00 00 ................ +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 15 f3 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 06 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 00 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 03 00 12 06 01 01 ................ +| 4080: 06 02 03 00 12 06 01 01 06 01 03 00 12 06 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 8 offset 28672 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f 00 00 00 00 00 ................ +| 4048: 00 00 00 00 00 00 11 03 02 2b 69 6e 74 65 67 72 .........+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 00 00 00 00 uild....opti.... +| end crash-b06f016068bcea.db +.testctrl prng_seed 1 db +.testctrl internal_functions +.testctrl json_selfcheck on +}]} {} + +do_execsql_test 10.1 { + UPDATE t1 SET b=quote(zeroblob(current_date)) WHERE t1 MATCH 't*'; +} + +do_catchsql_test 10.2 { + BEGIN; + INSERT INTO t1(t1,rank) VALUES('secure-delete',1); + REPLACE INTO t1(b,a,rowid) VALUES(1,2,3); +} {0 {}} + +do_catchsql_test 10.3 { + COMMIT +} {1 {database disk image is malformed}} + +do_catchsql_test 10.4 { + REPLACE INTO t1(b,a,rowid) VALUES(1,2,3); +} {1 {database disk image is malformed}} + sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/manifest b/manifest index 57eca29cdb..c848e6661b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\scrash\sin\sfts5\sthat\scould\soccur\sif\sshadow\stables\sare\smodified\sor\sremoved. -D 2025-01-08T15:54:44.349 +C Fix\sanother\sassert()\sfailure\sin\sfts5. +D 2025-01-08T20:43:03.635 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -113,7 +113,7 @@ F ext/fts5/fts5_config.c e7d8dd062b44a66cd77e5a0f74f23a2354cd1f3f8575afb967b2773 F ext/fts5/fts5_expr.c 69b8d976058512c07dfe86e229521b7a871768157bd1607cedf1a5038dfd72c9 F ext/fts5/fts5_hash.c adda4272be401566a6e0ba1acbe70ee5cb97fce944bc2e04dc707152a0ec91b1 F ext/fts5/fts5_index.c 1a450035b9e06cc82fcd75f71d6ed9028a78bd56101dcb0c813346e1e91c722a -F ext/fts5/fts5_main.c 72527efa1d634054b93a21eafe854763cbc5c270e8a4ab99bbb589557b818482 +F ext/fts5/fts5_main.c 9ba1871ee99c415756346ea515d0fd31162d599b9b39a29a5b5a265509f136e3 F ext/fts5/fts5_storage.c 1ad05dab4830a4e2eaf2900bb143477f93bc17437093582f36f4b818809e88d8 F ext/fts5/fts5_tcl.c 7fb5a3d3404099075aaa2457307cb459bbc257c0de3dbd52b1e80a5b503e0329 F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee @@ -163,7 +163,7 @@ F ext/fts5/test/fts5corrupt.test 6485f721b88ba355ca5d701e7ee87a4efa3ea578d8e6adb F ext/fts5/test/fts5corrupt2.test 335911e3f68b9625d850325f9e29a128db3f4276a8c9d4e32134580da8f924c4 F ext/fts5/test/fts5corrupt3.test 3420ad30bf9e9bbdbd43b3224c582431744899530a65b11b60ddacdf14200e19 F ext/fts5/test/fts5corrupt4.test dc08d19f5b8943e95a7778a7d8da592042504faf18dd93f68f7d7a0d7d7dd733 -F ext/fts5/test/fts5corrupt5.test 11b47126f5772cc37b67e3e8b2ed05895c4d07c05338bc07e4eea225bfe32c76 +F ext/fts5/test/fts5corrupt5.test b1199f316976dc0396caac59655f489576b7dd29c2520799af19ce3386ef6562 F ext/fts5/test/fts5corrupt6.test 2d72db743db7b5d9c9a6d0cfef24d799ed1aa5e8192b66c40e871a37ed9eed06 F ext/fts5/test/fts5corrupt7.test 4e830875c33b9ea3c4cf1ba71e692b63893cbb4faae8c69b1071889dc26e211c F ext/fts5/test/fts5corrupt8.test b81d802e41631e98100f49a1aadeeffef860e30a62d6ed7d743c2797c477239e @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 5e6ede92afae77ce6023f3b294dc565651631c7976d898d800988f1b3ff2e83f -R aaf463096c33b6880c3455de8eba69af +P c0b691095ae72fc07530777ef6d23688fb4196ce2e0feff14fc3c597c572252d +R 25cf4f6dfa19d9549598c6fb3f0ef39b U dan -Z ae39e4a53d5583331f681da82808c46e +Z af424067c12fe68ac83a2d82b8d3d4b3 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index e3d479fb61..c25464140b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c0b691095ae72fc07530777ef6d23688fb4196ce2e0feff14fc3c597c572252d +6da37893f5b5729ea5fd632e8d98789e867488a67501d4a4dad92f8e7cb6bda0 From b1cbae8bd62a1d920a91ad820841b50008130310 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 9 Jan 2025 14:10:25 +0000 Subject: [PATCH 044/220] When removing an fts5 in secure-delete mode, defer setting the table version to SECUREDELETE until flushing data to disk. This prevents problems that can occur if there is a rollback or statement rollback operation. FossilOrigin-Name: c359e555ceafcaab2ae38074bc4f57cccdc5bc6080d17f82290c09b9e5dd80c2 --- ext/fts5/fts5_index.c | 18 +++ ext/fts5/fts5_main.c | 19 --- ext/fts5/test/fts5corrupt5.test | 232 ++++++++++++++++++++++++++++++++ ext/fts5/test/fts5version.test | 2 +- manifest | 18 +-- manifest.uuid | 2 +- 6 files changed, 261 insertions(+), 30 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 2e512fd215..a8ac98b699 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -5477,6 +5477,24 @@ static void fts5FlushSecureDelete( const int f = FTS5INDEX_QUERY_SKIPHASH; Fts5Iter *pIter = 0; /* Used to find term instance */ + /* If the version number has not been set to SECUREDELETE, do so now. */ + if( p->pConfig->iVersion!=FTS5_CURRENT_VERSION_SECUREDELETE ){ + Fts5Config *pConfig = p->pConfig; + sqlite3_stmt *pStmt = 0; + fts5IndexPrepareStmt(p, &pStmt, sqlite3_mprintf( + "REPLACE INTO %Q.'%q_config' VALUES ('version', %d)", + pConfig->zDb, pConfig->zName, FTS5_CURRENT_VERSION_SECUREDELETE + )); + if( p->rc==SQLITE_OK ){ + int rc; + sqlite3_step(pStmt); + rc = sqlite3_finalize(pStmt); + if( p->rc==SQLITE_OK ) p->rc = rc; + pConfig->iCookie++; + pConfig->iVersion = FTS5_CURRENT_VERSION_SECUREDELETE; + } + } + fts5MultiIterNew(p, pStruct, f, 0, (const u8*)zTerm, nTerm, -1, 0, &pIter); if( fts5MultiIterEof(p, pIter)==0 ){ i64 iThis = fts5MultiIterRowid(pIter); diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index 474f7441e9..9f504bb3a3 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -1901,7 +1901,6 @@ static int fts5UpdateMethod( Fts5Config *pConfig = pTab->p.pConfig; int eType0; /* value_type() of apVal[0] */ int rc = SQLITE_OK; /* Return code */ - int bUpdateOrDelete = 0; /* A transaction must be open when this is called. */ assert( pTab->ts.eState==1 || pTab->ts.eState==2 ); @@ -1938,7 +1937,6 @@ static int fts5UpdateMethod( rc = SQLITE_ERROR; }else{ rc = fts5SpecialDelete(pTab, apVal); - bUpdateOrDelete = 1; } }else{ rc = fts5SpecialInsert(pTab, z, apVal[2 + pConfig->nCol + 1]); @@ -1975,7 +1973,6 @@ static int fts5UpdateMethod( }else{ i64 iDel = sqlite3_value_int64(apVal[0]); /* Rowid to delete */ rc = sqlite3Fts5StorageDelete(pTab->pStorage, iDel, 0, 0); - bUpdateOrDelete = 1; } } @@ -2003,7 +2000,6 @@ static int fts5UpdateMethod( if( eConflict==SQLITE_REPLACE && eType1==SQLITE_INTEGER ){ i64 iNew = sqlite3_value_int64(apVal[1]); /* Rowid to delete */ rc = sqlite3Fts5StorageDelete(pTab->pStorage, iNew, 0, 0); - bUpdateOrDelete = 1; } fts5StorageInsert(&rc, pTab, apVal, pRowid); } @@ -2057,23 +2053,8 @@ static int fts5UpdateMethod( rc = sqlite3Fts5StorageDelete(pStorage, iOld, 0, 1); fts5StorageInsert(&rc, pTab, apVal, pRowid); } - bUpdateOrDelete = 1; sqlite3Fts5StorageReleaseDeleteRow(pStorage); } - - } - } - - if( rc==SQLITE_OK - && bUpdateOrDelete - && pConfig->bSecureDelete - && pConfig->iVersion==FTS5_CURRENT_VERSION - ){ - rc = sqlite3Fts5StorageConfigValue( - pTab->pStorage, "version", 0, FTS5_CURRENT_VERSION_SECUREDELETE - ); - if( rc==SQLITE_OK ){ - pConfig->iVersion = FTS5_CURRENT_VERSION_SECUREDELETE; } } diff --git a/ext/fts5/test/fts5corrupt5.test b/ext/fts5/test/fts5corrupt5.test index ddb22f870d..6a70fc7e44 100644 --- a/ext/fts5/test/fts5corrupt5.test +++ b/ext/fts5/test/fts5corrupt5.test @@ -1686,6 +1686,238 @@ do_catchsql_test 10.4 { REPLACE INTO t1(b,a,rowid) VALUES(1,2,3); } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +reset_db +do_test 11.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +.open --hexdb +| size 32768 pagesize 4096 filename crash-3d05232c78871b.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 08 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 09 00 00 00 04 ................ +| 96: 00 00 00 00 0d 0f c7 00 07 0d 92 00 0f 8d 0f 36 ...............6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d 92 0d 92 00 00 00 00 ...k............ +| 3472: 00 00 22 08 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3488: 32 74 32 08 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3504: 20 74 32 28 78 29 56 07 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 42 4c 4f 42 29 5e 05 07 17 21 Y, sz BLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 74 31 5f 63 6f 6e 74 !...tablet1_cont +| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19 c0, c1, c2)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 ...-tablet1_idxt +| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 00 00 00 00 00 00 (a,b,c)......... +| page 3 offset 8192 +| 0: 0d 00 00 00 03 0c 94 00 0f e6 0f ef 0c 94 00 00 ................ +| 3216: 00 00 00 00 86 4a 84 80 80 80 80 01 04 00 8d 18 .....J.......... +| 3232: 00 00 03 2b 02 30 30 01 02 06 01 02 06 01 02 06 ...+.00......... +| 3248: 1f 02 03 01 02 03 01 02 03 01 08 32 30 31 36 30 ...........20160 +| 3264: 36 30 39 01 02 07 01 02 07 01 02 07 01 01 34 01 609...........4. +| 3280: 02 05 01 02 05 01 02 05 01 01 35 01 02 04 01 02 ..........5..... +| 3296: 04 01 02 04 02 07 30 30 30 30 30 30 30 1c 02 04 ......0000000... +| 3312: 01 02 04 01 02 04 01 06 62 69 6e 61 72 79 03 06 ........binary.. +| 3328: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3344: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3360: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3376: 03 06 01 02 02 03 06 01 02 02 01 08 63 6f 6d 70 ............comp +| 3392: 69 6c 65 72 01 02 02 01 02 02 01 02 02 01 06 64 iler...........d +| 3408: 62 73 74 61 74 07 02 03 01 02 03 01 02 03 02 04 bstat........... +| 3424: 65 62 75 67 04 02 02 01 02 02 01 02 02 01 06 65 ebug...........e +| 3440: 6e 61 62 6c 65 07 02 02 01 02 02 01 02 02 01 02 nable........... +| 3456: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 ................ +| 3472: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 ................ +| 3488: 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 ................ +| 3504: 02 01 02 02 02 08 78 74 65 6e 73 69 6f 6e 1f 02 ......xtension.. +| 3520: 04 01 02 04 01 02 04 01 04 66 74 73 34 0a 02 03 .........fts4... +| 3536: 01 02 03 01 02 03 04 01 35 0d 02 03 01 02 03 01 ........5....... +| 3552: 02 03 01 03 67 63 63 01 02 03 01 02 03 01 02 03 ....gcc......... +| 3568: 02 06 65 6f 70 6f 6c 79 10 02 03 01 02 03 01 02 ..eopoly........ +| 3584: 03 01 05 6a 73 6f 6e 31 13 02 03 01 02 03 01 02 ...json1........ +| 3600: 03 01 04 6c 6f 61 64 1f 02 03 01 02 03 01 02 03 ...load......... +| 3616: 01 03 6d 61 78 1c 02 02 01 02 02 01 02 02 02 05 ..max........... +| 3632: 65 6d 6f 72 79 1c 02 03 01 02 03 01 02 03 04 04 emory........... +| 3648: 73 79 73 35 16 02 03 01 02 02 03 01 03 01 06 6e sys5...........n +| 3664: 6f 63 61 73 65 02 06 01 02 02 03 06 01 02 02 03 ocase........... +| 3680: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 ................ +| 3696: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3712: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3728: 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 02 02 ...omit......... +| 3744: 01 05 72 74 72 65 65 19 02 03 01 02 03 01 02 03 ..rtree......... +| 3760: 04 02 69 6d 01 06 01 02 02 03 06 01 02 02 03 06 ..im............ +| 3776: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3792: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3808: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3824: 01 0a 74 68 72 65 61 64 73 61 66 65 03 57 34 56 ..threadsafe.W4V +| 3840: 94 64 91 46 85 84 04 76 74 61 62 07 02 04 01 02 .d.F...vtab..... +| 3856: 04 01 02 04 01 01 78 01 06 01 01 02 01 06 01 01 ......x......... +| 3872: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 10 02 ................ +| 3888: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3904: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3920: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3936: 01 02 01 06 01 01 10 01 06 01 01 02 01 06 01 01 ................ +| 3952: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3968: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3984: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 4000: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 4016: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 4032: 02 01 06 01 01 02 01 06 01 01 02 04 15 13 0c 0c ................ +| 4048: 12 44 13 11 0f 47 13 0f 0c 0e 11 10 0f 0e 10 0f .D...G.......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 24 5a 24 24 0f D..@.......$Z$$. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 01 0f fa 00 00 00 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 24 0c 0a 00 0f d8 0f af 0f 86 0f 74 ....$..........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d5 ...t.[.@.$...... +| 48: 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 00 00 00 00 00 00 00 00 00 ................ +| 3072: 00 00 00 00 00 00 00 00 00 00 18 24 05 00 25 0f ...........$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 31 46 45 3d ..%..THREADS1FE= +| 3152: 30 58 52 64 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRdRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX MEMORY=50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LE RTREEXNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4b 45 20 4d 45 4d 53 59 53 35 58 42 49 NABKE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 42 60 2d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 B`-EMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 46 ....)..ENABLE MF +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 42 4c 45 20 47 45 4f 50 4f 4c 59 58 42 49 4e 41 BLE GEOPOLYXBINA +| 3616: 52 59 1a 11 05 00 39 0f 19 45 4e 41 42 4c 45 2e RY....9..ENABLE. +| 3632: 41 40 47 45 4f 50 4f 4c 59 58 4e 4f 43 41 53 40 A@GEOPOLYXNOCAS@ +| 3648: 4f 4c 59 58 55 09 10 05 00 29 0f 17 45 4e 41 42 OLYXU....)..ENAB +| 3664: 4c 45 20 47 45 4f 52 54 52 49 4d 17 0f 05 00 23 LE GEORTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f 17 45 4e 41 42 4c 45 20 46 54 53 35 58 .#..ENABLE FTS5X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 17 0b LE FTS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 34 ..#..ENABLE FTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 24 15 48 4e 4f 43 41 53 45 1d TAT VT$.HNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XRTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 6 offset 20480 +| 0: 0d 00 00 00 24 0e e0 00 0f f8 0f f0 0f e8 0f e0 ....$........... +| 16: 0f d8 0f d0 0f c8 0f c0 0f b8 0f b0 0f a8 0f a0 ................ +| 32: 1f 98 0f 90 0f 88 0f 80 0f 78 0f 70 0f 68 0f 60 .........x.p.h.` +| 48: 0f 58 0f 50 0f 48 0f 40 0f 38 0f 30 0f 28 0f 20 .X.P.H.@.8.0.(. +| 64: 0f 18 0f 10 0f 08 0f 00 0e f8 0e f0 0e e8 00 00 ................ +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 15 f3 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 06 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 00 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 03 00 12 06 01 01 ................ +| 4080: 06 02 03 00 12 06 01 01 06 01 03 00 12 06 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 8 offset 28672 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f 00 00 00 00 00 ................ +| 4048: 00 00 00 00 00 00 11 03 02 2b 69 6e 74 65 67 72 .........+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 00 00 00 00 00 00 00 uild....o....... +| end crash-3d05232c78871b.db +}]} {} + +do_execsql_test 11.1 { + UPDATE t1 SET b=quote(zeroblob('2025-01-09')) WHERE t1 MATCH 't*'; + INSERT INTO t1(t1,rank) VALUES('secure-delete',1); +} + +do_catchsql_test 11.2 { + BEGIN; + REPLACE INTO t1(rowid,b,a,rowid) VALUES(x'44023b9eb002d28b0ee90c',1,2,3); + PRAGMA writable_schema=RESET; + INSERT INTO t1(t1) SELECT x FROM t2; + ROLLBACK; +} {1 {database disk image is malformed}} + +do_catchsql_test 11.3 { + REPLACE INTO t1(rowid,b,a,rowid) VALUES(x'44023b9eb002d28b0ee90c',1,2,3); +} {1 {database disk image is malformed}} + + sqlite3_fts5_may_be_corrupt 0 finish_test diff --git a/ext/fts5/test/fts5version.test b/ext/fts5/test/fts5version.test index a92c0dc9f4..58dd9fe14e 100644 --- a/ext/fts5/test/fts5version.test +++ b/ext/fts5/test/fts5version.test @@ -112,7 +112,7 @@ do_execsql_test 2.1 { do_execsql_test 2.2 { SELECT v FROM xyz_config WHERE k='version'; -} {5} +} {4} do_execsql_test 2.3 { ROLLBACK TO one; diff --git a/manifest b/manifest index c848e6661b..6eb5459a34 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sanother\sassert()\sfailure\sin\sfts5. -D 2025-01-08T20:43:03.635 +C When\sremoving\san\sfts5\sin\ssecure-delete\smode,\sdefer\ssetting\sthe\stable\sversion\sto\sSECUREDELETE\suntil\sflushing\sdata\sto\sdisk.\sThis\sprevents\sproblems\sthat\scan\soccur\sif\sthere\sis\sa\srollback\sor\sstatement\srollback\soperation. +D 2025-01-09T14:10:25.673 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -112,8 +112,8 @@ F ext/fts5/fts5_buffer.c 0eec58bff585f1a44ea9147eae5da2447292080ea435957f7488c70 F ext/fts5/fts5_config.c e7d8dd062b44a66cd77e5a0f74f23a2354cd1f3f8575afb967b2773c3384f7f8 F ext/fts5/fts5_expr.c 69b8d976058512c07dfe86e229521b7a871768157bd1607cedf1a5038dfd72c9 F ext/fts5/fts5_hash.c adda4272be401566a6e0ba1acbe70ee5cb97fce944bc2e04dc707152a0ec91b1 -F ext/fts5/fts5_index.c 1a450035b9e06cc82fcd75f71d6ed9028a78bd56101dcb0c813346e1e91c722a -F ext/fts5/fts5_main.c 9ba1871ee99c415756346ea515d0fd31162d599b9b39a29a5b5a265509f136e3 +F ext/fts5/fts5_index.c f1f6da5938af616e0a5e54f0423a3134df95b9f17ac1c6ebf2e2e8132bbc75b9 +F ext/fts5/fts5_main.c 9a1daef7247f9b8a50b4159323e340efa6b0e4bea4fcd83580480f94d4f2c888 F ext/fts5/fts5_storage.c 1ad05dab4830a4e2eaf2900bb143477f93bc17437093582f36f4b818809e88d8 F ext/fts5/fts5_tcl.c 7fb5a3d3404099075aaa2457307cb459bbc257c0de3dbd52b1e80a5b503e0329 F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee @@ -163,7 +163,7 @@ F ext/fts5/test/fts5corrupt.test 6485f721b88ba355ca5d701e7ee87a4efa3ea578d8e6adb F ext/fts5/test/fts5corrupt2.test 335911e3f68b9625d850325f9e29a128db3f4276a8c9d4e32134580da8f924c4 F ext/fts5/test/fts5corrupt3.test 3420ad30bf9e9bbdbd43b3224c582431744899530a65b11b60ddacdf14200e19 F ext/fts5/test/fts5corrupt4.test dc08d19f5b8943e95a7778a7d8da592042504faf18dd93f68f7d7a0d7d7dd733 -F ext/fts5/test/fts5corrupt5.test b1199f316976dc0396caac59655f489576b7dd29c2520799af19ce3386ef6562 +F ext/fts5/test/fts5corrupt5.test bcf0801b0c991eadae3cb8e978e82b4bf01412cb4df41874a90d5aa279c7cc96 F ext/fts5/test/fts5corrupt6.test 2d72db743db7b5d9c9a6d0cfef24d799ed1aa5e8192b66c40e871a37ed9eed06 F ext/fts5/test/fts5corrupt7.test 4e830875c33b9ea3c4cf1ba71e692b63893cbb4faae8c69b1071889dc26e211c F ext/fts5/test/fts5corrupt8.test b81d802e41631e98100f49a1aadeeffef860e30a62d6ed7d743c2797c477239e @@ -264,7 +264,7 @@ F ext/fts5/test/fts5unindexed.test 168838d2c385e131120bbf5b516d2432a5fabc4caa225 F ext/fts5/test/fts5unindexed2.test 516236eceaac05ace322290a0d3705b4c4ffe4760d8eb9d014d9d27d56dfcc02 F ext/fts5/test/fts5update.test b8affd796e45c94a4d19ad5c26606ea06065a0f162a9562d9f005b5a80ccf0bc F ext/fts5/test/fts5update2.test c5baa76799ac605ebb8e5e21035db2014b396cef25c903eb96ba39b1d6f9f046 -F ext/fts5/test/fts5version.test c22d163c17e60a99f022cbc52de5a48bb7f84deaa00fe15e9bc4c3aa1996204e +F ext/fts5/test/fts5version.test 44ab35566267b7618c090443de2d9ad84f633df5d20bf72e9bad199ae5fced84 F ext/fts5/test/fts5vocab.test 2a2bdb60d0998fa3124d541b6d30b019504918dc43a6584645b63a24be72f992 F ext/fts5/test/fts5vocab2.test bbba149c254375d00055930c1a501c9a51e80b0d20bf7b98f3e9fa3b03786373 F ext/fts5/tool/fts5speed.tcl b0056f91a55b2d1a3684ec05729de92b042e2f85 @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P c0b691095ae72fc07530777ef6d23688fb4196ce2e0feff14fc3c597c572252d -R 25cf4f6dfa19d9549598c6fb3f0ef39b +P 6da37893f5b5729ea5fd632e8d98789e867488a67501d4a4dad92f8e7cb6bda0 +R 659181897535bd26e43a32e9be047282 U dan -Z af424067c12fe68ac83a2d82b8d3d4b3 +Z a32ef00755f10bd4444e41dd1939dfc6 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index c25464140b..30a1951bd1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6da37893f5b5729ea5fd632e8d98789e867488a67501d4a4dad92f8e7cb6bda0 +c359e555ceafcaab2ae38074bc4f57cccdc5bc6080d17f82290c09b9e5dd80c2 From 35ac4c868572c57b12e7f034b299a632e2151ca0 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 9 Jan 2025 19:57:44 +0000 Subject: [PATCH 045/220] Update the makefile so that it puts the amalgamation files in a subdirectory in the amalgamation-zip. [forum:/forumpost/b8dd1941e1|Forum post b8dd1941e1]. FossilOrigin-Name: cef8e88bedf01dc47012ef1cb878b22117c9966e615edf5a69704486f9cfa56c --- manifest | 14 +++++++------- manifest.uuid | 2 +- tool/mkamalzip.tcl | 12 ++++++++++-- 3 files changed, 18 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 6eb5459a34..defee4b6a3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sremoving\san\sfts5\sin\ssecure-delete\smode,\sdefer\ssetting\sthe\stable\sversion\sto\sSECUREDELETE\suntil\sflushing\sdata\sto\sdisk.\sThis\sprevents\sproblems\sthat\scan\soccur\sif\sthere\sis\sa\srollback\sor\sstatement\srollback\soperation. -D 2025-01-09T14:10:25.673 +C Update\sthe\smakefile\sso\sthat\sit\sputs\sthe\samalgamation\sfiles\sin\sa\ssubdirectory\nin\sthe\samalgamation-zip.\n[forum:/forumpost/b8dd1941e1|Forum\spost\sb8dd1941e1]. +D 2025-01-09T19:57:44.593 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -2139,7 +2139,7 @@ F tool/loadfts.c c3c64e4d5e90e8ba41159232c2189dba4be7b862 F tool/logest.c c34e5944318415de513d29a6098df247a9618c96d83c38d4abd88641fe46e669 F tool/max-limits.c cbb635fbb37ae4d05f240bfb5b5270bb63c54439 F tool/merge-test.tcl de76b62f2de2a92d4c1ca4f976bce0aea6899e0229e250479b229b2a1914b176 -F tool/mkamalzip.tcl 8a1b21fb6a7f990eb9625e08daa2dd0e03cb551bccc69ccd1cdd5bd975e8177a +F tool/mkamalzip.tcl 8aa5ebe7973c8b8774062d34e15fea9815c4cc2ceea3a9b184695f005910876a F tool/mkautoconfamal.sh cbdcf993fa83dccbef7fb77b39cdeb31ef9f77d9d88c9e343b58d35ca3898a6a F tool/mkccode.tcl 210159febe0ef0ecbc53c79833500663ceaba0115b2b374405818dc835b5f84b x F tool/mkctimec.tcl ef6a67ec82e5b6fc19152a4c79f237227b18bf67ff16d155bac7adb94355d9cf x @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 6da37893f5b5729ea5fd632e8d98789e867488a67501d4a4dad92f8e7cb6bda0 -R 659181897535bd26e43a32e9be047282 -U dan -Z a32ef00755f10bd4444e41dd1939dfc6 +P c359e555ceafcaab2ae38074bc4f57cccdc5bc6080d17f82290c09b9e5dd80c2 +R 4acc7fa1125cb682f7786bdefbb3cacb +U drh +Z 1b3035dddd40c2669ae993db009fbd5c # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 30a1951bd1..afb4e5caa1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c359e555ceafcaab2ae38074bc4f57cccdc5bc6080d17f82290c09b9e5dd80c2 +cef8e88bedf01dc47012ef1cb878b22117c9966e615edf5a69704486f9cfa56c diff --git a/tool/mkamalzip.tcl b/tool/mkamalzip.tcl index a7c6587566..92feb4122e 100644 --- a/tool/mkamalzip.tcl +++ b/tool/mkamalzip.tcl @@ -9,7 +9,15 @@ set vers [read $fd] close $fd scan $vers %d.%d.%d major minor patch set numvers [format {3%02d%02d00} $minor $patch] -set cmd "zip sqlite-amalgamation-$numvers.zip\ - sqlite3.c sqlite3.h shell.c sqlite3ext.h" +set dir sqlite-amalgamation-$numvers +file delete -force $dir +file mkdir $dir +set filelist {sqlite3.c sqlite3.h shell.c sqlite3ext.h} +foreach f $filelist { + file copy $f $dir/$f +} +set cmd "zip -r $dir.zip $dir" puts $cmd +file delete -force $dir.zip exec {*}$cmd +file delete -force $dir From c1f914dbc986e7e9ef6643eb02e03ec5cb55c3d0 Mon Sep 17 00:00:00 2001 From: stephan Date: Sat, 11 Jan 2025 09:02:55 +0000 Subject: [PATCH 046/220] Fix an age-old bug in the lower-level wasm/js helper bits which was (A) caused removal of customized WASM func/argument conversion to siltently fail and (B) triggered a warning in the closure toolchain. Reported in [jaccwabyt ticket c5c296e85a7c01360820|https://fossil.wanderinghorse.net/r/jaccwabyt/info/c5c296e85a7c01360820]. FossilOrigin-Name: 99917a5bb04b5ad6ace95baf86d91e6ce098f9d3001de1a29d3d0b0b817acdce --- ext/wasm/common/whwasmutil.js | 2 +- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ext/wasm/common/whwasmutil.js b/ext/wasm/common/whwasmutil.js index 25400d48e3..8fe4a990b6 100644 --- a/ext/wasm/common/whwasmutil.js +++ b/ext/wasm/common/whwasmutil.js @@ -2055,7 +2055,7 @@ globalThis.WhWasmUtilInstaller = function(target){ if(1===argc) return xcvPart.get(typeName); else if(2===argc){ if(!adapter){ - delete xcvPart.get(typeName); + xcvPart.delete(typeName); return func; }else if(!(adapter instanceof Function)){ toss(modeName,"requires a function argument."); diff --git a/manifest b/manifest index defee4b6a3..d41be8009b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sthe\smakefile\sso\sthat\sit\sputs\sthe\samalgamation\sfiles\sin\sa\ssubdirectory\nin\sthe\samalgamation-zip.\n[forum:/forumpost/b8dd1941e1|Forum\spost\sb8dd1941e1]. -D 2025-01-09T19:57:44.593 +C Fix\san\sage-old\sbug\sin\sthe\slower-level\swasm/js\shelper\sbits\swhich\swas\s(A)\scaused\sremoval\sof\scustomized\sWASM\sfunc/argument\sconversion\sto\ssiltently\sfail\sand\s(B)\striggered\sa\swarning\sin\sthe\sclosure\stoolchain.\sReported\sin\s[jaccwabyt\sticket\sc5c296e85a7c01360820|https://fossil.wanderinghorse.net/r/jaccwabyt/info/c5c296e85a7c01360820]. +D 2025-01-11T09:02:55.088 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -658,7 +658,7 @@ F ext/wasm/c-pp.c 6d131069644964223305582a80973477fa8b06b57306781690d7874ebd3a4f F ext/wasm/common/SqliteTestUtil.js 7adaeffef757d8708418dc9190f72df22367b531831775804b31598b44f6aa51 F ext/wasm/common/emscripten.css 11bd104b6c0d597c67d40cc8ecc0a60dae2b965151e3b6a37fa5708bac3acd15 F ext/wasm/common/testing.css e97549bab24126c24e0daabfe2de9bb478fb0a69fdb2ddd0a73a992c091aad6f -F ext/wasm/common/whwasmutil.js 6181f8cd958700f3723350bd4d76c7cc797db331a9aa14b25b42d121f12d6fee +F ext/wasm/common/whwasmutil.js d76c69617e95d85ffc9996f7d9d7481df6976dcbd860ecd82bd8c075e3a101ae F ext/wasm/demo-123-worker.html a0b58d9caef098a626a1a1db567076fca4245e8d60ba94557ede8684350a81ed F ext/wasm/demo-123.html 8c70a412ce386bd3796534257935eb1e3ea5c581e5d5aea0490b8232e570a508 F ext/wasm/demo-123.js c7b3cca50c55841c381a9ca4f9396e5bbdc6114273d0b10a43e378e32e7be5bf @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P c359e555ceafcaab2ae38074bc4f57cccdc5bc6080d17f82290c09b9e5dd80c2 -R 4acc7fa1125cb682f7786bdefbb3cacb -U drh -Z 1b3035dddd40c2669ae993db009fbd5c +P cef8e88bedf01dc47012ef1cb878b22117c9966e615edf5a69704486f9cfa56c +R 2966a1ed8608823769a5c4d3eb2bc028 +U stephan +Z 02b31671f60b5e3785eaa517886d85b1 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index afb4e5caa1..a540ad80d9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cef8e88bedf01dc47012ef1cb878b22117c9966e615edf5a69704486f9cfa56c +99917a5bb04b5ad6ace95baf86d91e6ce098f9d3001de1a29d3d0b0b817acdce From 27661f24cd6fc71387af5a48caf3fc38dffe1b14 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 11 Jan 2025 13:59:42 +0000 Subject: [PATCH 047/220] Fix harmless scan-build warnings. FossilOrigin-Name: b93af6feb7c0c3af30a47810a7c0e77ce41c386fac164c64bb5871a6c153db7e --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/expr.c | 1 + src/shell.c.in | 1 + 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index d41be8009b..6f043074b9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sage-old\sbug\sin\sthe\slower-level\swasm/js\shelper\sbits\swhich\swas\s(A)\scaused\sremoval\sof\scustomized\sWASM\sfunc/argument\sconversion\sto\ssiltently\sfail\sand\s(B)\striggered\sa\swarning\sin\sthe\sclosure\stoolchain.\sReported\sin\s[jaccwabyt\sticket\sc5c296e85a7c01360820|https://fossil.wanderinghorse.net/r/jaccwabyt/info/c5c296e85a7c01360820]. -D 2025-01-11T09:02:55.088 +C Fix\sharmless\sscan-build\swarnings. +D 2025-01-11T13:59:42.950 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -728,7 +728,7 @@ F src/date.c 89ce1ff20512a7fa5070ba6e7dd5c171148ca7d580955795bf97c79c2456144a F src/dbpage.c e90410e5d4c0217dfddc4184a81e38ec4903c25d4ec0f201060a0e54e7c2099f F src/dbstat.c 73362c0df0f40ad5523a6f5501224959d0976757b511299bf892313e79d14f5c F src/delete.c 03a77ba20e54f0f42ebd8eddf15411ed6bdb06a2c472ac4b6b336521bf7cea42 -F src/expr.c 3329173aacc6c37da3971b6253827799b32e301673be00126df8271bf018e15f +F src/expr.c bc600813682b849ef180fffd26fbb36397016366ac1246aa3d3d58f9a31f88f8 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 928ed2517e8732113d2b9821aa37af639688d752f4ea9ac6e0e393d713eeb76f F src/func.c 89b733a5f513c4bc06b7271384363d5693d62782de8295bc87b97d79862c9714 @@ -779,7 +779,7 @@ F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c F src/resolve.c c8a5372b97b2a2e972a280676f06ddb5b74e885d3b1f5ce383f839907b57ef68 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 F src/select.c 83e88fbb36f89b6703b348777491619554f0fd6f917c9fdf51e4c2e9cda6c04e -F src/shell.c.in a9c0f8066eac40f1f97b8554bb0462b07263d5c02380cc1ef74734c5d1c67637 +F src/shell.c.in d6d1901fda17a7ab5443e6a6fbc3ca523c01c85058cf0d3ce2e2e5c2e898915e F src/sqlite.h.in 6afbcaae44140216704a6c82e4c4ea4118c46d5f6573d6c5fa4fc901ed9d369e F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54 @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P cef8e88bedf01dc47012ef1cb878b22117c9966e615edf5a69704486f9cfa56c -R 2966a1ed8608823769a5c4d3eb2bc028 -U stephan -Z 02b31671f60b5e3785eaa517886d85b1 +P 99917a5bb04b5ad6ace95baf86d91e6ce098f9d3001de1a29d3d0b0b817acdce +R 4a4f027b9e85dc62acdf46f689ae54cd +U drh +Z a5dd0b9f1006749b9a2e9efcfdf75968 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index a540ad80d9..034199fd7d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -99917a5bb04b5ad6ace95baf86d91e6ce098f9d3001de1a29d3d0b0b817acdce +b93af6feb7c0c3af30a47810a7c0e77ce41c386fac164c64bb5871a6c153db7e diff --git a/src/expr.c b/src/expr.c index 86c966683c..8c118d0779 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3285,6 +3285,7 @@ int sqlite3FindInIndex( if( aiMap ) aiMap[i] = j; } + assert( nExproutCount = 2; }else{ From 4b5e8c926ac48d83f70ae9fc1db8a6a9f6b73454 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 11 Jan 2025 14:43:47 +0000 Subject: [PATCH 048/220] Better job at suppressing harmless scan-build warnings. This time testing and working. FossilOrigin-Name: c847973947de67579fab78a65ecfc90bf59fd5db0b7fa7a9c1abb1fc92213d01 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/expr.c | 2 +- src/shell.c.in | 4 +++- 4 files changed, 12 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 6f043074b9..cf63954c97 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\sscan-build\swarnings. -D 2025-01-11T13:59:42.950 +C Better\sjob\sat\ssuppressing\sharmless\sscan-build\swarnings.\s\sThis\stime\stesting\nand\sworking. +D 2025-01-11T14:43:47.901 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -728,7 +728,7 @@ F src/date.c 89ce1ff20512a7fa5070ba6e7dd5c171148ca7d580955795bf97c79c2456144a F src/dbpage.c e90410e5d4c0217dfddc4184a81e38ec4903c25d4ec0f201060a0e54e7c2099f F src/dbstat.c 73362c0df0f40ad5523a6f5501224959d0976757b511299bf892313e79d14f5c F src/delete.c 03a77ba20e54f0f42ebd8eddf15411ed6bdb06a2c472ac4b6b336521bf7cea42 -F src/expr.c bc600813682b849ef180fffd26fbb36397016366ac1246aa3d3d58f9a31f88f8 +F src/expr.c 30a407765d4e4b592f9f958085fb4e8336e54fa46a70ade7f5a67111bc191563 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 928ed2517e8732113d2b9821aa37af639688d752f4ea9ac6e0e393d713eeb76f F src/func.c 89b733a5f513c4bc06b7271384363d5693d62782de8295bc87b97d79862c9714 @@ -779,7 +779,7 @@ F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c F src/resolve.c c8a5372b97b2a2e972a280676f06ddb5b74e885d3b1f5ce383f839907b57ef68 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 F src/select.c 83e88fbb36f89b6703b348777491619554f0fd6f917c9fdf51e4c2e9cda6c04e -F src/shell.c.in d6d1901fda17a7ab5443e6a6fbc3ca523c01c85058cf0d3ce2e2e5c2e898915e +F src/shell.c.in aca84434e73942aaaefdba3790fd147c75f73f7c6908959cf2d5cd6a53e8ee76 F src/sqlite.h.in 6afbcaae44140216704a6c82e4c4ea4118c46d5f6573d6c5fa4fc901ed9d369e F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54 @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 99917a5bb04b5ad6ace95baf86d91e6ce098f9d3001de1a29d3d0b0b817acdce -R 4a4f027b9e85dc62acdf46f689ae54cd +P b93af6feb7c0c3af30a47810a7c0e77ce41c386fac164c64bb5871a6c153db7e +R ae54af26d9f89a39f6b222b17c0e4b08 U drh -Z a5dd0b9f1006749b9a2e9efcfdf75968 +Z 623dab57f8e4a45135026255ca9de26f # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 034199fd7d..16c5fbe1c6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b93af6feb7c0c3af30a47810a7c0e77ce41c386fac164c64bb5871a6c153db7e +c847973947de67579fab78a65ecfc90bf59fd5db0b7fa7a9c1abb1fc92213d01 diff --git a/src/expr.c b/src/expr.c index 8c118d0779..ca5b9092e7 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3285,7 +3285,7 @@ int sqlite3FindInIndex( if( aiMap ) aiMap[i] = j; } - assert( nExpr0 && nExpr Date: Sat, 11 Jan 2025 16:28:41 +0000 Subject: [PATCH 049/220] Fix harmless "implicit fall through" warnings that suddenly appeared when I upgraded to gcc-13. FossilOrigin-Name: 3e2875dac27de1525d9c78f38ac5f1fc12fec7e1b43dbdf47798b128fae49084 --- ext/misc/base64.c | 9 ++++++--- ext/misc/base85.c | 4 ++++ manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/shell.c.in | 6 +++--- 5 files changed, 22 insertions(+), 15 deletions(-) diff --git a/ext/misc/base64.c b/ext/misc/base64.c index bc7a976abc..b8147707f9 100644 --- a/ext/misc/base64.c +++ b/ext/misc/base64.c @@ -175,15 +175,15 @@ static u8* fromBase64( char *pIn, int ncIn, u8 *pOut ){ case ND: /* Treat dark non-digits as pad, but they terminate decode too. */ ncIn = 0; - deliberate_fall_through; + deliberate_fall_through; /* FALLTHRU */ case WS: /* Treat whitespace as pad and terminate this group.*/ nti = nac; - deliberate_fall_through; + deliberate_fall_through; /* FALLTHRU */ case PC: bdp = 0; --nbo; - deliberate_fall_through; + deliberate_fall_through; /* FALLTHRU */ default: /* bdp is the digit value. */ qv = qv<<6 | bdp; break; @@ -192,10 +192,13 @@ static u8* fromBase64( char *pIn, int ncIn, u8 *pOut ){ switch( nbo ){ case 3: pOut[2] = (qv) & 0xff; + deliberate_fall_through; /* FALLTHRU */ case 2: pOut[1] = (qv>>8) & 0xff; + deliberate_fall_through; /* FALLTHRU */ case 1: pOut[0] = (qv>>16) & 0xff; + deliberate_fall_through; /* FALLTHRU */ } pOut += nbo; } diff --git a/ext/misc/base85.c b/ext/misc/base85.c index e7ef0a04c9..eaf1732c46 100644 --- a/ext/misc/base85.c +++ b/ext/misc/base85.c @@ -232,12 +232,16 @@ static u8* fromBase85( char *pIn, int ncIn, u8 *pOut ){ switch( nbo ){ case 4: *pOut++ = (qv >> 24)&0xff; + /* FALLTHRU */ case 3: *pOut++ = (qv >> 16)&0xff; + /* FALLTHRU */ case 2: *pOut++ = (qv >> 8)&0xff; + /* FALLTHRU */ case 1: *pOut++ = qv&0xff; + /* FALLTHRU */ case 0: break; } diff --git a/manifest b/manifest index cf63954c97..ba912442f4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Better\sjob\sat\ssuppressing\sharmless\sscan-build\swarnings.\s\sThis\stime\stesting\nand\sworking. -D 2025-01-11T14:43:47.901 +C Fix\sharmless\s"implicit\sfall\sthrough"\swarnings\sthat\ssuddenly\sappeared\swhen\nI\supgraded\sto\sgcc-13. +D 2025-01-11T16:28:41.860 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -400,8 +400,8 @@ F ext/misc/README.md d6dd0fe1d8af77040216798a6a2b0c46c73054d2f0ea544fbbcdccf6f23 F ext/misc/amatch.c 5001711cbecdd57b288cb613386789f3034e5beb58fbe0c79f2b3d643ffd4e03 F ext/misc/anycollseq.c 5ffdfde9829eeac52219136ad6aa7cd9a4edb3b15f4f2532de52f4a22525eddb F ext/misc/appendvfs.c 9642c7a194a2a25dca7ad3e36af24a0a46d7702168c4ad7e59c9f9b0e16a3824 -F ext/misc/base64.c a71b131e50300c654a66c469a25b62874481f3d1cb3beb56aca9a68edd812e0d -F ext/misc/base85.c 073054111988db593ef5fdb87ab8c459df1ea0c3aaaddf0f5bfa3d72b7e6280a +F ext/misc/base64.c 95abb0547cb1799d9851f3357c8d7fc3c09a95c63c8772aa3acd5f65f12050f6 +F ext/misc/base85.c a70c885c5c9350261ea6e7b166038eab21a09cf4fceae856ce41fae9c2213b60 F ext/misc/basexx.c 89ad6b76558efbceb627afd5e2ef1d84b2e96d9aaf9b7ecb20e3d00b51be6fcf F ext/misc/blobio.c a867c4c4617f6ec223a307ebfe0eabb45e0992f74dd47722b96f3e631c0edb2a F ext/misc/btreeinfo.c cb952620eedf5c0b7625b678f0f08e54d2ec0011d4e50efda5ebdc97f3df7d04 @@ -779,7 +779,7 @@ F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c F src/resolve.c c8a5372b97b2a2e972a280676f06ddb5b74e885d3b1f5ce383f839907b57ef68 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 F src/select.c 83e88fbb36f89b6703b348777491619554f0fd6f917c9fdf51e4c2e9cda6c04e -F src/shell.c.in aca84434e73942aaaefdba3790fd147c75f73f7c6908959cf2d5cd6a53e8ee76 +F src/shell.c.in beb370609906092a6810fcd9ea76737be2c91694445061c2eb05c4c0a3753de4 F src/sqlite.h.in 6afbcaae44140216704a6c82e4c4ea4118c46d5f6573d6c5fa4fc901ed9d369e F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54 @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P b93af6feb7c0c3af30a47810a7c0e77ce41c386fac164c64bb5871a6c153db7e -R ae54af26d9f89a39f6b222b17c0e4b08 +P c847973947de67579fab78a65ecfc90bf59fd5db0b7fa7a9c1abb1fc92213d01 +R 21473fba427f7d039b2fd83376887456 U drh -Z 623dab57f8e4a45135026255ca9de26f +Z b74c42c31ff873968b8ed05fb8e82534 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 16c5fbe1c6..899a15f66c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c847973947de67579fab78a65ecfc90bf59fd5db0b7fa7a9c1abb1fc92213d01 +3e2875dac27de1525d9c78f38ac5f1fc12fec7e1b43dbdf47798b128fae49084 diff --git a/src/shell.c.in b/src/shell.c.in index db0604eb18..17054a961c 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -7337,7 +7337,7 @@ static int arProcessSwitch(ArCommand *pAr, int eSwitch, const char *zArg){ break; case AR_SWITCH_APPEND: pAr->bAppend = 1; - deliberate_fall_through; + deliberate_fall_through; /* FALLTHRU */ case AR_SWITCH_FILE: pAr->zFile = zArg; break; @@ -12029,7 +12029,7 @@ static QuickScanState quickscan(char *zLine, QuickScanState qss, break; case '[': cin = ']'; - deliberate_fall_through; + deliberate_fall_through; /* FALLTHRU */ case '`': case '\'': case '"': cWait = cin; qss = QSS_HasDark | cWait; @@ -12064,7 +12064,7 @@ static QuickScanState quickscan(char *zLine, QuickScanState qss, ++zLine; continue; } - deliberate_fall_through; + deliberate_fall_through; /* FALLTHRU */ case ']': CONTINUE_PROMPT_AWAITC(pst, 0); qss = QSS_SETV(qss, 0); From 43afab28a09659f7869661a8e56f21865af2414d Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 13 Jan 2025 11:28:34 +0000 Subject: [PATCH 050/220] GCC 13 has become more quite pedantic about the signature of functions matching the type of pointers through which the functions are called. Make adjustments to extension functions and test procedures to work around this. No changes to the core. FossilOrigin-Name: ed83b79100b4345235aec990303c4526874f0c2f8701160c4639a80633ebaf70 --- ext/misc/closure.c | 7 ++++++- ext/misc/regexp.c | 3 ++- ext/session/test_session.c | 3 --- manifest | 22 +++++++++++----------- manifest.uuid | 2 +- src/test1.c | 12 ++++++++---- src/test_intarray.c | 3 ++- src/test_malloc.c | 6 ++++-- 8 files changed, 34 insertions(+), 24 deletions(-) diff --git a/ext/misc/closure.c b/ext/misc/closure.c index 79a5a21d1e..267ae1c424 100644 --- a/ext/misc/closure.c +++ b/ext/misc/closure.c @@ -588,12 +588,17 @@ static int closureOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ return SQLITE_OK; } +/* +** Wrapper around sqlite3_free +*/ +static void closureMemFree(closure_avl *p){ sqlite3_free(p); } + /* ** Free up all the memory allocated by a cursor. Set it rLimit to 0 ** to indicate that it is at EOF. */ static void closureClearCursor(closure_cursor *pCur){ - closureAvlDestroy(pCur->pClosure, (void(*)(closure_avl*))sqlite3_free); + closureAvlDestroy(pCur->pClosure, closureMemFree); sqlite3_free(pCur->zTableName); sqlite3_free(pCur->zIdColumn); sqlite3_free(pCur->zParentColumn); diff --git a/ext/misc/regexp.c b/ext/misc/regexp.c index a50008ca35..71c7ea4c22 100644 --- a/ext/misc/regexp.c +++ b/ext/misc/regexp.c @@ -656,7 +656,8 @@ static const char *re_subcompile_string(ReCompiled *p){ ** regular expression. Applications should invoke this routine once ** for every call to re_compile() to avoid memory leaks. */ -static void re_free(ReCompiled *pRe){ +static void re_free(void *p){ + ReCompiled *pRe = (ReCompiled*)p; if( pRe ){ sqlite3_free(pRe->aOp); sqlite3_free(pRe->aArg); diff --git a/ext/session/test_session.c b/ext/session/test_session.c index 29aeadf537..41d6aaa109 100644 --- a/ext/session/test_session.c +++ b/ext/session/test_session.c @@ -719,7 +719,6 @@ static int replace_handler( const char *zTab; /* Name of table conflict is on */ int nCol; /* Number of columns in table zTab */ int i; - int x = 0; sqlite3changeset_op(pIter, &zTab, &nCol, &op, 0); @@ -728,7 +727,6 @@ static int replace_handler( sqlite3_value *pVal; sqlite3changeset_old(pIter, i, &pVal); sqlite3_value_text16(pVal); - x++; } } @@ -737,7 +735,6 @@ static int replace_handler( sqlite3_value *pVal; sqlite3changeset_new(pIter, i, &pVal); sqlite3_value_text16(pVal); - x++; } } diff --git a/manifest b/manifest index ba912442f4..d079f815d5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\s"implicit\sfall\sthrough"\swarnings\sthat\ssuddenly\sappeared\swhen\nI\supgraded\sto\sgcc-13. -D 2025-01-11T16:28:41.860 +C GCC\s13\shas\sbecome\smore\squite\spedantic\sabout\sthe\ssignature\sof\sfunctions\smatching\sthe\ntype\sof\spointers\sthrough\swhich\sthe\sfunctions\sare\scalled.\s\sMake\sadjustments\sto\nextension\sfunctions\sand\stest\sprocedures\sto\swork\saround\sthis.\s\sNo\schanges\sto\sthe\ncore. +D 2025-01-13T11:28:34.810 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -408,7 +408,7 @@ F ext/misc/btreeinfo.c cb952620eedf5c0b7625b678f0f08e54d2ec0011d4e50efda5ebdc97f F ext/misc/carray.c 34fac63770971611c5285de0a9f0ac67d504eaf66be891f637add9290f1c76a5 F ext/misc/carray.h 503209952ccf2431c7fd899ebb92bf46bf7635b38aace42ec8aa1b8d7b6e98a5 F ext/misc/cksumvfs.c 3a7931dd30667be6348af919f3f9e6188dfd7646b42af8e399a499b327f5bd63 -F ext/misc/closure.c 0e04f52d93e678dd6f950f195f365992edf3c380df246f3d80425cba4c13891e +F ext/misc/closure.c 87e0967772e0087e709887ce7ca9cf13aa32d2096e33b5d3382c8b8d477c6cb1 F ext/misc/completion.c cb978c88d5577821323617a8ea775ce1b920e02dcdb593858f02044a4d008eea F ext/misc/compress.c 2c79a74330e0e0ba6cb3f7397f8ba5af12d46377ef5d3ee075e12dd8a6ed57f0 F ext/misc/csv.c 575c2c05fba0a451586a4d42c2c81e711780c41e797126f198d8d9e0a308dcdb @@ -432,7 +432,7 @@ F ext/misc/percentile.c 82531c62cd015b9cdca95ad6bb10c3a907ceb570d21ebd4fb7d634c8 F ext/misc/prefixes.c 82645f79229877afab08c8b08ca1e7fa31921280906b90a61c294e4f540cd2a6 F ext/misc/qpvtab.c fc189e127f68f791af90a487f4460ec91539a716daf45a0c357e963fd47cc06c F ext/misc/randomjson.c ef835fc64289e76ac4873b85fe12f9463a036168d7683cf2b773e36e6262c4ed -F ext/misc/regexp.c 4bdd0045912f81c84908bd535ec5ad3b1c8540b4287c70ab84070963624047db +F ext/misc/regexp.c 388e7f237307c7dfbfb8dde44e097946f6c437801d63f0d7ad63f3320d4e61cc F ext/misc/remember.c add730f0f7e7436cd15ea3fd6a90fd83c3f706ab44169f7f048438b7d6baa69c F ext/misc/rot13.c 51ac5f51e9d5fd811db58a9c23c628ad5f333c173f1fc53c8491a3603d38556c F ext/misc/scrub.c 2a44b0d44c69584c0580ad2553f6290a307a49df4668941d2812135bfb96a946 @@ -616,7 +616,7 @@ F ext/session/sessionstat1.test 5e718d5888c0c49bbb33a7a4f816366db85f59f6a4f97544 F ext/session/sessionwor.test 6fd9a2256442cebde5b2284936ae9e0d54bde692d0f5fd009ecef8511f4cf3fc F ext/session/sqlite3session.c d6f5e3e83b9b0bbc4a8db4837284f0ecc6af5321d4c8e7136380b456b278c46a F ext/session/sqlite3session.h 683ccbf16e2c2521661fc4c1cf918ce57002039efbcabcd8097fa4bca569104b -F ext/session/test_session.c aa29abdcc9011ac02f4fa38e8ede226106eaeee7c3ea7d8b2b999a124e0c368c +F ext/session/test_session.c 12e0a2c15fd60f92da4bb29c697c9177ff0c0dbcdc5129a54c47e999f147937a F ext/wasm/EXPORTED_FUNCTIONS.fiddle.in 27450c8b8c70875a260aca55435ec927068b34cef801a96205adb81bdcefc65c F ext/wasm/GNUmakefile 311aa0d5edc7006409962cc77cc26560d92f9be69c2c4302e8bbc68189fd02db F ext/wasm/README-dist.txt 6382cb9548076fca472fb3330bbdba3a55c1ea0b180ff9253f084f07ff383576 @@ -789,7 +789,7 @@ F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 F src/tclsqlite.c c6b9d3a0b1100e1e028460c418c41ca180dac5958e96bef79f6799b552522a37 F src/tclsqlite.h 65e2c761446e1c9fa0342b7d2612a703483643c8b6a316d12a65b745a4727395 -F src/test1.c 07c9b523f90b96f6e9a701476602fa1f82075da19955823316b3fe13eaaa52cc +F src/test1.c 9d2da51b4c33633e7370e4068af6d16d2c52b22a5810ec012ac32e77f8397b64 F src/test2.c 7ebc518e6735939d8979273a6f7b1d9b5702babf059f6ad62499f7f60a9eb9a3 F src/test3.c e7573aa0f78ee4e070a4bc8c3493941c1aa64d5c66d4825c74c0f055451f432b F src/test4.c 13e57ae7ec7a959ee180970aef09deed141252fe9bb07c61054f0dfa4f1dfd5d @@ -810,11 +810,11 @@ F src/test_fs.c c411c40baba679536fc34e2679349f59d8225570aed3488b5b3ef1908525a3d5 F src/test_func.c 858d4dddb7acf88222ebcba7cffb585f6dde83e4a15b838c0d05ccdf8d5219b9 F src/test_hexio.c 7449504e4bde876ba91b202617a9228c7c8c2e7bd8b957302f3803ac0e9e353c F src/test_init.c 17313332d58e90defc527129d5eda4a08bd6b6e8de7207a231523c8d98fb445e -F src/test_intarray.c e4216aadee9df2de7d1aee7e70f6b22c80ee79ece72a63d57105db74217639e5 +F src/test_intarray.c 3fcf8ca7bb5c8776ea83f6aa9b66f8df0d1f37a99207b0097c8486f9c15cedbf F src/test_intarray.h 6c3534641108cd1bea517a8e117dcba237081310a29a4c35bd2190caa8972293 F src/test_journal.c a0b9709b2f12b1ec819eea8a1176f283bca6d688a6d4a502bd6fd79786f4e287 F src/test_loadext.c 337056bae59f80b9eb00ba82088b39d0f4fe6dfd -F src/test_malloc.c a0295e022103b14a1bc5e0660cc2af7fbec05e0d029098782e326e50612e69d9 +F src/test_malloc.c 4954125ee89aa51d9f641d5cb272cc93ca4cb03dcc7c9c941d70210354c69567 F src/test_md5.c 811a45330c9391933360f998156a8907ee29909c828ab83ac05d329942cbea8f F src/test_multiplex.c b99d7f43ec859e6b93a40aaa5455420b3ad133053cce3db739498d29ea30735f F src/test_multiplex.h f0ff5b6f4462bfd46dac165d6375b9530d08089b7bcbe75e88e0926110db5363 @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P c847973947de67579fab78a65ecfc90bf59fd5db0b7fa7a9c1abb1fc92213d01 -R 21473fba427f7d039b2fd83376887456 +P 3e2875dac27de1525d9c78f38ac5f1fc12fec7e1b43dbdf47798b128fae49084 +R 6e0293de1d493e0b13b460e55a82a4db U drh -Z b74c42c31ff873968b8ed05fb8e82534 +Z 4c81104bb07f42df2245a2e0f81e374f # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 899a15f66c..d415ffab2c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3e2875dac27de1525d9c78f38ac5f1fc12fec7e1b43dbdf47798b128fae49084 +ed83b79100b4345235aec990303c4526874f0c2f8701160c4639a80633ebaf70 diff --git a/src/test1.c b/src/test1.c index 4212c73232..c204335dcc 100644 --- a/src/test1.c +++ b/src/test1.c @@ -5681,9 +5681,11 @@ static int SQLITE_TCLAPI test_stmt_utf8( sqlite3_stmt *pStmt; int col; const char *(*xFunc)(sqlite3_stmt*, int); + const unsigned char *(*xFuncU)(sqlite3_stmt*, int); const char *zRet; xFunc = (const char *(*)(sqlite3_stmt*, int))clientData; + xFuncU = (const unsigned char*(*)(sqlite3_stmt*,int))xFunc; if( objc!=3 ){ Tcl_AppendResult(interp, "wrong # args: should be \"", Tcl_GetString(objv[0]), " STMT column", 0); @@ -5692,7 +5694,11 @@ static int SQLITE_TCLAPI test_stmt_utf8( if( getStmtPointer(interp, Tcl_GetString(objv[1]), &pStmt) ) return TCL_ERROR; if( Tcl_GetIntFromObj(interp, objv[2], &col) ) return TCL_ERROR; - zRet = xFunc(pStmt, col); + if( xFunc==sqlite3_column_name || xFunc==sqlite3_column_decltype ){ + zRet = xFunc(pStmt, col); + }else{ + zRet = (const char*)xFuncU(pStmt, col); + } if( zRet ){ Tcl_SetResult(interp, (char *)zRet, 0); } @@ -7562,7 +7568,7 @@ static struct LogCallback { Tcl_Interp *pInterp; Tcl_Obj *pObj; } logcallback = {0, 0}; -static void xLogcallback(void *unused, int err, char *zMsg){ +static void xLogcallback(void *unused, int err, const char *zMsg){ Tcl_Obj *pNew = Tcl_DuplicateObj(logcallback.pObj); Tcl_IncrRefCount(pNew); Tcl_ListObjAppendElement( @@ -8601,7 +8607,6 @@ static int SQLITE_TCLAPI test_decode_hexdb( const char *zIn = 0; unsigned char *a = 0; int n = 0; - int lineno = 0; int i, iNext; int iOffset = 0; int j, k; @@ -8613,7 +8618,6 @@ static int SQLITE_TCLAPI test_decode_hexdb( } zIn = Tcl_GetString(objv[1]); for(i=0; zIn[i]; i=iNext){ - lineno++; for(iNext=i; zIn[iNext] && zIn[iNext]!='\n'; iNext++){} if( zIn[iNext]=='\n' ) iNext++; while( zIn[i]==' ' || zIn[i]=='\t' ){ i++; } diff --git a/src/test_intarray.c b/src/test_intarray.c index 16c1df2e9c..9e4629467e 100644 --- a/src/test_intarray.c +++ b/src/test_intarray.c @@ -61,7 +61,8 @@ struct intarray_cursor { /* ** Free an sqlite3_intarray object. */ -static void intarrayFree(sqlite3_intarray *p){ +static void intarrayFree(void *pX){ + sqlite3_intarray *p = (sqlite3_intarray*)pX; if( p->xFree ){ p->xFree(p->a); } diff --git a/src/test_malloc.c b/src/test_malloc.c index 21faa0d291..8d6c4fa505 100644 --- a/src/test_malloc.c +++ b/src/test_malloc.c @@ -41,8 +41,9 @@ static struct MemFault { ** fire on any simulated malloc() failure. */ static void sqlite3Fault(void){ - static int cnt = 0; + static u64 cnt = 0; cnt++; + if( cnt>((u64)1<<63) ) abort(); } /* @@ -52,8 +53,9 @@ static void sqlite3Fault(void){ ** This routine only runs on the first such failure. */ static void sqlite3FirstFault(void){ - static int cnt2 = 0; + static u64 cnt2 = 0; cnt2++; + if( cnt2>((u64)1<<63) ) abort(); } /* From f1747f93e0f8df7984b595b91649c7789217fe59 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 13 Jan 2025 13:32:56 +0000 Subject: [PATCH 051/220] Remove a stray tab character from a comment. FossilOrigin-Name: 315079b150b47e013e2cde4985bc39d24e0f6f6c6e60f9383fb8ea4ea897c67a --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/where.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index d079f815d5..dfaaeb02a3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C GCC\s13\shas\sbecome\smore\squite\spedantic\sabout\sthe\ssignature\sof\sfunctions\smatching\sthe\ntype\sof\spointers\sthrough\swhich\sthe\sfunctions\sare\scalled.\s\sMake\sadjustments\sto\nextension\sfunctions\sand\stest\sprocedures\sto\swork\saround\sthis.\s\sNo\schanges\sto\sthe\ncore. -D 2025-01-13T11:28:34.810 +C Remove\sa\sstray\stab\scharacter\sfrom\sa\scomment. +D 2025-01-13T13:32:56.652 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -862,7 +862,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 4e6181d8780ab0af2e1388d0754cbe6f2f04593d2b1ab6c41699a89942fd8997 F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 -F src/where.c d519bc93b4a05928f10ba4925b1afc77cbd71c1b1b5148583ab4868925c639fb +F src/where.c 604f17baed46f4997ffe79f25c07c4b51a4165a5938cc27fe165c7e1ca485d11 F src/whereInt.h 1e36ec50392f7cc3d93d1152d4338064cd522b87156a0739388b7e273735f0ca F src/wherecode.c 0c3d3199a2b769a5e2bb70feb5003dc85b3d86842ecaf903a47f2b4205ca5dab F src/whereexpr.c 0f93a29cabd3a338d09a1f5c6770620a1ac51ec1157f3229502a7e7767c60b6f @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 3e2875dac27de1525d9c78f38ac5f1fc12fec7e1b43dbdf47798b128fae49084 -R 6e0293de1d493e0b13b460e55a82a4db +P ed83b79100b4345235aec990303c4526874f0c2f8701160c4639a80633ebaf70 +R 0ed0cfcc7f2bc831da5d62a3490571ed U drh -Z 4c81104bb07f42df2245a2e0f81e374f +Z 2b06b025e298002c2c77b6953d35e566 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index d415ffab2c..aeb488e3a7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ed83b79100b4345235aec990303c4526874f0c2f8701160c4639a80633ebaf70 +315079b150b47e013e2cde4985bc39d24e0f6f6c6e60f9383fb8ea4ea897c67a diff --git a/src/where.c b/src/where.c index 4325374bce..20b1c38c0c 100644 --- a/src/where.c +++ b/src/where.c @@ -862,7 +862,7 @@ static int constraintCompatibleWithOuterJoin( ** 3. If no disqualifying conditions above are found, return true. ** ** 2025-01-03: I experimented with a new rule that returns false if the -** the datatype of the column is "BOOLEAN". This did not improve +** the datatype of the column is "BOOLEAN". This did not improve ** performance on any queries at hand, but it did burn CPU cycles, so the ** idea was not committed. */ From 942c9587698715734715242737dba07ef296b0ef Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 14 Jan 2025 11:05:00 +0000 Subject: [PATCH 052/220] Version 3.48.0 FossilOrigin-Name: d2fe6b05f38d9d7cd78c5d252e99ac59f1aea071d669830c1ffe4e8966e84010 --- manifest | 11 +++++++---- manifest.uuid | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/manifest b/manifest index dfaaeb02a3..809b43bc20 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sa\sstray\stab\scharacter\sfrom\sa\scomment. -D 2025-01-13T13:32:56.652 +C Version\s3.48.0 +D 2025-01-14T11:05:00.186 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -2205,8 +2205,11 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P ed83b79100b4345235aec990303c4526874f0c2f8701160c4639a80633ebaf70 +P 315079b150b47e013e2cde4985bc39d24e0f6f6c6e60f9383fb8ea4ea897c67a R 0ed0cfcc7f2bc831da5d62a3490571ed +T +sym-major-relase * +T +sym-relase * +T +sym-version-3.48.0 * U drh -Z 2b06b025e298002c2c77b6953d35e566 +Z cc77aac977f98c5521d75f4212754ff8 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index aeb488e3a7..582262f689 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -315079b150b47e013e2cde4985bc39d24e0f6f6c6e60f9383fb8ea4ea897c67a +d2fe6b05f38d9d7cd78c5d252e99ac59f1aea071d669830c1ffe4e8966e84010 From 290caec8e32bc00e9d5bc80c8b08736e820f0ea7 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 14 Jan 2025 16:10:13 +0000 Subject: [PATCH 053/220] Trying to remove a warning from some compiler that I do not have access to. FossilOrigin-Name: bc6de90c7049dd429a82d32b186a838f4a21aa7b8a83418eaf0416d19771b41e --- ext/misc/base64.c | 2 +- manifest | 15 ++++++--------- manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/ext/misc/base64.c b/ext/misc/base64.c index b8147707f9..17b3bbfc71 100644 --- a/ext/misc/base64.c +++ b/ext/misc/base64.c @@ -198,7 +198,7 @@ static u8* fromBase64( char *pIn, int ncIn, u8 *pOut ){ deliberate_fall_through; /* FALLTHRU */ case 1: pOut[0] = (qv>>16) & 0xff; - deliberate_fall_through; /* FALLTHRU */ + break; } pOut += nbo; } diff --git a/manifest b/manifest index 809b43bc20..bee17b3109 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Version\s3.48.0 -D 2025-01-14T11:05:00.186 +C Trying\sto\sremove\sa\swarning\sfrom\ssome\scompiler\sthat\sI\sdo\snot\shave\saccess\sto. +D 2025-01-14T16:10:13.035 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -400,7 +400,7 @@ F ext/misc/README.md d6dd0fe1d8af77040216798a6a2b0c46c73054d2f0ea544fbbcdccf6f23 F ext/misc/amatch.c 5001711cbecdd57b288cb613386789f3034e5beb58fbe0c79f2b3d643ffd4e03 F ext/misc/anycollseq.c 5ffdfde9829eeac52219136ad6aa7cd9a4edb3b15f4f2532de52f4a22525eddb F ext/misc/appendvfs.c 9642c7a194a2a25dca7ad3e36af24a0a46d7702168c4ad7e59c9f9b0e16a3824 -F ext/misc/base64.c 95abb0547cb1799d9851f3357c8d7fc3c09a95c63c8772aa3acd5f65f12050f6 +F ext/misc/base64.c 73c31eb325c71bae2e27276565e3f674fc095d8b0d7a651becb3b241a4d2fa57 F ext/misc/base85.c a70c885c5c9350261ea6e7b166038eab21a09cf4fceae856ce41fae9c2213b60 F ext/misc/basexx.c 89ad6b76558efbceb627afd5e2ef1d84b2e96d9aaf9b7ecb20e3d00b51be6fcf F ext/misc/blobio.c a867c4c4617f6ec223a307ebfe0eabb45e0992f74dd47722b96f3e631c0edb2a @@ -2205,11 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 315079b150b47e013e2cde4985bc39d24e0f6f6c6e60f9383fb8ea4ea897c67a -R 0ed0cfcc7f2bc831da5d62a3490571ed -T +sym-major-relase * -T +sym-relase * -T +sym-version-3.48.0 * +P d2fe6b05f38d9d7cd78c5d252e99ac59f1aea071d669830c1ffe4e8966e84010 +R aff0689df06812b91685e37aa2e42245 U drh -Z cc77aac977f98c5521d75f4212754ff8 +Z 834ff516b013f84167d7c9e70325f453 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 582262f689..747a460e8b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d2fe6b05f38d9d7cd78c5d252e99ac59f1aea071d669830c1ffe4e8966e84010 +bc6de90c7049dd429a82d32b186a838f4a21aa7b8a83418eaf0416d19771b41e From 0609cf85fd252bd8529e5648095529a4a4e954c2 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 14 Jan 2025 20:47:23 +0000 Subject: [PATCH 054/220] Change the version number to 3.49.0 to begin the next development cycle. Any patches to 3.48.0 will go on a branch. FossilOrigin-Name: 8165a3d3a40c5b43275fb4b1cdf57c44a57cd56c514bd2a550deac26a14795eb --- VERSION | 2 +- autoconf/tea/configure.ac | 2 +- manifest | 14 +++++++------- manifest.uuid | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/VERSION b/VERSION index 7dd5eda815..549b777ead 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.48.0 +3.49.0 diff --git a/autoconf/tea/configure.ac b/autoconf/tea/configure.ac index 8abf8ad02f..e653798fc5 100644 --- a/autoconf/tea/configure.ac +++ b/autoconf/tea/configure.ac @@ -19,7 +19,7 @@ dnl to configure the system for the local environment. # so that we create the export library with the dll. #----------------------------------------------------------------------- -AC_INIT([sqlite],[3.48.0]) +AC_INIT([sqlite],[3.49.0]) #-------------------------------------------------------------------- # Call TEA_INIT as the first TEA_ macro to set up initial vars. diff --git a/manifest b/manifest index bee17b3109..16e144446c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Trying\sto\sremove\sa\swarning\sfrom\ssome\scompiler\sthat\sI\sdo\snot\shave\saccess\sto. -D 2025-01-14T16:10:13.035 +C Change\sthe\sversion\snumber\sto\s3.49.0\sto\sbegin\sthe\snext\sdevelopment\ncycle.\s\sAny\spatches\sto\s3.48.0\swill\sgo\son\sa\sbranch. +D 2025-01-14T20:47:23.128 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -7,7 +7,7 @@ F Makefile.in ad349acf91b3569033439fe498fa197aa530cafaa01362eb7daad2f84e43d265 F Makefile.linux-generic bd3e3cacd369821a6241d4ea1967395c962dfe3057e38cb0a435cee0e8b789d0 F Makefile.msc 39785ec45f9ae0311e49094eff2ee079562246fed6be3b9f632a99d4df20056a F README.md c3c0f19532ce28f6297a71870f3c7b424729f0e6d9ab889616d3587dd2332159 -F VERSION 8dc0c3df15fd5ff0622f88fc483533fce990b1cbb2f5fb9fdfb4dbd71eef2889 +F VERSION 01f7606130e48fd58a74d1e45e565f2674819d6eadbc219d328d94bb3362b818 F art/icon-243x273.gif 9750b734f82fdb3dc43127753d5e6fbf3b62c9f4e136c2fbf573b2f57ea87af5 F art/icon-80x90.gif 65509ce3e5f86a9cd64fe7fca2d23954199f31fe44c1e09e208c80fb83d87031 F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 @@ -25,7 +25,7 @@ F autoconf/configure.ac ec7fa914c5e74ff212fe879f9bb6918e1234497e05facfb641f30c4d F autoconf/tea/Makefile.in ba0556fee8da09c066bad85a4457904e46ee2c2eabaa309c0e83a78f2f151a8e F autoconf/tea/README.txt 61e62e519579e4a112791354d6d440f8b51ea6db3b0bab58d59f29df42d2dfe3 F autoconf/tea/aclocal.m4 52c47aac44ce0ddb1f918b6993e8beb8eee88f43 -F autoconf/tea/configure.ac ff2d745f88e493080810b67958d88b4f7a7d79f19e2ee8e7f72ffd6fc04eabc7 +F autoconf/tea/configure.ac d22326594f005a493a7857cb4ad2496b91480101be731d7f0541bb8d7eba22a2 F autoconf/tea/doc/sqlite3.n e1fe45d4f5286ee3d0ccc877aca2a0def488e9bb F autoconf/tea/license.terms 13bd403c9610fd2b76ece0ab50c4c5eda933d523 F autoconf/tea/pkgIndex.tcl.in 55aec3c6d7e9a1de9b8d2fdc9c27fd055da3ac3a51b572195e2ae7300bcfd3a2 @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P d2fe6b05f38d9d7cd78c5d252e99ac59f1aea071d669830c1ffe4e8966e84010 -R aff0689df06812b91685e37aa2e42245 +P bc6de90c7049dd429a82d32b186a838f4a21aa7b8a83418eaf0416d19771b41e +R 7be4e73ee614c5955da7d841289f67c4 U drh -Z 834ff516b013f84167d7c9e70325f453 +Z 4394aec1aff44c176b2cf58b3618b986 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 747a460e8b..6b616acf3d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bc6de90c7049dd429a82d32b186a838f4a21aa7b8a83418eaf0416d19771b41e +8165a3d3a40c5b43275fb4b1cdf57c44a57cd56c514bd2a550deac26a14795eb From 4ea86ac0e398d20cefa211555a604fcdc55dc45e Mon Sep 17 00:00:00 2001 From: stephan Date: Wed, 15 Jan 2025 14:28:56 +0000 Subject: [PATCH 055/220] Disable the C-style comment stripper in the JS dist build, as explained in [forum:529c20d344|forum post 529c20d344]. FossilOrigin-Name: a9475e7614f8e44252abf273d0e0522c247df12624e40108ce98ad4aaf320f2d --- ext/wasm/dist.make | 13 +++++++++++-- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 19 insertions(+), 10 deletions(-) diff --git a/ext/wasm/dist.make b/ext/wasm/dist.make index e820e066d4..10c64e16d6 100644 --- a/ext/wasm/dist.make +++ b/ext/wasm/dist.make @@ -97,6 +97,15 @@ STRIP_K2.js := $(sqlite3.js) $(sqlite3.mjs) \ # Note that we require $(bin.version-info) in order to figure out the # dist file's name, so cannot (without a recursive make) have the # target name equal to the archive name. +# +# 2025-01-15: Emsdk 4.0.0 introduces, in its generated code, a regex +# which contains the pattern /*. That, of course, confuses any C-style +# comment-stripper which is not specifically JS-aware and smart enough +# to know that it's in a regex or string literal. Because of that, +# comment-stripping is currently disabled, which means the builds will +# be significantly larger than before. +apply_comment_stripper := false +# ^^^ shell command true or false dist: \ $(bin.stripccomments) $(bin.version-info) \ $(dist.build) $(STRIP_K1.js) $(STRIP_K2.js) \ @@ -109,8 +118,8 @@ dist: \ @cp -p README-dist.txt $(dist-dir.top)/README.txt @cp -p index-dist.html $(dist-dir.top)/index.html @cp -p $(dist.jswasm.extras) $(dist-dir.jswasm) - @$(foreach JS,$(STRIP_K1.js),$(call DIST_STRIP_COMMENTS,$(JS),-k)) - @$(foreach JS,$(STRIP_K2.js),$(call DIST_STRIP_COMMENTS,$(JS),-k -k)) + @if $(apply_comment_stripper); then $(foreach JS,$(STRIP_K1.js),$(call DIST_STRIP_COMMENTS,$(JS),-k)) fi + @if $(apply_comment_stripper); then $(foreach JS,$(STRIP_K2.js),$(call DIST_STRIP_COMMENTS,$(JS),-k -k)) fi @cp -p $(dist.common.extras) $(dist-dir.common) @set -e; \ vnum=$$($(bin.version-info) --download-version); \ diff --git a/manifest b/manifest index 16e144446c..89626587fd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\sthe\sversion\snumber\sto\s3.49.0\sto\sbegin\sthe\snext\sdevelopment\ncycle.\s\sAny\spatches\sto\s3.48.0\swill\sgo\son\sa\sbranch. -D 2025-01-14T20:47:23.128 +C Disable\sthe\sC-style\scomment\sstripper\sin\sthe\sJS\sdist\sbuild,\sas\sexplained\sin\s[forum:529c20d344|forum\spost\s529c20d344]. +D 2025-01-15T14:28:56.143 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -668,7 +668,7 @@ F ext/wasm/demo-worker1-promiser.c-pp.html 635cf90685805e21772a5f7a35d1ace80f98a F ext/wasm/demo-worker1-promiser.c-pp.js fcc628cb42fcfaf07d250477801de1e6deb1e319d003976612a0db8d76b9fccc F ext/wasm/demo-worker1.html 2c178c1890a2beb5a5fecb1453e796d067a4b8d3d2a04d65ca2eb1ab2c68ef5d F ext/wasm/demo-worker1.js 836bece8615b17b1b572584f7b15912236a5947fe8c68b98d2737d7e287447ef -F ext/wasm/dist.make 653e212c1e84aa3be168d62a10616ccea45ee9585b0192745d2706707a5248ce +F ext/wasm/dist.make a5bed3b6e6d6a644e1cd416f18b799b956765333130f948d1065872a7f1ce199 F ext/wasm/example_extra_init.c 2347cd69d19d839ef4e5e77b7855103a7fe3ef2af86f2e8c95839afd8b05862f F ext/wasm/fiddle.make d4969f0322a582c57a22ce3541f10a5b09a609d14eab32891f613f43b3c14d8b F ext/wasm/fiddle/fiddle-worker.js 850e66fce39b89d59e161d1abac43a181a4caa89ddeea162765d660277cd84ce @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P bc6de90c7049dd429a82d32b186a838f4a21aa7b8a83418eaf0416d19771b41e -R 7be4e73ee614c5955da7d841289f67c4 -U drh -Z 4394aec1aff44c176b2cf58b3618b986 +P 8165a3d3a40c5b43275fb4b1cdf57c44a57cd56c514bd2a550deac26a14795eb +R a0a8bbc53f3c66c17e57addc303a0fb5 +U stephan +Z 1a15ad455819e4eca33993ca2fa2e2ed # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 6b616acf3d..4894553b8b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8165a3d3a40c5b43275fb4b1cdf57c44a57cd56c514bd2a550deac26a14795eb +a9475e7614f8e44252abf273d0e0522c247df12624e40108ce98ad4aaf320f2d From 73d9eb1bb3fca5e9a1bdc83c2d827cb815bc1278 Mon Sep 17 00:00:00 2001 From: stephan Date: Wed, 15 Jan 2025 15:27:02 +0000 Subject: [PATCH 056/220] Fix a typo in a wasm makefile var name, noting that this doesn't actually fix anything because the var in question is not used when building 'clean' or 'distclean'. FossilOrigin-Name: 7cfc75a625095e41c3e952d4a209fdbb344df0d3dd9b0103e9e6a986dfe53c89 --- ext/wasm/GNUmakefile | 2 +- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ext/wasm/GNUmakefile b/ext/wasm/GNUmakefile index 19ad759905..6f226fbb4f 100644 --- a/ext/wasm/GNUmakefile +++ b/ext/wasm/GNUmakefile @@ -185,7 +185,7 @@ endif # Find wasm-strip, which we need for release builds (see below for # why) but not strictly for non-release builds. ifeq (1,$(MAKING_CLEAN)) - wasm-strip-bin := irrelevant + wasm-strip.bin := irrelevant else wasm-strip.bin ?= $(shell which wasm-strip 2>/dev/null) ifeq (,$(wasm-strip.bin)) diff --git a/manifest b/manifest index 89626587fd..5a2e1a4442 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Disable\sthe\sC-style\scomment\sstripper\sin\sthe\sJS\sdist\sbuild,\sas\sexplained\sin\s[forum:529c20d344|forum\spost\s529c20d344]. -D 2025-01-15T14:28:56.143 +C Fix\sa\stypo\sin\sa\swasm\smakefile\svar\sname,\snoting\sthat\sthis\sdoesn't\sactually\sfix\sanything\sbecause\sthe\svar\sin\squestion\sis\snot\sused\swhen\sbuilding\s'clean'\sor\s'distclean'. +D 2025-01-15T15:27:02.044 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -618,7 +618,7 @@ F ext/session/sqlite3session.c d6f5e3e83b9b0bbc4a8db4837284f0ecc6af5321d4c8e7136 F ext/session/sqlite3session.h 683ccbf16e2c2521661fc4c1cf918ce57002039efbcabcd8097fa4bca569104b F ext/session/test_session.c 12e0a2c15fd60f92da4bb29c697c9177ff0c0dbcdc5129a54c47e999f147937a F ext/wasm/EXPORTED_FUNCTIONS.fiddle.in 27450c8b8c70875a260aca55435ec927068b34cef801a96205adb81bdcefc65c -F ext/wasm/GNUmakefile 311aa0d5edc7006409962cc77cc26560d92f9be69c2c4302e8bbc68189fd02db +F ext/wasm/GNUmakefile 6b42d6de2316ae01a96d1b850932fcab0f2938affc27b48495776903f544a488 F ext/wasm/README-dist.txt 6382cb9548076fca472fb3330bbdba3a55c1ea0b180ff9253f084f07ff383576 F ext/wasm/README.md a8a2962c3aebdf8d2104a9102e336c5554e78fc6072746e5daf9c61514e7d193 F ext/wasm/SQLTester/GNUmakefile e0794f676d55819951bbfae45cc5e8d7818dc460492dc317ce7f0d2eca15caff @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 8165a3d3a40c5b43275fb4b1cdf57c44a57cd56c514bd2a550deac26a14795eb -R a0a8bbc53f3c66c17e57addc303a0fb5 +P a9475e7614f8e44252abf273d0e0522c247df12624e40108ce98ad4aaf320f2d +R 1edfbe182664cb23963ce1c643c56290 U stephan -Z 1a15ad455819e4eca33993ca2fa2e2ed +Z 7b3481ce418acfe304612eaa50fc5d07 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 4894553b8b..2e33fd143c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a9475e7614f8e44252abf273d0e0522c247df12624e40108ce98ad4aaf320f2d +7cfc75a625095e41c3e952d4a209fdbb344df0d3dd9b0103e9e6a986dfe53c89 From 874b5e9fbb22231b283ec5a56921fa9b418c5c8d Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 15 Jan 2025 19:30:10 +0000 Subject: [PATCH 057/220] Variable names and conditional logic simplified in where.c. These changes are cosmetic only and do not affect the resuling machine code. FossilOrigin-Name: dbc2d6a244fdafd208239894dbdd8f139db6ca20dd8f1ed00d87028e0cb60570 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/where.c | 51 ++++++++++++++++++++++++-------------------------- src/whereInt.h | 2 +- 4 files changed, 34 insertions(+), 37 deletions(-) diff --git a/manifest b/manifest index 5a2e1a4442..c560adf18a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\stypo\sin\sa\swasm\smakefile\svar\sname,\snoting\sthat\sthis\sdoesn't\sactually\sfix\sanything\sbecause\sthe\svar\sin\squestion\sis\snot\sused\swhen\sbuilding\s'clean'\sor\s'distclean'. -D 2025-01-15T15:27:02.044 +C Variable\snames\sand\sconditional\slogic\ssimplified\sin\swhere.c.\s\sThese\nchanges\sare\scosmetic\sonly\sand\sdo\snot\saffect\sthe\sresuling\smachine\scode. +D 2025-01-15T19:30:10.144 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -862,8 +862,8 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 4e6181d8780ab0af2e1388d0754cbe6f2f04593d2b1ab6c41699a89942fd8997 F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 -F src/where.c 604f17baed46f4997ffe79f25c07c4b51a4165a5938cc27fe165c7e1ca485d11 -F src/whereInt.h 1e36ec50392f7cc3d93d1152d4338064cd522b87156a0739388b7e273735f0ca +F src/where.c 066374c086ded30e6829a909df532c22f6fb03b1a29ef1bc0f34f45bd7895687 +F src/whereInt.h 2b0804f300c7f65de4046a1d81c65f01b208d6c08950ccd1fa6b8c16162a8af7 F src/wherecode.c 0c3d3199a2b769a5e2bb70feb5003dc85b3d86842ecaf903a47f2b4205ca5dab F src/whereexpr.c 0f93a29cabd3a338d09a1f5c6770620a1ac51ec1157f3229502a7e7767c60b6f F src/window.c 2bf01f9941a64fbcead61a0e3cb5db3fca5094b30d2ff0d23274c2a81d2e2385 @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P a9475e7614f8e44252abf273d0e0522c247df12624e40108ce98ad4aaf320f2d -R 1edfbe182664cb23963ce1c643c56290 -U stephan -Z 7b3481ce418acfe304612eaa50fc5d07 +P 7cfc75a625095e41c3e952d4a209fdbb344df0d3dd9b0103e9e6a986dfe53c89 +R d91733ae99ec500ae8110e1fa74b02f9 +U drh +Z 7b31834eebc351dc793c0a6c7bc753c6 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 2e33fd143c..14ca545255 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7cfc75a625095e41c3e952d4a209fdbb344df0d3dd9b0103e9e6a986dfe53c89 +dbc2d6a244fdafd208239894dbdd8f139db6ca20dd8f1ed00d87028e0cb60570 diff --git a/src/where.c b/src/where.c index 20b1c38c0c..25b64bcaad 100644 --- a/src/where.c +++ b/src/where.c @@ -5511,7 +5511,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ int mxI = 0; /* Index of next entry to replace */ int nOrderBy; /* Number of ORDER BY clause terms */ LogEst mxCost = 0; /* Maximum cost of a set of paths */ - LogEst mxUnsorted = 0; /* Maximum unsorted cost of a set of path */ + LogEst mxUnsort = 0; /* Maximum unsorted cost of a set of path */ int nTo, nFrom; /* Number of valid entries in aTo[] and aFrom[] */ WherePath *aFrom; /* All nFrom paths at the previous level */ WherePath *aTo; /* The nTo best paths at the current level */ @@ -5608,7 +5608,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ for(pWLoop=pWInfo->pLoops; pWLoop; pWLoop=pWLoop->pNextLoop){ LogEst nOut; /* Rows visited by (pFrom+pWLoop) */ LogEst rCost; /* Cost of path (pFrom+pWLoop) */ - LogEst rUnsorted; /* Unsorted cost of (pFrom+pWLoop) */ + LogEst rUnsort; /* Unsorted cost of (pFrom+pWLoop) */ i8 isOrdered; /* isOrdered for (pFrom+pWLoop) */ Bitmask maskNew; /* Mask of src visited by (..) */ Bitmask revMask; /* Mask of rev-order loops for (..) */ @@ -5626,11 +5626,11 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ /* At this point, pWLoop is a candidate to be the next loop. ** Compute its cost */ - rUnsorted = pWLoop->rRun + pFrom->nRow; + rUnsort = pWLoop->rRun + pFrom->nRow; if( pWLoop->rSetup ){ - rUnsorted = sqlite3LogEstAdd(pWLoop->rSetup, rUnsorted); + rUnsort = sqlite3LogEstAdd(pWLoop->rSetup, rUnsort); } - rUnsorted = sqlite3LogEstAdd(rUnsorted, pFrom->rUnsorted); + rUnsort = sqlite3LogEstAdd(rUnsort, pFrom->rUnsort); nOut = pFrom->nRow + pWLoop->nOut; maskNew = pFrom->maskLoop | pWLoop->maskSelf; isOrdered = pFrom->isOrdered; @@ -5652,15 +5652,15 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ ** extra encouragement to the query planner to select a plan ** where the rows emerge in the correct order without any sorting ** required. */ - rCost = sqlite3LogEstAdd(rUnsorted, aSortCost[isOrdered]) + 3; + rCost = sqlite3LogEstAdd(rUnsort, aSortCost[isOrdered]) + 3; WHERETRACE(0x002, ("---- sort cost=%-3d (%d/%d) increases cost %3d to %-3d\n", aSortCost[isOrdered], (nOrderBy-isOrdered), nOrderBy, - rUnsorted, rCost)); + rUnsort, rCost)); }else{ - rCost = rUnsorted; - rUnsorted -= 2; /* TUNING: Slight bias in favor of no-sort plans */ + rCost = rUnsort; + rUnsort -= 2; /* TUNING: Slight bias in favor of no-sort plans */ } /* Check to see if pWLoop should be added to the set of @@ -5686,7 +5686,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ if( jj>=nTo ){ /* None of the existing best-so-far paths match the candidate. */ if( nTo>=mxChoice - && (rCost>mxCost || (rCost==mxCost && rUnsorted>=mxUnsorted)) + && (rCost>mxCost || (rCost==mxCost && rUnsort>=mxUnsort)) ){ /* The current candidate is no better than any of the mxChoice ** paths currently in the best-so-far buffer. So discard @@ -5694,7 +5694,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ #ifdef WHERETRACE_ENABLED /* 0x4 */ if( sqlite3WhereTrace&0x4 ){ sqlite3DebugPrintf("Skip %s cost=%-3d,%3d,%3d order=%c\n", - wherePathName(pFrom, iLoop, pWLoop), rCost, nOut, rUnsorted, + wherePathName(pFrom, iLoop, pWLoop), rCost, nOut, rUnsort, isOrdered>=0 ? isOrdered+'0' : '?'); } #endif @@ -5713,7 +5713,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ #ifdef WHERETRACE_ENABLED /* 0x4 */ if( sqlite3WhereTrace&0x4 ){ sqlite3DebugPrintf("New %s cost=%-3d,%3d,%3d order=%c\n", - wherePathName(pFrom, iLoop, pWLoop), rCost, nOut, rUnsorted, + wherePathName(pFrom, iLoop, pWLoop), rCost, nOut, rUnsort, isOrdered>=0 ? isOrdered+'0' : '?'); } #endif @@ -5724,24 +5724,21 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ ** pTo or if the candidate should be skipped. ** ** The conditional is an expanded vector comparison equivalent to: - ** (pTo->rCost,pTo->nRow,pTo->rUnsorted) <= (rCost,nOut,rUnsorted) + ** (pTo->rCost,pTo->nRow,pTo->rUnsort) <= (rCost,nOut,rUnsort) */ - if( pTo->rCostrCost==rCost - && (pTo->nRownRow==nOut && pTo->rUnsorted<=rUnsorted) - ) - ) + if( (pTo->rCostrCost==rCost && pTo->nRowrCost==rCost && pTo->nRow==nOut && pTo->rUnsort<=rUnsort) ){ #ifdef WHERETRACE_ENABLED /* 0x4 */ if( sqlite3WhereTrace&0x4 ){ sqlite3DebugPrintf( "Skip %s cost=%-3d,%3d,%3d order=%c", - wherePathName(pFrom, iLoop, pWLoop), rCost, nOut, rUnsorted, + wherePathName(pFrom, iLoop, pWLoop), rCost, nOut, rUnsort, isOrdered>=0 ? isOrdered+'0' : '?'); sqlite3DebugPrintf(" vs %s cost=%-3d,%3d,%3d order=%c\n", wherePathName(pTo, iLoop+1, 0), pTo->rCost, pTo->nRow, - pTo->rUnsorted, pTo->isOrdered>=0 ? pTo->isOrdered+'0' : '?'); + pTo->rUnsort, pTo->isOrdered>=0 ? pTo->isOrdered+'0' : '?'); } #endif /* Discard the candidate path from further consideration */ @@ -5755,11 +5752,11 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ if( sqlite3WhereTrace&0x4 ){ sqlite3DebugPrintf( "Update %s cost=%-3d,%3d,%3d order=%c", - wherePathName(pFrom, iLoop, pWLoop), rCost, nOut, rUnsorted, + wherePathName(pFrom, iLoop, pWLoop), rCost, nOut, rUnsort, isOrdered>=0 ? isOrdered+'0' : '?'); sqlite3DebugPrintf(" was %s cost=%-3d,%3d,%3d order=%c\n", wherePathName(pTo, iLoop+1, 0), pTo->rCost, pTo->nRow, - pTo->rUnsorted, pTo->isOrdered>=0 ? pTo->isOrdered+'0' : '?'); + pTo->rUnsort, pTo->isOrdered>=0 ? pTo->isOrdered+'0' : '?'); } #endif } @@ -5768,20 +5765,20 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ pTo->revLoop = revMask; pTo->nRow = nOut; pTo->rCost = rCost; - pTo->rUnsorted = rUnsorted; + pTo->rUnsort = rUnsort; pTo->isOrdered = isOrdered; memcpy(pTo->aLoop, pFrom->aLoop, sizeof(WhereLoop*)*iLoop); pTo->aLoop[iLoop] = pWLoop; if( nTo>=mxChoice ){ mxI = 0; mxCost = aTo[0].rCost; - mxUnsorted = aTo[0].nRow; + mxUnsort = aTo[0].nRow; for(jj=1, pTo=&aTo[1]; jjrCost>mxCost - || (pTo->rCost==mxCost && pTo->rUnsorted>mxUnsorted) + || (pTo->rCost==mxCost && pTo->rUnsort>mxUnsort) ){ mxCost = pTo->rCost; - mxUnsorted = pTo->rUnsorted; + mxUnsort = pTo->rUnsort; mxI = jj; } } diff --git a/src/whereInt.h b/src/whereInt.h index f262b0eebc..f44c040418 100644 --- a/src/whereInt.h +++ b/src/whereInt.h @@ -212,7 +212,7 @@ struct WherePath { Bitmask revLoop; /* aLoop[]s that should be reversed for ORDER BY */ LogEst nRow; /* Estimated number of rows generated by this path */ LogEst rCost; /* Total cost of this path */ - LogEst rUnsorted; /* Total cost of this path ignoring sorting costs */ + LogEst rUnsort; /* Total cost of this path ignoring sorting costs */ i8 isOrdered; /* No. of ORDER BY terms satisfied. -1 for unknown */ WhereLoop **aLoop; /* Array of WhereLoop objects implementing this path */ }; From d1047faad681aca6c1ceea052f027c91fb75cabe Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 15 Jan 2025 20:23:22 +0000 Subject: [PATCH 058/220] When choosing between two indexes with the same cost, pick the one with the smaller predicted number of bytes per row. FossilOrigin-Name: d4bd0d4214551f88f248698fefc821575b722ce5c194d0b3796f572e4704f641 --- manifest | 15 +++++++++------ manifest.uuid | 2 +- src/where.c | 26 +++++++++++++++++++++++++- 3 files changed, 35 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index c560adf18a..6da9fb0a2b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Variable\snames\sand\sconditional\slogic\ssimplified\sin\swhere.c.\s\sThese\nchanges\sare\scosmetic\sonly\sand\sdo\snot\saffect\sthe\sresuling\smachine\scode. -D 2025-01-15T19:30:10.144 +C When\schoosing\sbetween\stwo\sindexes\swith\sthe\ssame\scost,\spick\sthe\sone\swith\sthe\nsmaller\spredicted\snumber\sof\sbytes\sper\srow. +D 2025-01-15T20:23:22.162 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -862,7 +862,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 4e6181d8780ab0af2e1388d0754cbe6f2f04593d2b1ab6c41699a89942fd8997 F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 -F src/where.c 066374c086ded30e6829a909df532c22f6fb03b1a29ef1bc0f34f45bd7895687 +F src/where.c f081a371086f48201948431832f5e9bb1bf6c930397b8d7bcf8aaa9e21d819da F src/whereInt.h 2b0804f300c7f65de4046a1d81c65f01b208d6c08950ccd1fa6b8c16162a8af7 F src/wherecode.c 0c3d3199a2b769a5e2bb70feb5003dc85b3d86842ecaf903a47f2b4205ca5dab F src/whereexpr.c 0f93a29cabd3a338d09a1f5c6770620a1ac51ec1157f3229502a7e7767c60b6f @@ -2205,8 +2205,11 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 7cfc75a625095e41c3e952d4a209fdbb344df0d3dd9b0103e9e6a986dfe53c89 -R d91733ae99ec500ae8110e1fa74b02f9 +P dbc2d6a244fdafd208239894dbdd8f139db6ca20dd8f1ed00d87028e0cb60570 +R b4fed608ae80dc9fc4a5de4904cc7901 +T *branch * consider-idx-width +T *sym-consider-idx-width * +T -sym-trunk * U drh -Z 7b31834eebc351dc793c0a6c7bc753c6 +Z dfdb92c016b02704a64b8a1056c8f180 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 14ca545255..a279b0e281 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -dbc2d6a244fdafd208239894dbdd8f139db6ca20dd8f1ed00d87028e0cb60570 +d4bd0d4214551f88f248698fefc821575b722ce5c194d0b3796f572e4704f641 diff --git a/src/where.c b/src/where.c index 25b64bcaad..05dab8fdd5 100644 --- a/src/where.c +++ b/src/where.c @@ -5490,6 +5490,28 @@ static int computeMxChoice(WhereInfo *pWInfo, LogEst nRowEst){ return pWInfo->nOutStarDelta>0 ? 18 : 12; } +/* +** Two WhereLoop objects, pCandidate and pBaseline, are known to have the +** same cost. Look deep into each to see if pCandidate is even slightly +** better than pBaseline. Return false if it is, if pCandidate is is preferred. +** Return true if pBaseline is preferred or if we cannot tell the difference. +** +** Result Meaning +** -------- ---------------------------------------------------------- +** true We cannot tell the difference in pCandidate and pBaseline +** false pCandidate seems like a better choice than pBaseline +*/ +static SQLITE_NOINLINE int whereLoopIsNoBetter( + const WhereLoop *pCandidate, + const WhereLoop *pBaseline +){ + if( (pCandidate->wsFlags & WHERE_INDEXED)==0 ) return 1; + if( (pBaseline->wsFlags & WHERE_INDEXED)==0 ) return 1; + if( pCandidate->u.btree.pIndex->szIdxRow < + pBaseline->u.btree.pIndex->szIdxRow ) return 0; + return 1; +} + /* ** Given the list of WhereLoop objects at pWInfo->pLoops, this routine ** attempts to find the lowest cost path that visits each WhereLoop @@ -5728,7 +5750,9 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ */ if( (pTo->rCostrCost==rCost && pTo->nRowrCost==rCost && pTo->nRow==nOut && pTo->rUnsort<=rUnsort) + || (pTo->rCost==rCost && pTo->nRow==nOut && pTo->rUnsortrCost==rCost && pTo->nRow==nOut && pTo->rUnsort==rUnsort + && whereLoopIsNoBetter(pWLoop, pTo->aLoop[iLoop]) ) ){ #ifdef WHERETRACE_ENABLED /* 0x4 */ if( sqlite3WhereTrace&0x4 ){ From c738052394db4847c129c5039a973972e8125152 Mon Sep 17 00:00:00 2001 From: stephan Date: Wed, 15 Jan 2025 20:53:14 +0000 Subject: [PATCH 059/220] Work around [https://github.com/emscripten-core/emscripten/issues/23420|a behavior change in emsdk 4.0.0] which breaks the load/init timing of the wasm module. FossilOrigin-Name: 00a750184bcf1a94bf4e7f1d5029a42671e87e2997ae97be07bd900d3702883d --- ext/wasm/api/extern-post-js.c-pp.js | 13 ++++++++++++- ext/wasm/api/post-js-footer.js | 2 ++ ext/wasm/api/post-js-header.js | 1 + ext/wasm/api/sqlite3-api-cleanup.js | 3 +++ manifest | 20 ++++++++++---------- manifest.uuid | 2 +- 6 files changed, 29 insertions(+), 12 deletions(-) diff --git a/ext/wasm/api/extern-post-js.c-pp.js b/ext/wasm/api/extern-post-js.c-pp.js index 63e55051c6..c54e1f0825 100644 --- a/ext/wasm/api/extern-post-js.c-pp.js +++ b/ext/wasm/api/extern-post-js.c-pp.js @@ -12,6 +12,7 @@ const toExportForESM = //#endif (function(){ + //console.warn("this is extern-post-js"); /** In order to hide the sqlite3InitModule()'s resulting Emscripten module from downstream clients (and simplify our @@ -62,6 +63,17 @@ const toExportForESM = globalThis.sqlite3InitModule = function ff(...args){ //console.warn("Using replaced sqlite3InitModule()",globalThis.location); return originalInit(...args).then((EmscriptenModule)=>{ + //console.warn("originalInit() then() arg =",EmscriptenModule); + //console.warn("initModuleState =",initModuleState); + if( EmscriptenModule.postRun && EmscriptenModule.postRun.length ){ + /* Emscripten 4.0.0 changes the order in which our Module.postRun handler + runs. In 3.x postRun would have run by now, and our code relies + heavily on that order, so we'll work around that difference here. + + https://github.com/emscripten-core/emscripten/issues/23420 */ + //console.warn("Emscripten did not run postRun: running them now!"); + EmscriptenModule.postRun.shift()(EmscriptenModule); + } //#if wasmfs if('undefined'!==typeof WorkerGlobalScope && EmscriptenModule['ENVIRONMENT_IS_PTHREAD']){ @@ -74,7 +86,6 @@ const toExportForESM = return EmscriptenModule; } //#endif - //console.warn("sqlite3InitModule() returning sqlite3 object."); const s = EmscriptenModule.sqlite3; s.scriptInfo = initModuleState; //console.warn("sqlite3.scriptInfo =",s.scriptInfo); diff --git a/ext/wasm/api/post-js-footer.js b/ext/wasm/api/post-js-footer.js index 58882cbd9c..d9bb1eab0b 100644 --- a/ext/wasm/api/post-js-footer.js +++ b/ext/wasm/api/post-js-footer.js @@ -1,4 +1,6 @@ /* The current function scope was opened via post-js-header.js, which gets prepended to this at build-time. This file closes that scope. */ +//console.warn("This is the end of the Module.postRun handler."); })/*postRun.push(...)*/; +//console.warn("This is the end of the setup of the (pending) Module.postRun"); diff --git a/ext/wasm/api/post-js-header.js b/ext/wasm/api/post-js-header.js index 7fd82a7d6c..d0778b9807 100644 --- a/ext/wasm/api/post-js-header.js +++ b/ext/wasm/api/post-js-header.js @@ -10,6 +10,7 @@ if(!Module.postRun) Module.postRun = []; Module.postRun.push(function(Module/*the Emscripten-style module object*/){ 'use strict'; + //console.warn("This is the start of the Module.postRun handler."); /* This function will contain at least the following: - post-js-header.js (this file) diff --git a/ext/wasm/api/sqlite3-api-cleanup.js b/ext/wasm/api/sqlite3-api-cleanup.js index 65dbb4eb64..7fb29e6487 100644 --- a/ext/wasm/api/sqlite3-api-cleanup.js +++ b/ext/wasm/api/sqlite3-api-cleanup.js @@ -14,6 +14,9 @@ intended to be appended after all other sqlite3-api-*.js files so that it can finalize any setup and clean up any global symbols temporarily used for setting up the API's various subsystems. + + In Emscripten builds it's run in the context of a Module.postRun + handler. */ 'use strict'; if('undefined' !== typeof Module){ // presumably an Emscripten build diff --git a/manifest b/manifest index c560adf18a..47d06a98cd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Variable\snames\sand\sconditional\slogic\ssimplified\sin\swhere.c.\s\sThese\nchanges\sare\scosmetic\sonly\sand\sdo\snot\saffect\sthe\sresuling\smachine\scode. -D 2025-01-15T19:30:10.144 +C Work\saround\s[https://github.com/emscripten-core/emscripten/issues/23420|a\sbehavior\schange\sin\semsdk\s4.0.0]\swhich\sbreaks\sthe\sload/init\stiming\sof\sthe\swasm\smodule. +D 2025-01-15T20:53:14.915 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -631,12 +631,12 @@ F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-extras fe40d6d758646e38f8b15f709044951 F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-see fb29e62082a658f0d81102488414d422c393c4b20cc2f685b216bc566237957b F ext/wasm/api/EXPORTED_RUNTIME_METHODS.sqlite3-api 1ec3c73e7d66e95529c3c64ac3de2470b0e9e7fbf7a5b41261c367cf4f1b7287 F ext/wasm/api/README.md 34fe11466f9c1d81b10a0469e1114e5f1c5a6365c73d80a1a6ca639a1a358b73 -F ext/wasm/api/extern-post-js.c-pp.js c4154a7f90c2d7e51fd6738273908152036c3457fdc0b6523f1be3ef51105aac +F ext/wasm/api/extern-post-js.c-pp.js 13b1202f2815165a063ea41cc8450e0dc1505bbbe0be2fdac439b30b8cbdaacd F ext/wasm/api/extern-pre-js.js cc61c09c7a24a07dbecb4c352453c3985170cec12b4e7e7e7a4d11d43c5c8f41 -F ext/wasm/api/post-js-footer.js cd0a8ec768501d9bd45d325ab0442037fb0e33d1f3b4f08902f15c34720ee4a1 -F ext/wasm/api/post-js-header.js 04dc12c3edd666b64a1b4ef3b6690c88dcc653f26451fd4734472d8e29c1c122 +F ext/wasm/api/post-js-footer.js 6137d9d3dea0f3868d03bca058dc662f01848f81ab6bf940ffaa10a75069d709 +F ext/wasm/api/post-js-header.js bd91458bd0763c1bdb382dc4e8ac7b52e2d7337adc3a2f07f454631b64f12e82 F ext/wasm/api/pre-js.c-pp.js a614a2c82b12c4d96d8e3ba77330329efc53c4d56a8a7e60ade900f341866cfb -F ext/wasm/api/sqlite3-api-cleanup.js d235ad237df6954145404305040991c72ef8b1881715d2a650dda7b3c2576d0e +F ext/wasm/api/sqlite3-api-cleanup.js 3ac1786e461ada63033143be8c3b00b26b939540661f3e839515bb92f2e35359 F ext/wasm/api/sqlite3-api-glue.c-pp.js fb6dbfe692cc23000a65a4cd95a1a47ed5eb592dc9d8b55363b3c2952a787244 F ext/wasm/api/sqlite3-api-oo1.c-pp.js f3a8e2004c6625d17946c11f2fb32008be78bc5207bf746fc77d59848813225f F ext/wasm/api/sqlite3-api-prologue.js 6f1257e04885632ed9f44d43aba200b86e0bc16709ffdba29abbbeb1bc8e8b76 @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 7cfc75a625095e41c3e952d4a209fdbb344df0d3dd9b0103e9e6a986dfe53c89 -R d91733ae99ec500ae8110e1fa74b02f9 -U drh -Z 7b31834eebc351dc793c0a6c7bc753c6 +P dbc2d6a244fdafd208239894dbdd8f139db6ca20dd8f1ed00d87028e0cb60570 +R 723821a02135b50496a5bd528b97b64e +U stephan +Z ebeb04455686fb17ca7f0190e9405462 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 14ca545255..4b58858647 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -dbc2d6a244fdafd208239894dbdd8f139db6ca20dd8f1ed00d87028e0cb60570 +00a750184bcf1a94bf4e7f1d5029a42671e87e2997ae97be07bd900d3702883d From 3ba9adc5c165055268cb0a75020e8a1296c619b8 Mon Sep 17 00:00:00 2001 From: stephan Date: Wed, 15 Jan 2025 21:09:19 +0000 Subject: [PATCH 060/220] Teach tool/stripccomments.c that a backslash immediately preceeding a forward slash means that that forward slash cannot be the start of a comment. This is intended to allow JavaScript regular expressions containing \/* (like [https://github.com/emscripten-core/emscripten/issues/23412|the one introduced in emsdk 4.0.0]) to pass through properly. Re-enable comment-stripping in the JS dist builds. FossilOrigin-Name: db21d6cc9d1c425deffc0e4e92173caf586e6ac66110c71a4930b21e3e7f84b9 --- ext/wasm/dist.make | 3 ++- manifest | 14 +++++++------- manifest.uuid | 2 +- tool/stripccomments.c | 19 ++++++++++++++++++- 4 files changed, 28 insertions(+), 10 deletions(-) diff --git a/ext/wasm/dist.make b/ext/wasm/dist.make index 10c64e16d6..60699ff5c0 100644 --- a/ext/wasm/dist.make +++ b/ext/wasm/dist.make @@ -104,7 +104,8 @@ STRIP_K2.js := $(sqlite3.js) $(sqlite3.mjs) \ # to know that it's in a regex or string literal. Because of that, # comment-stripping is currently disabled, which means the builds will # be significantly larger than before. -apply_comment_stripper := false +#apply_comment_stripper := false +apply_comment_stripper := true # ^^^ shell command true or false dist: \ $(bin.stripccomments) $(bin.version-info) \ diff --git a/manifest b/manifest index 47d06a98cd..611f9cccda 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Work\saround\s[https://github.com/emscripten-core/emscripten/issues/23420|a\sbehavior\schange\sin\semsdk\s4.0.0]\swhich\sbreaks\sthe\sload/init\stiming\sof\sthe\swasm\smodule. -D 2025-01-15T20:53:14.915 +C Teach\stool/stripccomments.c\sthat\sa\sbackslash\simmediately\spreceeding\sa\sforward\sslash\smeans\sthat\sthat\sforward\sslash\scannot\sbe\sthe\sstart\sof\sa\scomment.\sThis\sis\sintended\sto\sallow\sJavaScript\sregular\sexpressions\scontaining\s\\/*\s(like\s[https://github.com/emscripten-core/emscripten/issues/23412|the\sone\sintroduced\sin\semsdk\s4.0.0])\sto\spass\sthrough\sproperly.\sRe-enable\scomment-stripping\sin\sthe\sJS\sdist\sbuilds. +D 2025-01-15T21:09:19.736 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -668,7 +668,7 @@ F ext/wasm/demo-worker1-promiser.c-pp.html 635cf90685805e21772a5f7a35d1ace80f98a F ext/wasm/demo-worker1-promiser.c-pp.js fcc628cb42fcfaf07d250477801de1e6deb1e319d003976612a0db8d76b9fccc F ext/wasm/demo-worker1.html 2c178c1890a2beb5a5fecb1453e796d067a4b8d3d2a04d65ca2eb1ab2c68ef5d F ext/wasm/demo-worker1.js 836bece8615b17b1b572584f7b15912236a5947fe8c68b98d2737d7e287447ef -F ext/wasm/dist.make a5bed3b6e6d6a644e1cd416f18b799b956765333130f948d1065872a7f1ce199 +F ext/wasm/dist.make 92ef4ffe33022a50f92d602acabad10bd8dd91759f3eb7df27fc6d7d37072b96 F ext/wasm/example_extra_init.c 2347cd69d19d839ef4e5e77b7855103a7fe3ef2af86f2e8c95839afd8b05862f F ext/wasm/fiddle.make d4969f0322a582c57a22ce3541f10a5b09a609d14eab32891f613f43b3c14d8b F ext/wasm/fiddle/fiddle-worker.js 850e66fce39b89d59e161d1abac43a181a4caa89ddeea162765d660277cd84ce @@ -2193,7 +2193,7 @@ F tool/src-verify.c d00f93263aa2fa6ba0cba0106d95458e6effb94fdb5fc634f56834f90c05 F tool/srcck1.c 371de5363b70154012955544f86fdee8f6e5326f F tool/srctree-check.tcl 1f1f505835a4beca64c1751a7ebec5c41a1ddf22b1e80481345b95059eef6583 F tool/stack_usage.tcl f8e71b92cdb099a147dad572375595eae55eca43 -F tool/stripccomments.c 20b8aabc4694d0d4af5566e42da1f1a03aff057689370326e9269a9ddcffdc37 +F tool/stripccomments.c dfe9cc03cf87728ac9836be30763f8aa52b82caca0780b3d3f3572e4643b01d3 F tool/symbols-mingw.sh 4dbcea7e74768305384c9fd2ed2b41bbf9f0414d F tool/symbols.sh 1612bd947750e21e7b47befad5f6b3825b06cce0705441f903bf35ced65ae9b9 F tool/tclConfigShToAutoDef.sh 44ec55046d86a3febb2cb3e099399b41794e80e9cd138eee7b9b016f819e882b x @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P dbc2d6a244fdafd208239894dbdd8f139db6ca20dd8f1ed00d87028e0cb60570 -R 723821a02135b50496a5bd528b97b64e +P 00a750184bcf1a94bf4e7f1d5029a42671e87e2997ae97be07bd900d3702883d +R 1dd6d511f4cfda5dc1ec4a63bbc6ac95 U stephan -Z ebeb04455686fb17ca7f0190e9405462 +Z 602290f471545d4fbdf4261f6ac0243b # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 4b58858647..0a601b281b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -00a750184bcf1a94bf4e7f1d5029a42671e87e2997ae97be07bd900d3702883d +db21d6cc9d1c425deffc0e4e92173caf586e6ac66110c71a4930b21e3e7f84b9 diff --git a/tool/stripccomments.c b/tool/stripccomments.c index 53933c0138..1bdb5c6b82 100644 --- a/tool/stripccomments.c +++ b/tool/stripccomments.c @@ -111,7 +111,24 @@ void do_it_all(void){ } else if(slash == ch){ /* MARKER(("state 0 ==> 1 @ %d:%d\n", line, col)); */ - state = S_SLASH1; + if( '\\'==prev ){ + /** + JS regexes may contain slash-asterisks, as happened at: + + https://github.com/emscripten-core/emscripten/issues/23412 + + Such regexes will always necessarily be preceeded by a + backslash, though. + + It is hypothetically possible for a legitimate comment + slash-asterisk to appear immediately before a + backslash, but that seems like an even rarer corner + case than the JS regex case. + */ + fputc(ch, out); + }else{ + state = S_SLASH1; + } break; } fputc(ch, out); From 65d0312c96cd23958372fac8940314c782a6b03c Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 15 Jan 2025 21:13:38 +0000 Subject: [PATCH 061/220] Check-in [da9124fee28c155c] broken the new SQLITE_IOCAP_SUBPAGE_READ mechanism for inhibiting direct-overflow-read. This check-in fixes the problem. FossilOrigin-Name: 113078d555eaf740666680562ebbb04f7d823b72e8b2d553627e54ab3d7bf653 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/pager.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 611f9cccda..1ccac6a46a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Teach\stool/stripccomments.c\sthat\sa\sbackslash\simmediately\spreceeding\sa\sforward\sslash\smeans\sthat\sthat\sforward\sslash\scannot\sbe\sthe\sstart\sof\sa\scomment.\sThis\sis\sintended\sto\sallow\sJavaScript\sregular\sexpressions\scontaining\s\\/*\s(like\s[https://github.com/emscripten-core/emscripten/issues/23412|the\sone\sintroduced\sin\semsdk\s4.0.0])\sto\spass\sthrough\sproperly.\sRe-enable\scomment-stripping\sin\sthe\sJS\sdist\sbuilds. -D 2025-01-15T21:09:19.736 +C Check-in\s[da9124fee28c155c]\sbroken\sthe\snew\sSQLITE_IOCAP_SUBPAGE_READ\smechanism\nfor\sinhibiting\sdirect-overflow-read.\s\sThis\scheck-in\sfixes\sthe\sproblem. +D 2025-01-15T21:13:38.465 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -765,7 +765,7 @@ F src/os_setup.h 6011ad7af5db4e05155f385eb3a9b4470688de6f65d6166b8956e58a3d87210 F src/os_unix.c d2edbd92b07a3f778c2defa8a2e9d75acceb6267bda56948c41e8cdda65224d6 F src/os_win.c 49c7725b500f5867e8360e75eeb30f9d70b62fa1f05c8a101da627210578df32 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 2fdd489447aa6bb0f672973bacb801ced92225ca9a1c874ed9b856d2741dc54e +F src/pager.c 3a1c4e7f69af482e33c8cba8a75afe0dda0ea6391240adac22b040ce1bdeef44 F src/pager.h 6137149346e6c8a3ddc1eeb40aee46381e9bc8b0fcc6dda8a1efde993c2275b8 F src/parse.y dcf45a81b61223ac93e61fdfe9b22d635dd371c446e8222634d90aa37e25e5f6 F src/pcache.c 588cc3c5ccaaadde689ed35ce5c5c891a1f7b1f4d1f56f6cf0143b74d8ee6484 @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 00a750184bcf1a94bf4e7f1d5029a42671e87e2997ae97be07bd900d3702883d -R 1dd6d511f4cfda5dc1ec4a63bbc6ac95 -U stephan -Z 602290f471545d4fbdf4261f6ac0243b +P db21d6cc9d1c425deffc0e4e92173caf586e6ac66110c71a4930b21e3e7f84b9 +R c4c1c248146b8316d21d4d01771a3b12 +U drh +Z 22739ec3697956e07bb55a68cf1c833f # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 0a601b281b..468e020a54 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -db21d6cc9d1c425deffc0e4e92173caf586e6ac66110c71a4930b21e3e7f84b9 +113078d555eaf740666680562ebbb04f7d823b72e8b2d553627e54ab3d7bf653 diff --git a/src/pager.c b/src/pager.c index e2dbbeae3f..ecec892b45 100644 --- a/src/pager.c +++ b/src/pager.c @@ -808,7 +808,7 @@ int sqlite3PagerDirectReadOk(Pager *pPager, Pgno pgno){ if( pPager->pWal ){ u32 iRead = 0; (void)sqlite3WalFindFrame(pPager->pWal, pgno, &iRead); - return iRead==0; /* Condition (4) */ + if( iRead ) return 0; /* Case (4) */ } #endif assert( pPager->fd->pMethods->xDeviceCharacteristics!=0 ); From 3202b11f66aaeac6dd86f64f3d38dff9e3464b86 Mon Sep 17 00:00:00 2001 From: stephan Date: Thu, 16 Jan 2025 09:27:40 +0000 Subject: [PATCH 062/220] Replace use of Emscripten's Module.postRun() with a custom callback so that we get consistent library init timing with both Emscripten 3.1.x and 4.0.x. Details and discussion are in [https://github.com/emscripten-core/emscripten/issues/23420|Emscripten ticket #23420]. FossilOrigin-Name: 4863a70ac61ff6f868429f16f0141484ea98f973fde1a9aff879252d0f1dbb6b --- ext/wasm/api/extern-post-js.c-pp.js | 25 +++++++++---------------- ext/wasm/api/post-js-footer.js | 6 +++--- ext/wasm/api/post-js-header.js | 12 ++++++++---- ext/wasm/api/sqlite3-api-prologue.js | 12 ++++++------ manifest | 21 ++++++++++----------- manifest.uuid | 2 +- 6 files changed, 37 insertions(+), 41 deletions(-) diff --git a/ext/wasm/api/extern-post-js.c-pp.js b/ext/wasm/api/extern-post-js.c-pp.js index c54e1f0825..3598c0d6fe 100644 --- a/ext/wasm/api/extern-post-js.c-pp.js +++ b/ext/wasm/api/extern-post-js.c-pp.js @@ -65,15 +65,14 @@ const toExportForESM = return originalInit(...args).then((EmscriptenModule)=>{ //console.warn("originalInit() then() arg =",EmscriptenModule); //console.warn("initModuleState =",initModuleState); - if( EmscriptenModule.postRun && EmscriptenModule.postRun.length ){ - /* Emscripten 4.0.0 changes the order in which our Module.postRun handler - runs. In 3.x postRun would have run by now, and our code relies - heavily on that order, so we'll work around that difference here. - - https://github.com/emscripten-core/emscripten/issues/23420 */ - //console.warn("Emscripten did not run postRun: running them now!"); - EmscriptenModule.postRun.shift()(EmscriptenModule); - } + EmscriptenModule.runSQLite3PostLoadInit(EmscriptenModule); + const s = EmscriptenModule.sqlite3; + s.scriptInfo = initModuleState; + //console.warn("sqlite3.scriptInfo =",s.scriptInfo); + if(ff.__isUnderTest) s.__isUnderTest = true; + const f = s.asyncPostInit; + delete s.asyncPostInit; + const rv = f(); //#if wasmfs if('undefined'!==typeof WorkerGlobalScope && EmscriptenModule['ENVIRONMENT_IS_PTHREAD']){ @@ -86,13 +85,7 @@ const toExportForESM = return EmscriptenModule; } //#endif - const s = EmscriptenModule.sqlite3; - s.scriptInfo = initModuleState; - //console.warn("sqlite3.scriptInfo =",s.scriptInfo); - if(ff.__isUnderTest) s.__isUnderTest = true; - const f = s.asyncPostInit; - delete s.asyncPostInit; - return f(); + return rv; }).catch((e)=>{ console.error("Exception loading sqlite3 module:",e); throw e; diff --git a/ext/wasm/api/post-js-footer.js b/ext/wasm/api/post-js-footer.js index d9bb1eab0b..7af12cbe34 100644 --- a/ext/wasm/api/post-js-footer.js +++ b/ext/wasm/api/post-js-footer.js @@ -1,6 +1,6 @@ /* The current function scope was opened via post-js-header.js, which gets prepended to this at build-time. This file closes that scope. */ -//console.warn("This is the end of the Module.postRun handler."); -})/*postRun.push(...)*/; -//console.warn("This is the end of the setup of the (pending) Module.postRun"); +//console.warn("This is the end of the Module.runSQLite3PostLoadInit handler."); +}/*Module.runSQLite3PostLoadInit()*/; +//console.warn("This is the end of the setup of the (pending) Module.runSQLite3PostLoadInit"); diff --git a/ext/wasm/api/post-js-header.js b/ext/wasm/api/post-js-header.js index d0778b9807..a543c14f3a 100644 --- a/ext/wasm/api/post-js-header.js +++ b/ext/wasm/api/post-js-header.js @@ -7,8 +7,12 @@ installs will be run after the WASM module is loaded, at which point the sqlite3 JS API bits will get set up. */ -if(!Module.postRun) Module.postRun = []; -Module.postRun.push(function(Module/*the Emscripten-style module object*/){ +Module.runSQLite3PostLoadInit = function(EmscriptenModule/*the Emscripten-style module object*/){ + /** ^^^ As don't use Module.postRun, as that runs a different time + depending on whether this file is built with emcc 3.1.x or + 4.0.x. This function name is intentionally obnoxiously verbose to + ensure that we don't collide with current and future Emscripten + symbol names. */ 'use strict'; //console.warn("This is the start of the Module.postRun handler."); /* This function will contain at least the following: @@ -16,9 +20,9 @@ Module.postRun.push(function(Module/*the Emscripten-style module object*/){ - post-js-header.js (this file) - sqlite3-api-prologue.js => Bootstrapping bits to attach the rest to - common/whwasmutil.js => Replacements for much of Emscripten's glue - - jaccwaby/jaccwabyt.js => Jaccwabyt (C/JS struct binding) + - jaccwabyt/jaccwabyt.js => Jaccwabyt (C/JS struct binding) - sqlite3-api-glue.js => glues previous parts together - - sqlite3-api-oo.js => SQLite3 OO API #1 + - sqlite3-api-oo1.js => SQLite3 OO API #1 - sqlite3-api-worker1.js => Worker-based API - sqlite3-vfs-helper.c-pp.js => Utilities for VFS impls - sqlite3-vtab-helper.c-pp.js => Utilities for virtual table impls diff --git a/ext/wasm/api/sqlite3-api-prologue.js b/ext/wasm/api/sqlite3-api-prologue.js index c8db3698c1..ee973990a3 100644 --- a/ext/wasm/api/sqlite3-api-prologue.js +++ b/ext/wasm/api/sqlite3-api-prologue.js @@ -12,12 +12,12 @@ This file is intended to be combined at build-time with other related code, most notably a header and footer which wraps this - whole file into an Emscripten Module.postRun() handler. The sqlite3 - JS API has no hard requirements on Emscripten and does not expose - any Emscripten APIs to clients. It is structured such that its build - can be tweaked to include it in arbitrary WASM environments which - can supply the necessary underlying features (e.g. a POSIX file I/O - layer). + whole file into an Emscripten Module.postRun()-style handler. The + sqlite3 JS API has no hard requirements on Emscripten and does not + expose any Emscripten APIs to clients. It is structured such that + its build can be tweaked to include it in arbitrary WASM + environments which can supply the necessary underlying features + (e.g. a POSIX file I/O layer). Main project home page: https://sqlite.org diff --git a/manifest b/manifest index f9dbf25f7f..9701b9f5c6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\stwo\sindexes\shave\sthe\ssame\scost,\suse\sthe\snarrower\sone\s(the\sone\swith\sthe\nsmaller\saverage\son-disk\srow\swidth). -D 2025-01-16T01:47:03.189 +C Replace\suse\sof\sEmscripten's\sModule.postRun()\swith\sa\scustom\scallback\sso\sthat\swe\sget\sconsistent\slibrary\sinit\stiming\swith\sboth\sEmscripten\s3.1.x\sand\s4.0.x.\sDetails\sand\sdiscussion\sare\sin\s[https://github.com/emscripten-core/emscripten/issues/23420|Emscripten\sticket\s#23420]. +D 2025-01-16T09:27:40.151 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -631,15 +631,15 @@ F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-extras fe40d6d758646e38f8b15f709044951 F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-see fb29e62082a658f0d81102488414d422c393c4b20cc2f685b216bc566237957b F ext/wasm/api/EXPORTED_RUNTIME_METHODS.sqlite3-api 1ec3c73e7d66e95529c3c64ac3de2470b0e9e7fbf7a5b41261c367cf4f1b7287 F ext/wasm/api/README.md 34fe11466f9c1d81b10a0469e1114e5f1c5a6365c73d80a1a6ca639a1a358b73 -F ext/wasm/api/extern-post-js.c-pp.js 13b1202f2815165a063ea41cc8450e0dc1505bbbe0be2fdac439b30b8cbdaacd +F ext/wasm/api/extern-post-js.c-pp.js 3fcd904f1204685dea84e5ae90d8b7e65a1dcebab1e838386d8328b74cce46c9 F ext/wasm/api/extern-pre-js.js cc61c09c7a24a07dbecb4c352453c3985170cec12b4e7e7e7a4d11d43c5c8f41 -F ext/wasm/api/post-js-footer.js 6137d9d3dea0f3868d03bca058dc662f01848f81ab6bf940ffaa10a75069d709 -F ext/wasm/api/post-js-header.js bd91458bd0763c1bdb382dc4e8ac7b52e2d7337adc3a2f07f454631b64f12e82 +F ext/wasm/api/post-js-footer.js 365405929f41ca0e6d389ed8a8da3f3c93e11d3ef43a90ae151e37fa9f75bf41 +F ext/wasm/api/post-js-header.js 54b2b4294501b3866245cc94315a16f5424c0e87729d0fb610fba151593c6d26 F ext/wasm/api/pre-js.c-pp.js a614a2c82b12c4d96d8e3ba77330329efc53c4d56a8a7e60ade900f341866cfb F ext/wasm/api/sqlite3-api-cleanup.js 3ac1786e461ada63033143be8c3b00b26b939540661f3e839515bb92f2e35359 F ext/wasm/api/sqlite3-api-glue.c-pp.js fb6dbfe692cc23000a65a4cd95a1a47ed5eb592dc9d8b55363b3c2952a787244 F ext/wasm/api/sqlite3-api-oo1.c-pp.js f3a8e2004c6625d17946c11f2fb32008be78bc5207bf746fc77d59848813225f -F ext/wasm/api/sqlite3-api-prologue.js 6f1257e04885632ed9f44d43aba200b86e0bc16709ffdba29abbbeb1bc8e8b76 +F ext/wasm/api/sqlite3-api-prologue.js 3caa0d1f46fe1bfbd1cce31b57b4446ca073ddb15f67476a9ff6c93456467712 F ext/wasm/api/sqlite3-api-worker1.c-pp.js 5cc22a3c0d52828cb32aad8691488719f47d27567e63e8bc8b832d74371c352d F ext/wasm/api/sqlite3-license-version-header.js 0c807a421f0187e778dc1078f10d2994b915123c1223fe752b60afdcd1263f89 F ext/wasm/api/sqlite3-opfs-async-proxy.js 3774befd97cd1a5e2895c8225a894aad946848c6d9b4028acc988b5d123475af @@ -2205,9 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 113078d555eaf740666680562ebbb04f7d823b72e8b2d553627e54ab3d7bf653 d4bd0d4214551f88f248698fefc821575b722ce5c194d0b3796f572e4704f641 -R 67bf1f1ea7b98f52d11babfcef31079b -T +closed d4bd0d4214551f88f248698fefc821575b722ce5c194d0b3796f572e4704f641 -U drh -Z e2e745138fe18758760902106f28615a +P 398559678f2b9a65b245ed73b4d512c4fccc69d42b5a6a1c1b7755a80b69d073 +R 2801f6e9d42f0c28c93c86330f3de131 +U stephan +Z d1762f6c1968a826e67235d5776c3a77 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 1fb039b289..bc45adc644 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -398559678f2b9a65b245ed73b4d512c4fccc69d42b5a6a1c1b7755a80b69d073 +4863a70ac61ff6f868429f16f0141484ea98f973fde1a9aff879252d0f1dbb6b From b6953280e7563d2e7e900391d36f618b39b64b02 Mon Sep 17 00:00:00 2001 From: stephan Date: Thu, 16 Jan 2025 12:15:51 +0000 Subject: [PATCH 063/220] When generating the autoconf snapshot, replaces the Libs.private line from sqlite3.pc.in with one compatible with the legacy build, as reported in [forum:e40b9b424a|forum post e40b9b424a]. FossilOrigin-Name: fe47154799bfefb12eb1209d9ada64ecac38bee1b7c3558d175215a2beba991d --- manifest | 12 ++++++------ manifest.uuid | 2 +- tool/mkautoconfamal.sh | 4 ++++ 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 9701b9f5c6..29cdb16be1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Replace\suse\sof\sEmscripten's\sModule.postRun()\swith\sa\scustom\scallback\sso\sthat\swe\sget\sconsistent\slibrary\sinit\stiming\swith\sboth\sEmscripten\s3.1.x\sand\s4.0.x.\sDetails\sand\sdiscussion\sare\sin\s[https://github.com/emscripten-core/emscripten/issues/23420|Emscripten\sticket\s#23420]. -D 2025-01-16T09:27:40.151 +C When\sgenerating\sthe\sautoconf\ssnapshot,\sreplaces\sthe\sLibs.private\sline\sfrom\ssqlite3.pc.in\swith\sone\scompatible\swith\sthe\slegacy\sbuild,\sas\sreported\sin\s[forum:e40b9b424a|forum\spost\se40b9b424a]. +D 2025-01-16T12:15:51.633 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -2140,7 +2140,7 @@ F tool/logest.c c34e5944318415de513d29a6098df247a9618c96d83c38d4abd88641fe46e669 F tool/max-limits.c cbb635fbb37ae4d05f240bfb5b5270bb63c54439 F tool/merge-test.tcl de76b62f2de2a92d4c1ca4f976bce0aea6899e0229e250479b229b2a1914b176 F tool/mkamalzip.tcl 8aa5ebe7973c8b8774062d34e15fea9815c4cc2ceea3a9b184695f005910876a -F tool/mkautoconfamal.sh cbdcf993fa83dccbef7fb77b39cdeb31ef9f77d9d88c9e343b58d35ca3898a6a +F tool/mkautoconfamal.sh 4fbfd523330c8cf12ead8f0e0acdb3c5c9c08a1bcb293119267aeaa3e0bbe3e1 F tool/mkccode.tcl 210159febe0ef0ecbc53c79833500663ceaba0115b2b374405818dc835b5f84b x F tool/mkctimec.tcl ef6a67ec82e5b6fc19152a4c79f237227b18bf67ff16d155bac7adb94355d9cf x F tool/mkkeywordhash.c 6b0be901c47f9ad42215fc995eb2f4384ac49213b1fba395102ec3e999acf559 @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 398559678f2b9a65b245ed73b4d512c4fccc69d42b5a6a1c1b7755a80b69d073 -R 2801f6e9d42f0c28c93c86330f3de131 +P 4863a70ac61ff6f868429f16f0141484ea98f973fde1a9aff879252d0f1dbb6b +R e6fb17d788fe1bd29fcc394e2d7718b5 U stephan -Z d1762f6c1968a826e67235d5776c3a77 +Z e136bf1726024a0aa66f18035e95cfb5 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index bc45adc644..5c39a70ad1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4863a70ac61ff6f868429f16f0141484ea98f973fde1a9aff879252d0f1dbb6b +fe47154799bfefb12eb1209d9ada64ecac38bee1b7c3558d175215a2beba991d diff --git a/tool/mkautoconfamal.sh b/tool/mkautoconfamal.sh index 35dbfb41e0..f3ce9dd5ba 100644 --- a/tool/mkautoconfamal.sh +++ b/tool/mkautoconfamal.sh @@ -68,6 +68,10 @@ cat $TMPSPACE/configure.ac | sed "s/--SQLITE-VERSION--/$VERSION/" > $TMPSPACE/tmp mv $TMPSPACE/tmp $TMPSPACE/configure.ac +cat $TMPSPACE/sqlite3.pc.in | +sed "s/^Libs.private:.*/Libs.private: @LIBS@/" > $TMPSPACE/tmp +mv $TMPSPACE/tmp $TMPSPACE/sqlite3.pc.in + cd $TMPSPACE autoreconf -i #libtoolize From ec50c5a2a430b77c45a1118ab68c93d53c9299bb Mon Sep 17 00:00:00 2001 From: stephan Date: Thu, 16 Jan 2025 13:10:06 +0000 Subject: [PATCH 064/220] wasm: after generating the .js/.mjs file, strip out all of the generated pieces which create Emscripten call() bindings for the sqlite3 APIs, as we don't use those binding, so both the setup time and the memory they use installing WASM proxy bindings is wasted. This eliminates some 200 superfluous/unused bindings from the init process. FossilOrigin-Name: 020d2c7528be6f11a5b2b849d7b2f04e47abe2b0842520ff60eb7defb3768e1c --- ext/wasm/GNUmakefile | 1 + ext/wasm/mkwasmbuilds.c | 11 +++++++++-- manifest | 14 +++++++------- manifest.uuid | 2 +- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/ext/wasm/GNUmakefile b/ext/wasm/GNUmakefile index 6f226fbb4f..ad6fafacc7 100644 --- a/ext/wasm/GNUmakefile +++ b/ext/wasm/GNUmakefile @@ -1052,6 +1052,7 @@ $(speedtest1.js): $(MAKEFILE) $(speedtest1.cfiles) \ $(speedtest1.exit-runtime0) \ -o $@ $(speedtest1.cfiles) -lm $(maybe-wasm-strip) $(speedtest1.wasm) + sed -i -e '/^var _sqlite3.*createExportWrapper/d' $@ chmod -x $(speedtest1.wasm) ls -la $@ $(speedtest1.wasm) diff --git a/ext/wasm/mkwasmbuilds.c b/ext/wasm/mkwasmbuilds.c index 29b6cafae9..d7a9a3e71c 100644 --- a/ext/wasm/mkwasmbuilds.c +++ b/ext/wasm/mkwasmbuilds.c @@ -75,7 +75,7 @@ static void mk_pre_post(const char *zName /* build name */, const char *zMode /* build mode */, const char *zCmppD /* optional -D flags for c-pp for the ** --pre/--post-js files. */){ - pf("%s# Begin --pre/--post flags for %s-%s\n", zBanner, zName, zMode); + pf("%s# Begin --pre/--post flags for %s-%s\n", zBanner, zNM); pf("c-pp.D.%s-%s := %s\n", zNM, zCmppD ? zCmppD : ""); pf("pre-post-%s-%s.flags ?=\n", zNM); @@ -130,7 +130,7 @@ static void mk_pre_post(const char *zName /* build name */, zNM, zNM, zNM); pf("pre-post-%s-%s.deps := $(pre-post-jses.%s-%s.deps) $(dir.tmp)/pre-js.%s-%s.js\n", zNM, zNM, zNM); - pf("# End --pre/--post flags for %s-%s%s", zName, zMode, zBanner); + pf("# End --pre/--post flags for %s-%s%s", zNM, zBanner); } /* @@ -233,6 +233,13 @@ static void mk_lib_mode(const char *zName /* build name */, pf("\t@dotwasm=$(basename $@).wasm; \\\n" "\tchmod -x $$dotwasm; \\\n" "\t$(maybe-wasm-strip) $$dotwasm; \\\n"); + pf("\tsed -i -e '/^var _sqlite3.*createExportWrapper/d' %s; \\\n" + "\techo 'Stripped out createExportWrapper() parts.'; \\\n", + zJsOut) /* Our JS code installs bindings of each WASM export. The + generated Emscripten JS file does the same using its + own framework, but we don't use those results and can + speed up lib init, and reduce memory cost + considerably, by stripping them out. */; /* ** The above $(emcc.bin) call will write zJsOut and will create a ** like-named .wasm file. That .wasm file name gets hard-coded into diff --git a/manifest b/manifest index 29cdb16be1..211eaabd00 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\sgenerating\sthe\sautoconf\ssnapshot,\sreplaces\sthe\sLibs.private\sline\sfrom\ssqlite3.pc.in\swith\sone\scompatible\swith\sthe\slegacy\sbuild,\sas\sreported\sin\s[forum:e40b9b424a|forum\spost\se40b9b424a]. -D 2025-01-16T12:15:51.633 +C wasm:\safter\sgenerating\sthe\s.js/.mjs\sfile,\sstrip\sout\sall\sof\sthe\sgenerated\spieces\swhich\screate\sEmscripten\scall()\sbindings\sfor\sthe\ssqlite3\sAPIs,\sas\swe\sdon't\suse\sthose\sbinding,\sso\sboth\sthe\ssetup\stime\sand\sthe\smemory\sthey\suse\sinstalling\sWASM\sproxy\sbindings\sis\swasted.\sThis\seliminates\ssome\s200\ssuperfluous/unused\sbindings\sfrom\sthe\sinit\sprocess. +D 2025-01-16T13:10:06.949 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -618,7 +618,7 @@ F ext/session/sqlite3session.c d6f5e3e83b9b0bbc4a8db4837284f0ecc6af5321d4c8e7136 F ext/session/sqlite3session.h 683ccbf16e2c2521661fc4c1cf918ce57002039efbcabcd8097fa4bca569104b F ext/session/test_session.c 12e0a2c15fd60f92da4bb29c697c9177ff0c0dbcdc5129a54c47e999f147937a F ext/wasm/EXPORTED_FUNCTIONS.fiddle.in 27450c8b8c70875a260aca55435ec927068b34cef801a96205adb81bdcefc65c -F ext/wasm/GNUmakefile 6b42d6de2316ae01a96d1b850932fcab0f2938affc27b48495776903f544a488 +F ext/wasm/GNUmakefile 78f49e47146d58fa44f9ac624627a718fba4b2b2baeaea641bcf6fed300c0f0d F ext/wasm/README-dist.txt 6382cb9548076fca472fb3330bbdba3a55c1ea0b180ff9253f084f07ff383576 F ext/wasm/README.md a8a2962c3aebdf8d2104a9102e336c5554e78fc6072746e5daf9c61514e7d193 F ext/wasm/SQLTester/GNUmakefile e0794f676d55819951bbfae45cc5e8d7818dc460492dc317ce7f0d2eca15caff @@ -678,7 +678,7 @@ F ext/wasm/index-dist.html 564b5ec5669676482c5a25dea9e721d8eafed426ecb155f93d29a F ext/wasm/index.html e4bbffdb3d40eff12b3f9c7abedef91787e2935620b7f8d40f2c774b80ad8fa9 F ext/wasm/jaccwabyt/jaccwabyt.js 1264710db3cfbcb6887d95665b7aeba60c1126eaef789ca4cf1a4a17d5bc7f54 F ext/wasm/jaccwabyt/jaccwabyt.md 59a20df389abcc3606eb4eaea7fb7ba14504beb3e345dbea9b99a0618ba3bec8 -F ext/wasm/mkwasmbuilds.c e3580b26bc393e4e4beb25f6349b999878782f3319b740469f64c2e772632e03 +F ext/wasm/mkwasmbuilds.c af06fd14fcb7803c0adacab276047bb696c07f5b683a6f70adc5b3f146cf61f3 F ext/wasm/module-symbols.html dc476b403369b26a1a23773e13b80f41b9a49f0825e81435fe3600a7cfbbe337 F ext/wasm/scratchpad-wasmfs.html a3d7388f3c4b263676b58b526846e9d02dfcb4014ff29d3a5040935286af5b96 F ext/wasm/scratchpad-wasmfs.mjs 66034b9256b218de59248aad796760a1584c1dd842231505895eff00dbd57c63 @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 4863a70ac61ff6f868429f16f0141484ea98f973fde1a9aff879252d0f1dbb6b -R e6fb17d788fe1bd29fcc394e2d7718b5 +P fe47154799bfefb12eb1209d9ada64ecac38bee1b7c3558d175215a2beba991d +R 0d99f3ed7952e5d1d1a513615776937d U stephan -Z e136bf1726024a0aa66f18035e95cfb5 +Z 6b1b963846ad84056f214255285f2dea # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 5c39a70ad1..57bfab2704 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fe47154799bfefb12eb1209d9ada64ecac38bee1b7c3558d175215a2beba991d +020d2c7528be6f11a5b2b849d7b2f04e47abe2b0842520ff60eb7defb3768e1c From 4a25b740f26ee60386cdbf962dc30acf563cb432 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 16 Jan 2025 14:06:29 +0000 Subject: [PATCH 065/220] Speedtest1 enhancements: (1) Add the ability to scale performance of tests sets using "/NNN" after the testset name, even for testsets in a comma-separated list. (2) Add the "mix1" macro testset. FossilOrigin-Name: 85667b3a572bc9afd8c862a0b2c5f47f76ca80d6e61302ca7d7c1b326d3dd578 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/speedtest1.c | 23 +++++++++++++++++++++-- 3 files changed, 29 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 211eaabd00..46cf956575 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C wasm:\safter\sgenerating\sthe\s.js/.mjs\sfile,\sstrip\sout\sall\sof\sthe\sgenerated\spieces\swhich\screate\sEmscripten\scall()\sbindings\sfor\sthe\ssqlite3\sAPIs,\sas\swe\sdon't\suse\sthose\sbinding,\sso\sboth\sthe\ssetup\stime\sand\sthe\smemory\sthey\suse\sinstalling\sWASM\sproxy\sbindings\sis\swasted.\sThis\seliminates\ssome\s200\ssuperfluous/unused\sbindings\sfrom\sthe\sinit\sprocess. -D 2025-01-16T13:10:06.949 +C Speedtest1\senhancements:\s\s(1)\sAdd\sthe\sability\sto\sscale\sperformance\sof\ntests\ssets\susing\s"/NNN"\safter\sthe\stestset\sname,\seven\sfor\stestsets\sin\sa\ncomma-separated\slist.\s\s(2)\sAdd\sthe\s"mix1"\smacro\stestset. +D 2025-01-16T14:06:30.000 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -1677,7 +1677,7 @@ F test/speed3.test 694affeb9100526007436334cf7d08f3d74b85ef F test/speed4.test abc0ad3399dcf9703abed2fff8705e4f8e416715 F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa F test/speed4p.test 377a0c48e5a92e0b11c1c5ebb1bc9d83a7312c922bc0cb05970ef5d6a96d1f0c -F test/speedtest1.c cc503febbb8559d541a67d7a33d3d7bb8a2c8cbbfc89eb336e2e2bd6ad6a63ee +F test/speedtest1.c ef3a1b9c0938b5202a6ad7a16bf53422f13f4c3901e9b973aaac168a30d75feb F test/spellfix.test 951a6405d49d1a23d6b78027d3877b4a33eeb8221dcab5704b499755bb4f552e F test/spellfix2.test dfc8f519a3fc204cb2dfa8b4f29821ae90f6f8c3 F test/spellfix3.test 0f9efaaa502a0e0a09848028518a6fb096c8ad33 @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P fe47154799bfefb12eb1209d9ada64ecac38bee1b7c3558d175215a2beba991d -R 0d99f3ed7952e5d1d1a513615776937d -U stephan -Z 6b1b963846ad84056f214255285f2dea +P 020d2c7528be6f11a5b2b849d7b2f04e47abe2b0842520ff60eb7defb3768e1c +R 6782bdbb35165160181ae38f9abe3d27 +U drh +Z 6a345f2c4878196402ebe51d9f9059ab # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 57bfab2704..b51b9a35e4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -020d2c7528be6f11a5b2b849d7b2f04e47abe2b0842520ff60eb7defb3768e1c +85667b3a572bc9afd8c862a0b2c5f47f76ca80d6e61302ca7d7c1b326d3dd578 diff --git a/test/speedtest1.c b/test/speedtest1.c index b0817858ae..37f215172e 100644 --- a/test/speedtest1.c +++ b/test/speedtest1.c @@ -43,6 +43,8 @@ static const char zHelp[] = " --stmtscanstatus Activate SQLITE_DBCONFIG_STMT_SCANSTATUS\n" " --temp N N from 0 to 9. 0: no temp table. 9: all temp tables\n" " --testset T Run test-set T (main, cte, rtree, orm, fp, debug)\n" + " Can be a comma-separated list of values, with /SCALE suffixes\n" + " or macro \"mix1\"\n" " --trace Turn on SQL tracing\n" " --threads N Use up to N threads for sorting\n" " --utf16be Set text encoding to UTF-16BE\n" @@ -99,6 +101,7 @@ static struct Global { int bMemShrink; /* Call sqlite3_db_release_memory() often */ int eTemp; /* 0: no TEMP. 9: always TEMP. */ int szTest; /* Scale factor for test iterations */ + int szBase; /* Base size prior to testset scaling */ int nRepeat; /* Repeat selects this many times */ int doCheckpoint; /* Run PRAGMA wal_checkpoint after each trans */ int nReserve; /* Reserve bytes */ @@ -2299,6 +2302,7 @@ int main(int argc, char **argv){ g.zNN = ""; g.zPK = "UNIQUE"; g.szTest = 100; + g.szBase = 100; g.nRepeat = 1; for(i=1; i0 || zComma!=0 ){ + zSep = strchr(zThisTest, '/'); + if( zSep ){ + int kk; + for(kk=1; zSep[kk] && ISDIGIT(zSep[kk]); kk++){} + if( kk==1 || zSep[kk]!=0 ){ + fatal_error("bad modifier on testset name: \"%s\"", zThisTest); + } + g.szTest = g.szBase*integerValue(zSep+1)/100; + zSep[0] = 0; + }else{ + g.szTest = g.szBase; + } + if( g.iTotal>0 || zComma==0 ){ printf(" Begin testset \"%s\"\n", zThisTest); } if( strcmp(zThisTest,"main")==0 ){ From bfa721898255f8529bb58e8cbb1d1b3d867896fe Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 16 Jan 2025 14:37:48 +0000 Subject: [PATCH 066/220] Add the "json" test case to speedtest1 and include it in "mix1". FossilOrigin-Name: 2db3a3ee37a9d2fe9b94d16d35c24846c37abe73b89cde4dd763e01a2bfaa8b7 --- manifest | 12 +++---- manifest.uuid | 2 +- test/speedtest1.c | 85 +++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 90 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 46cf956575..73e42b6f79 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Speedtest1\senhancements:\s\s(1)\sAdd\sthe\sability\sto\sscale\sperformance\sof\ntests\ssets\susing\s"/NNN"\safter\sthe\stestset\sname,\seven\sfor\stestsets\sin\sa\ncomma-separated\slist.\s\s(2)\sAdd\sthe\s"mix1"\smacro\stestset. -D 2025-01-16T14:06:30.000 +C Add\sthe\s"json"\stest\scase\sto\sspeedtest1\sand\sinclude\sit\sin\s"mix1". +D 2025-01-16T14:37:48.974 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -1677,7 +1677,7 @@ F test/speed3.test 694affeb9100526007436334cf7d08f3d74b85ef F test/speed4.test abc0ad3399dcf9703abed2fff8705e4f8e416715 F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa F test/speed4p.test 377a0c48e5a92e0b11c1c5ebb1bc9d83a7312c922bc0cb05970ef5d6a96d1f0c -F test/speedtest1.c ef3a1b9c0938b5202a6ad7a16bf53422f13f4c3901e9b973aaac168a30d75feb +F test/speedtest1.c 572cc10da33f9ce696346fefddf8afc583745e448192fda8d81ae4be897da27f F test/spellfix.test 951a6405d49d1a23d6b78027d3877b4a33eeb8221dcab5704b499755bb4f552e F test/spellfix2.test dfc8f519a3fc204cb2dfa8b4f29821ae90f6f8c3 F test/spellfix3.test 0f9efaaa502a0e0a09848028518a6fb096c8ad33 @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 020d2c7528be6f11a5b2b849d7b2f04e47abe2b0842520ff60eb7defb3768e1c -R 6782bdbb35165160181ae38f9abe3d27 +P 85667b3a572bc9afd8c862a0b2c5f47f76ca80d6e61302ca7d7c1b326d3dd578 +R 207656080a990b075c009fc5a42018e0 U drh -Z 6a345f2c4878196402ebe51d9f9059ab +Z 5e27a73ae0785d981160c5186c684481 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index b51b9a35e4..d4dd07d115 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -85667b3a572bc9afd8c862a0b2c5f47f76ca80d6e61302ca7d7c1b326d3dd578 +2db3a3ee37a9d2fe9b94d16d35c24846c37abe73b89cde4dd763e01a2bfaa8b7 diff --git a/test/speedtest1.c b/test/speedtest1.c index 37f215172e..581e0af373 100644 --- a/test/speedtest1.c +++ b/test/speedtest1.c @@ -42,7 +42,7 @@ static const char zHelp[] = " --stats Show statistics at the end\n" " --stmtscanstatus Activate SQLITE_DBCONFIG_STMT_SCANSTATUS\n" " --temp N N from 0 to 9. 0: no temp table. 9: all temp tables\n" - " --testset T Run test-set T (main, cte, rtree, orm, fp, debug)\n" + " --testset T Run test-set T (main, cte, rtree, orm, fp, json, debug)\n" " Can be a comma-separated list of values, with /SCALE suffixes\n" " or macro \"mix1\"\n" " --trace Turn on SQL tracing\n" @@ -2152,6 +2152,85 @@ void testset_debug1(void){ } } +/* +** Performance tests for JSON. +*/ +void testset_json(void){ + speedtest1_begin_test(100, "construct table J1 with %d rows of text JSON", + g.szTest*250); + speedtest1_exec( + "CREATE TABLE j1(x JSON TEXT);\n" + "WITH RECURSIVE\n" + " c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<%d),\n" + " array1(y) AS (\n" + " SELECT json_group_array(\n" + " json_object('x',x,'y',random(),'z',hex(randomblob(50)))\n" + " )\n" + " FROM c\n" + " ),\n" + " c2(n) AS (VALUES(1) UNION ALL SELECT n+1 FROM c2 WHERE n<5)\n" + "INSERT INTO j1(x)\n" + " SELECT json_object('a',n,'b',n*2,'c',y,'d',3,'e',5,'f',6) FROM array1, c2;\n", + g.szTest*250 + ); + speedtest1_end_test(); + + speedtest1_begin_test(110, "construct table J2 with %d rows of JSONB", + g.szTest*250); + speedtest1_exec( + "CREATE TABLE j2(x JSON TEXT);\n" + "WITH RECURSIVE\n" + " c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<%d),\n" + " array1(y) AS (\n" + " SELECT json_group_array(\n" + " json_object('x',x,'y',random(),'z',hex(randomblob(50)))\n" + " )\n" + " FROM c\n" + " ),\n" + " c2(n) AS (VALUES(1) UNION ALL SELECT n+1 FROM c2 WHERE n<5)\n" + "INSERT INTO j2(x)\n" + " SELECT jsonb_object('a',n,'b',n*2,'c',y,'d',3,'e',5,'f',6) FROM array1, c2;\n", + g.szTest*250 + ); + speedtest1_end_test(); + + speedtest1_begin_test(120, "create indexes on JSON expressions"); + speedtest1_exec( + "BEGIN;\n" + "CREATE INDEX j1x1 ON j1(x->>'a');\n" + "CREATE INDEX j1x2 ON j1(x->>'b');\n" + "CREATE INDEX j1x3 ON j1(x->>'e');\n" + "CREATE INDEX j1x4 ON j1(x->>'f');\n" + "CREATE INDEX j2x1 ON j2(x->>'a');\n" + "CREATE INDEX j2x2 ON j2(x->>'b');\n" + "CREATE INDEX j2x3 ON j2(x->>'e');\n" + "CREATE INDEX j2x4 ON j2(x->>'f');\n" + "COMMIT;\n" + ); + speedtest1_end_test(); + + speedtest1_begin_test(130, "json_replace()/set()/remove() on every row of J1"); + speedtest1_exec( + "BEGIN;\n" + "UPDATE j1 SET x=json_replace(x,'$.f',(x->>'f')+1);\n" + "UPDATE j1 SET x=json_set(x,'$.e',(x->>'f')-1);\n" + "UPDATE j1 SET x=json_remove(x,'$.d');\n" + "COMMIT;\n" + ); + speedtest1_end_test(); + + speedtest1_begin_test(140, "json_replace()/set()/remove() on every row of J2"); + speedtest1_exec( + "BEGIN;\n" + "UPDATE j2 SET x=jsonb_replace(x,'$.f',(x->>'f')+1);\n" + "UPDATE j2 SET x=jsonb_set(x,'$.e',(x->>'f')-1);\n" + "UPDATE j2 SET x=jsonb_remove(x,'$.d');\n" + "COMMIT;\n" + ); + speedtest1_end_test(); + +} + /* ** This testset focuses on the speed of parsing numeric literals (integers ** and real numbers). This was added to test the impact of allowing "_" @@ -2423,7 +2502,7 @@ int main(int argc, char **argv){ } g.eTemp = argv[i][0] - '0'; }else if( strcmp(z,"testset")==0 ){ - static char zMix1Tests[] = "main,orm/25,cte/20,fp/25,parsenumber,rtree/20"; + static char zMix1Tests[] = "main,orm/25,cte/20,json,fp/25,parsenumber,rtree/20"; ARGC_VALUE_CHECK(1); zTSet = argv[++i]; if( strcmp(zTSet,"mix1")==0 ) zTSet = zMix1Tests; @@ -2613,6 +2692,8 @@ int main(int argc, char **argv){ testset_cte(); }else if( strcmp(zThisTest,"fp")==0 ){ testset_fp(); + }else if( strcmp(zThisTest,"json")==0 ){ + testset_json(); }else if( strcmp(zThisTest,"trigger")==0 ){ testset_trigger(); }else if( strcmp(zThisTest,"parsenumber")==0 ){ From c957673bf7f8e79f29ce217bc89c0f686ff4c590 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 16 Jan 2025 17:19:06 +0000 Subject: [PATCH 067/220] Revamp the "json" testset in speedtest1. FossilOrigin-Name: d33508836bc88314a205bfa9d80f3ebe695163cf0c46d500ad674535975408fb --- manifest | 12 +++---- manifest.uuid | 2 +- test/speedtest1.c | 83 ++++++++++++++++++++++++++--------------------- 3 files changed, 53 insertions(+), 44 deletions(-) diff --git a/manifest b/manifest index 73e42b6f79..82d8bd5ec6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s"json"\stest\scase\sto\sspeedtest1\sand\sinclude\sit\sin\s"mix1". -D 2025-01-16T14:37:48.974 +C Revamp\sthe\s"json"\stestset\sin\sspeedtest1. +D 2025-01-16T17:19:06.045 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -1677,7 +1677,7 @@ F test/speed3.test 694affeb9100526007436334cf7d08f3d74b85ef F test/speed4.test abc0ad3399dcf9703abed2fff8705e4f8e416715 F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa F test/speed4p.test 377a0c48e5a92e0b11c1c5ebb1bc9d83a7312c922bc0cb05970ef5d6a96d1f0c -F test/speedtest1.c 572cc10da33f9ce696346fefddf8afc583745e448192fda8d81ae4be897da27f +F test/speedtest1.c 6c9f30a9035aeafc767b770f0c576d45701ed928f7e354f6c18b6bbccbf81417 F test/spellfix.test 951a6405d49d1a23d6b78027d3877b4a33eeb8221dcab5704b499755bb4f552e F test/spellfix2.test dfc8f519a3fc204cb2dfa8b4f29821ae90f6f8c3 F test/spellfix3.test 0f9efaaa502a0e0a09848028518a6fb096c8ad33 @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 85667b3a572bc9afd8c862a0b2c5f47f76ca80d6e61302ca7d7c1b326d3dd578 -R 207656080a990b075c009fc5a42018e0 +P 2db3a3ee37a9d2fe9b94d16d35c24846c37abe73b89cde4dd763e01a2bfaa8b7 +R c60371158767e3daeea4a8672be014f0 U drh -Z 5e27a73ae0785d981160c5186c684481 +Z 3720db8250a91ea5623fb5048e644ae1 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index d4dd07d115..e1c1950809 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2db3a3ee37a9d2fe9b94d16d35c24846c37abe73b89cde4dd763e01a2bfaa8b7 +d33508836bc88314a205bfa9d80f3ebe695163cf0c46d500ad674535975408fb diff --git a/test/speedtest1.c b/test/speedtest1.c index 581e0af373..95a451e7b7 100644 --- a/test/speedtest1.c +++ b/test/speedtest1.c @@ -2156,55 +2156,64 @@ void testset_debug1(void){ ** Performance tests for JSON. */ void testset_json(void){ - speedtest1_begin_test(100, "construct table J1 with %d rows of text JSON", - g.szTest*250); + unsigned int r = 0x12345678; + sqlite3_test_control(SQLITE_TESTCTRL_PRNG_SEED, r, g.db); + speedtest1_begin_test(100, "table J1 is %d rows of JSONB", + g.szTest*5); speedtest1_exec( - "CREATE TABLE j1(x JSON TEXT);\n" + "CREATE TABLE j1(x JSONB);\n" "WITH RECURSIVE\n" - " c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<%d),\n" - " array1(y) AS (\n" - " SELECT json_group_array(\n" - " json_object('x',x,'y',random(),'z',hex(randomblob(50)))\n" - " )\n" - " FROM c\n" + " jval(n,j) AS (\n" + " VALUES(0,'{}'),(1,'[]'),(2,'true'),(3,'false'),(4,'null'),\n" + " (5,'{x:1,y:2}'),(6,'0.0'),(7,'3.14159'),(8,'-99.9'),\n" + " (9,'[1,2,3,4]')\n" " ),\n" - " c2(n) AS (VALUES(1) UNION ALL SELECT n+1 FROM c2 WHERE n<5)\n" + " c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<26*26-1),\n" + " array1(y) AS MATERIALIZED (\n" + " SELECT jsonb_group_array(\n" + " jsonb_object('x',x,\n" + " 'y',jsonb(coalesce(j,random()%%10000)),\n" + " 'z',hex(randomblob(50)))\n" + " )\n" + " FROM c LEFT JOIN jval ON (x%%20)=n\n" + " ),\n" + " object1(z) AS MATERIALIZED (\n" + " SELECT jsonb_group_object(char(0x61+x%%26,0x61+(x/26)%%26),\n" + " jsonb( coalesce(j,random()%%10000)))\n" + " FROM c LEFT JOIN jval ON (x%%20)=n\n" + " ),\n" + " c2(n) AS (VALUES(1) UNION ALL SELECT n+1 FROM c2 WHERE n<%d)\n" "INSERT INTO j1(x)\n" - " SELECT json_object('a',n,'b',n*2,'c',y,'d',3,'e',5,'f',6) FROM array1, c2;\n", - g.szTest*250 + " SELECT jsonb_object('a',n,'b',n+10000,'c',jsonb(y),'d',jsonb(z),\n" + " 'e',n+20000,'f',n+30000)\n" + " FROM array1, object1, c2;", + g.szTest*5 ); speedtest1_end_test(); - speedtest1_begin_test(110, "construct table J2 with %d rows of JSONB", - g.szTest*250); + speedtest1_begin_test(110, "table J2 is %d rows from J1 converted to text", g.szTest); speedtest1_exec( "CREATE TABLE j2(x JSON TEXT);\n" - "WITH RECURSIVE\n" - " c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<%d),\n" - " array1(y) AS (\n" - " SELECT json_group_array(\n" - " json_object('x',x,'y',random(),'z',hex(randomblob(50)))\n" - " )\n" - " FROM c\n" - " ),\n" - " c2(n) AS (VALUES(1) UNION ALL SELECT n+1 FROM c2 WHERE n<5)\n" - "INSERT INTO j2(x)\n" - " SELECT jsonb_object('a',n,'b',n*2,'c',y,'d',3,'e',5,'f',6) FROM array1, c2;\n", - g.szTest*250 + "INSERT INTO j2(x) SELECT json(x) FROM j1 LIMIT %d", g.szTest ); speedtest1_end_test(); - speedtest1_begin_test(120, "create indexes on JSON expressions"); + speedtest1_begin_test(120, "create indexes on JSON expressions on J1"); speedtest1_exec( "BEGIN;\n" "CREATE INDEX j1x1 ON j1(x->>'a');\n" "CREATE INDEX j1x2 ON j1(x->>'b');\n" - "CREATE INDEX j1x3 ON j1(x->>'e');\n" - "CREATE INDEX j1x4 ON j1(x->>'f');\n" + "CREATE INDEX j1x3 ON j1(x->>'f');\n" + "COMMIT;\n" + ); + speedtest1_end_test(); + + speedtest1_begin_test(130, "create indexes on JSON expressions on J2"); + speedtest1_exec( + "BEGIN;\n" "CREATE INDEX j2x1 ON j2(x->>'a');\n" "CREATE INDEX j2x2 ON j2(x->>'b');\n" - "CREATE INDEX j2x3 ON j2(x->>'e');\n" - "CREATE INDEX j2x4 ON j2(x->>'f');\n" + "CREATE INDEX j2x3 ON j2(x->>'f');\n" "COMMIT;\n" ); speedtest1_end_test(); @@ -2212,9 +2221,9 @@ void testset_json(void){ speedtest1_begin_test(130, "json_replace()/set()/remove() on every row of J1"); speedtest1_exec( "BEGIN;\n" - "UPDATE j1 SET x=json_replace(x,'$.f',(x->>'f')+1);\n" - "UPDATE j1 SET x=json_set(x,'$.e',(x->>'f')-1);\n" - "UPDATE j1 SET x=json_remove(x,'$.d');\n" + "UPDATE j1 SET x=jsonb_replace(x,'$.f',(x->>'f')+1);\n" + "UPDATE j1 SET x=jsonb_set(x,'$.e',(x->>'f')-1);\n" + "UPDATE j1 SET x=jsonb_remove(x,'$.d');\n" "COMMIT;\n" ); speedtest1_end_test(); @@ -2222,9 +2231,9 @@ void testset_json(void){ speedtest1_begin_test(140, "json_replace()/set()/remove() on every row of J2"); speedtest1_exec( "BEGIN;\n" - "UPDATE j2 SET x=jsonb_replace(x,'$.f',(x->>'f')+1);\n" - "UPDATE j2 SET x=jsonb_set(x,'$.e',(x->>'f')-1);\n" - "UPDATE j2 SET x=jsonb_remove(x,'$.d');\n" + "UPDATE j2 SET x=json_replace(x,'$.f',(x->>'f')+1);\n" + "UPDATE j2 SET x=json_set(x,'$.e',(x->>'f')-1);\n" + "UPDATE j2 SET x=json_remove(x,'$.d');\n" "COMMIT;\n" ); speedtest1_end_test(); From 7edb0c392078837d268cea54c2a6252e195a6210 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 16 Jan 2025 20:08:59 +0000 Subject: [PATCH 068/220] speedtest1: Improvements to the "json" testset. Better balance in "mix1". FossilOrigin-Name: 2cc73c5e08f1a16fe8accf0af6af061e42d27635883d09234516fd470e99bc0a --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/speedtest1.c | 33 +++++++++++++++++++++++---------- 3 files changed, 30 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index 82d8bd5ec6..08f99e6eef 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Revamp\sthe\s"json"\stestset\sin\sspeedtest1. -D 2025-01-16T17:19:06.045 +C speedtest1:\s\sImprovements\sto\sthe\s"json"\stestset.\s\sBetter\sbalance\sin\s"mix1". +D 2025-01-16T20:08:59.559 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -1677,7 +1677,7 @@ F test/speed3.test 694affeb9100526007436334cf7d08f3d74b85ef F test/speed4.test abc0ad3399dcf9703abed2fff8705e4f8e416715 F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa F test/speed4p.test 377a0c48e5a92e0b11c1c5ebb1bc9d83a7312c922bc0cb05970ef5d6a96d1f0c -F test/speedtest1.c 6c9f30a9035aeafc767b770f0c576d45701ed928f7e354f6c18b6bbccbf81417 +F test/speedtest1.c 26f1b44de121c114d1487baa5b040c0f2d5fe6bb57febb7ae51ece6ab919783d F test/spellfix.test 951a6405d49d1a23d6b78027d3877b4a33eeb8221dcab5704b499755bb4f552e F test/spellfix2.test dfc8f519a3fc204cb2dfa8b4f29821ae90f6f8c3 F test/spellfix3.test 0f9efaaa502a0e0a09848028518a6fb096c8ad33 @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 2db3a3ee37a9d2fe9b94d16d35c24846c37abe73b89cde4dd763e01a2bfaa8b7 -R c60371158767e3daeea4a8672be014f0 +P d33508836bc88314a205bfa9d80f3ebe695163cf0c46d500ad674535975408fb +R dd0ac0f4915c519ed5a12a3b5d1c6f66 U drh -Z 3720db8250a91ea5623fb5048e644ae1 +Z 81cac1efd10a78c1a3b6a5cb8d65a46e # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index e1c1950809..d6dcda86ad 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d33508836bc88314a205bfa9d80f3ebe695163cf0c46d500ad674535975408fb +2cc73c5e08f1a16fe8accf0af6af061e42d27635883d09234516fd470e99bc0a diff --git a/test/speedtest1.c b/test/speedtest1.c index 95a451e7b7..c84d2c5919 100644 --- a/test/speedtest1.c +++ b/test/speedtest1.c @@ -2166,7 +2166,7 @@ void testset_json(void){ " jval(n,j) AS (\n" " VALUES(0,'{}'),(1,'[]'),(2,'true'),(3,'false'),(4,'null'),\n" " (5,'{x:1,y:2}'),(6,'0.0'),(7,'3.14159'),(8,'-99.9'),\n" - " (9,'[1,2,3,4]')\n" + " (9,'[1,2,\"\\n\\u2192\\\"\\u2190\",4]')\n" " ),\n" " c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<26*26-1),\n" " array1(y) AS MATERIALIZED (\n" @@ -2218,20 +2218,32 @@ void testset_json(void){ ); speedtest1_end_test(); - speedtest1_begin_test(130, "json_replace()/set()/remove() on every row of J1"); + speedtest1_begin_test(140, "queries against J1"); + speedtest1_exec( + "WITH c(n) AS (VALUES(0) UNION ALL SELECT n+1 FROM c WHERE n<7)\n" + " SELECT sum(x->>format('$.c[%%d].x',n)) FROM c, j1;\n" + "WITH c(n) AS (VALUES(1) UNION ALL SELECT n+1 FROM c WHERE n<5)\n" + " SELECT sum(x->>format('$.\"c\"[#-%%d].y',n)) FROM c, j1;\n" + "SELECT sum(x->>'$.d.ez' + x->>'$.d.\"xz\"' + x->>'a' + x->>'$.c[10].y') FROM j1;\n" + "SELECT x->>'$.d.tz[2]', x->'$.d.tz' FROM j1;\n" + ); + speedtest1_end_test(); + + + speedtest1_begin_test(150, "json_insert()/set()/remove() on every row of J1"); speedtest1_exec( "BEGIN;\n" - "UPDATE j1 SET x=jsonb_replace(x,'$.f',(x->>'f')+1);\n" + "UPDATE j1 SET x=jsonb_insert(x,'$.g',(x->>'f')+1);\n" "UPDATE j1 SET x=jsonb_set(x,'$.e',(x->>'f')-1);\n" "UPDATE j1 SET x=jsonb_remove(x,'$.d');\n" "COMMIT;\n" ); speedtest1_end_test(); - speedtest1_begin_test(140, "json_replace()/set()/remove() on every row of J2"); + speedtest1_begin_test(160, "json_insert()/set()/remove() on every row of J2"); speedtest1_exec( "BEGIN;\n" - "UPDATE j2 SET x=json_replace(x,'$.f',(x->>'f')+1);\n" + "UPDATE j2 SET x=json_insert(x,'$.g',(x->>'f')+1);\n" "UPDATE j2 SET x=json_set(x,'$.e',(x->>'f')-1);\n" "UPDATE j2 SET x=json_remove(x,'$.d');\n" "COMMIT;\n" @@ -2259,25 +2271,25 @@ void testset_parsenumber(void){ const int NROW = 100*g.szTest; int ii; - speedtest1_begin_test(100, "parsing small integers"); + speedtest1_begin_test(100, "parsing %d small integers", NROW); for(ii=0; ii Date: Thu, 16 Jan 2025 20:46:08 +0000 Subject: [PATCH 069/220] speedtest1: further improvements to the "json" testset. FossilOrigin-Name: c4750f7cf7e2188623de8b12e01acf3e3d7dc7b5ea87ac449571eb36f97d842a --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/speedtest1.c | 16 +++++++++++++++- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 08f99e6eef..a5505b6964 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C speedtest1:\s\sImprovements\sto\sthe\s"json"\stestset.\s\sBetter\sbalance\sin\s"mix1". -D 2025-01-16T20:08:59.559 +C speedtest1:\sfurther\simprovements\sto\sthe\s"json"\stestset. +D 2025-01-16T20:46:08.022 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -1677,7 +1677,7 @@ F test/speed3.test 694affeb9100526007436334cf7d08f3d74b85ef F test/speed4.test abc0ad3399dcf9703abed2fff8705e4f8e416715 F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa F test/speed4p.test 377a0c48e5a92e0b11c1c5ebb1bc9d83a7312c922bc0cb05970ef5d6a96d1f0c -F test/speedtest1.c 26f1b44de121c114d1487baa5b040c0f2d5fe6bb57febb7ae51ece6ab919783d +F test/speedtest1.c 323ce0956430a5aae56ea20f502da7bea3fb62b8ed02e9b0f12ab078b2b258f5 F test/spellfix.test 951a6405d49d1a23d6b78027d3877b4a33eeb8221dcab5704b499755bb4f552e F test/spellfix2.test dfc8f519a3fc204cb2dfa8b4f29821ae90f6f8c3 F test/spellfix3.test 0f9efaaa502a0e0a09848028518a6fb096c8ad33 @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P d33508836bc88314a205bfa9d80f3ebe695163cf0c46d500ad674535975408fb -R dd0ac0f4915c519ed5a12a3b5d1c6f66 +P 2cc73c5e08f1a16fe8accf0af6af061e42d27635883d09234516fd470e99bc0a +R f4bb93608db14b0baa099caf842aef42 U drh -Z 81cac1efd10a78c1a3b6a5cb8d65a46e +Z 1a1ead4cbc7ce98f73040d73112e92fb # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index d6dcda86ad..43e7b2476a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2cc73c5e08f1a16fe8accf0af6af061e42d27635883d09234516fd470e99bc0a +c4750f7cf7e2188623de8b12e01acf3e3d7dc7b5ea87ac449571eb36f97d842a diff --git a/test/speedtest1.c b/test/speedtest1.c index c84d2c5919..8847ed04bf 100644 --- a/test/speedtest1.c +++ b/test/speedtest1.c @@ -2222,18 +2222,32 @@ void testset_json(void){ speedtest1_exec( "WITH c(n) AS (VALUES(0) UNION ALL SELECT n+1 FROM c WHERE n<7)\n" " SELECT sum(x->>format('$.c[%%d].x',n)) FROM c, j1;\n" + "WITH c(n) AS (VALUES(1) UNION ALL SELECT n+1 FROM c WHERE n<5)\n" " SELECT sum(x->>format('$.\"c\"[#-%%d].y',n)) FROM c, j1;\n" + "SELECT sum(x->>'$.d.ez' + x->>'$.d.\"xz\"' + x->>'a' + x->>'$.c[10].y') FROM j1;\n" + "SELECT x->>'$.d.tz[2]', x->'$.d.tz' FROM j1;\n" ); speedtest1_end_test(); + speedtest1_begin_test(141, "queries involving json_type()"); + speedtest1_exec( + "WITH c(n) AS (VALUES(1) UNION ALL SELECT n+1 FROM c WHERE n<20)\n" + " SELECT json_type(x,format('$.c[#-%%d].y',n)), count(*)\n" + " FROM c, j1\n" + " WHERE j1.rowid=1\n" + " GROUP BY 1 ORDER BY 2;" + ); + speedtest1_end_test(); + speedtest1_begin_test(150, "json_insert()/set()/remove() on every row of J1"); speedtest1_exec( "BEGIN;\n" - "UPDATE j1 SET x=jsonb_insert(x,'$.g',(x->>'f')+1);\n" + "UPDATE j1 SET x=jsonb_insert(x,'$.g',(x->>'f')+1,'$.h',3.14159,'$.i','hello',\n" + " '$.j',json('{x:99}'),'$.k','{y:98}');\n" "UPDATE j1 SET x=jsonb_set(x,'$.e',(x->>'f')-1);\n" "UPDATE j1 SET x=jsonb_remove(x,'$.d');\n" "COMMIT;\n" From d0c6c6586e03ddef4713388ce95e212b1c26f5ed Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 17 Jan 2025 10:39:04 +0000 Subject: [PATCH 070/220] Fix a potential one-byte buffer overrun when reading from the Windows console in the CLI. [forum:/forumpost/95e17b8f5c|Forum post 95e17b8f5c]. FossilOrigin-Name: 4d96759694c91301410f53a3f737a049c33e8b259b0954ff659714aff8b21ae8 --- ext/misc/sqlite3_stdio.c | 2 +- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ext/misc/sqlite3_stdio.c b/ext/misc/sqlite3_stdio.c index 97c3551da2..be3acc665e 100644 --- a/ext/misc/sqlite3_stdio.c +++ b/ext/misc/sqlite3_stdio.c @@ -151,7 +151,7 @@ char *sqlite3_fgets(char *buf, int sz, FILE *in){ #ifndef SQLITE_USE_STDIO_FOR_CONSOLE DWORD nRead = 0; if( IsConsole(in) - && ReadConsoleW(GetStdHandle(STD_INPUT_HANDLE), b1, sz, &nRead, 0) + && ReadConsoleW(GetStdHandle(STD_INPUT_HANDLE), b1, sz-1, &nRead, 0) ){ b1[nRead] = 0; }else diff --git a/manifest b/manifest index a5505b6964..4ddace420a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C speedtest1:\sfurther\simprovements\sto\sthe\s"json"\stestset. -D 2025-01-16T20:46:08.022 +C Fix\sa\spotential\sone-byte\sbuffer\soverrun\swhen\sreading\sfrom\sthe\sWindows\nconsole\sin\sthe\sCLI.\s[forum:/forumpost/95e17b8f5c|Forum\spost\s95e17b8f5c]. +D 2025-01-17T10:39:04.650 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -442,7 +442,7 @@ F ext/misc/shathree.c f3a778f27bf3e71b666a77f28e463a3b931c4dbe4219447e61bb678b4b F ext/misc/showauth.c 732578f0fe4ce42d577e1c86dc89dd14a006ab52 F ext/misc/spellfix.c bcc42ef3fd29429bc01a83e751332b8d4690e65d45008449bdffe7656371487f F ext/misc/sqlar.c a6175790482328171da47095f87608b48a476d4fac78d8a9ff18b03a2454f634 -F ext/misc/sqlite3_stdio.c 5657afb6ec81bef31790973528980af778e0e1388a93db780d33007336efe6e6 +F ext/misc/sqlite3_stdio.c 18160504b9348d0ebb9f5620fd61e64cd2d55fffde05ab3f7db03396add4840a F ext/misc/sqlite3_stdio.h f05eaf5e0258f0573910324a789a9586fc360a57678c57a6d63cfaa2245b6176 F ext/misc/stmt.c b090086cd6bd6281c21271d38d576eeffe662f0e6b67536352ce32bbaa438321 F ext/misc/stmtrand.c 59cffa5d8e158943ff1ce078956d8e208e8c04e67307e8f249dece2436dcb7fc @@ -2205,8 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 2cc73c5e08f1a16fe8accf0af6af061e42d27635883d09234516fd470e99bc0a -R f4bb93608db14b0baa099caf842aef42 +P c4750f7cf7e2188623de8b12e01acf3e3d7dc7b5ea87ac449571eb36f97d842a +R 45a83a05156d426ada8c2c9a4e3fc01c U drh -Z 1a1ead4cbc7ce98f73040d73112e92fb +Z 4047e2705a87b112269cd6828f65ee7b # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 43e7b2476a..ce8658f845 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c4750f7cf7e2188623de8b12e01acf3e3d7dc7b5ea87ac449571eb36f97d842a +4d96759694c91301410f53a3f737a049c33e8b259b0954ff659714aff8b21ae8 From e0244216242601f768a211f99cef2c8f2e191473 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 17 Jan 2025 12:32:01 +0000 Subject: [PATCH 071/220] Add the test/speedtest.tcl script to simplify performance and size testing. FossilOrigin-Name: ad7b38672656d0336a73bb789ec83f6939fbdae81e21be68e0313006826dc294 --- manifest | 11 +- manifest.uuid | 2 +- test/speedtest.tcl | 271 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 278 insertions(+), 6 deletions(-) create mode 100755 test/speedtest.tcl diff --git a/manifest b/manifest index 4ddace420a..33319f9174 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\spotential\sone-byte\sbuffer\soverrun\swhen\sreading\sfrom\sthe\sWindows\nconsole\sin\sthe\sCLI.\s[forum:/forumpost/95e17b8f5c|Forum\spost\s95e17b8f5c]. -D 2025-01-17T10:39:04.650 +C Add\sthe\stest/speedtest.tcl\sscript\sto\ssimplify\sperformance\sand\ssize\stesting. +D 2025-01-17T12:32:01.367 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -1677,6 +1677,7 @@ F test/speed3.test 694affeb9100526007436334cf7d08f3d74b85ef F test/speed4.test abc0ad3399dcf9703abed2fff8705e4f8e416715 F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa F test/speed4p.test 377a0c48e5a92e0b11c1c5ebb1bc9d83a7312c922bc0cb05970ef5d6a96d1f0c +F test/speedtest.tcl 76a0959d7d16cbebae49756bbb858a3d2f1d9081e757c87cb7fea7c816d1c575 x F test/speedtest1.c 323ce0956430a5aae56ea20f502da7bea3fb62b8ed02e9b0f12ab078b2b258f5 F test/spellfix.test 951a6405d49d1a23d6b78027d3877b4a33eeb8221dcab5704b499755bb4f552e F test/spellfix2.test dfc8f519a3fc204cb2dfa8b4f29821ae90f6f8c3 @@ -2205,8 +2206,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P c4750f7cf7e2188623de8b12e01acf3e3d7dc7b5ea87ac449571eb36f97d842a -R 45a83a05156d426ada8c2c9a4e3fc01c +P 4d96759694c91301410f53a3f737a049c33e8b259b0954ff659714aff8b21ae8 +R 7f163047a093ae4e315e910ea1611ab4 U drh -Z 4047e2705a87b112269cd6828f65ee7b +Z 4d5c65aabce50a5f7c599ac5c2690d5d # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index ce8658f845..36403859dc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4d96759694c91301410f53a3f737a049c33e8b259b0954ff659714aff8b21ae8 +ad7b38672656d0336a73bb789ec83f6939fbdae81e21be68e0313006826dc294 diff --git a/test/speedtest.tcl b/test/speedtest.tcl new file mode 100755 index 0000000000..1d6cf4e9d8 --- /dev/null +++ b/test/speedtest.tcl @@ -0,0 +1,271 @@ +#!/bin/sh +# the next line restarts using tclsh \ +exec tclsh "$0" ${1+"$@"} +# +# This program runs performance testing on sqlite3.c. Usage: +set usage {USAGE: + + speedtest.tcl sqlite3.c x1.txt trunk.txt -Os -DSQLITE_ENABLE_STAT4 + | | | `-----------------------' + File to test ----' | | | + | | `- options + Output filename --------' | + `--- optional prior output to diff + +Do a cache-grind performance analysis of the sqlite3.c file named and +write the results into the output file. The ".txt" is appended to the +output file (and diff-file) name if it is not already present. If the +diff-file is specified then show a diff from the diff-file to the new +output. + +Other options include: + --dryrun Show what would happen but don't do anything + --help Show this help screen + --lean "Lean" mode. + --lookaside N SZ Lookahead uses N slots of SZ bytes each + --pagesize N Use N as the page size +} +set srcfile {} +set outfile {} +set difffile {} +set cflags {} +set cc gcc +set testset mix1 +set dryrun 0 +set speedtestflags {--shrink-memory --reprepare --stats --heap 40000000 64} +lappend speedtestflags --journal wal --size 5 + +for {set i 0} {$i<[llength $argv]} {incr i} { + set arg [lindex $argv $i] + if {[string index $arg 0]=="-"} { + switch -- $arg { + -pagesize - + --pagesize { + lappend speedtestflags --pagesize + incr i + lappend speedtestflags [lindex $argv $i] + } + -lookaside - + --lookaside { + lappend speedtestflags --lookaside + incr i + lappend speedtestflags [lindex $argv $i] + incr i + lappend speedtestflags [lindex $argv $i] + } + -lean - + --lean { + lappend cflags \ + -DSQLITE_DEFAULT_MEMSTATUS=0 \ + -DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1 \ + -DSQLITE_LIKE_DOESNT_MATCH_BLOBS=1 \ + -DSQLITE_MAX_EXPR_DEPTH=1 \ + -DSQLITE_OMIT_DECLTYPE \ + -DSQLITE_OMIT_DEPRECATED \ + -DSQLITE_OMIT_PROGRESS_CALLBACK \ + -DSQLITE_OMIT_SHARED_CACHE \ + -DSQLITE_USE_ALLOCA + } + -n - + -dryrun - + --dryrun { + set dryrun 1 + } + -? - + -help - + --help { + puts $usage + exit 0 + } + default { + lappend cflags $arg + } + } + continue + } + if {[string match CC=* $arg]} { + set cc [lrange $arg 3 end] + continue + } + if {[string match *.c $arg]} { + if {$srcfile!=""} { + puts stderr "multiple source files: $srcfile $arg" + exit 1 + } + set srcfile $arg + continue + } + if {[lsearch {main cte rtree orm fp json parsenumber mix1} $arg]>=0} { + set testset $arg + continue + } + if {$outfile==""} { + set outfile $arg + continue + } + if {$difffile==""} { + set difffile $arg + continue + } + puts stderr "unknown option: \"$arg\". Use --help for more info." + exit 1 +} +if {[lsearch -glob $cflags -O*]<0} { + lappend cflags -Os +} +if {[lsearch -glob $cflags -DSQLITE_ENABLE_MEMSYS*]<0} { + lappend cflags -DSQLITE_ENABLE_MEMSYS5 +} +if {[lsearch -glob $cflags -DSQLITE_ENABLE_RTREE*]<0} { + lappend cflags -DSQLITE_ENABLE_RTREE +} +if {$srcfile==""} { + puts stderr "no sqlite3.c source file specified" + exit 1 +} +if {![file readable $srcfile]} { + puts stderr "source file \"$srcfile\" does not exist" + exit 1 +} +if {$outfile==""} { + puts stderr "no output file specified" + exit 1 +} +if {![string match *.* [file tail $outfile]]} { + append outfile .txt +} +if {$difffile!=""} { + if {![file exists $difffile]} { + if {[file exists $difffile.txt]} { + append difffile .txt + } else { + puts stderr "No such file: \"$difffile\"" + exit 1 + } + } +} + +set cccmd [list $cc -g] +lappend cccmd -I[file dir $srcfile] +lappend cccmd {*}[lsort $cflags] +lappend cccmd [file dir $argv0]/speedtest1.c +lappend cccmd $srcfile +lappend cccmd -o speedtest1 +puts $cccmd +if {!$dryrun} { + exec {*}$cccmd +} +lappend speedtestflags --testset $testset +set stcmd [list valgrind --tool=cachegrind ./speedtest1 {*}$speedtestflags] +lappend stcmd >valgrind-out.txt 2>valgrind-err.txt +puts $stcmd +if {!$dryrun} { + exec {*}$stcmd +} + +set maxmtime 0 +set cgfile {} +foreach cgout [glob -nocomplain cachegrind.out.*] { + if {[file mtime $cgout]>$maxmtime} { + set cgfile $cgout + set maxmtime [file mtime $cgfile] + } +} +if {$cgfile==""} { + puts "no cachegrind output" + exit 1 +} + +############# Process the cachegrind.out.# file ########################## +set fd [open $outfile wb] +set in [open "|cg_annotate --show=Ir --auto=yes --context=40 $cgfile" r] +set dest ! +set out(!) {} +set linenum 0 +set cntlines 0 ;# true to remember cycle counts on each line +set seenSqlite3 0 ;# true if we have seen the sqlite3.c file +while {![eof $in]} { + set line [string map {\t { }} [gets $in]] + if {[regexp {^-- Auto-annotated source: (.*)} $line all name]} { + set dest $name + if {[string match */sqlite3.c $dest]} { + set cntlines 1 + set seenSqlite3 1 + } else { + set cntlines 0 + } + } elseif {[regexp {^-- line (\d+) ------} $line all ln]} { + set line [lreplace $line 2 2 {#}] + set linenum [expr {$ln-1}] + } elseif {[regexp {^The following files chosen for } $line]} { + set dest ! + } + append out($dest) $line\n + if {$cntlines} { + incr linenum + if {[regexp {^ *([0-9,]+) } $line all x]} { + set x [string map {, {}} $x] + set cycles($linenum) $x + } + } +} +foreach x [lsort [array names out]] { + puts $fd $out($x) +} +# If the sqlite3.c file has been seen, then output a summary of the +# cycle counts for each file that went into making up sqlite3.c +# +if {$seenSqlite3} { + close $in + set in [open sqlite3.c] + set linenum 0 + set fn sqlite3.c + set pattern1 {^/\*+ Begin file ([^ ]+) \*} + set pattern2 {^/\*+ Continuing where we left off in ([^ ]+) \*} + while {![eof $in]} { + set line [gets $in] + incr linenum + if {[regexp $pattern1 $line all newfn]} { + set fn $newfn + } elseif {[regexp $pattern2 $line all newfn]} { + set fn $newfn + } elseif {[info exists cycles($linenum)]} { + incr fcycles($fn) $cycles($linenum) + } + } + close $in + puts $fd \ + {**********************************************************************} + set lx {} + set sum 0 + foreach {fn cnt} [array get fcycles] { + lappend lx [list $cnt $fn] + incr sum $cnt + } + puts $fd [format {%20s %14d %8.3f%%} TOTAL $sum 100] + foreach entry [lsort -index 0 -integer -decreasing $lx] { + foreach {cnt fn} $entry break + puts $fd [format {%20s %14d %8.3f%%} $fn $cnt [expr {$cnt*100.0/$sum}]] + } +} +puts $fd "Executable size:" +close $fd +exec size speedtest1 >>$outfile +# +# Processed cachegrind output should now be in the $outfile +############################################################################# + +if {$difffile!=""} { + set fossilcmd {fossil xdiff --tk -c 20} + lappend fossilcmd $difffile + lappend fossilcmd $outfile + lappend fossilcmd & + puts $fossilcmd + if {!$dryrun} { + exec {*}$fossilcmd + } +} else { + if {!$dryrun} { + exec open $outfile + } +} From ada34700755801e93ec8b5704caf4b9203a25151 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 17 Jan 2025 15:39:48 +0000 Subject: [PATCH 072/220] Improvements to the speedtest.tcl script. Add documentation on how to use the script. FossilOrigin-Name: eb3853d08141bf941193e8ecaf991191bb7fb46287818708a84018520eb1835e --- manifest | 13 ++++++------ manifest.uuid | 2 +- test/speedtest.md | 53 ++++++++++++++++++++++++++++++++++++++++++++++ test/speedtest.tcl | 18 ++++++++++++---- 4 files changed, 75 insertions(+), 11 deletions(-) create mode 100644 test/speedtest.md diff --git a/manifest b/manifest index 33319f9174..c97b983558 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\stest/speedtest.tcl\sscript\sto\ssimplify\sperformance\sand\ssize\stesting. -D 2025-01-17T12:32:01.367 +C Improvements\sto\sthe\sspeedtest.tcl\sscript.\s\sAdd\sdocumentation\son\show\sto\suse\sthe\nscript. +D 2025-01-17T15:39:48.918 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -1677,7 +1677,8 @@ F test/speed3.test 694affeb9100526007436334cf7d08f3d74b85ef F test/speed4.test abc0ad3399dcf9703abed2fff8705e4f8e416715 F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa F test/speed4p.test 377a0c48e5a92e0b11c1c5ebb1bc9d83a7312c922bc0cb05970ef5d6a96d1f0c -F test/speedtest.tcl 76a0959d7d16cbebae49756bbb858a3d2f1d9081e757c87cb7fea7c816d1c575 x +F test/speedtest.md 3ce32f2d60cf701381f95e1d8c916b6c57c31ae015f096224e83823f9b3a3d87 +F test/speedtest.tcl 96052cb8c5d44f69e0600e690794557f176ef99bd87cb4360080982d1f479a70 x F test/speedtest1.c 323ce0956430a5aae56ea20f502da7bea3fb62b8ed02e9b0f12ab078b2b258f5 F test/spellfix.test 951a6405d49d1a23d6b78027d3877b4a33eeb8221dcab5704b499755bb4f552e F test/spellfix2.test dfc8f519a3fc204cb2dfa8b4f29821ae90f6f8c3 @@ -2206,8 +2207,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 4d96759694c91301410f53a3f737a049c33e8b259b0954ff659714aff8b21ae8 -R 7f163047a093ae4e315e910ea1611ab4 +P ad7b38672656d0336a73bb789ec83f6939fbdae81e21be68e0313006826dc294 +R f4c44da8ff797a58ac8642b4946994e1 U drh -Z 4d5c65aabce50a5f7c599ac5c2690d5d +Z f6ee9eb4c1425ae484e244ffbda51720 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 36403859dc..d830cfeb92 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ad7b38672656d0336a73bb789ec83f6939fbdae81e21be68e0313006826dc294 +eb3853d08141bf941193e8ecaf991191bb7fb46287818708a84018520eb1835e diff --git a/test/speedtest.md b/test/speedtest.md new file mode 100644 index 0000000000..0a575b6a5c --- /dev/null +++ b/test/speedtest.md @@ -0,0 +1,53 @@ +# Performance And Size Measurements + +This document shows a procedure for making performance and size +comparisons between two versions of the SQLite Amalgamation "sqlite3.c". +You will need: + + * fossil + * valgrind + * tclsh + * A script or program named "open" that brings up *.txt files in an + editor for viewing. (Macs provide this by default. You'll need to + come up with your own on Linxu and Windows.) + * An SQLite source tree + +The procedure described in this document is not the only way to make +performance and size measurements. Use this as a guide and make +adjustments as needed. + +## Establish the baseline measurement + + * Begin at the root the SQLite source tree + * mkdir -p ../speed
                + ↑ Speed measurement output files will go into this directory. + You can actually put those files wherever you want. This is just a + suggestion. It might be good to keep these files outside of the + source tree so that "fossil clean" does not delete them. + * Obtain the baseline SQLite amalgamation. For the purpose of this + technical not, assume the baseline SQLite sources are in files + "../baseline/sqlite3.c" and "../baseline/sqlite3.h". + * test/speedtest.tcl ../baseline/sqlite3.c ../speed/baseline.txt
                + ↑ The performance measure will be written into ../speed/baseline.txt + and that file will be brought up in an editor for easy viewing.
                + ↑ The "sqlite3.h" will be taken from the directory that contains + the "sqlite3.c" amalgamation file. + +## Comparing the current checkout against the baseline + + * make sqlite3.c + * test/speedtest.tcl sqlite3.c ../speed/test.txt ../speed/baseline.txt
                + ↑ Test results written into ../speed/test.txt and then + "fossil xdiff" is run to compare ../speed/baseline.txt against + the new test results. + +## When to do this + +Performance and size checks should be done prior to trunk check-ins. +Sometimes a seemingly innocuous change can have large performance +impacts. A large impact does not mean that the change cannot continue, +but it is important to be aware of the impact. + +## Additional hints + +Use the --help option to test/speedtest.tcl to see other available options. diff --git a/test/speedtest.tcl b/test/speedtest.tcl index 1d6cf4e9d8..b353077e7c 100755 --- a/test/speedtest.tcl +++ b/test/speedtest.tcl @@ -19,11 +19,16 @@ diff-file is specified then show a diff from the diff-file to the new output. Other options include: - --dryrun Show what would happen but don't do anything - --help Show this help screen + CC=... Specify an alternative C compiler. Default is "gcc". + -D... -D and -O options are passed through to the C compiler. + --dryrun Show what would happen but don't do anything. + --help Show this help screen. --lean "Lean" mode. - --lookaside N SZ Lookahead uses N slots of SZ bytes each - --pagesize N Use N as the page size + --lookaside N SZ Lookahead uses N slots of SZ bytes each. + --pagesize N Use N as the page size. + --testset TEST Specify the specific testset to use. The default + is "mix1". Other options include: "main", "json", + "cte", "orm", "fp", "rtree". } set srcfile {} set outfile {} @@ -66,6 +71,11 @@ for {set i 0} {$i<[llength $argv]} {incr i} { -DSQLITE_OMIT_SHARED_CACHE \ -DSQLITE_USE_ALLOCA } + -testset - + --testset { + incr i + set testset [lindex $argv $i] + } -n - -dryrun - --dryrun { From 0887b702863ab085dff6396bbc57039083cd117b Mon Sep 17 00:00:00 2001 From: stephan Date: Fri, 17 Jan 2025 15:56:16 +0000 Subject: [PATCH 073/220] Typo fix in speedtest.md. FossilOrigin-Name: 36027cf340fe2e351c63129d069f9bced090c4a028ffd78d5b8c0f418ad9f230 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/speedtest.md | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index c97b983558..393700dac9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improvements\sto\sthe\sspeedtest.tcl\sscript.\s\sAdd\sdocumentation\son\show\sto\suse\sthe\nscript. -D 2025-01-17T15:39:48.918 +C Typo\sfix\sin\sspeedtest.md. +D 2025-01-17T15:56:16.503 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -1677,7 +1677,7 @@ F test/speed3.test 694affeb9100526007436334cf7d08f3d74b85ef F test/speed4.test abc0ad3399dcf9703abed2fff8705e4f8e416715 F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa F test/speed4p.test 377a0c48e5a92e0b11c1c5ebb1bc9d83a7312c922bc0cb05970ef5d6a96d1f0c -F test/speedtest.md 3ce32f2d60cf701381f95e1d8c916b6c57c31ae015f096224e83823f9b3a3d87 +F test/speedtest.md e4f467683acfdb2834ca1d6ce209c3d883dfecf73c41f77234b2368be9579de2 F test/speedtest.tcl 96052cb8c5d44f69e0600e690794557f176ef99bd87cb4360080982d1f479a70 x F test/speedtest1.c 323ce0956430a5aae56ea20f502da7bea3fb62b8ed02e9b0f12ab078b2b258f5 F test/spellfix.test 951a6405d49d1a23d6b78027d3877b4a33eeb8221dcab5704b499755bb4f552e @@ -2207,8 +2207,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P ad7b38672656d0336a73bb789ec83f6939fbdae81e21be68e0313006826dc294 -R f4c44da8ff797a58ac8642b4946994e1 -U drh -Z f6ee9eb4c1425ae484e244ffbda51720 +P eb3853d08141bf941193e8ecaf991191bb7fb46287818708a84018520eb1835e +R ffaa647250f944a4e334209019949953 +U stephan +Z 0892513d03b81f8f5fa790c99efdef39 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index d830cfeb92..c4119bbbab 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -eb3853d08141bf941193e8ecaf991191bb7fb46287818708a84018520eb1835e +36027cf340fe2e351c63129d069f9bced090c4a028ffd78d5b8c0f418ad9f230 diff --git a/test/speedtest.md b/test/speedtest.md index 0a575b6a5c..645742d756 100644 --- a/test/speedtest.md +++ b/test/speedtest.md @@ -25,7 +25,7 @@ adjustments as needed. suggestion. It might be good to keep these files outside of the source tree so that "fossil clean" does not delete them. * Obtain the baseline SQLite amalgamation. For the purpose of this - technical not, assume the baseline SQLite sources are in files + technical note, assume the baseline SQLite sources are in files "../baseline/sqlite3.c" and "../baseline/sqlite3.h". * test/speedtest.tcl ../baseline/sqlite3.c ../speed/baseline.txt
                ↑ The performance measure will be written into ../speed/baseline.txt From f462046cd14511ccfd8d819050fb2b18e5a11f61 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 17 Jan 2025 17:09:42 +0000 Subject: [PATCH 074/220] Enhance a comment on a test case to add recent context. FossilOrigin-Name: c2647d1bd16fd46dd03953afee6cad44ce14fa2c36713c487b678d63660bc072 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/with6.test | 6 ++++++ 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 393700dac9..48e8749eee 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Typo\sfix\sin\sspeedtest.md. -D 2025-01-17T15:56:16.503 +C Enhance\sa\scomment\son\sa\stest\scase\sto\sadd\srecent\scontext. +D 2025-01-17T17:09:42.305 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -2090,7 +2090,7 @@ F test/with2.test 181674a6cc86a601ca2ac052741cdfad5b529e07e870435d2f6cdb92d589ff F test/with3.test e30369ea27aa27eb1bda4c5e510c8a9f782c8afd2ab99d1a02b8a7f25a5d3e65 F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f198205 F test/with5.test 6248213c41fab36290b5b73aa3f937309dfba337004d9d8434c3fabc8c7d4be8 -F test/with6.test 9ff3503c3ff7cd459dc4852a02aaefa998dccace53f4142a0eb726174ad5984a +F test/with6.test 281e4861b5e517f6c3c2f08517a520c1e2ee7c11966545d3901f258a4fe8ef76 F test/withM.test 693b61765f2b387b5e3e24a4536e2e82de15ff64 F test/without_rowid1.test a5210b8770dc4736bca4e74bc96588f43025ad03ad6a80f885afd36d9890e217 F test/without_rowid2.test af260339f79d13cb220288b67cd287fbcf81ad99 @@ -2207,8 +2207,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P eb3853d08141bf941193e8ecaf991191bb7fb46287818708a84018520eb1835e -R ffaa647250f944a4e334209019949953 -U stephan -Z 0892513d03b81f8f5fa790c99efdef39 +P 36027cf340fe2e351c63129d069f9bced090c4a028ffd78d5b8c0f418ad9f230 +R ef3d991b9c054b173fa221e38e326aa0 +U drh +Z 0b63cd7bd279966e11ae3eece17abfb9 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index c4119bbbab..e9d77082b4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -36027cf340fe2e351c63129d069f9bced090c4a028ffd78d5b8c0f418ad9f230 +c2647d1bd16fd46dd03953afee6cad44ce14fa2c36713c487b678d63660bc072 diff --git a/test/with6.test b/test/with6.test index 95e6305474..b95ec0b763 100644 --- a/test/with6.test +++ b/test/with6.test @@ -325,6 +325,12 @@ do_eqp_test 331 { # marked with M10d_Yes and hence prohibited from participating in the # query flattening optimization. # +# Updated 2025-01-02. +# https://sqlite.org/forum/forumpost/8f38fc9878a92aa9 +# +# The same optimization that made Grunthos's query fast made +# Jean-Noël Mayor's query slow. Bummer. +# reset_db db eval { CREATE TABLE raw(country,date,total,delta, UNIQUE(country,date)); From e432f2a316d281f6f4de268483fd113606ed14a7 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 17 Jan 2025 23:49:40 +0000 Subject: [PATCH 075/220] For the purpose of the query planner heuristic added by [38db9b5c83], a query should only count as a star query if the fact tables are connected to the dimension table by an INNER JOIN. If a LEFT JOIN is used, then the fact tables are constrained to be in inner loops anyhow and so the heuristic does not make any sense. But it does interfere with AUTOMATIC index creation, which causes the performance regression reported by [forum:/forumpost/d87570a145599033|forum post d87570a1455]. FossilOrigin-Name: 0852c57ee2768224af79910e6f26e70a4962651dae0f8b45cbfc847e6707d7bb --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/where.c | 13 +++++++++---- 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 48e8749eee..ddf6529f37 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sa\scomment\son\sa\stest\scase\sto\sadd\srecent\scontext. -D 2025-01-17T17:09:42.305 +C For\sthe\spurpose\sof\sthe\squery\splanner\sheuristic\sadded\sby\s[38db9b5c83],\sa\squery\nshould\sonly\scount\sas\sa\sstar\squery\sif\sthe\sfact\stables\sare\sconnected\sto\sthe\ndimension\stable\sby\san\sINNER\sJOIN.\s\sIf\sa\sLEFT\sJOIN\sis\sused,\sthen\sthe\sfact\ntables\sare\sconstrained\sto\sbe\sin\sinner\sloops\sanyhow\sand\sso\sthe\sheuristic\sdoes\nnot\smake\sany\ssense.\s\sBut\sit\sdoes\sinterfere\swith\sAUTOMATIC\sindex\screation,\swhich\ncauses\sthe\sperformance\sregression\sreported\sby\n[forum:/forumpost/d87570a145599033|forum\spost\sd87570a1455]. +D 2025-01-17T23:49:40.018 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -862,7 +862,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 4e6181d8780ab0af2e1388d0754cbe6f2f04593d2b1ab6c41699a89942fd8997 F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 -F src/where.c f081a371086f48201948431832f5e9bb1bf6c930397b8d7bcf8aaa9e21d819da +F src/where.c 7aa91f806d19d254d47763564e355cca50d1787d93fc0a62c7d5361d8dfbce70 F src/whereInt.h 2b0804f300c7f65de4046a1d81c65f01b208d6c08950ccd1fa6b8c16162a8af7 F src/wherecode.c 0c3d3199a2b769a5e2bb70feb5003dc85b3d86842ecaf903a47f2b4205ca5dab F src/whereexpr.c 0f93a29cabd3a338d09a1f5c6770620a1ac51ec1157f3229502a7e7767c60b6f @@ -2207,8 +2207,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 36027cf340fe2e351c63129d069f9bced090c4a028ffd78d5b8c0f418ad9f230 -R ef3d991b9c054b173fa221e38e326aa0 +P c2647d1bd16fd46dd03953afee6cad44ce14fa2c36713c487b678d63660bc072 +R 93d684fb6b94ab6c95c7721a922c90f7 U drh -Z 0b63cd7bd279966e11ae3eece17abfb9 +Z 89119702900b9ccbb1fc6836bf36a009 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index e9d77082b4..f763ea63a8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c2647d1bd16fd46dd03953afee6cad44ce14fa2c36713c487b678d63660bc072 +0852c57ee2768224af79910e6f26e70a4962651dae0f8b45cbfc847e6707d7bb diff --git a/src/where.c b/src/where.c index 05dab8fdd5..b3f177fb40 100644 --- a/src/where.c +++ b/src/where.c @@ -5427,9 +5427,10 @@ static LogEst whereSortingCost( ** 12 otherwise ** ** For the purposes of SQLite, a star-query is defined as a query -** with a large central table that is joined against four or more -** smaller tables. The central table is called the "fact" table. -** The smaller tables that get joined are "dimension tables". +** with a large central table that is joined (using an INNER JOIN, +** not a LEFT JOIN) against four or more smaller tables. The central +** table is called the "fact" table. The smaller tables that get +** joined are "dimension tables". ** ** SIDE EFFECT: (and really the whole point of this subroutine) ** @@ -5457,7 +5458,11 @@ static int computeMxChoice(WhereInfo *pWInfo, LogEst nRowEst){ LogEst rDelta; /* Heuristic cost adjustment */ Bitmask mSeen = 0; /* Mask of dimension tables */ for(pWLoop=pWInfo->pLoops; pWLoop; pWLoop=pWLoop->pNextLoop){ - if( (pWLoop->prereq & m)!=0 && (pWLoop->maskSelf & mSeen)==0 ){ + if( (pWLoop->prereq & m)!=0 /* pWInfo depends on iLoop */ + && (pWLoop->maskSelf & mSeen)==0 /* pWInfo not already a dependency */ + && (pWInfo->pTabList->a[pWLoop->iTab].fg.jointype & JT_LEFT)==0 + /* ^- pWInfo isn't a LEFT JOIN */ + ){ nDep++; mSeen |= pWLoop->maskSelf; } From e52cdadea7b9978d75bc9d8733409f8cdea2ce0b Mon Sep 17 00:00:00 2001 From: stephan Date: Sat, 18 Jan 2025 13:51:01 +0000 Subject: [PATCH 076/220] When running make install, avoid the -s (strip) flag when cross-compiling, as it only works for the build platform. Reported in [forum:9a67df63eda9925c|forum post 9a67df63eda9925c]. FossilOrigin-Name: 230e49c10e3aa6fe9c487a1e026016a8bf97f7e736e7477d5976d987da5e83cf --- Makefile.in | 1 + auto.def | 6 +++++- main.mk | 11 +++++++++-- manifest | 18 +++++++++--------- manifest.uuid | 2 +- 5 files changed, 25 insertions(+), 13 deletions(-) diff --git a/Makefile.in b/Makefile.in index 5b17c0e426..5fff3d2fc5 100644 --- a/Makefile.in +++ b/Makefile.in @@ -335,4 +335,5 @@ distclean: distclean-autosetup version-info$(T.exe): $(TOP)/tool/version-info.c Makefile sqlite3.h $(T.link) $(ST_OPT) -o $@ $(TOP)/tool/version-info.c +IS_CROSS_COMPILING = @IS_CROSS_COMPILING@ include $(TOP)/main.mk diff --git a/auto.def b/auto.def index c9aa0cb9d1..8c7599c032 100644 --- a/auto.def +++ b/auto.def @@ -475,7 +475,6 @@ apply {{} { } switch -exact -- $soname { none - "" { return 0 } - auto { set soname libsqlite3.so.3 } legacy { set soname libsqlite3.so.0 } default { if {[string match libsqlite3.* $soname]} { @@ -1356,6 +1355,11 @@ apply {{} { unset oFF }} +######################################################################## +# When cross-compiling, we have to avoid using the -s flag to +# /usr/bin/install: https://sqlite.org/forum/forumpost/9a67df63eda9925c +define IS_CROSS_COMPILING $isCrossCompiling + ######################################################################## # "Re-export" the autoconf-conventional --XYZdir flags into something # which is more easily overridable from a make invocation. See the docs diff --git a/main.mk b/main.mk index a0b08e5773..d83c39b3a9 100644 --- a/main.mk +++ b/main.mk @@ -351,6 +351,13 @@ T.cc += $(OPTS) INSTALL.noexec = $(INSTALL) -m 0644 # ^^^ do not use GNU-specific flags to $(INSTALL), e.g. --mode=... +# When cross-compiling, we need to avoid the -s flag because it only +# works on the build host's platform. +INSTALL.strip.1 = $(INSTALL) +INSTALL.strip.0 = $(INSTALL) -s +INSTALL.strip. = $(INSTALL.strip.0) +INSTALL.strip = $(INSTALL.strip.$(IS_CROSS_COMPILING)) + # # $(T.compile) = generic target platform compiler invocation, # differing only from $(T.cc) in that it appends $(T.compile.extras), @@ -2017,7 +2024,7 @@ sqlite3d$(T.exe): shell.c $(LIBOBJS0) $(LDFLAGS.libsqlite3) $(LDFLAGS.readline) install-shell-0: sqlite3$(T.exe) $(install-dir.bin) - $(INSTALL) -s sqlite3$(T.exe) "$(install-dir.bin)" + $(INSTALL.strip) sqlite3$(T.exe) "$(install-dir.bin)" install-shell-1: install: install-shell-$(HAVE_WASI_SDK) @@ -2031,7 +2038,7 @@ sqldiff$(T.exe): $(sqldiff.$(LINK_TOOLS_DYNAMICALLY).deps) $(sqldiff.$(LINK_TOOLS_DYNAMICALLY).rules) install-diff: sqldiff$(T.exe) $(install-dir.bin) - $(INSTALL) -s sqldiff$(T.exe) "$(install-dir.bin)" + $(INSTALL.strip) sqldiff$(T.exe) "$(install-dir.bin)" #install: install-diff dbhash$(T.exe): $(TOP)/tool/dbhash.c sqlite3.o sqlite3.h diff --git a/manifest b/manifest index ddf6529f37..e7d438afbf 100644 --- a/manifest +++ b/manifest @@ -1,9 +1,9 @@ -C For\sthe\spurpose\sof\sthe\squery\splanner\sheuristic\sadded\sby\s[38db9b5c83],\sa\squery\nshould\sonly\scount\sas\sa\sstar\squery\sif\sthe\sfact\stables\sare\sconnected\sto\sthe\ndimension\stable\sby\san\sINNER\sJOIN.\s\sIf\sa\sLEFT\sJOIN\sis\sused,\sthen\sthe\sfact\ntables\sare\sconstrained\sto\sbe\sin\sinner\sloops\sanyhow\sand\sso\sthe\sheuristic\sdoes\nnot\smake\sany\ssense.\s\sBut\sit\sdoes\sinterfere\swith\sAUTOMATIC\sindex\screation,\swhich\ncauses\sthe\sperformance\sregression\sreported\sby\n[forum:/forumpost/d87570a145599033|forum\spost\sd87570a1455]. -D 2025-01-17T23:49:40.018 +C When\srunning\smake\sinstall,\savoid\sthe\s-s\s(strip)\sflag\swhen\scross-compiling,\sas\sit\sonly\sworks\sfor\sthe\sbuild\splatform.\sReported\sin\s[forum:9a67df63eda9925c|forum\spost\s9a67df63eda9925c]. +D 2025-01-18T13:51:01.877 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d -F Makefile.in ad349acf91b3569033439fe498fa197aa530cafaa01362eb7daad2f84e43d265 +F Makefile.in 572271a39d7ac1ae228ed911c63fdf374300a6a880ceb851b1f3d357e9a9534e F Makefile.linux-generic bd3e3cacd369821a6241d4ea1967395c962dfe3057e38cb0a435cee0e8b789d0 F Makefile.msc 39785ec45f9ae0311e49094eff2ee079562246fed6be3b9f632a99d4df20056a F README.md c3c0f19532ce28f6297a71870f3c7b424729f0e6d9ab889616d3587dd2332159 @@ -14,7 +14,7 @@ F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90 F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2 F art/sqlite370.svg 40b7e2fe8aac3add5d56dd86ab8d427a4eca5bcb3fe4f8946cb3794e1821d531 -F auto.def 63dfbbc58b041d1c5c516f31a02679cce8d79123c89ad87fd2783f4ef26dedbb +F auto.def b8135ba11ec23857bc76469f8b447c43fcfeecc9c775179107392e18ebe8c740 F autoconf/INSTALL 83e4a25da9fd053c7b3665eaaaf7919707915903 F autoconf/Makefile.am adedc1324b6a87fdd1265ddd336d2fb7d4f36a0e77b86ea553ae7cc4ea239347 F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac @@ -700,7 +700,7 @@ F ext/wasm/tests/opfs/concurrency/test.js d08889a5bb6e61937d0b8cbb78c9efbefbf65a F ext/wasm/tests/opfs/concurrency/worker.js 0a8c1a3e6ebb38aabbee24f122693f1fb29d599948915c76906681bb7da1d3d2 F ext/wasm/wasmfs.make bc8bb227f35d5bd3863a7bd2233437c37472a0d81585979f058f9b9b503bef35 F magic.txt 5ade0bc977aa135e79e3faaea894d5671b26107cc91e70783aa7dc83f22f3ba0 -F main.mk 0b62344246f8a3e920edb8a52b0c3296dde829d7eb450f67b89c63d79536de85 +F main.mk a187ada134ccb55b5d59ea3eb8f71cc6b19bfc244689e24a729f7a64aa500dc3 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 F mptest/crash01.test 61e61469e257df0850df4293d7d4d6c2af301421 @@ -2207,8 +2207,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P c2647d1bd16fd46dd03953afee6cad44ce14fa2c36713c487b678d63660bc072 -R 93d684fb6b94ab6c95c7721a922c90f7 -U drh -Z 89119702900b9ccbb1fc6836bf36a009 +P 0852c57ee2768224af79910e6f26e70a4962651dae0f8b45cbfc847e6707d7bb +R ed0f0a3d6dea2dbb296ffb05bcf1dd67 +U stephan +Z b7991c6ad22e45c5f184f51dda631f10 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index f763ea63a8..dbbf089777 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0852c57ee2768224af79910e6f26e70a4962651dae0f8b45cbfc847e6707d7bb +230e49c10e3aa6fe9c487a1e026016a8bf97f7e736e7477d5976d987da5e83cf From 1a1fe1d1da294f2b4f48c3212852151bb10688c6 Mon Sep 17 00:00:00 2001 From: stephan Date: Sat, 18 Jan 2025 16:05:38 +0000 Subject: [PATCH 077/220] When cross-compiling, change the CFLAGS default to exclude -g, per /chat discussion prompted by [forum:9a67df63eda9925c|forum post 9a67df63eda9925c]. FossilOrigin-Name: 4309da2ca5cb99ea81f3034ae3c5809187c0131d21f9f9469ea0d69c941f393e --- auto.def | 14 +++++++++++++- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/auto.def b/auto.def index 8c7599c032..b4a54111b9 100644 --- a/auto.def +++ b/auto.def @@ -325,8 +325,18 @@ if {"" eq [proj-bin-define install]} { # compiling binaries for the target system (CC a.k.a. $(T.cc)). # Normally they're the same, but they will differ when # cross-compiling. -define CFLAGS [proj-get-env CFLAGS {-g -O2}] +# +# When cross-compiling we default to not using the -g flag, based on a +# /chat discussion prompted by +# https://sqlite.org/forum/forumpost/9a67df63eda9925c +set defaultCFlags {-O2} +if {!$isCrossCompiling} { + lappend defaultCFlags -g +} +define CFLAGS [proj-get-env CFLAGS $defaultCFlags] +# BUILD_CFLAGS is the CFLAGS for CC_FOR_BUILD. define BUILD_CFLAGS [proj-get-env BUILD_CFLAGS {-g}] +unset defaultCFlags proj-if-opt-truthy dev { # --enable-dev needs to come early so that the downstream tests @@ -335,6 +345,8 @@ proj-if-opt-truthy dev { proj-opt-set debug 1 proj-opt-set amalgamation 0 define CFLAGS [get-env CFLAGS {-O0 -g}] + # -------------^^^^^^^ intentionally using [get-env] instead of + # [proj-get-env] here. } ######################################################################## diff --git a/manifest b/manifest index e7d438afbf..141c4d0b23 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\srunning\smake\sinstall,\savoid\sthe\s-s\s(strip)\sflag\swhen\scross-compiling,\sas\sit\sonly\sworks\sfor\sthe\sbuild\splatform.\sReported\sin\s[forum:9a67df63eda9925c|forum\spost\s9a67df63eda9925c]. -D 2025-01-18T13:51:01.877 +C When\scross-compiling,\schange\sthe\sCFLAGS\sdefault\sto\sexclude\s-g,\sper\s/chat\sdiscussion\sprompted\sby\s[forum:9a67df63eda9925c|forum\spost\s9a67df63eda9925c]. +D 2025-01-18T16:05:38.256 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -14,7 +14,7 @@ F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90 F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2 F art/sqlite370.svg 40b7e2fe8aac3add5d56dd86ab8d427a4eca5bcb3fe4f8946cb3794e1821d531 -F auto.def b8135ba11ec23857bc76469f8b447c43fcfeecc9c775179107392e18ebe8c740 +F auto.def 20ddd61060516e29cb984d716c451ad6e7e3ebe1d3786ec8f70813fada06eb2f F autoconf/INSTALL 83e4a25da9fd053c7b3665eaaaf7919707915903 F autoconf/Makefile.am adedc1324b6a87fdd1265ddd336d2fb7d4f36a0e77b86ea553ae7cc4ea239347 F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac @@ -2207,8 +2207,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 0852c57ee2768224af79910e6f26e70a4962651dae0f8b45cbfc847e6707d7bb -R ed0f0a3d6dea2dbb296ffb05bcf1dd67 +P 230e49c10e3aa6fe9c487a1e026016a8bf97f7e736e7477d5976d987da5e83cf +R 862143f3cdd830dae6969328bc86fd10 U stephan -Z b7991c6ad22e45c5f184f51dda631f10 +Z 5e9420f0d3ea15cbb564de8d4adc7b33 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index dbbf089777..94ceeec9f2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -230e49c10e3aa6fe9c487a1e026016a8bf97f7e736e7477d5976d987da5e83cf +4309da2ca5cb99ea81f3034ae3c5809187c0131d21f9f9469ea0d69c941f393e From 50c44200300f77e5415e8fe8c3475d53830a9ff2 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 18 Jan 2025 21:00:19 +0000 Subject: [PATCH 078/220] Add support for automatic query-time indexes on WITHOUT ROWID tables. FossilOrigin-Name: 89c4cbd9529081941d7283a401c4a8d71b241f4577ebf6d3eb2ebe5a1cf92f2e --- manifest | 17 ++++++++++------- manifest.uuid | 2 +- src/where.c | 23 +++++++++++++++++++---- 3 files changed, 30 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index e7d438afbf..dbd4e38927 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\srunning\smake\sinstall,\savoid\sthe\s-s\s(strip)\sflag\swhen\scross-compiling,\sas\sit\sonly\sworks\sfor\sthe\sbuild\splatform.\sReported\sin\s[forum:9a67df63eda9925c|forum\spost\s9a67df63eda9925c]. -D 2025-01-18T13:51:01.877 +C Add\ssupport\sfor\sautomatic\squery-time\sindexes\son\sWITHOUT\sROWID\stables. +D 2025-01-18T21:00:19.369 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -862,7 +862,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 4e6181d8780ab0af2e1388d0754cbe6f2f04593d2b1ab6c41699a89942fd8997 F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 -F src/where.c 7aa91f806d19d254d47763564e355cca50d1787d93fc0a62c7d5361d8dfbce70 +F src/where.c b09334881ab87dfdb1d2dbc71a8cf97f345834d36509344207a133f0e6b86161 F src/whereInt.h 2b0804f300c7f65de4046a1d81c65f01b208d6c08950ccd1fa6b8c16162a8af7 F src/wherecode.c 0c3d3199a2b769a5e2bb70feb5003dc85b3d86842ecaf903a47f2b4205ca5dab F src/whereexpr.c 0f93a29cabd3a338d09a1f5c6770620a1ac51ec1157f3229502a7e7767c60b6f @@ -2207,8 +2207,11 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 0852c57ee2768224af79910e6f26e70a4962651dae0f8b45cbfc847e6707d7bb -R ed0f0a3d6dea2dbb296ffb05bcf1dd67 -U stephan -Z b7991c6ad22e45c5f184f51dda631f10 +P 230e49c10e3aa6fe9c487a1e026016a8bf97f7e736e7477d5976d987da5e83cf +R 1eb7d22a051c22dd4afc1e0246916027 +T *branch * without-rowid-autoidx +T *sym-without-rowid-autoidx * +T -sym-trunk * +U drh +Z eca129c2aba163fe6547f234a58ed149 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index dbbf089777..d320276785 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -230e49c10e3aa6fe9c487a1e026016a8bf97f7e736e7477d5976d987da5e83cf +89c4cbd9529081941d7283a401c4a8d71b241f4577ebf6d3eb2ebe5a1cf92f2e diff --git a/src/where.c b/src/where.c index b3f177fb40..8af00b96a3 100644 --- a/src/where.c +++ b/src/where.c @@ -1080,6 +1080,19 @@ static SQLITE_NOINLINE void constructAutomaticIndex( }else{ extraCols = pSrc->colUsed & (~idxCols | MASKBIT(BMS-1)); } + if( !HasRowid(pTable) ){ + /* For WITHOUT ROWID tables, ensure that all PRIMARY KEY columns are + ** either in the idxCols mask or in the extraCols mask */ + for(i=0; inCol; i++){ + if( (pTable->aCol[i].colFlags & COLFLAG_PRIMKEY)==0 ) continue; + if( i>=BMS-1 ){ + extraCols |= MASKBIT(BMS-1); + break; + } + if( idxCols & MASKBIT(i) ) continue; + extraCols |= MASKBIT(i); + } + } mxBitCol = MIN(BMS-1,pTable->nCol); testcase( pTable->nCol==BMS-1 ); testcase( pTable->nCol==BMS-2 ); @@ -1091,7 +1104,8 @@ static SQLITE_NOINLINE void constructAutomaticIndex( } /* Construct the Index object to describe this index */ - pIdx = sqlite3AllocateIndexObject(pParse->db, nKeyCol+1, 0, &zNotUsed); + pIdx = sqlite3AllocateIndexObject(pParse->db, nKeyCol+HasRowid(pTable), + 0, &zNotUsed); if( pIdx==0 ) goto end_auto_index_create; pLoop->u.btree.pIndex = pIdx; pIdx->zName = "auto-index"; @@ -1147,8 +1161,10 @@ static SQLITE_NOINLINE void constructAutomaticIndex( } } assert( n==nKeyCol ); - pIdx->aiColumn[n] = XN_ROWID; - pIdx->azColl[n] = sqlite3StrBINARY; + if( HasRowid(pTable) ){ + pIdx->aiColumn[n] = XN_ROWID; + pIdx->azColl[n] = sqlite3StrBINARY; + } /* Create the automatic index */ explainAutomaticIndex(pParse, pIdx, pPartial!=0, &addrExp); @@ -3923,7 +3939,6 @@ static int whereLoopAddBtree( && (pWInfo->pParse->db->flags & SQLITE_AutoIndex)!=0 && !pSrc->fg.isIndexedBy /* Has no INDEXED BY clause */ && !pSrc->fg.notIndexed /* Has no NOT INDEXED clause */ - && HasRowid(pTab) /* Not WITHOUT ROWID table. (FIXME: Why not?) */ && !pSrc->fg.isCorrelated /* Not a correlated subquery */ && !pSrc->fg.isRecursive /* Not a recursive common table expression. */ && (pSrc->fg.jointype & JT_RIGHT)==0 /* Not the right tab of a RIGHT JOIN */ From 0f4de9bf9deabc2246fc9f076c22e83322a339b0 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 18 Jan 2025 21:19:02 +0000 Subject: [PATCH 079/220] Add a simple test case (many more are coming soon to TH3). Fix an obsolete assert(). FossilOrigin-Name: aa829a131a3431791083cf60d9cf00e7b3c0fafdd39a23e761b629a2287ab875 --- manifest | 17 +++++++---------- manifest.uuid | 2 +- src/where.c | 2 +- test/autoindex1.test | 28 ++++++++++++++++++++++++++++ 4 files changed, 37 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index dbd4e38927..acd3f5611e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\ssupport\sfor\sautomatic\squery-time\sindexes\son\sWITHOUT\sROWID\stables. -D 2025-01-18T21:00:19.369 +C Add\sa\ssimple\stest\scase\s(many\smore\sare\scoming\ssoon\sto\sTH3).\s\sFix\san\sobsolete\nassert(). +D 2025-01-18T21:19:02.129 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -862,7 +862,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 4e6181d8780ab0af2e1388d0754cbe6f2f04593d2b1ab6c41699a89942fd8997 F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 -F src/where.c b09334881ab87dfdb1d2dbc71a8cf97f345834d36509344207a133f0e6b86161 +F src/where.c 521472bb0c7cfdd65a9b5b92d44f921e3e0a26a1996cc0416cf53e25301820d2 F src/whereInt.h 2b0804f300c7f65de4046a1d81c65f01b208d6c08950ccd1fa6b8c16162a8af7 F src/wherecode.c 0c3d3199a2b769a5e2bb70feb5003dc85b3d86842ecaf903a47f2b4205ca5dab F src/whereexpr.c 0f93a29cabd3a338d09a1f5c6770620a1ac51ec1157f3229502a7e7767c60b6f @@ -925,7 +925,7 @@ F test/auth2.test 9eb7fce9f34bf1f50d3f366fb3e606be5a2000a1 F test/auth3.test 76d20a7fa136d63bcfcf8bcb65c0b1455ed71078d81f22bcd0550d3eb18594ab F test/autoanalyze1.test b9cc3f32a990fa56669b668d237c6d53e983554ae80c0604992e18869a0b2dec F test/autoinc.test 997d6f185f138229dc4251583a1d04816423dddc2fc034871a01aeb1d728cb39 -F test/autoindex1.test 714cac6e60beeb5a26ed346dd46505ba60b5a5597e9122c9ed3a55f89a922aa4 +F test/autoindex1.test 65931519206bbec71948b11e125af0656435a0937973fe5fed70d776a712911f F test/autoindex2.test 12ef578928102baaa0dc23ad397601a2f4ecb0df F test/autoindex3.test ca502c8050166ac6107a7b4fe4e951f4d3270a23a958af02b14f1b962b83c4b6 F test/autoindex4.test 3c2105e9172920e26f950ba3c5823e4972190e022c1e6f260ba476b0af24c593 @@ -2207,11 +2207,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 230e49c10e3aa6fe9c487a1e026016a8bf97f7e736e7477d5976d987da5e83cf -R 1eb7d22a051c22dd4afc1e0246916027 -T *branch * without-rowid-autoidx -T *sym-without-rowid-autoidx * -T -sym-trunk * +P 89c4cbd9529081941d7283a401c4a8d71b241f4577ebf6d3eb2ebe5a1cf92f2e +R 060bc82586424a9cc221e972d5251271 U drh -Z eca129c2aba163fe6547f234a58ed149 +Z 18819fcf6e705c7a88ab29e3c059c242 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index d320276785..1691c3d936 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -89c4cbd9529081941d7283a401c4a8d71b241f4577ebf6d3eb2ebe5a1cf92f2e +aa829a131a3431791083cf60d9cf00e7b3c0fafdd39a23e761b629a2287ab875 diff --git a/src/where.c b/src/where.c index 8af00b96a3..b867e615f7 100644 --- a/src/where.c +++ b/src/where.c @@ -949,7 +949,7 @@ static void explainAutomaticIndex( sqlite3_str *pStr = sqlite3_str_new(pParse->db); sqlite3_str_appendf(pStr,"CREATE AUTOMATIC INDEX ON %s(", pTab->zName); assert( pIdx->nColumn>1 ); - assert( pIdx->aiColumn[pIdx->nColumn-1]==XN_ROWID ); + assert( pIdx->aiColumn[pIdx->nColumn-1]==XN_ROWID || !HasRowid(pTab) ); for(ii=0; ii<(pIdx->nColumn-1); ii++){ const char *zName = 0; int iCol = pIdx->aiColumn[ii]; diff --git a/test/autoindex1.test b/test/autoindex1.test index b294a2721f..1c8ce007f0 100644 --- a/test/autoindex1.test +++ b/test/autoindex1.test @@ -563,4 +563,32 @@ do_execsql_test autoindex-1120 { SELECT * FROM t1 LEFT JOIN t2 ON (t2.c=+t1.a) LEFT JOIN t3 ON (t2.d IS NULL); } {1 1 1 2 {} {}} +# 2025-01-18 +# Added support for automatic indexes on WITHOUT ROWID tables. +# +reset_db +do_execsql_test autoindex-1200 { + CREATE TABLE t1(a INT, b INT, x INT, PRIMARY KEY(a,b)) WITHOUT ROWID; + INSERT INTO t1 VALUES(1,2,90),(1,3,91),(1,4,92); + CREATE TABLE t2a(c INTEGER PRIMARY KEY, i1 INT); + CREATE TABLE t2b(i1 INTEGER PRIMARY KEY, d INT); + CREATE VIEW t2(c,d) AS SELECT c, d FROM t2a NATURAL JOIN t2b; + INSERT INTO t2a VALUES(3,93),(4,94),(5,95),(6,96),(7,97); + INSERT INTO t2b VALUES(91,11),(92,22),(93,33),(94,44),(95,55); + CREATE TABLE dual(dummy TEXT); + INSERT INTO dual(dummy) VALUES('x'); +} +db null NULL +do_execsql_test autoindex-1210 { + SELECT t1.*, t2.* FROM t2 LEFT OUTER JOIN t1 ON b=c ORDER BY +b; +} { + NULL NULL NULL 5 55 + 1 3 91 3 33 + 1 4 92 4 44 +} +do_execsql_test autoindex-1211 { + EXPLAIN QUERY PLAN + SELECT t1.*, t2.* FROM t2 LEFT OUTER JOIN t1 ON b=c ORDER BY +b; +} {/SEARCH t1 USING AUTOMATIC COVERING INDEX/} + finish_test From 6cd83aecb944636fe5bcf1f4335aec016524e3a8 Mon Sep 17 00:00:00 2001 From: stephan Date: Sun, 19 Jan 2025 14:53:45 +0000 Subject: [PATCH 080/220] Move some of the auto.def functions into autosetup/sqlite-config.tcl for re-use in the pending migration of the autoconf bundle to autosetup. This is just reorg, no functional changes. FossilOrigin-Name: 2f1e94994f3595baad4045ab05ffee0668059c23ab37a39c25b83c62bfbaea28 --- auto.def | 492 ++--------------------------------- autosetup/sqlite-config.tcl | 505 ++++++++++++++++++++++++++++++++++++ manifest | 16 +- manifest.uuid | 2 +- 4 files changed, 529 insertions(+), 486 deletions(-) create mode 100644 autosetup/sqlite-config.tcl diff --git a/auto.def b/auto.def index b4a54111b9..8ee102dc8a 100644 --- a/auto.def +++ b/auto.def @@ -12,7 +12,7 @@ # # JimTCL: https://jim.tcl.tk # -use cc cc-db cc-shared cc-lib proj pkg-config +use sqlite-config # $DUMP_DEFINES_TXT is the file emitted by --dump-defines, intended # only for build debugging and not part of the public build interface. @@ -220,16 +220,7 @@ if {"" ne $DUMP_DEFINES_JSON} { options [subst -nobackslashes -nocommands $flags] unset flags - -# -# Carry values from hidden --flag aliases over to their canonical flag -# forms. -# -proj-xfer-options-aliases { - with-readline-inc => with-readline-cflags - with-readline-lib => with-readline-ldflags - with-debug => debug -} +sqlite-post-options-init set srcdir $::autosetup(srcdir) set PACKAGE_VERSION [proj-file-content -trim $srcdir/VERSION] @@ -242,56 +233,6 @@ msg-result "Source dir = $srcdir" msg-result "Build dir = $::autosetup(builddir)" msg-result "Configuring SQLite version $PACKAGE_VERSION" -apply {{} { - # - # SQLITE_AUTORECONFIG contains make target rules for re-running the - # configure script with the same arguments it was initially invoked - # with. This can be used to automatically reconfigure - # - proc squote {arg} { - # Wrap $arg in single-quotes if it looks like it might need that - # to avoid mis-handling as a shell argument. We assume that $arg - # will never contain any single-quote characters. - if {[string match {*[ &;$*"]*} $arg]} { return '$arg' } - return $arg - } - define-append SQLITE_AUTORECONFIG cd [squote $::autosetup(builddir)] && [squote $::srcdir/configure] - #{*}$::autosetup(argv) breaks with --flag='val with spaces', so... - foreach arg $::autosetup(argv) { - define-append SQLITE_AUTORECONFIG [squote $arg] - } - rename squote "" -}} - -# Are we cross-compiling? -set isCrossCompiling [proj-is-cross-compiling] - -define OPT_FEATURE_FLAGS {} ; # -DSQLITE_OMIT/ENABLE flags. -define OPT_SHELL {} ; # Feature-related CFLAGS for the sqlite3 CLI app -######################################################################## -# Adds $args, if not empty, to OPT_FEATURE_FLAGS. If the first arg is -# -shell then it strips that arg and passes the remaining args the -# sqlite-add-shell-opt in addition to adding them to -# OPT_FEATURE_FLAGS. -proc sqlite-add-feature-flag {args} { - set shell "" - if {"-shell" eq [lindex $args 0]} { - set args [lassign $args shell] - } - if {"" ne $args} { - if {"" ne $shell} { - sqlite-add-shell-opt {*}$args - } - define-append OPT_FEATURE_FLAGS {*}$args - } -} -# Appends $args, if not empty, to OPT_SHELL. -proc sqlite-add-shell-opt {args} { - if {"" ne $args} { - define-append OPT_SHELL {*}$args - } -} - # Pass msg-debug=1 to configure to enable obnoxiously loud output from # msg-debug. set msgDebugEnabled [proj-val-truthy [get-env msg-debug 0]] @@ -330,7 +271,7 @@ if {"" eq [proj-bin-define install]} { # /chat discussion prompted by # https://sqlite.org/forum/forumpost/9a67df63eda9925c set defaultCFlags {-O2} -if {!$isCrossCompiling} { +if {!$sqliteIsCrossCompiling} { lappend defaultCFlags -g } define CFLAGS [proj-get-env CFLAGS $defaultCFlags] @@ -359,7 +300,7 @@ proc sqlite-check-wasi-sdk {} { define HAVE_WASI_SDK 0 if {$wasiSdkDir eq ""} { return 0 - } elseif {$::isCrossCompiling} { + } elseif {$::sqliteIsCrossCompiling} { proj-fatal "Cannot combine --with-wasi-sdk with cross-compilation" } msg-result "Checking WASI SDK directory \[$wasiSdkDir]... " @@ -402,8 +343,8 @@ proc sqlite-check-wasi-sdk {} { } } # Remember that we now have a discrepancy beteween - # $::isCrossCompiling and [proj-is-cross-compiling]. - set ::isCrossCompiling 1 + # $::sqliteIsCrossCompiling and [proj-is-cross-compiling]. + set ::sqliteIsCrossCompiling 1 # # Changing --host and --target have no effect here except to @@ -471,45 +412,6 @@ if {[cc-check-includes zlib.h] && [proj-check-function-in-lib deflate z]} { proj-check-rpath ; # Determine proper rpath-handling flag -######################################################################## -# "soname" for libsqlite3.so. See discussion at: -# https://sqlite.org/src/forumpost/5a3b44f510df8ded -apply {{} { - define LDFLAGS_LIBSQLITE3_SONAME "" - if {[proj-opt-was-provided soname]} { - set soname [join [opt-val soname] ""] - } else { - # Enabling soname breaks linking for the --dynlink-tools feature, - # and this project has no direct use for soname, so default to - # none. Package maintainers, on the other hand, like to have an - # soname. - set soname none - } - switch -exact -- $soname { - none - "" { return 0 } - legacy { set soname libsqlite3.so.0 } - default { - if {[string match libsqlite3.* $soname]} { - # use it as-is - } else { - # Assume it's a suffix - set soname "libsqlite3.so.${soname}" - } - } - } - msg-debug "soname=$soname" - if {[proj-check-soname $soname]} { - define LDFLAGS_LIBSQLITE3_SONAME [get-define LDFLAGS_SONAME_PREFIX]$soname - msg-result "Setting SONAME using: [get-define LDFLAGS_LIBSQLITE3_SONAME]" - } elseif {[proj-opt-was-provided soname]} { - # --soname was explicitly requested but not available, so fail fatally - proj-fatal "This environment does not support SONAME." - } else { - # --soname was not explicitly requested but not available, so just warn - msg-result "This environment does not support SONAME." - } -}} - proj-define-for-opt shared ENABLE_SHARED "Build shared library?" if {![proj-define-for-opt static ENABLE_STATIC \ @@ -527,16 +429,8 @@ proj-define-for-opt test-status TSTRNNR_OPTS \ proj-define-for-opt linemacros AMALGAMATION_LINE_MACROS \ "Use #line macros in the amalgamation:" -msg-checking "SQLITE_DEBUG build? " -proj-if-opt-truthy debug { - define SQLITE_DEBUG 1 - define TARGET_DEBUG {-g -DSQLITE_DEBUG=1 -DSQLITE_ENABLE_SELECTTRACE -DSQLITE_ENABLE_WHERETRACE -O0 -Wall} - proj-opt-set memsys5 - msg-result yes -} { - define TARGET_DEBUG {-DNDEBUG} - msg-result no -} +sqlite-check-soname +sqlite-check-debug ######################################################################## # TCL... @@ -774,8 +668,8 @@ sqlite-check-tcl # - CFLAGS_JIMSH = any flags needed for buildng a BTCLSH-compatible # jimsh. The defaults may be passed on to configure as # CFLAGS_JIMSH=... -set useJimForCodeGen 0 ; # Set to 1 when using jimsh for code generation. - # May affect later decisions. +set sqliteUseJimForCodeGen 0 ; # Set to 1 when using jimsh for code + # generation. May affect later decisions. proc sqlite-determine-codegen-tcl {} { rename sqlite-determine-codegen-tcl "" msg-result "Checking for TCL to use for code generation... " @@ -812,7 +706,7 @@ proc sqlite-determine-codegen-tcl {} { if {$sysh && [cc-check-functions realpath]} { define-append CFLAGS_JIMSH -DHAVE_REALPATH define BTCLSH "\$(JIMSH)" - set ::useJimForCodeGen 1 + set ::sqliteUseJimForCodeGen 1 } elseif {$sysh && [cc-check-functions _fullpath]} { # _fullpath() is a Windows API. It's not entirely clear # whether we need to add {-DHAVE_SYS_TIME_H -DHAVE_DIRENT_H} @@ -821,7 +715,7 @@ proc sqlite-determine-codegen-tcl {} { # builds it does not. define-append CFLAGS_JIMSH -DHAVE__FULLPATH define BTCLSH "\$(JIMSH)" - set ::useJimForCodeGen 1 + set ::sqliteUseJimForCodeGen 1 } elseif {[file-isexec [get-define TCLSH_CMD]]} { set cgtcl [get-define TCLSH_CMD] define BTCLSH "\$(TCLSH_CMD)" @@ -854,23 +748,7 @@ msg-result "TCL for code generation: [sqlite-determine-codegen-tcl]" ######################################################################## # Thread safety? -msg-checking "Support threadsafe operation? " -proj-if-opt-truthy threadsafe { - msg-result yes - sqlite-add-feature-flag -DSQLITE_THREADSAFE=1 - if {![proj-check-function-in-lib pthread_create pthread] - || ![proj-check-function-in-lib pthread_mutexattr_init pthread]} { - user-error "Missing required pthread bits" - } - define LDFLAGS_PTHREAD [get-define lib_pthread_create] - undefine lib_pthread_create - # Recall that LDFLAGS_PTHREAD might be empty even if pthreads if - # found because it's in -lc on some platforms. -} { - msg-result no - sqlite-add-feature-flag -DSQLITE_THREADSAFE=0 - define LDFLAGS_PTHREAD "" -} +sqlite-check-threadsafe ######################################################################## # Do we want temporary databases in memory? @@ -897,245 +775,6 @@ if {[proj-opt-was-provided with-tempstore]} { }} } -######################################################################## -# sqlite-check-line-editing jumps through proverbial hoops to try to -# find a working line-editing library, setting: -# -# - HAVE_READLINE to 0 or 1 -# - HAVE_LINENOISE to 0, 1, or 2 -# - HAVE_EDITLINE to 0 or 1 -# -# Only one of ^^^ those will be set to non-0. -# -# - LDFLAGS_READLINE = linker flags or empty string -# -# - CFLAGS_READLINE = compilation flags for clients or empty string. -# -# Note that LDFLAGS_READLINE and CFLAGS_READLINE may refer to -# linenoise or editline, not necessarily libreadline. In some cases -# it will set HAVE_READLINE=1 when it's really using editline, for -# reasons described in this function's comments. -# -# Returns a string describing which line-editing approach to use, or -# "none" if no option is available. -# -# Order of checks: -# -# 1) --with-linenoise trumps all others and skips all of the -# complexities involved with the remaining options. -# -# 2) --editline trumps --readline -# -# 3) --disable-readline trumps --readline -# -# 4) Default to automatic search for optional readline -# -# 5) Try to find readline or editline. If it's not found AND the -# corresponding --FEATURE flag was explicitly given, fail fatally, -# else fail silently. -proc sqlite-check-line-editing {} { - rename sqlite-check-line-editing "" - msg-result "Checking for line-editing capability..." - define HAVE_READLINE 0 - define HAVE_LINENOISE 0 - define HAVE_EDITLINE 0 - define LDFLAGS_READLINE "" - define CFLAGS_READLINE "" - set failIfNotFound 0 ; # Gets set to 1 for explicit --FEATURE requests - # so that we know whether to fail fatally or not - # if the library is not found. - set libsForReadline {readline edit} ; # -l names to check for readline(). - # The libedit check changes this. - set editLibName "readline" ; # "readline" or "editline" - set editLibDef "HAVE_READLINE" ; # "HAVE_READLINE" or "HAVE_EDITLINE" - set dirLn [opt-val with-linenoise] - if {"" ne $dirLn} { - # Use linenoise from a copy of its sources (not a library)... - if {![file isdir $dirLn]} { - proj-fatal "--with-linenoise value is not a directory" - } - set lnH $dirLn/linenoise.h - if {![file exists $lnH] } { - proj-fatal "Cannot find linenoise.h in $dirLn" - } - set lnC "" - set lnCOpts {linenoise-ship.c linenoise.c} - foreach f $lnCOpts { - if {[file exists $dirLn/$f]} { - set lnC $dirLn/$f - break; - } - } - if {"" eq $lnC} { - proj-fatal "Cannot find any of $lnCOpts in $dirLn" - } - set flavor "" - set lnVal [proj-which-linenoise $lnH] - switch -- $lnVal { - 1 { set flavor "antirez" } - 2 { set flavor "msteveb" } - default { - proj-fatal "Cannot determine the flavor of linenoise from $lnH" - } - } - define CFLAGS_READLINE "-I$dirLn $lnC" - define HAVE_LINENOISE $lnVal - sqlite-add-shell-opt -DHAVE_LINENOISE=$lnVal - if {$::useJimForCodeGen && 2 == $lnVal} { - define-append CFLAGS_JIMSH -DUSE_LINENOISE [get-define CFLAGS_READLINE] - user-notice "Adding linenoise support to jimsh." - } - return "linenoise ($flavor)" - } elseif {[opt-bool editline]} { - # libedit mimics libreadline and on some systems does not have its - # own header installed (instead, that of libreadline is used). - # - # shell.c historically expects HAVE_EDITLINE to be set for - # libedit, but it then expects to see , which - # some system's don't actually have despite having libedit. If we - # end up finding below, we will use - # -DHAVE_EDITLINE=1, else we will use -DHAVE_READLINE=1. In either - # case, we will link against libedit. - set failIfNotFound 1 - set libsForReadline {edit} - set editLibName editline - } elseif {![opt-bool readline]} { - msg-result "Readline support explicitly disabled with --disable-readline" - return "none" - } elseif {[proj-opt-was-provided readline]} { - # If an explicit --[enable-]readline was used, fail if it's not - # found, else treat the feature as optional. - set failIfNotFound 1 - } - - # Transform with-readline-header=X to with-readline-cflags=-I... - set v [opt-val with-readline-header] - proj-opt-set with-readline-header "" - if {"" ne $v} { - if {"auto" eq $v} { - proj-opt-set with-readline-cflags auto - } else { - set v [file dirname $v] - if {[string match */readline $v]} { - # Special case: if the path includes .../readline/readline.h, - # set the -I to one dir up from that because our sources - # #include or . - set v [file dirname $v] - } - proj-opt-set with-readline-cflags "-I$v" - } - } - - # Look for readline.h - set rlInc [opt-val with-readline-cflags auto] - if {"auto" eq $rlInc} { - set rlInc "" - if {$::isCrossCompiling} { - # ^^^ this check is derived from the legacy configure script. - proj-warn "Skipping check for readline.h because we're cross-compiling." - } else { - set dirs "[get-define prefix] /usr /usr/local /usr/local/readline /usr/contrib /mingw" - set subdirs "include/$editLibName" - if {"editline" eq $editLibName} { - lappend subdirs include/readline - # ^^^ editline, on some systems, does not have its own header, - # and uses libreadline's header. - } - lappend subdirs include - # ^^^ The dirs and subdirs lists are, except for the inclusion - # of $prefix and editline, from the legacy configure script - set rlInc [proj-search-for-header-dir readline.h \ - -dirs $dirs -subdirs $subdirs] - if {"" ne $rlInc} { - if {[string match */readline $rlInc]} { - set rlInc [file dirname $rlInc]; # shell #include's - } elseif {[string match */editline $rlInc]} { - set editLibDef HAVE_EDITLINE - set rlInc [file dirname $rlInc]; # shell #include's - } - set rlInc "-I${rlInc}" - } - } - } elseif {"" ne $rlInc && ![string match *-I* $rlInc]} { - proj-fatal "Argument to --with-readline-cflags is intended to be CFLAGS and contain -I..." - } - - # If readline.h was found/specified, look for lib(readline|edit)... - # - # This is not quite straightforward because both libreadline and - # libedit typically require some other library which (according to - # legacy autotools-generated tests) provides tgetent(3). On some - # systems that's built into libreadline/edit, on some (most?) its in - # lib[n]curses, and on some it's in libtermcap. - set rlLib "" - if {"" ne $rlInc} { - set rlLib [opt-val with-readline-ldflags] - if {"" eq $rlLib || "auto" eq $rlLib} { - set rlLib "" - set libTerm "" - if {[proj-check-function-in-lib tgetent "$editLibName ncurses curses termcap"]} { - # ^^^ that libs list comes from the legacy configure script ^^^ - set libTerm [get-define lib_tgetent] - undefine lib_tgetent - } - if {$editLibName eq $libTerm} { - set rlLib $libTerm - } elseif {[proj-check-function-in-lib readline $libsForReadline $libTerm]} { - set rlLib [get-define lib_readline] - lappend rlLib $libTerm - undefine lib_readline - } - } - } - - # If we found a library, configure the build to use it... - if {"" ne $rlLib} { - if {"editline" eq $editLibName && "HAVE_READLINE" eq $editLibDef} { - # Alert the user that, despite outward appearances, we won't be - # linking to the GPL'd libreadline. Presumably that distinction is - # significant for those using --editline. - proj-indented-notice { - NOTE: the local libedit but uses so we - will compile with -DHAVE_READLINE=1 but will link with - libedit. - } - } - set rlLib [join $rlLib] - set rlInc [join $rlInc] - define LDFLAGS_READLINE $rlLib - define CFLAGS_READLINE $rlInc - proj-assert {$editLibDef in {HAVE_READLINE HAVE_EDITLINE}} - proj-assert {$editLibName in {readline editline}} - sqlite-add-shell-opt -D${editLibDef}=1 - msg-result "Using $editLibName flags: $rlInc $rlLib" - # Check whether rl_completion_matches() has a signature we can use - # and disable that sub-feature if it doesn't. - if {![cctest \ - -cflags "$rlInc -D${editLibDef}" -libs $rlLib -nooutput 1 -source { - #include - #ifdef HAVE_EDITLINE - #include - #else - #include - #endif - static char * rcg(const char *z, int i){(void)z; (void)i; return 0;} - int main(void) { - char ** x = rl_completion_matches("one", rcg); - (void)x; - return 0; - } - }]} { - proj-warn "readline-style completion disabled due to rl_completion_matches() signature mismatch" - sqlite-add-shell-opt -DSQLITE_OMIT_READLINE_COMPLETION - } - return $editLibName - } - - if {$failIfNotFound} { - proj-fatal "Explicit --$editLibName failed to find a matching library." - } - return "none" -}; # sqlite-check-line-editing msg-result "Line-editing support for the sqlite3 shell: [sqlite-check-line-editing]" proj-if-opt-truthy load-extension { @@ -1164,93 +803,6 @@ proj-if-opt-truthy math { msg-result "Disabling math SQL functions" } -######################################################################## -# ICU - International Components for Unicode -# -# Handles these flags: -# -# --with-icu-ldflags=LDFLAGS -# --with-icu-cflags=CFLAGS -# --with-icu-config[=auto | pkg-config | /path/to/icu-config] -# --enable-icu-collations -# -# --with-icu-config values: -# -# - auto: use the first one of (pkg-config, icu-config) found on the -# system. -# - pkg-config: use only pkg-config to determine flags -# - /path/to/icu-config: use that to determine flags -# -# If --with-icu-config is used as neither pkg-config nor icu-config -# are found, fail fatally. -# -# If both --with-icu-ldflags and --with-icu-config are provided, they -# are cumulative. If neither are provided, icu-collations is not -# honored and a warning is emitted if it is provided. -# -# Design note: though we could automatically enable ICU if the -# icu-config binary or (pkg-config icu-io) are found, we specifically -# do not. ICU is always an opt-in feature. -proc sqlite-check-icu {} { - rename sqlite-check-icu "" - define LDFLAGS_ICU [join [opt-val with-icu-ldflags ""]] - define CFLAGS_ICU [join [opt-val with-icu-cflags ""]] - if {[proj-opt-was-provided with-icu-config]} { - set icuConfigBin [opt-val with-icu-config] - set tryIcuConfigBin 1; # set to 0 if we end up using pkg-config - if {"auto" eq $icuConfigBin || "pkg-config" eq $icuConfigBin} { - if {[pkg-config-init 0] && [pkg-config icu-io]} { - # Maintenance reminder: historical docs say to use both of - # (icu-io, icu-uc). icu-uc lacks a required lib and icu-io has - # all of them on tested OSes. - set tryIcuConfigBin 0 - define LDFLAGS_ICU [get-define PKG_ICU_IO_LDFLAGS] - define-append LDFLAGS_ICU [get-define PKG_ICU_IO_LIBS] - define CFLAGS_ICU [get-define PKG_ICU_IO_CFLAGS] - } elseif {"pkg-config" eq $icuConfigBin} { - proj-fatal "pkg-config cannot find package icu-io" - } else { - proj-assert {"auto" eq $icuConfigBin} - } - } - if {$tryIcuConfigBin} { - if {"auto" eq $icuConfigBin} { - set icuConfigBin [proj-first-bin-of \ - /usr/local/bin/icu-config \ - /usr/bin/icu-config] - if {"" eq $icuConfigBin} { - proj-fatal "--with-icu-config=auto cannot find (pkg-config icu-io) or icu-config binary" - } - } - if {[file-isexec $icuConfigBin]} { - set x [exec $icuConfigBin --ldflags] - if {"" eq $x} { - proj-fatal "$icuConfigBin --ldflags returned no data" - } - define-append LDFLAGS_ICU $x - set x [exec $icuConfigBin --cppflags] - define-append CFLAGS_ICU $x - } else { - proj-fatal "--with-icu-config=$bin does not refer to an executable" - } - } - } - set ldflags [define LDFLAGS_ICU [string trim [get-define LDFLAGS_ICU]]] - set cflags [define CFLAGS_ICU [string trim [get-define CFLAGS_ICU]]] - if {"" ne $ldflags} { - sqlite-add-feature-flag -shell -DSQLITE_ENABLE_ICU - msg-result "Enabling ICU support with flags: $ldflags $cflags" - if {[opt-bool icu-collations]} { - msg-result "Enabling ICU collations." - sqlite-add-feature-flag -shell -DSQLITE_ENABLE_ICU_COLLATIONS - # Recall that shell.c builds with sqlite3.c - } - } elseif {[opt-bool icu-collations]} { - proj-warn "ignoring --enable-icu-collations because neither --with-icu-ldflags nor --with-icu-config provided any linker flags" - } else { - msg-result "ICU support is disabled." - } -}; # sqlite-check-icu sqlite-check-icu ######################################################################## @@ -1351,26 +903,12 @@ foreach {boolFlag featureFlag} { } } -######################################################################### -# Show the final feature flag sets: -apply {{} { - set oFF [get-define OPT_FEATURE_FLAGS] - if {"" ne $oFF} { - define OPT_FEATURE_FLAGS [lsort -unique $oFF] - msg-result "Library feature flags: [get-define OPT_FEATURE_FLAGS]" - } - set oFF [get-define OPT_SHELL] - if {"" ne $oFF} { - define OPT_SHELL [lsort -unique $oFF] - msg-result "Shell options: [get-define OPT_SHELL]" - } - unset oFF -}} +sqlite-show-feature-flags ######################################################################## # When cross-compiling, we have to avoid using the -s flag to # /usr/bin/install: https://sqlite.org/forum/forumpost/9a67df63eda9925c -define IS_CROSS_COMPILING $isCrossCompiling +define IS_CROSS_COMPILING $sqliteIsCrossCompiling ######################################################################## # "Re-export" the autoconf-conventional --XYZdir flags into something diff --git a/autosetup/sqlite-config.tcl b/autosetup/sqlite-config.tcl new file mode 100644 index 0000000000..9bd712c0a8 --- /dev/null +++ b/autosetup/sqlite-config.tcl @@ -0,0 +1,505 @@ +# This file holds functions for autosetup which are specific to the +# sqlite build tree. They are in this file, instead of auto.def, so +# that they can be reused in the TEA sub-tree. This file requires +# functions from proj.tcl. + +use cc cc-db cc-shared cc-lib pkg-config proj + +# Are we cross-compiling? This value may be changed by certain build +# options, so it's important that config code which checks for +# cross-compilation uses this var instead of +# [proj-is-cross-compiling]. +set ::sqliteIsCrossCompiling [proj-is-cross-compiling] + + +######################################################################## +# Runs some common initialization which must happen immediately after +# autosetup's [options] function is called. +proc sqlite-post-options-init {} { + # + # Carry values from hidden --flag aliases over to their canonical + # flag forms. This list must include only options which are common + # to both the top-level auto.def and autoconf/auto.def. + # + proj-xfer-options-aliases { + with-readline-inc => with-readline-cflags + with-readline-lib => with-readline-ldflags + with-debug => debug + } + sqlite-autoreconfig +} + +######################################################################## +# Sets up the SQLITE_AUTORECONFIG define. +proc sqlite-autoreconfig {} { + # + # SQLITE_AUTORECONFIG contains make target rules for re-running the + # configure script with the same arguments it was initially invoked + # with. This can be used to automatically reconfigure + # + proc squote {arg} { + # Wrap $arg in single-quotes if it looks like it might need that + # to avoid mis-handling as a shell argument. We assume that $arg + # will never contain any single-quote characters. + if {[string match {*[ &;$*"]*} $arg]} { return '$arg' } + return $arg + } + define-append SQLITE_AUTORECONFIG cd [squote $::autosetup(builddir)] && [squote $::autosetup(srcdir)/configure] + #{*}$::autosetup(argv) breaks with --flag='val with spaces', so... + foreach arg $::autosetup(argv) { + define-append SQLITE_AUTORECONFIG [squote $arg] + } + rename squote "" +} + +define OPT_FEATURE_FLAGS {} ; # -DSQLITE_OMIT/ENABLE flags. +define OPT_SHELL {} ; # Feature-related CFLAGS for the sqlite3 CLI app +######################################################################## +# Adds $args, if not empty, to OPT_FEATURE_FLAGS. If the first arg is +# -shell then it strips that arg and passes the remaining args the +# sqlite-add-shell-opt in addition to adding them to +# OPT_FEATURE_FLAGS. +proc sqlite-add-feature-flag {args} { + set shell "" + if {"-shell" eq [lindex $args 0]} { + set args [lassign $args shell] + } + if {"" ne $args} { + if {"" ne $shell} { + sqlite-add-shell-opt {*}$args + } + define-append OPT_FEATURE_FLAGS {*}$args + } +} +# Appends $args, if not empty, to OPT_SHELL. +proc sqlite-add-shell-opt {args} { + if {"" ne $args} { + define-append OPT_SHELL {*}$args + } +} + +######################################################################### +# Show the final feature flag sets. +proc sqlite-show-feature-flags {} { + set oFF [get-define OPT_FEATURE_FLAGS] + if {"" ne $oFF} { + define OPT_FEATURE_FLAGS [lsort -unique $oFF] + msg-result "Library feature flags: [get-define OPT_FEATURE_FLAGS]" + } + set oFF [get-define OPT_SHELL] + if {"" ne $oFF} { + define OPT_SHELL [lsort -unique $oFF] + msg-result "Shell options: [get-define OPT_SHELL]" + } +} + +######################################################################## +# Checks for the --debug flag, defining SQLITE_DEBUG to 1 if it is +# true. TARGET_DEBUG gets defined either way, with content depending +# on whether --debug is true or false. +proc sqlite-check-debug {} { + msg-checking "SQLITE_DEBUG build? " + proj-if-opt-truthy debug { + define SQLITE_DEBUG 1 + define TARGET_DEBUG {-g -DSQLITE_DEBUG=1 -DSQLITE_ENABLE_SELECTTRACE -DSQLITE_ENABLE_WHERETRACE -O0 -Wall} + proj-opt-set memsys5 + msg-result yes + } { + define TARGET_DEBUG {-DNDEBUG} + msg-result no + } +} + +######################################################################## +# "soname" for libsqlite3.so. See discussion at: +# https://sqlite.org/src/forumpost/5a3b44f510df8ded +proc sqlite-check-soname {} { + define LDFLAGS_LIBSQLITE3_SONAME "" + if {[proj-opt-was-provided soname]} { + set soname [join [opt-val soname] ""] + } else { + # Enabling soname breaks linking for the --dynlink-tools feature, + # and this project has no direct use for soname, so default to + # none. Package maintainers, on the other hand, like to have an + # soname. + set soname none + } + switch -exact -- $soname { + none - "" { return 0 } + legacy { set soname libsqlite3.so.0 } + default { + if {[string match libsqlite3.* $soname]} { + # use it as-is + } else { + # Assume it's a suffix + set soname "libsqlite3.so.${soname}" + } + } + } + # msg-debug "soname=$soname" + if {[proj-check-soname $soname]} { + define LDFLAGS_LIBSQLITE3_SONAME [get-define LDFLAGS_SONAME_PREFIX]$soname + msg-result "Setting SONAME using: [get-define LDFLAGS_LIBSQLITE3_SONAME]" + } elseif {[proj-opt-was-provided soname]} { + # --soname was explicitly requested but not available, so fail fatally + proj-fatal "This environment does not support SONAME." + } else { + # --soname was not explicitly requested but not available, so just warn + msg-result "This environment does not support SONAME." + } +} + +######################################################################## +# If --enable-thresafe is set, this adds -DSQLITE_THREADSAFE=1 to +# OPT_FEATURE_FLAGS and sets LDFLAGS_PTHREAD to the linker flags +# needed for linking pthread. If --enable-threadsafe is not set, adds +# -DSQLITE_THREADSAFE=0 to OPT_FEATURE_FLAGS and sets LDFLAGS_PTHREAD +# to an empty string. +proc sqlite-check-threadsafe {} { + msg-checking "Support threadsafe operation? " + proj-if-opt-truthy threadsafe { + msg-result yes + sqlite-add-feature-flag -DSQLITE_THREADSAFE=1 + if {![proj-check-function-in-lib pthread_create pthread] + || ![proj-check-function-in-lib pthread_mutexattr_init pthread]} { + user-error "Missing required pthread bits" + } + define LDFLAGS_PTHREAD [get-define lib_pthread_create] + undefine lib_pthread_create + # Recall that LDFLAGS_PTHREAD might be empty even if pthreads if + # found because it's in -lc on some platforms. + } { + msg-result no + sqlite-add-feature-flag -DSQLITE_THREADSAFE=0 + define LDFLAGS_PTHREAD "" + } +} + +######################################################################## +# sqlite-check-line-editing jumps through proverbial hoops to try to +# find a working line-editing library, setting: +# +# - HAVE_READLINE to 0 or 1 +# - HAVE_LINENOISE to 0, 1, or 2 +# - HAVE_EDITLINE to 0 or 1 +# +# Only one of ^^^ those will be set to non-0. +# +# - LDFLAGS_READLINE = linker flags or empty string +# +# - CFLAGS_READLINE = compilation flags for clients or empty string. +# +# Note that LDFLAGS_READLINE and CFLAGS_READLINE may refer to +# linenoise or editline, not necessarily libreadline. In some cases +# it will set HAVE_READLINE=1 when it's really using editline, for +# reasons described in this function's comments. +# +# Returns a string describing which line-editing approach to use, or +# "none" if no option is available. +# +# Order of checks: +# +# 1) --with-linenoise trumps all others and skips all of the +# complexities involved with the remaining options. +# +# 2) --editline trumps --readline +# +# 3) --disable-readline trumps --readline +# +# 4) Default to automatic search for optional readline +# +# 5) Try to find readline or editline. If it's not found AND the +# corresponding --FEATURE flag was explicitly given, fail fatally, +# else fail silently. +proc sqlite-check-line-editing {} { + rename sqlite-check-line-editing "" + msg-result "Checking for line-editing capability..." + define HAVE_READLINE 0 + define HAVE_LINENOISE 0 + define HAVE_EDITLINE 0 + define LDFLAGS_READLINE "" + define CFLAGS_READLINE "" + set failIfNotFound 0 ; # Gets set to 1 for explicit --FEATURE requests + # so that we know whether to fail fatally or not + # if the library is not found. + set libsForReadline {readline edit} ; # -l names to check for readline(). + # The libedit check changes this. + set editLibName "readline" ; # "readline" or "editline" + set editLibDef "HAVE_READLINE" ; # "HAVE_READLINE" or "HAVE_EDITLINE" + set dirLn [opt-val with-linenoise] + if {"" ne $dirLn} { + # Use linenoise from a copy of its sources (not a library)... + if {![file isdir $dirLn]} { + proj-fatal "--with-linenoise value is not a directory" + } + set lnH $dirLn/linenoise.h + if {![file exists $lnH] } { + proj-fatal "Cannot find linenoise.h in $dirLn" + } + set lnC "" + set lnCOpts {linenoise-ship.c linenoise.c} + foreach f $lnCOpts { + if {[file exists $dirLn/$f]} { + set lnC $dirLn/$f + break; + } + } + if {"" eq $lnC} { + proj-fatal "Cannot find any of $lnCOpts in $dirLn" + } + set flavor "" + set lnVal [proj-which-linenoise $lnH] + switch -- $lnVal { + 1 { set flavor "antirez" } + 2 { set flavor "msteveb" } + default { + proj-fatal "Cannot determine the flavor of linenoise from $lnH" + } + } + define CFLAGS_READLINE "-I$dirLn $lnC" + define HAVE_LINENOISE $lnVal + sqlite-add-shell-opt -DHAVE_LINENOISE=$lnVal + if {[info exists sqliteUseJimForCodeGen] + && $::sqliteUseJimForCodeGen && 2 == $lnVal} { + define-append CFLAGS_JIMSH -DUSE_LINENOISE [get-define CFLAGS_READLINE] + user-notice "Adding linenoise support to jimsh." + } + return "linenoise ($flavor)" + } elseif {[opt-bool editline]} { + # libedit mimics libreadline and on some systems does not have its + # own header installed (instead, that of libreadline is used). + # + # shell.c historically expects HAVE_EDITLINE to be set for + # libedit, but it then expects to see , which + # some system's don't actually have despite having libedit. If we + # end up finding below, we will use + # -DHAVE_EDITLINE=1, else we will use -DHAVE_READLINE=1. In either + # case, we will link against libedit. + set failIfNotFound 1 + set libsForReadline {edit} + set editLibName editline + } elseif {![opt-bool readline]} { + msg-result "Readline support explicitly disabled with --disable-readline" + return "none" + } elseif {[proj-opt-was-provided readline]} { + # If an explicit --[enable-]readline was used, fail if it's not + # found, else treat the feature as optional. + set failIfNotFound 1 + } + + # Transform with-readline-header=X to with-readline-cflags=-I... + set v [opt-val with-readline-header] + proj-opt-set with-readline-header "" + if {"" ne $v} { + if {"auto" eq $v} { + proj-opt-set with-readline-cflags auto + } else { + set v [file dirname $v] + if {[string match */readline $v]} { + # Special case: if the path includes .../readline/readline.h, + # set the -I to one dir up from that because our sources + # #include or . + set v [file dirname $v] + } + proj-opt-set with-readline-cflags "-I$v" + } + } + + # Look for readline.h + set rlInc [opt-val with-readline-cflags auto] + if {"auto" eq $rlInc} { + set rlInc "" + if {$::sqliteIsCrossCompiling} { + # ^^^ this check is derived from the legacy configure script. + proj-warn "Skipping check for readline.h because we're cross-compiling." + } else { + set dirs "[get-define prefix] /usr /usr/local /usr/local/readline /usr/contrib /mingw" + set subdirs "include/$editLibName" + if {"editline" eq $editLibName} { + lappend subdirs include/readline + # ^^^ editline, on some systems, does not have its own header, + # and uses libreadline's header. + } + lappend subdirs include + # ^^^ The dirs and subdirs lists are, except for the inclusion + # of $prefix and editline, from the legacy configure script + set rlInc [proj-search-for-header-dir readline.h \ + -dirs $dirs -subdirs $subdirs] + if {"" ne $rlInc} { + if {[string match */readline $rlInc]} { + set rlInc [file dirname $rlInc]; # shell #include's + } elseif {[string match */editline $rlInc]} { + set editLibDef HAVE_EDITLINE + set rlInc [file dirname $rlInc]; # shell #include's + } + set rlInc "-I${rlInc}" + } + } + } elseif {"" ne $rlInc && ![string match *-I* $rlInc]} { + proj-fatal "Argument to --with-readline-cflags is intended to be CFLAGS and contain -I..." + } + + # If readline.h was found/specified, look for lib(readline|edit)... + # + # This is not quite straightforward because both libreadline and + # libedit typically require some other library which (according to + # legacy autotools-generated tests) provides tgetent(3). On some + # systems that's built into libreadline/edit, on some (most?) its in + # lib[n]curses, and on some it's in libtermcap. + set rlLib "" + if {"" ne $rlInc} { + set rlLib [opt-val with-readline-ldflags] + if {"" eq $rlLib || "auto" eq $rlLib} { + set rlLib "" + set libTerm "" + if {[proj-check-function-in-lib tgetent "$editLibName ncurses curses termcap"]} { + # ^^^ that libs list comes from the legacy configure script ^^^ + set libTerm [get-define lib_tgetent] + undefine lib_tgetent + } + if {$editLibName eq $libTerm} { + set rlLib $libTerm + } elseif {[proj-check-function-in-lib readline $libsForReadline $libTerm]} { + set rlLib [get-define lib_readline] + lappend rlLib $libTerm + undefine lib_readline + } + } + } + + # If we found a library, configure the build to use it... + if {"" ne $rlLib} { + if {"editline" eq $editLibName && "HAVE_READLINE" eq $editLibDef} { + # Alert the user that, despite outward appearances, we won't be + # linking to the GPL'd libreadline. Presumably that distinction is + # significant for those using --editline. + proj-indented-notice { + NOTE: the local libedit but uses so we + will compile with -DHAVE_READLINE=1 but will link with + libedit. + } + } + set rlLib [join $rlLib] + set rlInc [join $rlInc] + define LDFLAGS_READLINE $rlLib + define CFLAGS_READLINE $rlInc + proj-assert {$editLibDef in {HAVE_READLINE HAVE_EDITLINE}} + proj-assert {$editLibName in {readline editline}} + sqlite-add-shell-opt -D${editLibDef}=1 + msg-result "Using $editLibName flags: $rlInc $rlLib" + # Check whether rl_completion_matches() has a signature we can use + # and disable that sub-feature if it doesn't. + if {![cctest \ + -cflags "$rlInc -D${editLibDef}" -libs $rlLib -nooutput 1 -source { + #include + #ifdef HAVE_EDITLINE + #include + #else + #include + #endif + static char * rcg(const char *z, int i){(void)z; (void)i; return 0;} + int main(void) { + char ** x = rl_completion_matches("one", rcg); + (void)x; + return 0; + } + }]} { + proj-warn "readline-style completion disabled due to rl_completion_matches() signature mismatch" + sqlite-add-shell-opt -DSQLITE_OMIT_READLINE_COMPLETION + } + return $editLibName + } + + if {$failIfNotFound} { + proj-fatal "Explicit --$editLibName failed to find a matching library." + } + return "none" +}; # sqlite-check-line-editing + +######################################################################## +# ICU - International Components for Unicode +# +# Handles these flags: +# +# --with-icu-ldflags=LDFLAGS +# --with-icu-cflags=CFLAGS +# --with-icu-config[=auto | pkg-config | /path/to/icu-config] +# --enable-icu-collations +# +# --with-icu-config values: +# +# - auto: use the first one of (pkg-config, icu-config) found on the +# system. +# - pkg-config: use only pkg-config to determine flags +# - /path/to/icu-config: use that to determine flags +# +# If --with-icu-config is used as neither pkg-config nor icu-config +# are found, fail fatally. +# +# If both --with-icu-ldflags and --with-icu-config are provided, they +# are cumulative. If neither are provided, icu-collations is not +# honored and a warning is emitted if it is provided. +# +# Design note: though we could automatically enable ICU if the +# icu-config binary or (pkg-config icu-io) are found, we specifically +# do not. ICU is always an opt-in feature. +proc sqlite-check-icu {} { + rename sqlite-check-icu "" + define LDFLAGS_ICU [join [opt-val with-icu-ldflags ""]] + define CFLAGS_ICU [join [opt-val with-icu-cflags ""]] + if {[proj-opt-was-provided with-icu-config]} { + set icuConfigBin [opt-val with-icu-config] + set tryIcuConfigBin 1; # set to 0 if we end up using pkg-config + if {"auto" eq $icuConfigBin || "pkg-config" eq $icuConfigBin} { + if {[pkg-config-init 0] && [pkg-config icu-io]} { + # Maintenance reminder: historical docs say to use both of + # (icu-io, icu-uc). icu-uc lacks a required lib and icu-io has + # all of them on tested OSes. + set tryIcuConfigBin 0 + define LDFLAGS_ICU [get-define PKG_ICU_IO_LDFLAGS] + define-append LDFLAGS_ICU [get-define PKG_ICU_IO_LIBS] + define CFLAGS_ICU [get-define PKG_ICU_IO_CFLAGS] + } elseif {"pkg-config" eq $icuConfigBin} { + proj-fatal "pkg-config cannot find package icu-io" + } else { + proj-assert {"auto" eq $icuConfigBin} + } + } + if {$tryIcuConfigBin} { + if {"auto" eq $icuConfigBin} { + set icuConfigBin [proj-first-bin-of \ + /usr/local/bin/icu-config \ + /usr/bin/icu-config] + if {"" eq $icuConfigBin} { + proj-fatal "--with-icu-config=auto cannot find (pkg-config icu-io) or icu-config binary" + } + } + if {[file-isexec $icuConfigBin]} { + set x [exec $icuConfigBin --ldflags] + if {"" eq $x} { + proj-fatal "$icuConfigBin --ldflags returned no data" + } + define-append LDFLAGS_ICU $x + set x [exec $icuConfigBin --cppflags] + define-append CFLAGS_ICU $x + } else { + proj-fatal "--with-icu-config=$bin does not refer to an executable" + } + } + } + set ldflags [define LDFLAGS_ICU [string trim [get-define LDFLAGS_ICU]]] + set cflags [define CFLAGS_ICU [string trim [get-define CFLAGS_ICU]]] + if {"" ne $ldflags} { + sqlite-add-feature-flag -shell -DSQLITE_ENABLE_ICU + msg-result "Enabling ICU support with flags: $ldflags $cflags" + if {[opt-bool icu-collations]} { + msg-result "Enabling ICU collations." + sqlite-add-feature-flag -shell -DSQLITE_ENABLE_ICU_COLLATIONS + # Recall that shell.c builds with sqlite3.c + } + } elseif {[opt-bool icu-collations]} { + proj-warn "ignoring --enable-icu-collations because neither --with-icu-ldflags nor --with-icu-config provided any linker flags" + } else { + msg-result "ICU support is disabled." + } +}; # sqlite-check-icu diff --git a/manifest b/manifest index d90ea454d8..528a20c4ab 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enable\sautomatic\squery-time\sindexes\sfor\sWITHOUT\sROWID\stables. -D 2025-01-18T23:44:06.756 +C Move\ssome\sof\sthe\sauto.def\sfunctions\sinto\sautosetup/sqlite-config.tcl\sfor\sre-use\sin\sthe\spending\smigration\sof\sthe\sautoconf\sbundle\sto\sautosetup.\sThis\sis\sjust\sreorg,\sno\sfunctional\schanges. +D 2025-01-19T14:53:45.375 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -14,7 +14,7 @@ F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90 F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2 F art/sqlite370.svg 40b7e2fe8aac3add5d56dd86ab8d427a4eca5bcb3fe4f8946cb3794e1821d531 -F auto.def 20ddd61060516e29cb984d716c451ad6e7e3ebe1d3786ec8f70813fada06eb2f +F auto.def 8d8467f21bd073a7d62ad9803d958d5e5f625459cd64b97776636ca740d4f743 F autoconf/INSTALL 83e4a25da9fd053c7b3665eaaaf7919707915903 F autoconf/Makefile.am adedc1324b6a87fdd1265ddd336d2fb7d4f36a0e77b86ea553ae7cc4ea239347 F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac @@ -51,6 +51,7 @@ F autosetup/cc.tcl c0fcc50ca91deff8741e449ddad05bcd08268bc31177e613a6343bbd1fd3e F autosetup/jimsh0.c d40e381ea4526a067590e7b91bd4b2efa6d4980d286f908054c647b3df4aee14 F autosetup/pkg-config.tcl 4e635bf39022ff65e0d5434339dd41503ea48fc53822c9c5bde88b02d3d952ba F autosetup/proj.tcl 2e817159b997077cb79bd871f6255276b787558f386dfc0830b0f825f6a53767 +F autosetup/sqlite-config.tcl 0a14f4deb35c150d565f13defd0d02aa2a9fb34b7ceec4de5c817f6205d90873 F autosetup/system.tcl 51d4be76cd9a9074704b584e5c9cbba616202c8468cf9ba8a4f8294a7ab1dba9 F configure 9a00b21dfd13757bbfb8d89b30660a89ec1f8f3a79402b8f9f9b6fc475c3303a x F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad @@ -2207,9 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 4309da2ca5cb99ea81f3034ae3c5809187c0131d21f9f9469ea0d69c941f393e aa829a131a3431791083cf60d9cf00e7b3c0fafdd39a23e761b629a2287ab875 -R f761383deed49e3993fc59c86662b3e0 -T +closed aa829a131a3431791083cf60d9cf00e7b3c0fafdd39a23e761b629a2287ab875 -U drh -Z 98bd687a2f93dbfd54703fb8cab1103d +P 8534af5b94be9f5b1f02453e1c3b6b3f78a698af91595bdbbfdea00676510116 +R 6870ce5e67a7ecb1dfa87ef84e5cc5df +U stephan +Z 3acb6f6b529d76da2efc2bf22b964dc8 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 450b852af6..8835e88290 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8534af5b94be9f5b1f02453e1c3b6b3f78a698af91595bdbbfdea00676510116 +2f1e94994f3595baad4045ab05ffee0668059c23ab37a39c25b83c62bfbaea28 From 815709dd0019c4825b25efb7b78c44233463b532 Mon Sep 17 00:00:00 2001 From: stephan Date: Sun, 19 Jan 2025 16:26:25 +0000 Subject: [PATCH 081/220] Minor internal refactoring of auto.def to support the pending autoconf subdir port to autosetup. No functional changes. FossilOrigin-Name: 01ff37584708f3f79c62c1b5ed8cceab721cf8348a69a65f0559b1ef8845e85b --- auto.def | 20 ++++++++++---------- autosetup/sqlite-config.tcl | 26 ++++++++++++++++++++------ manifest | 14 +++++++------- manifest.uuid | 2 +- 4 files changed, 38 insertions(+), 24 deletions(-) diff --git a/auto.def b/auto.def index 8ee102dc8a..f807947c10 100644 --- a/auto.def +++ b/auto.def @@ -271,7 +271,7 @@ if {"" eq [proj-bin-define install]} { # /chat discussion prompted by # https://sqlite.org/forum/forumpost/9a67df63eda9925c set defaultCFlags {-O2} -if {!$sqliteIsCrossCompiling} { +if {!$::sqliteConfig(is-cross-compiling)} { lappend defaultCFlags -g } define CFLAGS [proj-get-env CFLAGS $defaultCFlags] @@ -300,7 +300,7 @@ proc sqlite-check-wasi-sdk {} { define HAVE_WASI_SDK 0 if {$wasiSdkDir eq ""} { return 0 - } elseif {$::sqliteIsCrossCompiling} { + } elseif {$::sqliteConfig(is-cross-compiling)} { proj-fatal "Cannot combine --with-wasi-sdk with cross-compilation" } msg-result "Checking WASI SDK directory \[$wasiSdkDir]... " @@ -310,7 +310,7 @@ proc sqlite-check-wasi-sdk {} { define WASI_SDK_DIR $wasiSdkDir # Disable numerous options which we know either can't work or are # not useful in this build... - msg-result "Using wasi-sdk clang. Disabling CLI shell modifying config flags:" + msg-result "Using wasi-sdk clang. Disabling CLI shell and modifying config flags:" # Boolean (--enable-/--disable-) flags which must be switched off: foreach opt { dynlink-tools @@ -343,8 +343,8 @@ proc sqlite-check-wasi-sdk {} { } } # Remember that we now have a discrepancy beteween - # $::sqliteIsCrossCompiling and [proj-is-cross-compiling]. - set ::sqliteIsCrossCompiling 1 + # $::sqliteConfig(is-cross-compiling) and [proj-is-cross-compiling]. + set ::sqliteConfig(is-cross-compiling) 1 # # Changing --host and --target have no effect here except to @@ -668,8 +668,6 @@ sqlite-check-tcl # - CFLAGS_JIMSH = any flags needed for buildng a BTCLSH-compatible # jimsh. The defaults may be passed on to configure as # CFLAGS_JIMSH=... -set sqliteUseJimForCodeGen 0 ; # Set to 1 when using jimsh for code - # generation. May affect later decisions. proc sqlite-determine-codegen-tcl {} { rename sqlite-determine-codegen-tcl "" msg-result "Checking for TCL to use for code generation... " @@ -706,7 +704,7 @@ proc sqlite-determine-codegen-tcl {} { if {$sysh && [cc-check-functions realpath]} { define-append CFLAGS_JIMSH -DHAVE_REALPATH define BTCLSH "\$(JIMSH)" - set ::sqliteUseJimForCodeGen 1 + set ::sqliteConfig(use-jim-for-codegen) 1 } elseif {$sysh && [cc-check-functions _fullpath]} { # _fullpath() is a Windows API. It's not entirely clear # whether we need to add {-DHAVE_SYS_TIME_H -DHAVE_DIRENT_H} @@ -715,7 +713,7 @@ proc sqlite-determine-codegen-tcl {} { # builds it does not. define-append CFLAGS_JIMSH -DHAVE__FULLPATH define BTCLSH "\$(JIMSH)" - set ::sqliteUseJimForCodeGen 1 + set ::sqliteConfig(use-jim-for-codegen) 1 } elseif {[file-isexec [get-define TCLSH_CMD]]} { set cgtcl [get-define TCLSH_CMD] define BTCLSH "\$(TCLSH_CMD)" @@ -775,6 +773,7 @@ if {[proj-opt-was-provided with-tempstore]} { }} } +# Must come after sqlite-determine-codegen-tcl msg-result "Line-editing support for the sqlite3 shell: [sqlite-check-line-editing]" proj-if-opt-truthy load-extension { @@ -908,7 +907,7 @@ sqlite-show-feature-flags ######################################################################## # When cross-compiling, we have to avoid using the -s flag to # /usr/bin/install: https://sqlite.org/forum/forumpost/9a67df63eda9925c -define IS_CROSS_COMPILING $sqliteIsCrossCompiling +define IS_CROSS_COMPILING $sqliteConfig(is-cross-compiling) ######################################################################## # "Re-export" the autoconf-conventional --XYZdir flags into something @@ -991,3 +990,4 @@ apply {{} { } } }} + diff --git a/autosetup/sqlite-config.tcl b/autosetup/sqlite-config.tcl index 9bd712c0a8..6b036b529c 100644 --- a/autosetup/sqlite-config.tcl +++ b/autosetup/sqlite-config.tcl @@ -5,11 +5,25 @@ use cc cc-db cc-shared cc-lib pkg-config proj -# Are we cross-compiling? This value may be changed by certain build -# options, so it's important that config code which checks for +# +# Object for communicating config-time state across various +# auto.def-related pieces. +# +array set sqliteConfig {} + +# +# Set to 1 when cross-compiling This value may be changed by certain +# build options, so it's important that config code which checks for # cross-compilation uses this var instead of # [proj-is-cross-compiling]. -set ::sqliteIsCrossCompiling [proj-is-cross-compiling] +# +set sqliteConfig(is-cross-compiling) [proj-is-cross-compiling] + +# +# Gets set to 1 when using jimsh for code generation. May affect later +# decisions. +# +set sqliteConfig(use-jim-for-codegen) 0 ######################################################################## @@ -91,6 +105,7 @@ proc sqlite-show-feature-flags {} { define OPT_SHELL [lsort -unique $oFF] msg-result "Shell options: [get-define OPT_SHELL]" } + #parray ::sqliteConfig } ######################################################################## @@ -259,8 +274,7 @@ proc sqlite-check-line-editing {} { define CFLAGS_READLINE "-I$dirLn $lnC" define HAVE_LINENOISE $lnVal sqlite-add-shell-opt -DHAVE_LINENOISE=$lnVal - if {[info exists sqliteUseJimForCodeGen] - && $::sqliteUseJimForCodeGen && 2 == $lnVal} { + if {$::sqliteConfig(use-jim-for-codegen) && 2 == $lnVal} { define-append CFLAGS_JIMSH -DUSE_LINENOISE [get-define CFLAGS_READLINE] user-notice "Adding linenoise support to jimsh." } @@ -309,7 +323,7 @@ proc sqlite-check-line-editing {} { set rlInc [opt-val with-readline-cflags auto] if {"auto" eq $rlInc} { set rlInc "" - if {$::sqliteIsCrossCompiling} { + if {$::sqliteConfig(is-cross-compiling)} { # ^^^ this check is derived from the legacy configure script. proj-warn "Skipping check for readline.h because we're cross-compiling." } else { diff --git a/manifest b/manifest index 528a20c4ab..02e383c8f0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Move\ssome\sof\sthe\sauto.def\sfunctions\sinto\sautosetup/sqlite-config.tcl\sfor\sre-use\sin\sthe\spending\smigration\sof\sthe\sautoconf\sbundle\sto\sautosetup.\sThis\sis\sjust\sreorg,\sno\sfunctional\schanges. -D 2025-01-19T14:53:45.375 +C Minor\sinternal\srefactoring\sof\sauto.def\sto\ssupport\sthe\spending\sautoconf\ssubdir\sport\sto\sautosetup.\sNo\sfunctional\schanges. +D 2025-01-19T16:26:25.254 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -14,7 +14,7 @@ F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90 F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2 F art/sqlite370.svg 40b7e2fe8aac3add5d56dd86ab8d427a4eca5bcb3fe4f8946cb3794e1821d531 -F auto.def 8d8467f21bd073a7d62ad9803d958d5e5f625459cd64b97776636ca740d4f743 +F auto.def 8b7e3bdf0a9f3caccddb13175f6a2c3fdb1740220bbfe0bb8dae460a4f84d85a F autoconf/INSTALL 83e4a25da9fd053c7b3665eaaaf7919707915903 F autoconf/Makefile.am adedc1324b6a87fdd1265ddd336d2fb7d4f36a0e77b86ea553ae7cc4ea239347 F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac @@ -51,7 +51,7 @@ F autosetup/cc.tcl c0fcc50ca91deff8741e449ddad05bcd08268bc31177e613a6343bbd1fd3e F autosetup/jimsh0.c d40e381ea4526a067590e7b91bd4b2efa6d4980d286f908054c647b3df4aee14 F autosetup/pkg-config.tcl 4e635bf39022ff65e0d5434339dd41503ea48fc53822c9c5bde88b02d3d952ba F autosetup/proj.tcl 2e817159b997077cb79bd871f6255276b787558f386dfc0830b0f825f6a53767 -F autosetup/sqlite-config.tcl 0a14f4deb35c150d565f13defd0d02aa2a9fb34b7ceec4de5c817f6205d90873 +F autosetup/sqlite-config.tcl e52fa291ef148712a9392203b05e86743b474065ea88bdc65cdb664dbb188783 F autosetup/system.tcl 51d4be76cd9a9074704b584e5c9cbba616202c8468cf9ba8a4f8294a7ab1dba9 F configure 9a00b21dfd13757bbfb8d89b30660a89ec1f8f3a79402b8f9f9b6fc475c3303a x F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 8534af5b94be9f5b1f02453e1c3b6b3f78a698af91595bdbbfdea00676510116 -R 6870ce5e67a7ecb1dfa87ef84e5cc5df +P 2f1e94994f3595baad4045ab05ffee0668059c23ab37a39c25b83c62bfbaea28 +R 9c60fa033887f9029838d451908d0067 U stephan -Z 3acb6f6b529d76da2efc2bf22b964dc8 +Z ec3ab526fc22a680c0602f434f403d4d # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 8835e88290..684943058c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2f1e94994f3595baad4045ab05ffee0668059c23ab37a39c25b83c62bfbaea28 +01ff37584708f3f79c62c1b5ed8cceab721cf8348a69a65f0559b1ef8845e85b From c6a39debf9f15c4163b8228f4bf7dd14e76efd97 Mon Sep 17 00:00:00 2001 From: stephan Date: Sun, 19 Jan 2025 18:32:45 +0000 Subject: [PATCH 082/220] Further refactoring of auto.def to simplify creation of variant builds like the autoconf bundle. FossilOrigin-Name: f806c563a29240c709508316846fbe0cb3ed61b68a6c1d9544eb699e30141d8d --- auto.def | 793 ++---------------------------------- autosetup/proj.tcl | 4 +- autosetup/sqlite-config.tcl | 778 ++++++++++++++++++++++++++++++++++- manifest | 16 +- manifest.uuid | 2 +- 5 files changed, 817 insertions(+), 776 deletions(-) diff --git a/auto.def b/auto.def index f807947c10..4e646e6f2b 100644 --- a/auto.def +++ b/auto.def @@ -14,17 +14,6 @@ # use sqlite-config -# $DUMP_DEFINES_TXT is the file emitted by --dump-defines, intended -# only for build debugging and not part of the public build interface. -set DUMP_DEFINES_TXT ./config.defines.txt -# $DUMP_DEFINES_JSON is the autosetup counterpart of the historical -# "DEFS" var which was generated by the autotools in the pre-processed -# autotools builds (but not in the canonical tree). Generation of this -# file is disabled (via an empty file name) until/unless someone -# voices a specific interest in it. The original motivating use case -# is handled fine by sqlite_cfg.h. -set DUMP_DEFINES_JSON ""; #./config.defines.json - ######################################################################## # Regarding flag compatibility with the historical autotool configure # script: @@ -34,10 +23,9 @@ set DUMP_DEFINES_JSON ""; #./config.defines.json # flags compared to the historical autotools build. The differences # are documented here: # -# 1) --debug is used by autosetup itself, so we have to rename it to -# --with-debug. We cannot use --enable-debug because that is, for -# autosetup, an alias for --debug=1. Alternately, we can patch -# autosetup to use --autosetup-debug for its own purposes instead. +# 1) --debug is used by autosetup itself, but we patch it because +# decades of muscle memory expect --debug to apply to this code, +# not the configure script (details are in autosetup/README.md). # # 2) In autosetup, all flags starting with (--enable, --disable) are # forced to be booleans and receive special handling in how they're @@ -199,9 +187,9 @@ set flags { test-status => {Enable status of tests} gcov=0 => {Enable coverage testing using gcov} linemacros => {Enable #line macros in the amalgamation} - dump-defines=0 => {Dump autosetup defines to $DUMP_DEFINES_TXT (for build debugging)} dynlink-tools => {Dynamically link libsqlite3 to certain tools which normally statically embed it.} soname:=legacy => + # --soname has a long story behind it: https://sqlite.org/src/forumpost/5a3b44f510df8ded {SONAME for libsqlite3.so. "none", or not using this flag, sets no soname. "legacy" sets it to its historical value of libsqlite3.so.0. A value matching the glob "libsqlite3.*" sets @@ -209,76 +197,36 @@ set flags { suffix which gets applied to "libsqlite3.so.", e.g. --soname=9.10 equates to "libsqlite3.so.9.10". } - # --soname has a long story behind it: https://sqlite.org/src/forumpost/5a3b44f510df8ded + dump-defines=0 => {Dump autosetup defines to $::sqliteConfig(dump-defines-txt) (for build debugging)} # } -if {"" ne $DUMP_DEFINES_JSON} { +if {"" ne $::sqliteConfig(dump-defines-json)} { lappend flags \ defines-json-include-lowercase=0 \ - => {Include lower-case defines (primarily system paths) in $DUMP_DEFINES_JSON} + => {Include lower-case defines (primarily system paths) in $::sqliteConfig(dump-defines-json)} } options [subst -nobackslashes -nocommands $flags] unset flags sqlite-post-options-init -set srcdir $::autosetup(srcdir) -set PACKAGE_VERSION [proj-file-content -trim $srcdir/VERSION] -define PACKAGE_NAME "sqlite" -define PACKAGE_URL {https://sqlite.org} -define PACKAGE_VERSION $PACKAGE_VERSION -define PACKAGE_STRING "[get-define PACKAGE_NAME] $PACKAGE_VERSION" -define PACKAGE_BUGREPORT [get-define PACKAGE_URL]/forum -msg-result "Source dir = $srcdir" -msg-result "Build dir = $::autosetup(builddir)" -msg-result "Configuring SQLite version $PACKAGE_VERSION" - -# Pass msg-debug=1 to configure to enable obnoxiously loud output from -# msg-debug. -set msgDebugEnabled [proj-val-truthy [get-env msg-debug 0]] -proc msg-debug {msg} { - if {$::msgDebugEnabled} { - puts stderr [proj-bold "** DEBUG: $msg"] - } +if {1} { + # TODO: move this into autosetup/sqlite-config.tcl once we get the + # version info into autoconf/auto.def. + set srcdir $::autosetup(srcdir) + set PACKAGE_VERSION [proj-file-content -trim $srcdir/VERSION] + define PACKAGE_NAME "sqlite" + define PACKAGE_URL {https://sqlite.org} + define PACKAGE_VERSION $PACKAGE_VERSION + define PACKAGE_STRING "[get-define PACKAGE_NAME] $PACKAGE_VERSION" + define PACKAGE_BUGREPORT [get-define PACKAGE_URL]/forum + msg-result "Source dir = $srcdir" + msg-result "Build dir = $::autosetup(builddir)" + msg-result "Configuring SQLite version $PACKAGE_VERSION" + unset srcdir } -proj-file-extensions -if {".exe" eq [get-define TARGET_EXEEXT]} { - define SQLITE_OS_UNIX 0 - define SQLITE_OS_WIN 1 -} else { - define SQLITE_OS_UNIX 1 - define SQLITE_OS_WIN 0 -} - -######### -# Programs needed -cc-check-tools ld ar ; # must come before [sqlite-check-wasi-sdk] -if {"" eq [proj-bin-define install]} { - proj-warn "Cannot find install binary, so 'make install' will not work." - define BIN_INSTALL false -} - -######################################################################## -# We differentiate between two C compilers: the one used for binaries -# which are to run on the build system (in autosetup it's called -# CC_FOR_BUILD and in Makefile.in it's $(B.cc)) and the one used for -# compiling binaries for the target system (CC a.k.a. $(T.cc)). -# Normally they're the same, but they will differ when -# cross-compiling. -# -# When cross-compiling we default to not using the -g flag, based on a -# /chat discussion prompted by -# https://sqlite.org/forum/forumpost/9a67df63eda9925c -set defaultCFlags {-O2} -if {!$::sqliteConfig(is-cross-compiling)} { - lappend defaultCFlags -g -} -define CFLAGS [proj-get-env CFLAGS $defaultCFlags] -# BUILD_CFLAGS is the CFLAGS for CC_FOR_BUILD. -define BUILD_CFLAGS [proj-get-env BUILD_CFLAGS {-g}] -unset defaultCFlags - +sqlite-setup-default-cflags proj-if-opt-truthy dev { # --enable-dev needs to come early so that the downstream tests # which check for the following flags use their updated state. @@ -287,131 +235,22 @@ proj-if-opt-truthy dev { proj-opt-set amalgamation 0 define CFLAGS [get-env CFLAGS {-O0 -g}] # -------------^^^^^^^ intentionally using [get-env] instead of - # [proj-get-env] here. + # [proj-get-env] here because [sqlite-setup-default-cflags] uses + # [proj-get-env]. } -######################################################################## -# Handle --with-wasi-sdk=DIR -# -# This must be run relatively early on because it may change the -# toolchain and disable a number of config options. -proc sqlite-check-wasi-sdk {} { - set wasiSdkDir [opt-val with-wasi-sdk] ; # ??? [lindex [opt-val with-wasi-sdk] end] - define HAVE_WASI_SDK 0 - if {$wasiSdkDir eq ""} { - return 0 - } elseif {$::sqliteConfig(is-cross-compiling)} { - proj-fatal "Cannot combine --with-wasi-sdk with cross-compilation" - } - msg-result "Checking WASI SDK directory \[$wasiSdkDir]... " - #puts "prefix = [prefix $wasiSdkDir/bin {clang ld}]" - proj-affirm-files-exist -v {*}[prefix "$wasiSdkDir/bin/" {clang wasm-ld ar}] - define HAVE_WASI_SDK 1 - define WASI_SDK_DIR $wasiSdkDir - # Disable numerous options which we know either can't work or are - # not useful in this build... - msg-result "Using wasi-sdk clang. Disabling CLI shell and modifying config flags:" - # Boolean (--enable-/--disable-) flags which must be switched off: - foreach opt { - dynlink-tools - editline - gcov - icu-collations - load-extension - readline - shared - tcl - threadsafe - } { - if {[opt-bool $opt]} { - msg-result " --disable-$opt" - proj-opt-set $opt 0 - } - } - # Non-boolean flags which need to be cleared: - foreach opt { - with-emsdk - with-icu-config - with-icu-ldflags - with-icu-cflags - with-linenoise - with-tcl - } { - if {[proj-opt-was-provided $opt]} { - msg-result " removing --$opt" - proj-opt-set $opt "" - } - } - # Remember that we now have a discrepancy beteween - # $::sqliteConfig(is-cross-compiling) and [proj-is-cross-compiling]. - set ::sqliteConfig(is-cross-compiling) 1 - - # - # Changing --host and --target have no effect here except to - # possibly cause confusion. Autosetup has finished processing them - # by this point. - # - # host_alias=wasm32-wasi - # target=wasm32-wasi - # - # Merely changing CC, LD, and AR to the wasi-sdk's is enough to get - # sqlite3.o building in WASM format. - # - define CC "${wasiSdkDir}/bin/clang" - define LD "${wasiSdkDir}/bin/wasm-ld" - define AR "${wasiSdkDir}/bin/ar" - #define STRIP "${wasiSdkDir}/bin/strip" - return 1 -}; # sqlite-check-wasi-sdk -sqlite-check-wasi-sdk - -######################################################################## -# --dynlink-tools tells the build to dynamically link certain binaries -# to libsqlite3.so instead of embedding a copy of the amalgamation. -define LINK_TOOLS_DYNAMICALLY [proj-opt-was-provided dynlink-tools] +sqlite-check-common-bins ;# must come before [sqlite-handle-wasi-sdk] +sqlite-handle-wasi-sdk ;# must run relatively early, as it changes the environment +sqlite-check-common-system-deps # # Enable large file support (if special flags are necessary) +# define HAVE_LFS 0 if {[opt-bool largefile]} { cc-check-lfs } -# -# Check for needed/wanted data types -cc-with {-includes stdint.h} \ - {cc-check-types int8_t int16_t int32_t int64_t intptr_t \ - uint8_t uint16_t uint32_t uint64_t uintptr_t} - -# -# Check for needed/wanted functions -cc-check-functions gmtime_r isnan localtime_r localtime_s \ - malloc_usable_size strchrnul usleep utime pread pread64 pwrite pwrite64 - -proj-check-function-in-lib fdatasync rt -define LDFLAGS_FDATASYNC [get-define lib_fdatasync] -undefine lib_fdatasync - -# -# Check for needed/wanted headers -cc-check-includes \ - sys/types.h sys/stat.h dlfcn.h unistd.h \ - stdlib.h malloc.h memory.h \ - string.h strings.h \ - inttypes.h - -if {[cc-check-includes zlib.h] && [proj-check-function-in-lib deflate z]} { - # TODO? port over the more sophisticated zlib search from the fossil auto.def - define HAVE_ZLIB 1 - define LDFLAGS_ZLIB -lz - sqlite-add-shell-opt -DSQLITE_HAVE_ZLIB=1 -} else { - define HAVE_ZLIB 0 - define LDFLAGS_ZLIB "" -} - -proj-check-rpath ; # Determine proper rpath-handling flag - proj-define-for-opt shared ENABLE_SHARED "Build shared library?" if {![proj-define-for-opt static ENABLE_STATIC \ @@ -429,565 +268,21 @@ proj-define-for-opt test-status TSTRNNR_OPTS \ proj-define-for-opt linemacros AMALGAMATION_LINE_MACROS \ "Use #line macros in the amalgamation:" -sqlite-check-soname -sqlite-check-debug - -######################################################################## -# TCL... -# -# sqlite-check-tcl performs most of the --with-tcl and --with-tclsh -# handling. Some related bits and pieces are performed before and -# after that function is called. -# -# Important [define]'d vars: -# -# - HAVE_TCL indicates whether we have a tclsh suitable for building -# the TCL SQLite extension and, by extension, the testing -# infrastructure. This must only be 1 for environments where -# tclConfig.sh can be found. -# -# - TCLSH_CMD is the path to the canonical tclsh or "". It never -# refers to jimtcl. -# -# - TCL_CONFIG_SH is the path to tclConfig.sh or "". -# -# - TCLLIBDIR is the dir to which libtclsqlite3 gets installed. -# -# - BTCLSH = the path to the tcl interpreter used for in-tree code -# generation. It may be jimtcl or the canonical tclsh but may not -# be empty - this tree requires TCL to generated numerous -# components. -# -# If --tcl or --with-tcl are provided but no TCL is found, this -# function fails fatally. If they are not explicitly provided then -# failure to find TCL is not fatal but a loud warning will be emitted. -# -proc sqlite-check-tcl {} { - rename sqlite-check-tcl "" - define TCLSH_CMD false ; # Significant is that it exits with non-0 - define HAVE_TCL 0 ; # Will be enabled via --tcl or a successful search - define TCLLIBDIR "" ; # Installation dir for TCL extension lib - define TCL_CONFIG_SH ""; # full path to tclConfig.sh - - # Clear out all vars which would be set by tclConfigToAutoDef.sh, so - # that the late-config validation of @VARS@ works even if - # --disable-tcl is used. - foreach k {TCL_INCLUDE_SPEC TCL_LIB_SPEC TCL_STUB_LIB_SPEC TCL_EXEC_PREFIX TCL_VERSION} { - define $k "" - } - - file delete -force ".tclenv.sh"; # ensure no stale state from previous configures. - if {![opt-bool tcl]} { - proj-indented-notice { - NOTE: TCL is disabled via --disable-tcl. This means that none - of the TCL-based components will be built, including tests - and sqlite3_analyzer. - } - return - } - # TODO: document the steps this is taking. - global srcdir - msg-result "Checking for a suitable tcl... " - proj-assert [proj-opt-truthy tcl] - set use_tcl 1 - set with_tclsh [opt-val with-tclsh] - set with_tcl [opt-val with-tcl] - if {"prefix" eq $with_tcl} { - set with_tcl [get-define prefix] - } - msg-debug "sqlite-check-tcl: use_tcl ${use_tcl}" - msg-debug "sqlite-check-tcl: with_tclsh=${with_tclsh}" - msg-debug "sqlite-check-tcl: with_tcl=$with_tcl" - if {"" eq $with_tclsh && "" eq $with_tcl} { - # If neither --with-tclsh nor --with-tcl are provided, try to find - # a workable tclsh. - set with_tclsh [proj-first-bin-of tclsh9.0 tclsh8.6 tclsh] - msg-debug "sqlite-check-tcl: with_tclsh=${with_tclsh}" - } - - set doConfigLookup 1 ; # set to 0 to test the tclConfig.sh-not-found cases - if {"" ne $with_tclsh} { - # --with-tclsh was provided or found above. Validate it and use it - # to trump any value passed via --with-tcl=DIR. - if {![file isfile $with_tclsh]} { - proj-fatal "TCL shell $with_tclsh is not a file" - } elseif {![file-isexec $with_tclsh]} { - proj-fatal "TCL shell $with_tclsh is not executable" - } else { - define TCLSH_CMD $with_tclsh - #msg-result "Using tclsh: $with_tclsh" - } - if {$doConfigLookup && - [catch {exec $with_tclsh $srcdir/tool/find_tclconfig.tcl} result] == 0} { - set with_tcl $result - } - if {"" ne $with_tcl && [file isdir $with_tcl]} { - msg-result "$with_tclsh recommends the tclConfig.sh from $with_tcl" - } else { - proj-warn "$with_tclsh is unable to recommend a tclConfig.sh" - set use_tcl 0 - } - } - set cfg "" - set tclSubdirs {tcl9.0 tcl8.6 lib} - while {$use_tcl} { - if {"" ne $with_tcl} { - # Ensure that we can find tclConfig.sh under ${with_tcl}/... - if {$doConfigLookup} { - if {[file readable "${with_tcl}/tclConfig.sh"]} { - set cfg "${with_tcl}/tclConfig.sh" - } else { - foreach i $tclSubdirs { - if {[file readable "${with_tcl}/$i/tclConfig.sh"]} { - set cfg "${with_tcl}/$i/tclConfig.sh" - break - } - } - } - } - if {"" eq $cfg} { - proj-fatal "No tclConfig.sh found under ${with_tcl}" - } - } else { - # If we have not yet found a tclConfig.sh file, look in - # $libdir which is set automatically by autosetup or by the - # --prefix command-line option. See - # https://sqlite.org/forum/forumpost/e04e693439a22457 - set libdir [get-define libdir] - if {[file readable "${libdir}/tclConfig.sh"]} { - set cfg "${libdir}/tclConfig.sh" - } else { - foreach i $tclSubdirs { - if {[file readable "${libdir}/$i/tclConfig.sh"]} { - set cfg "${libdir}/$i/tclConfig.sh" - break - } - } - } - if {![file readable $cfg]} { - break - } - } - msg-result "Using tclConfig.sh: $cfg" - break - } - define TCL_CONFIG_SH $cfg - # Export a subset of tclConfig.sh to the current TCL-space. If $cfg - # is an empty string, this emits empty-string entries for the - # various options we're interested in. - eval [exec "${srcdir}/tool/tclConfigShToAutoDef.sh" "$cfg"] - - if {"" eq $with_tclsh && $cfg ne ""} { - # We have tclConfig.sh but no tclsh. Attempt to locate a tclsh - # based on info from tclConfig.sh. - proj-assert {"" ne [get-define TCL_EXEC_PREFIX]} - set with_tclsh [get-define TCL_EXEC_PREFIX]/bin/tclsh[get-define TCL_VERSION] - if {![file-isexec $with_tclsh]} { - set with_tclsh2 [get-define TCL_EXEC_PREFIX]/bin/tclsh - if {![file-isexec $with_tclsh2]} { - proj-warn "Cannot find a usable tclsh (tried: $with_tclsh $with_tclsh2)" - } else { - set with_tclsh $with_tclsh2 - } - } - } - define TCLSH_CMD $with_tclsh - if {$use_tcl} { - # Set up the TCLLIBDIR - # - # 2024-10-28: calculation of TCLLIBDIR is now done via the shell - # in main.mk (search it for T.tcl.env.sh) so that - # static/hand-written makefiles which import main.mk do not have - # to define that before importing main.mk. Even so, we export - # TCLLIBDIR from here, which will cause the canonical makefile to - # use this one rather than to re-calculate it at make-time. - set tcllibdir [get-env TCLLIBDIR ""] - if {"" eq $tcllibdir} { - # Attempt to extract TCLLIBDIR from TCL's $auto_path - if {"" ne $with_tclsh && - [catch {exec echo "puts stdout \$auto_path" | "$with_tclsh"} result] == 0} { - foreach i $result { - if {[file isdir $i]} { - set tcllibdir $i/sqlite3 - break - } - } - } else { - proj-warn "Cannot determine TCLLIBDIR." - # The makefile will fail fatally in this case if a target is - # invoked which requires TCLLIBDIR. - } - } - #if {"" ne $tcllibdir} { msg-result "TCLLIBDIR = ${tcllibdir}"; } - define TCLLIBDIR $tcllibdir - }; # find TCLLIBDIR - - if {[file-isexec $with_tclsh]} { - msg-result "Using tclsh: $with_tclsh" - if {$cfg ne ""} { - define HAVE_TCL 1 - } else { - proj-warn "Found tclsh but no tclConfig.sh." - } - } - show-notices - # If TCL is not found: if it was explicitly requested then fail - # fatally, else just emit a warning. If we can find the APIs needed - # to generate a working JimTCL then that will suffice for build-time - # TCL purposes (see: proc sqlite-determine-codegen-tcl). - if {![get-define HAVE_TCL] && - ([proj-opt-was-provided tcl] || [proj-opt-was-provided with-tcl])} { - proj-fatal "TCL support was requested but no tclConfig.sh could be found." - } - if {"" eq $cfg} { - proj-assert {0 == [get-define HAVE_TCL]} - proj-indented-notice { - WARNING: Cannot find a usable tclConfig.sh file. Use - --with-tcl=DIR to specify a directory where tclConfig.sh can be - found. SQLite does not use TCL internally, but some optional - components require TCL, including tests and sqlite3_analyzer. - } - } -}; # sqlite-check-tcl -sqlite-check-tcl - -######################################################################## -# sqlite-determine-codegen-tcl checks which TCL to use as a code -# generator. By default, prefer jimsh simply because we have it -# in-tree (it's part of autosetup) unless --with-tclsh=X is used, in -# which case prefer X. -# -# Returns the human-readable name of the TCL it selects. Fails fatally -# if it cannot detect a TCL appropriate for code generation. -# -# Defines: -# -# - BTCLSH = the TCL shell used for code generation. It may set this -# to an unexpanded makefile var name. -# -# - CFLAGS_JIMSH = any flags needed for buildng a BTCLSH-compatible -# jimsh. The defaults may be passed on to configure as -# CFLAGS_JIMSH=... -proc sqlite-determine-codegen-tcl {} { - rename sqlite-determine-codegen-tcl "" - msg-result "Checking for TCL to use for code generation... " - define CFLAGS_JIMSH [proj-get-env CFLAGS_JIMSH {-O1}] - set cgtcl [opt-val with-tclsh jimsh] - if {"jimsh" ne $cgtcl} { - # When --with-tclsh=X is used, use that for all TCL purposes, - # including in-tree code generation, per developer request. - define BTCLSH "\$(TCLSH_CMD)" - return $cgtcl - } - set flagsToRestore {CC CFLAGS AS_CFLAGS CPPFLAGS AS_CPPFLAGS LDFLAGS LINKFLAGS LIBS CROSS} - define-push $flagsToRestore { - # We have to swap CC to CC_FOR_BUILD for purposes of the various - # [cc-...] tests below. Recall that --with-wasi-sdk may have - # swapped out CC with one which is not appropriate for this block. - # Per consulation with autosetup's creator, doing this properly - # requires us to [define-push] the whole $flagsToRestore list - # (plus a few others which are not relevant in this tree). - # - # These will get set to their previous values at the end of this - # block. - foreach flag $flagsToRestore {define $flag ""} - define CC [get-define CC_FOR_BUILD] - # These headers are technically optional for JimTCL but necessary if - # we want to use it for code generation: - set sysh [cc-check-includes dirent.h sys/time.h] - # jimsh0.c hard-codes #define's for HAVE_DIRENT_H and - # HAVE_SYS_TIME_H on the platforms it supports, so we do not - # need to add -D... flags for those. We check for them here only - # so that we can avoid the situation that we later, at - # make-time, try to compile jimsh but it then fails due to - # missing headers (i.e. fail earlier rather than later). - if {$sysh && [cc-check-functions realpath]} { - define-append CFLAGS_JIMSH -DHAVE_REALPATH - define BTCLSH "\$(JIMSH)" - set ::sqliteConfig(use-jim-for-codegen) 1 - } elseif {$sysh && [cc-check-functions _fullpath]} { - # _fullpath() is a Windows API. It's not entirely clear - # whether we need to add {-DHAVE_SYS_TIME_H -DHAVE_DIRENT_H} - # to CFLAGS_JIMSH in this case. On MinGW32 we definitely do - # not want to because it already hard-codes them. On _MSC_VER - # builds it does not. - define-append CFLAGS_JIMSH -DHAVE__FULLPATH - define BTCLSH "\$(JIMSH)" - set ::sqliteConfig(use-jim-for-codegen) 1 - } elseif {[file-isexec [get-define TCLSH_CMD]]} { - set cgtcl [get-define TCLSH_CMD] - define BTCLSH "\$(TCLSH_CMD)" - } else { - # One last-ditch effort to find TCLSH_CMD: use info from - # tclConfig.sh to try to find a tclsh - if {"" eq [get-define TCLSH_CMD]} { - set tpre [get-define TCL_EXEC_PREFIX] - if {"" ne $tpre} { - set tv [get-define TCL_VERSION] - if {[file-isexec "${tpre}/bin/tclsh${tv}"]} { - define TCLSH_CMD "${tpre}/bin/tclsh${tv}" - } elseif {[file-isexec "${tpre}/bin/tclsh"]} { - define TCLSH_CMD "${tpre}/bin/tclsh" - } - } - } - set cgtcl [get-define TCLSH_CMD] - if {![file-isexec $cgtcl]} { - proj-fatal "Cannot find a tclsh to use for code generation." - } - define BTCLSH "\$(TCLSH_CMD)" - } - }; # CC swap-out - return $cgtcl -}; # sqlite-determine-codegen-tcl -msg-result "TCL for code generation: [sqlite-determine-codegen-tcl]" -# /TCL -######################################################################## - -######################################################################## -# Thread safety? -sqlite-check-threadsafe - -######################################################################## -# Do we want temporary databases in memory? -# -# The test fixture likes to set SQLITE_TEMP_STORE on its own, so do -# not set that feature flag unless it was explicitly provided to the -# configure script. -if {[proj-opt-was-provided with-tempstore]} { - apply {{} { - set ts [opt-val with-tempstore no] - set tsn 1 - msg-checking "Use an in-RAM database for temporary tables? " - switch -exact -- $ts { - never { set tsn 0 } - no { set tsn 1 } - yes { set tsn 2 } - always { set tsn 3 } - default { - user-error "Invalid --with-tempstore value '$ts'. Use one of: never, no, yes, always" - } - } - msg-result $ts - sqlite-add-feature-flag -DSQLITE_TEMP_STORE=$tsn - }} -} - -# Must come after sqlite-determine-codegen-tcl -msg-result "Line-editing support for the sqlite3 shell: [sqlite-check-line-editing]" - -proj-if-opt-truthy load-extension { - if {[proj-check-function-in-lib dlopen dl]} { - define LDFLAGS_DLOPEN [get-define lib_dlopen] - undefine lib_dlopen - } else { - user-error "dlopen() not found. Use --disable-load-extension to bypass this check." - } -} { - define LDFLAGS_DLOPEN "" - sqlite-add-feature-flag {-DSQLITE_OMIT_LOAD_EXTENSION=1} - msg-result "Disabling loadable extensions." -} - -proj-if-opt-truthy math { - if {![proj-check-function-in-lib ceil m]} { - user-error "Cannot find libm functions. Use --disable-math to bypass this." - } - define LDFLAGS_MATH [get-define lib_ceil] - undefine lib_ceil - sqlite-add-feature-flag {-DSQLITE_ENABLE_MATH_FUNCTIONS} - msg-result "Enabling math SQL functions [get-define LDFLAGS_MATH]" -} { - define LDFLAGS_MATH "" - msg-result "Disabling math SQL functions" -} - -sqlite-check-icu - -######################################################################## -# Check for the Emscripten SDK for building the web-based wasm -# components. The core lib and tools do not require this but ext/wasm -# does. -apply {{} { - if {$::autosetup(srcdir) ne $::autosetup(builddir)} { - # The EMSDK pieces require writing to the original source tree - # even when doing an out-of-tree build. The ext/wasm pieces do not - # support an out-of-tree build so we catch that case and treat it - # as if EMSDK were not found. - msg-result "Out-of tree build: not checking for EMSDK." - define EMCC_WRAPPER "" - return - } - set emccsh $::srcdir/tool/emcc.sh - if {![get-define HAVE_WASI_SDK] && [proj-check-emsdk]} { - define EMCC_WRAPPER $emccsh - proj-make-from-dot-in $emccsh - catch {exec chmod u+x $emccsh} - } else { - define EMCC_WRAPPER "" - file delete -force $emccsh - } -}} - -######################################################################## -# Check for log(3) in libm and die with an error if it is not -# found. $featureName should be the feature name which requires that -# function (it's used only in error messages). defines LDFLAGS_MATH to -# the required linker flags (which may be empty even if the math APIs -# are found, depending on the OS). -proc affirm-have-math {featureName} { - if {"" eq [get-define LDFLAGS_MATH ""]} { - if {![msg-quiet proj-check-function-in-lib log m]} { - user-error "Missing math APIs for $featureName" - } - define LDFLAGS_MATH [get-define lib_log ""] - undefine lib_log - } -} - -######################################################################## -# Handle various SQLITE_ENABLE_... feature flags. -msg-result "Feature flags..." -foreach {boolFlag featureFlag ifSetEvalThis} { - all {} { - # The 'all' option must be first in this list. - proj-opt-set fts4 - proj-opt-set fts5 - proj-opt-set geopoly - proj-opt-set rtree - proj-opt-set session - } - fts4 -DSQLITE_ENABLE_FTS4 {affirm-have-math fts4} - fts5 -DSQLITE_ENABLE_FTS5 {affirm-have-math fts5} - geopoly -DSQLITE_ENABLE_GEOPOLY {proj-opt-set rtree} - rtree -DSQLITE_ENABLE_RTREE {} - session {-DSQLITE_ENABLE_SESSION -DSQLITE_ENABLE_PREUPDATE_HOOK} {} - update-limit -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT {} - memsys5 -DSQLITE_ENABLE_MEMSYS5 {} - memsys3 {} { - if {[opt-bool memsys5]} { - proj-warn "not enabling memsys3 because memsys5 is enabled." - expr 0 - } else { - sqlite-add-feature-flag -DSQLITE_ENABLE_MEMSYS3 - } - } - scanstatus -DSQLITE_ENABLE_STMT_SCANSTATUS {} -} { - proj-if-opt-truthy $boolFlag { - sqlite-add-feature-flag $featureFlag - if {0 != [eval $ifSetEvalThis] && "all" ne $boolFlag} { - msg-result " + $boolFlag" - } - } { - if {"all" ne $boolFlag} { - msg-result " - $boolFlag" - } - } -} - -######################################################################## -# Invert the above loop's logic for some SQLITE_OMIT_... cases. If -# config option $boolFlag is false, [sqlite-add-feature-flag -# $featureFlag], where $featureFlag is intended to be -# -DSQLITE_OMIT_... -foreach {boolFlag featureFlag} { - json -DSQLITE_OMIT_JSON -} { - if {[proj-opt-truthy $boolFlag]} { - msg-result " + $boolFlag" - } else { - sqlite-add-feature-flag $featureFlag - msg-result " - $boolFlag" - } -} +define LINK_TOOLS_DYNAMICALLY [proj-opt-was-provided dynlink-tools] +proj-check-rpath +sqlite-handle-soname +sqlite-handle-debug +sqlite-handle-tcl +sqlite-handle-threadsafe +sqlite-handle-tempstore +sqlite-handle-line-editing +sqlite-handle-load-extension +sqlite-handle-math +sqlite-handle-icu +sqlite-handle-emsdk +sqlite-handle-common-feature-flags sqlite-show-feature-flags - -######################################################################## -# When cross-compiling, we have to avoid using the -s flag to -# /usr/bin/install: https://sqlite.org/forum/forumpost/9a67df63eda9925c -define IS_CROSS_COMPILING $sqliteConfig(is-cross-compiling) - -######################################################################## -# "Re-export" the autoconf-conventional --XYZdir flags into something -# which is more easily overridable from a make invocation. See the docs -# for [proj-remap-autoconf-dir-vars] for the explanation of why. -# -# We do this late in the config process, immediately before we export -# the Makefile and other generated files, so that configure tests -# which make make use of the autotools-conventional flags -# (e.g. [proj-check-rpath]) may do so before we "mangle" them here. -proj-remap-autoconf-dir-vars - -######################################################################## -# Generate the output files. -# -# Potential TODO (unclear): in sqlite3.pc.in, do we need to include -# any CFLAGS_READLINE, CFLAGS_ZLIB, etc in its "Cflags:" section? -proj-make-from-dot-in -touch Makefile sqlite3.pc -make-config-header sqlite_cfg.h \ - -bare {SIZEOF_* HAVE_DECL_*} \ - -none {HAVE_CFLAG_* LDFLAGS_* SH_* SQLITE_AUTORECONFIG - TARGET_* USE_GCOV TCL_*} \ - -auto {HAVE_* PACKAGE_*} \ - -none * -proj-touch sqlite_cfg.h ; # help avoid frequent unnecessary @SQLITE_AUTORECONFIG@ - -######################################################################## -# Some build-dev/debug-only output -proj-if-opt-truthy dump-defines { - make-config-header $::DUMP_DEFINES_TXT \ - -bare {SQLITE_OS* SQLITE_DEBUG USE_*} \ - -str {BIN_* CC LD AR LDFLAG* OPT_*} \ - -auto {*} - # achtung: ^^^^ whichever SQLITE_OS_foo flag which is set to 0 will - # get _undefined_ here unless it's part of the -bare set. - if {"" ne $DUMP_DEFINES_JSON} { - msg-result "--dump-defines is creating $::DUMP_DEFINES_JSON" - ######################################################################## - # Dump config-defines.json... - # Demonstrate (mis?)handling of spaces in JSON-export array values: - # define-append OPT_FOO.list {"-DFOO=bar baz" -DBAR="baz barre"} - define OPT_FEATURE_FLAGS.list [get-define OPT_FEATURE_FLAGS] - define OPT_SHELL.list [get-define OPT_SHELL] - set dumpDefsOpt { - -bare {SIZEOF_* HAVE_DECL_*} - -none {HAVE_CFLAG_* LDFLAGS_* SH_* SQLITE_AUTORECONFIG TARGET_* USE_GCOV TCL_*} - -array {*.list} - -auto {OPT_* PACKAGE_* HAVE_*} - } - if {[opt-bool defines-json-include-lowercase]} { - lappend dumpDefsOpt -none {lib_*} ; # remnants from proj-check-function-in-lib and friends - lappend dumpDefsOpt -auto {[a-z]*} - } - lappend dumpDefsOpt -none * - proj-dump-defs-json $DUMP_DEFINES_JSON {*}$dumpDefsOpt - undefine OPT_FEATURE_FLAGS.list - undefine OPT_SHELL.list - } -} - -######################################################################## -# Perform some high-level validation on the generated files... -# -# 1) Ensure that no unresolved @VAR@ placeholders are in files which -# use those. -# -# 2) TBD -apply {{} { - # Check #1: ensure that files which get filtered for @VAR@ do not - # contain any unresolved @VAR@ refs. That may indicate an - # unexported/unused var or a typo. - foreach f "Makefile sqlite3.pc $::srcdir/tool/emcc.sh" { - if {![file exists $f]} continue - set lnno 1 - foreach line [proj-file-content-list $f] { - if {[regexp {(@[A-Za-z_]+@)} $line match]} { - error "Unresolved reference to $match at line $lnno of $f" - } - incr lnno - } - } -}} - +sqlite-process-dot-in-files +sqlite-post-config-validation +sqlite-dump-defines diff --git a/autosetup/proj.tcl b/autosetup/proj.tcl index a469c898de..915a6b1349 100644 --- a/autosetup/proj.tcl +++ b/autosetup/proj.tcl @@ -184,7 +184,7 @@ proc proj-lshift_ {listVar {count 1}} { # out any lines which begin with an number of whitespace followed by a # '#', and returns a value containing the [append]ed results of each # remaining line with a \n between each. -proc proj-strip-hash-comments_ {val} { +proc proj-strip-hash-comments {val} { set x {} foreach line [split $val \n] { if {![string match "#*" [string trimleft $line]]} { @@ -1119,7 +1119,7 @@ proc proj-dump-defs-json {file args} { # that [opt-value canonical] will return X if --alias=X is passed to # configure. proc proj-xfer-options-aliases {mapping} { - foreach {hidden - canonical} [proj-strip-hash-comments_ $mapping] { + foreach {hidden - canonical} [proj-strip-hash-comments $mapping] { if {[proj-opt-was-provided $hidden]} { if {[proj-opt-was-provided $canonical]} { proj-fatal "both --$canonical and its alias --$hidden were used. Use only one or the other." diff --git a/autosetup/sqlite-config.tcl b/autosetup/sqlite-config.tcl index 6b036b529c..08bd0467e5 100644 --- a/autosetup/sqlite-config.tcl +++ b/autosetup/sqlite-config.tcl @@ -9,7 +9,29 @@ use cc cc-db cc-shared cc-lib pkg-config proj # Object for communicating config-time state across various # auto.def-related pieces. # -array set sqliteConfig {} +array set sqliteConfig [proj-strip-hash-comments { + # + # Gets set to 1 when using jimsh for code generation. May affect + # later decisions. + use-jim-for-codegen 0 + # + # Pass msg-debug=1 to configure to enable obnoxiously loud output + # from [msg-debug]. + msg-debug-enabled 0 + # + # Output file for --dump-defines. Intended only for build debugging + # and not part of the public build interface. + dump-defines-txt ./config.defines.txt + # + # Output file for --dump-defines-json. This is the autosetup + # counterpart of the historical "DEFS" var which was generated by + # the autotools in the pre-processed autotools builds (but not in + # the canonical tree). Generation of this file is disabled (via an + # empty file name) until/unless someone voices a specific interest + # in it. The original motivating use case is handled fine by + # sqlite_cfg.h. + dump-defines-json "" +}] # # Set to 1 when cross-compiling This value may be changed by certain @@ -19,13 +41,6 @@ array set sqliteConfig {} # set sqliteConfig(is-cross-compiling) [proj-is-cross-compiling] -# -# Gets set to 1 when using jimsh for code generation. May affect later -# decisions. -# -set sqliteConfig(use-jim-for-codegen) 0 - - ######################################################################## # Runs some common initialization which must happen immediately after # autosetup's [options] function is called. @@ -41,6 +56,23 @@ proc sqlite-post-options-init {} { with-debug => debug } sqlite-autoreconfig + proj-file-extensions + if {".exe" eq [get-define TARGET_EXEEXT]} { + define SQLITE_OS_UNIX 0 + define SQLITE_OS_WIN 1 + } else { + define SQLITE_OS_UNIX 1 + define SQLITE_OS_WIN 0 + } + + set ::sqliteConfig(msg-debug-enabled) [proj-val-truthy [get-env msg-debug 0]] + +} + +proc msg-debug {msg} { + if {$::sqliteConfig(msg-debug-enabled)} { + puts stderr [proj-bold "** DEBUG: $msg"] + } } ######################################################################## @@ -92,6 +124,151 @@ proc sqlite-add-shell-opt {args} { } } +######################################################################## +# Check for log(3) in libm and die with an error if it is not +# found. $featureName should be the feature name which requires that +# function (it's used only in error messages). defines LDFLAGS_MATH to +# the required linker flags (which may be empty even if the math APIs +# are found, depending on the OS). +proc sqlite-affirm-have-math {featureName} { + if {"" eq [get-define LDFLAGS_MATH ""]} { + if {![msg-quiet proj-check-function-in-lib log m]} { + user-error "Missing math APIs for $featureName" + } + define LDFLAGS_MATH [get-define lib_log ""] + undefine lib_log + } +} + +######################################################################## +# Run checks for required binaries, like ld and ar. In the canonical +# build this must come before [sqlite-handle-wasi-sdk]. +proc sqlite-check-common-bins {} { + cc-check-tools ld ar ; # must come before [sqlite-handle-wasi-sdk] + if {"" eq [proj-bin-define install]} { + proj-warn "Cannot find install binary, so 'make install' will not work." + define BIN_INSTALL false + } +} + +######################################################################## +# Run checks for system-level includes and libs which are common to +# both the canonical build and the "autoconf" bundle. +proc sqlite-check-common-system-deps {} { + # + # Check for needed/wanted data types + cc-with {-includes stdint.h} \ + {cc-check-types int8_t int16_t int32_t int64_t intptr_t \ + uint8_t uint16_t uint32_t uint64_t uintptr_t} + + # + # Check for needed/wanted functions + cc-check-functions gmtime_r isnan localtime_r localtime_s \ + malloc_usable_size strchrnul usleep utime pread pread64 pwrite pwrite64 + + proj-check-function-in-lib fdatasync rt + define LDFLAGS_FDATASYNC [get-define lib_fdatasync] + undefine lib_fdatasync + + # + # Check for needed/wanted headers + cc-check-includes \ + sys/types.h sys/stat.h dlfcn.h unistd.h \ + stdlib.h malloc.h memory.h \ + string.h strings.h \ + inttypes.h + + if {[cc-check-includes zlib.h] && [proj-check-function-in-lib deflate z]} { + # TODO? port over the more sophisticated zlib search from the fossil auto.def + define HAVE_ZLIB 1 + define LDFLAGS_ZLIB -lz + sqlite-add-shell-opt -DSQLITE_HAVE_ZLIB=1 + } else { + define HAVE_ZLIB 0 + define LDFLAGS_ZLIB "" + } +} + +proc sqlite-setup-default-cflags {} { + ######################################################################## + # We differentiate between two C compilers: the one used for binaries + # which are to run on the build system (in autosetup it's called + # CC_FOR_BUILD and in Makefile.in it's $(B.cc)) and the one used for + # compiling binaries for the target system (CC a.k.a. $(T.cc)). + # Normally they're the same, but they will differ when + # cross-compiling. + # + # When cross-compiling we default to not using the -g flag, based on a + # /chat discussion prompted by + # https://sqlite.org/forum/forumpost/9a67df63eda9925c + set defaultCFlags {-O2} + if {!$::sqliteConfig(is-cross-compiling)} { + lappend defaultCFlags -g + } + define CFLAGS [proj-get-env CFLAGS $defaultCFlags] + # BUILD_CFLAGS is the CFLAGS for CC_FOR_BUILD. + define BUILD_CFLAGS [proj-get-env BUILD_CFLAGS {-g}] +} + +######################################################################## +# Handle various SQLITE_ENABLE_... feature flags. +proc sqlite-handle-common-feature-flags {} { + msg-result "Feature flags..." + foreach {boolFlag featureFlag ifSetEvalThis} { + all {} { + # The 'all' option must be first in this list. + proj-opt-set fts4 + proj-opt-set fts5 + proj-opt-set geopoly + proj-opt-set rtree + proj-opt-set session + } + fts4 -DSQLITE_ENABLE_FTS4 {sqlite-affirm-have-math fts4} + fts5 -DSQLITE_ENABLE_FTS5 {sqlite-affirm-have-math fts5} + geopoly -DSQLITE_ENABLE_GEOPOLY {proj-opt-set rtree} + rtree -DSQLITE_ENABLE_RTREE {} + session {-DSQLITE_ENABLE_SESSION -DSQLITE_ENABLE_PREUPDATE_HOOK} {} + update-limit -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT {} + memsys5 -DSQLITE_ENABLE_MEMSYS5 {} + memsys3 {} { + if {[opt-bool memsys5]} { + proj-warn "not enabling memsys3 because memsys5 is enabled." + expr 0 + } else { + sqlite-add-feature-flag -DSQLITE_ENABLE_MEMSYS3 + } + } + scanstatus -DSQLITE_ENABLE_STMT_SCANSTATUS {} + } { + proj-if-opt-truthy $boolFlag { + sqlite-add-feature-flag $featureFlag + if {0 != [eval $ifSetEvalThis] && "all" ne $boolFlag} { + msg-result " + $boolFlag" + } + } { + if {"all" ne $boolFlag} { + msg-result " - $boolFlag" + } + } + } + ######################################################################## + # Invert the above loop's logic for some SQLITE_OMIT_... cases. If + # config option $boolFlag is false, [sqlite-add-feature-flag + # $featureFlag], where $featureFlag is intended to be + # -DSQLITE_OMIT_... + foreach {boolFlag featureFlag} { + json -DSQLITE_OMIT_JSON + } { + if {[proj-opt-truthy $boolFlag]} { + msg-result " + $boolFlag" + } else { + sqlite-add-feature-flag $featureFlag + msg-result " - $boolFlag" + } + } + +} + ######################################################################### # Show the final feature flag sets. proc sqlite-show-feature-flags {} { @@ -112,7 +289,7 @@ proc sqlite-show-feature-flags {} { # Checks for the --debug flag, defining SQLITE_DEBUG to 1 if it is # true. TARGET_DEBUG gets defined either way, with content depending # on whether --debug is true or false. -proc sqlite-check-debug {} { +proc sqlite-handle-debug {} { msg-checking "SQLITE_DEBUG build? " proj-if-opt-truthy debug { define SQLITE_DEBUG 1 @@ -128,7 +305,7 @@ proc sqlite-check-debug {} { ######################################################################## # "soname" for libsqlite3.so. See discussion at: # https://sqlite.org/src/forumpost/5a3b44f510df8ded -proc sqlite-check-soname {} { +proc sqlite-handle-soname {} { define LDFLAGS_LIBSQLITE3_SONAME "" if {[proj-opt-was-provided soname]} { set soname [join [opt-val soname] ""] @@ -151,7 +328,7 @@ proc sqlite-check-soname {} { } } } - # msg-debug "soname=$soname" + msg-debug "soname=$soname" if {[proj-check-soname $soname]} { define LDFLAGS_LIBSQLITE3_SONAME [get-define LDFLAGS_SONAME_PREFIX]$soname msg-result "Setting SONAME using: [get-define LDFLAGS_LIBSQLITE3_SONAME]" @@ -170,7 +347,7 @@ proc sqlite-check-soname {} { # needed for linking pthread. If --enable-threadsafe is not set, adds # -DSQLITE_THREADSAFE=0 to OPT_FEATURE_FLAGS and sets LDFLAGS_PTHREAD # to an empty string. -proc sqlite-check-threadsafe {} { +proc sqlite-handle-threadsafe {} { msg-checking "Support threadsafe operation? " proj-if-opt-truthy threadsafe { msg-result yes @@ -190,6 +367,57 @@ proc sqlite-check-threadsafe {} { } } +######################################################################## +# Handles the --with-tempstore flag. +# +# The test fixture likes to set SQLITE_TEMP_STORE on its own, so do +# not set that feature flag unless it was explicitly provided to the +# configure script. +proc sqlite-handle-tempstore {} { + if {[proj-opt-was-provided with-tempstore]} { + set ts [opt-val with-tempstore no] + set tsn 1 + msg-checking "Use an in-RAM database for temporary tables? " + switch -exact -- $ts { + never { set tsn 0 } + no { set tsn 1 } + yes { set tsn 2 } + always { set tsn 3 } + default { + user-error "Invalid --with-tempstore value '$ts'. Use one of: never, no, yes, always" + } + } + msg-result $ts + sqlite-add-feature-flag -DSQLITE_TEMP_STORE=$tsn + } +} + +######################################################################## +# Check for the Emscripten SDK for building the web-based wasm +# components. The core lib and tools do not require this but ext/wasm +# does. +proc sqlite-handle-emsdk {} { + set srcdir $::autosetup(srcdir) + if {$srcdir ne $::autosetup(builddir)} { + # The EMSDK pieces require writing to the original source tree + # even when doing an out-of-tree build. The ext/wasm pieces do not + # support an out-of-tree build so we catch that case and treat it + # as if EMSDK were not found. + msg-result "Out-of tree build: not checking for EMSDK." + define EMCC_WRAPPER "" + return + } + set emccsh $srcdir/tool/emcc.sh + if {![get-define HAVE_WASI_SDK] && [proj-check-emsdk]} { + define EMCC_WRAPPER $emccsh + proj-make-from-dot-in $emccsh + catch {exec chmod u+x $emccsh} + } else { + define EMCC_WRAPPER "" + file delete -force $emccsh + } +} + ######################################################################## # sqlite-check-line-editing jumps through proverbial hoops to try to # find a working line-editing library, setting: @@ -227,7 +455,6 @@ proc sqlite-check-threadsafe {} { # corresponding --FEATURE flag was explicitly given, fail fatally, # else fail silently. proc sqlite-check-line-editing {} { - rename sqlite-check-line-editing "" msg-result "Checking for line-editing capability..." define HAVE_READLINE 0 define HAVE_LINENOISE 0 @@ -430,6 +657,15 @@ proc sqlite-check-line-editing {} { return "none" }; # sqlite-check-line-editing +######################################################################## +# Runs sqlite-check-line-editing and adds a message around it In the +# canonical build this must not be called before +# sqlite-determine-codegen-tcl. +proc sqlite-handle-line-editing {} { + msg-result "Line-editing support for the sqlite3 shell: [sqlite-check-line-editing]" +} + + ######################################################################## # ICU - International Components for Unicode # @@ -457,8 +693,7 @@ proc sqlite-check-line-editing {} { # Design note: though we could automatically enable ICU if the # icu-config binary or (pkg-config icu-io) are found, we specifically # do not. ICU is always an opt-in feature. -proc sqlite-check-icu {} { - rename sqlite-check-icu "" +proc sqlite-handle-icu {} { define LDFLAGS_ICU [join [opt-val with-icu-ldflags ""]] define CFLAGS_ICU [join [opt-val with-icu-cflags ""]] if {[proj-opt-was-provided with-icu-config]} { @@ -516,4 +751,515 @@ proc sqlite-check-icu {} { } else { msg-result "ICU support is disabled." } -}; # sqlite-check-icu +}; # sqlite-handle-icu + + +######################################################################## +# Handles the --enable-load-extension flag. +proc sqlite-handle-load-extension {} { + proj-if-opt-truthy load-extension { + if {[proj-check-function-in-lib dlopen dl]} { + define LDFLAGS_DLOPEN [get-define lib_dlopen] + undefine lib_dlopen + } else { + user-error "dlopen() not found. Use --disable-load-extension to bypass this check." + } + } { + define LDFLAGS_DLOPEN "" + sqlite-add-feature-flag {-DSQLITE_OMIT_LOAD_EXTENSION=1} + msg-result "Disabling loadable extensions." + } +} + +######################################################################## +# Handles the --enable-math flag. +proc sqlite-handle-math {} { + proj-if-opt-truthy math { + if {![proj-check-function-in-lib ceil m]} { + user-error "Cannot find libm functions. Use --disable-math to bypass this." + } + define LDFLAGS_MATH [get-define lib_ceil] + undefine lib_ceil + sqlite-add-feature-flag {-DSQLITE_ENABLE_MATH_FUNCTIONS} + msg-result "Enabling math SQL functions [get-define LDFLAGS_MATH]" + } { + define LDFLAGS_MATH "" + msg-result "Disabling math SQL functions" + } +} + +######################################################################## +# Generate the configure-process output file(s). +proc sqlite-process-dot-in-files {} { + ######################################################################## + # When cross-compiling, we have to avoid using the -s flag to + # /usr/bin/install: https://sqlite.org/forum/forumpost/9a67df63eda9925c + define IS_CROSS_COMPILING $::sqliteConfig(is-cross-compiling) + + ######################################################################## + # "Re-export" the autoconf-conventional --XYZdir flags into something + # which is more easily overridable from a make invocation. See the docs + # for [proj-remap-autoconf-dir-vars] for the explanation of why. + # + # We do this late in the config process, immediately before we export + # the Makefile and other generated files, so that configure tests + # which make make use of the autotools-conventional flags + # (e.g. [proj-check-rpath]) may do so before we "mangle" them here. + proj-remap-autoconf-dir-vars + + proj-make-from-dot-in -touch Makefile sqlite3.pc + make-config-header sqlite_cfg.h \ + -bare {SIZEOF_* HAVE_DECL_*} \ + -none {HAVE_CFLAG_* LDFLAGS_* SH_* SQLITE_AUTORECONFIG + TARGET_* USE_GCOV TCL_*} \ + -auto {HAVE_* PACKAGE_*} \ + -none * + proj-touch sqlite_cfg.h ; # help avoid frequent unnecessary @SQLITE_AUTORECONFIG@ +} + +######################################################################## +# Perform some high-level validation on the generated files... +# +# 1) Ensure that no unresolved @VAR@ placeholders are in files which +# use those. +# +# 2) TBD +proc sqlite-post-config-validation {} { + # Check #1: ensure that files which get filtered for @VAR@ do not + # contain any unresolved @VAR@ refs. That may indicate an + # unexported/unused var or a typo. + foreach f "Makefile sqlite3.pc $::autosetup(srcdir)/tool/emcc.sh" { + if {![file exists $f]} continue + set lnno 1 + foreach line [proj-file-content-list $f] { + if {[regexp {(@[A-Za-z_]+@)} $line match]} { + error "Unresolved reference to $match at line $lnno of $f" + } + incr lnno + } + } +} + +######################################################################## +# Handle --with-wasi-sdk[=DIR] +# +# This must be run relatively early on because it may change the +# toolchain and disable a number of config options. However, in the +# canonical build this must come after [sqlite-check-common-bins]. +proc sqlite-handle-wasi-sdk {} { + set wasiSdkDir [opt-val with-wasi-sdk] ; # ??? [lindex [opt-val with-wasi-sdk] end] + define HAVE_WASI_SDK 0 + if {$wasiSdkDir eq ""} { + return 0 + } elseif {$::sqliteConfig(is-cross-compiling)} { + proj-fatal "Cannot combine --with-wasi-sdk with cross-compilation" + } + msg-result "Checking WASI SDK directory \[$wasiSdkDir]... " + proj-affirm-files-exist -v {*}[prefix "$wasiSdkDir/bin/" {clang wasm-ld ar}] + define HAVE_WASI_SDK 1 + define WASI_SDK_DIR $wasiSdkDir + # Disable numerous options which we know either can't work or are + # not useful in this build... + msg-result "Using wasi-sdk clang. Disabling CLI shell and modifying config flags:" + # Boolean (--enable-/--disable-) flags which must be switched off: + foreach opt { + dynlink-tools + editline + gcov + icu-collations + load-extension + readline + shared + tcl + threadsafe + } { + if {[opt-bool $opt]} { + msg-result " --disable-$opt" + proj-opt-set $opt 0 + } + } + # Non-boolean flags which need to be cleared: + foreach opt { + with-emsdk + with-icu-config + with-icu-ldflags + with-icu-cflags + with-linenoise + with-tcl + } { + if {[proj-opt-was-provided $opt]} { + msg-result " removing --$opt" + proj-opt-set $opt "" + } + } + # Remember that we now have a discrepancy beteween + # $::sqliteConfig(is-cross-compiling) and [proj-is-cross-compiling]. + set ::sqliteConfig(is-cross-compiling) 1 + + # + # Changing --host and --target have no effect here except to + # possibly cause confusion. Autosetup has finished processing them + # by this point. + # + # host_alias=wasm32-wasi + # target=wasm32-wasi + # + # Merely changing CC, LD, and AR to the wasi-sdk's is enough to get + # sqlite3.o building in WASM format. + # + define CC "${wasiSdkDir}/bin/clang" + define LD "${wasiSdkDir}/bin/wasm-ld" + define AR "${wasiSdkDir}/bin/ar" + #define STRIP "${wasiSdkDir}/bin/strip" + return 1 +}; # sqlite-handle-wasi-sdk + +######################################################################## +# TCL... +# +# sqlite-check-tcl performs most of the --with-tcl and --with-tclsh +# handling. Some related bits and pieces are performed before and +# after that function is called. +# +# Important [define]'d vars: +# +# - HAVE_TCL indicates whether we have a tclsh suitable for building +# the TCL SQLite extension and, by extension, the testing +# infrastructure. This must only be 1 for environments where +# tclConfig.sh can be found. +# +# - TCLSH_CMD is the path to the canonical tclsh or "". It never +# refers to jimtcl. +# +# - TCL_CONFIG_SH is the path to tclConfig.sh or "". +# +# - TCLLIBDIR is the dir to which libtclsqlite3 gets installed. +# +# - BTCLSH = the path to the tcl interpreter used for in-tree code +# generation. It may be jimtcl or the canonical tclsh but may not +# be empty - this tree requires TCL to generated numerous +# components. +# +# If --tcl or --with-tcl are provided but no TCL is found, this +# function fails fatally. If they are not explicitly provided then +# failure to find TCL is not fatal but a loud warning will be emitted. +# +proc sqlite-check-tcl {} { + define TCLSH_CMD false ; # Significant is that it exits with non-0 + define HAVE_TCL 0 ; # Will be enabled via --tcl or a successful search + define TCLLIBDIR "" ; # Installation dir for TCL extension lib + define TCL_CONFIG_SH ""; # full path to tclConfig.sh + + # Clear out all vars which would be set by tclConfigToAutoDef.sh, so + # that the late-config validation of @VARS@ works even if + # --disable-tcl is used. + foreach k {TCL_INCLUDE_SPEC TCL_LIB_SPEC TCL_STUB_LIB_SPEC TCL_EXEC_PREFIX TCL_VERSION} { + define $k "" + } + + file delete -force ".tclenv.sh"; # ensure no stale state from previous configures. + if {![opt-bool tcl]} { + proj-indented-notice { + NOTE: TCL is disabled via --disable-tcl. This means that none + of the TCL-based components will be built, including tests + and sqlite3_analyzer. + } + return + } + # TODO: document the steps this is taking. + set srcdir $::autosetup(srcdir) + msg-result "Checking for a suitable tcl... " + proj-assert [proj-opt-truthy tcl] + set use_tcl 1 + set with_tclsh [opt-val with-tclsh] + set with_tcl [opt-val with-tcl] + if {"prefix" eq $with_tcl} { + set with_tcl [get-define prefix] + } + msg-debug "sqlite-check-tcl: use_tcl ${use_tcl}" + msg-debug "sqlite-check-tcl: with_tclsh=${with_tclsh}" + msg-debug "sqlite-check-tcl: with_tcl=$with_tcl" + if {"" eq $with_tclsh && "" eq $with_tcl} { + # If neither --with-tclsh nor --with-tcl are provided, try to find + # a workable tclsh. + set with_tclsh [proj-first-bin-of tclsh9.0 tclsh8.6 tclsh] + msg-debug "sqlite-check-tcl: with_tclsh=${with_tclsh}" + } + + set doConfigLookup 1 ; # set to 0 to test the tclConfig.sh-not-found cases + if {"" ne $with_tclsh} { + # --with-tclsh was provided or found above. Validate it and use it + # to trump any value passed via --with-tcl=DIR. + if {![file isfile $with_tclsh]} { + proj-fatal "TCL shell $with_tclsh is not a file" + } elseif {![file-isexec $with_tclsh]} { + proj-fatal "TCL shell $with_tclsh is not executable" + } else { + define TCLSH_CMD $with_tclsh + #msg-result "Using tclsh: $with_tclsh" + } + if {$doConfigLookup && + [catch {exec $with_tclsh $srcdir/tool/find_tclconfig.tcl} result] == 0} { + set with_tcl $result + } + if {"" ne $with_tcl && [file isdir $with_tcl]} { + msg-result "$with_tclsh recommends the tclConfig.sh from $with_tcl" + } else { + proj-warn "$with_tclsh is unable to recommend a tclConfig.sh" + set use_tcl 0 + } + } + set cfg "" + set tclSubdirs {tcl9.0 tcl8.6 lib} + while {$use_tcl} { + if {"" ne $with_tcl} { + # Ensure that we can find tclConfig.sh under ${with_tcl}/... + if {$doConfigLookup} { + if {[file readable "${with_tcl}/tclConfig.sh"]} { + set cfg "${with_tcl}/tclConfig.sh" + } else { + foreach i $tclSubdirs { + if {[file readable "${with_tcl}/$i/tclConfig.sh"]} { + set cfg "${with_tcl}/$i/tclConfig.sh" + break + } + } + } + } + if {"" eq $cfg} { + proj-fatal "No tclConfig.sh found under ${with_tcl}" + } + } else { + # If we have not yet found a tclConfig.sh file, look in + # $libdir which is set automatically by autosetup or by the + # --prefix command-line option. See + # https://sqlite.org/forum/forumpost/e04e693439a22457 + set libdir [get-define libdir] + if {[file readable "${libdir}/tclConfig.sh"]} { + set cfg "${libdir}/tclConfig.sh" + } else { + foreach i $tclSubdirs { + if {[file readable "${libdir}/$i/tclConfig.sh"]} { + set cfg "${libdir}/$i/tclConfig.sh" + break + } + } + } + if {![file readable $cfg]} { + break + } + } + msg-result "Using tclConfig.sh: $cfg" + break + } + define TCL_CONFIG_SH $cfg + # Export a subset of tclConfig.sh to the current TCL-space. If $cfg + # is an empty string, this emits empty-string entries for the + # various options we're interested in. + eval [exec "$srcdir/tool/tclConfigShToAutoDef.sh" "$cfg"] + + if {"" eq $with_tclsh && $cfg ne ""} { + # We have tclConfig.sh but no tclsh. Attempt to locate a tclsh + # based on info from tclConfig.sh. + proj-assert {"" ne [get-define TCL_EXEC_PREFIX]} + set with_tclsh [get-define TCL_EXEC_PREFIX]/bin/tclsh[get-define TCL_VERSION] + if {![file-isexec $with_tclsh]} { + set with_tclsh2 [get-define TCL_EXEC_PREFIX]/bin/tclsh + if {![file-isexec $with_tclsh2]} { + proj-warn "Cannot find a usable tclsh (tried: $with_tclsh $with_tclsh2)" + } else { + set with_tclsh $with_tclsh2 + } + } + } + define TCLSH_CMD $with_tclsh + if {$use_tcl} { + # Set up the TCLLIBDIR + # + # 2024-10-28: calculation of TCLLIBDIR is now done via the shell + # in main.mk (search it for T.tcl.env.sh) so that + # static/hand-written makefiles which import main.mk do not have + # to define that before importing main.mk. Even so, we export + # TCLLIBDIR from here, which will cause the canonical makefile to + # use this one rather than to re-calculate it at make-time. + set tcllibdir [get-env TCLLIBDIR ""] + if {"" eq $tcllibdir} { + # Attempt to extract TCLLIBDIR from TCL's $auto_path + if {"" ne $with_tclsh && + [catch {exec echo "puts stdout \$auto_path" | "$with_tclsh"} result] == 0} { + foreach i $result { + if {[file isdir $i]} { + set tcllibdir $i/sqlite3 + break + } + } + } else { + proj-warn "Cannot determine TCLLIBDIR." + # The makefile will fail fatally in this case if a target is + # invoked which requires TCLLIBDIR. + } + } + #if {"" ne $tcllibdir} { msg-result "TCLLIBDIR = ${tcllibdir}"; } + define TCLLIBDIR $tcllibdir + }; # find TCLLIBDIR + + if {[file-isexec $with_tclsh]} { + msg-result "Using tclsh: $with_tclsh" + if {$cfg ne ""} { + define HAVE_TCL 1 + } else { + proj-warn "Found tclsh but no tclConfig.sh." + } + } + show-notices + # If TCL is not found: if it was explicitly requested then fail + # fatally, else just emit a warning. If we can find the APIs needed + # to generate a working JimTCL then that will suffice for build-time + # TCL purposes (see: proc sqlite-determine-codegen-tcl). + if {![get-define HAVE_TCL] && + ([proj-opt-was-provided tcl] || [proj-opt-was-provided with-tcl])} { + proj-fatal "TCL support was requested but no tclConfig.sh could be found." + } + if {"" eq $cfg} { + proj-assert {0 == [get-define HAVE_TCL]} + proj-indented-notice { + WARNING: Cannot find a usable tclConfig.sh file. Use + --with-tcl=DIR to specify a directory where tclConfig.sh can be + found. SQLite does not use TCL internally, but some optional + components require TCL, including tests and sqlite3_analyzer. + } + } +}; # sqlite-check-tcl + +######################################################################## +# sqlite-determine-codegen-tcl checks which TCL to use as a code +# generator. By default, prefer jimsh simply because we have it +# in-tree (it's part of autosetup) unless --with-tclsh=X is used, in +# which case prefer X. +# +# Returns the human-readable name of the TCL it selects. Fails fatally +# if it cannot detect a TCL appropriate for code generation. +# +# Defines: +# +# - BTCLSH = the TCL shell used for code generation. It may set this +# to an unexpanded makefile var name. +# +# - CFLAGS_JIMSH = any flags needed for buildng a BTCLSH-compatible +# jimsh. The defaults may be passed on to configure as +# CFLAGS_JIMSH=... +proc sqlite-determine-codegen-tcl {} { + msg-result "Checking for TCL to use for code generation... " + define CFLAGS_JIMSH [proj-get-env CFLAGS_JIMSH {-O1}] + set cgtcl [opt-val with-tclsh jimsh] + if {"jimsh" ne $cgtcl} { + # When --with-tclsh=X is used, use that for all TCL purposes, + # including in-tree code generation, per developer request. + define BTCLSH "\$(TCLSH_CMD)" + return $cgtcl + } + set flagsToRestore {CC CFLAGS AS_CFLAGS CPPFLAGS AS_CPPFLAGS LDFLAGS LINKFLAGS LIBS CROSS} + define-push $flagsToRestore { + # We have to swap CC to CC_FOR_BUILD for purposes of the various + # [cc-...] tests below. Recall that --with-wasi-sdk may have + # swapped out CC with one which is not appropriate for this block. + # Per consulation with autosetup's creator, doing this properly + # requires us to [define-push] the whole $flagsToRestore list + # (plus a few others which are not relevant in this tree). + # + # These will get set to their previous values at the end of this + # block. + foreach flag $flagsToRestore {define $flag ""} + define CC [get-define CC_FOR_BUILD] + # These headers are technically optional for JimTCL but necessary if + # we want to use it for code generation: + set sysh [cc-check-includes dirent.h sys/time.h] + # jimsh0.c hard-codes #define's for HAVE_DIRENT_H and + # HAVE_SYS_TIME_H on the platforms it supports, so we do not + # need to add -D... flags for those. We check for them here only + # so that we can avoid the situation that we later, at + # make-time, try to compile jimsh but it then fails due to + # missing headers (i.e. fail earlier rather than later). + if {$sysh && [cc-check-functions realpath]} { + define-append CFLAGS_JIMSH -DHAVE_REALPATH + define BTCLSH "\$(JIMSH)" + set ::sqliteConfig(use-jim-for-codegen) 1 + } elseif {$sysh && [cc-check-functions _fullpath]} { + # _fullpath() is a Windows API. It's not entirely clear + # whether we need to add {-DHAVE_SYS_TIME_H -DHAVE_DIRENT_H} + # to CFLAGS_JIMSH in this case. On MinGW32 we definitely do + # not want to because it already hard-codes them. On _MSC_VER + # builds it does not. + define-append CFLAGS_JIMSH -DHAVE__FULLPATH + define BTCLSH "\$(JIMSH)" + set ::sqliteConfig(use-jim-for-codegen) 1 + } elseif {[file-isexec [get-define TCLSH_CMD]]} { + set cgtcl [get-define TCLSH_CMD] + define BTCLSH "\$(TCLSH_CMD)" + } else { + # One last-ditch effort to find TCLSH_CMD: use info from + # tclConfig.sh to try to find a tclsh + if {"" eq [get-define TCLSH_CMD]} { + set tpre [get-define TCL_EXEC_PREFIX] + if {"" ne $tpre} { + set tv [get-define TCL_VERSION] + if {[file-isexec "${tpre}/bin/tclsh${tv}"]} { + define TCLSH_CMD "${tpre}/bin/tclsh${tv}" + } elseif {[file-isexec "${tpre}/bin/tclsh"]} { + define TCLSH_CMD "${tpre}/bin/tclsh" + } + } + } + set cgtcl [get-define TCLSH_CMD] + if {![file-isexec $cgtcl]} { + proj-fatal "Cannot find a tclsh to use for code generation." + } + define BTCLSH "\$(TCLSH_CMD)" + } + }; # CC swap-out + return $cgtcl +}; # sqlite-determine-codegen-tcl + +######################################################################## +# Runs sqlite-check-tcl and sqlite-determine-codegen-tcl. +proc sqlite-handle-tcl {} { + sqlite-check-tcl + msg-result "TCL for code generation: [sqlite-determine-codegen-tcl]" +} + +######################################################################## +# If the --dump-defines configure flag is provided then emit a list of +# all [define] values to config.defines.txt, else do nothing. +proc sqlite-dump-defines {} { + proj-if-opt-truthy dump-defines { + make-config-header $::sqliteConfig(dump-defines-txt) \ + -bare {SQLITE_OS* SQLITE_DEBUG USE_*} \ + -str {BIN_* CC LD AR LDFLAG* OPT_*} \ + -auto {*} + # achtung: ^^^^ whichever SQLITE_OS_foo flag which is set to 0 will + # get _undefined_ here unless it's part of the -bare set. + if {"" ne $::sqliteConfig(dump-defines-json)} { + msg-result "--dump-defines is creating $::sqliteConfig(dump-defines-json)" + ######################################################################## + # Dump config-defines.json... + # Demonstrate (mis?)handling of spaces in JSON-export array values: + # define-append OPT_FOO.list {"-DFOO=bar baz" -DBAR="baz barre"} + define OPT_FEATURE_FLAGS.list [get-define OPT_FEATURE_FLAGS] + define OPT_SHELL.list [get-define OPT_SHELL] + set dumpDefsOpt { + -bare {SIZEOF_* HAVE_DECL_*} + -none {HAVE_CFLAG_* LDFLAGS_* SH_* SQLITE_AUTORECONFIG TARGET_* USE_GCOV TCL_*} + -array {*.list} + -auto {OPT_* PACKAGE_* HAVE_*} + } + if {[opt-bool defines-json-include-lowercase]} { + lappend dumpDefsOpt -none {lib_*} ; # remnants from proj-check-function-in-lib and friends + lappend dumpDefsOpt -auto {[a-z]*} + } + lappend dumpDefsOpt -none * + proj-dump-defs-json $::sqliteConfig(dump-defines-json) {*}$dumpDefsOpt + undefine OPT_FEATURE_FLAGS.list + undefine OPT_SHELL.list + } + } +} diff --git a/manifest b/manifest index 02e383c8f0..2bd5902120 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\sinternal\srefactoring\sof\sauto.def\sto\ssupport\sthe\spending\sautoconf\ssubdir\sport\sto\sautosetup.\sNo\sfunctional\schanges. -D 2025-01-19T16:26:25.254 +C Further\srefactoring\sof\sauto.def\sto\ssimplify\screation\sof\svariant\sbuilds\slike\sthe\sautoconf\sbundle. +D 2025-01-19T18:32:45.973 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -14,7 +14,7 @@ F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90 F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2 F art/sqlite370.svg 40b7e2fe8aac3add5d56dd86ab8d427a4eca5bcb3fe4f8946cb3794e1821d531 -F auto.def 8b7e3bdf0a9f3caccddb13175f6a2c3fdb1740220bbfe0bb8dae460a4f84d85a +F auto.def 056352c70a74a82929bdb5aaef65b38d44e4b912a8c7ebcb0a7d87fa1fd7c185 F autoconf/INSTALL 83e4a25da9fd053c7b3665eaaaf7919707915903 F autoconf/Makefile.am adedc1324b6a87fdd1265ddd336d2fb7d4f36a0e77b86ea553ae7cc4ea239347 F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac @@ -50,8 +50,8 @@ F autosetup/cc-shared.tcl 4f024e94a47f427ba61de1739f6381ef0080210f9fae89112d5c1d F autosetup/cc.tcl c0fcc50ca91deff8741e449ddad05bcd08268bc31177e613a6343bbd1fd3e45f F autosetup/jimsh0.c d40e381ea4526a067590e7b91bd4b2efa6d4980d286f908054c647b3df4aee14 F autosetup/pkg-config.tcl 4e635bf39022ff65e0d5434339dd41503ea48fc53822c9c5bde88b02d3d952ba -F autosetup/proj.tcl 2e817159b997077cb79bd871f6255276b787558f386dfc0830b0f825f6a53767 -F autosetup/sqlite-config.tcl e52fa291ef148712a9392203b05e86743b474065ea88bdc65cdb664dbb188783 +F autosetup/proj.tcl 50b060ea6760b02ef5cb16650fbe9c1840e16351a0be0ccfc3727c565f74a257 +F autosetup/sqlite-config.tcl 4b1b8288415e26743a66a73a154303f67b8a1ae1aed478868843945cd5a58a29 F autosetup/system.tcl 51d4be76cd9a9074704b584e5c9cbba616202c8468cf9ba8a4f8294a7ab1dba9 F configure 9a00b21dfd13757bbfb8d89b30660a89ec1f8f3a79402b8f9f9b6fc475c3303a x F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 2f1e94994f3595baad4045ab05ffee0668059c23ab37a39c25b83c62bfbaea28 -R 9c60fa033887f9029838d451908d0067 +P 01ff37584708f3f79c62c1b5ed8cceab721cf8348a69a65f0559b1ef8845e85b +R 8c31a36a753a4b17d602415d7f01de06 U stephan -Z ec3ab526fc22a680c0602f434f403d4d +Z 2c8a02028d4af4395c0183d2b9aa5b8f # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 684943058c..8ccb68a4f6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -01ff37584708f3f79c62c1b5ed8cceab721cf8348a69a65f0559b1ef8845e85b +f806c563a29240c709508316846fbe0cb3ed61b68a6c1d9544eb699e30141d8d From 2534bf40117b7ad810a2f84a41910f28a842c377 Mon Sep 17 00:00:00 2001 From: stephan Date: Sun, 19 Jan 2025 18:58:09 +0000 Subject: [PATCH 083/220] Initial work towards converting the autoconf bundle to autosetup. Currently non-functional. FossilOrigin-Name: d7708372ff2fef4bfa61e56dbfbb363cac7685587a61a151497991d9a08bb07f --- autoconf/auto.def | 84 +++++++++++++++++++++++++++++++++++++ autosetup/sqlite-config.tcl | 5 +++ manifest | 18 ++++---- manifest.uuid | 2 +- tool/mkautoconfamal.sh | 34 ++++++++------- 5 files changed, 120 insertions(+), 23 deletions(-) create mode 100644 autoconf/auto.def diff --git a/autoconf/auto.def b/autoconf/auto.def new file mode 100644 index 0000000000..6aba4216fb --- /dev/null +++ b/autoconf/auto.def @@ -0,0 +1,84 @@ +#/do/not/tclsh +# ^^^ help out editors which guess this file's content type. +# +# This is the main autosetup-compatible configure script for the +# TEA build of the SQLite project. +# +# This script should be kept compatible with JimTCL, a copy of which +# is included in this source tree as ./autosetup/jimsh0.c. +# +use sqlite-config + +options { + # + static=1 => {Disable build of static library (mostly)} + # + # + threadsafe=1 => {Disable mutexing} + with-tempstore:=no => {Use an in-RAM database for temporary tables: never,no,yes,always} + load-extension=1 => {Disable loading of external extensions} + math=1 => {Disable math functions} + json=1 => {Disable JSON functions} + memsys5 => {Enable MEMSYS5} + memsys3 => {Enable MEMSYS3} + fts3 => {Enable the FTS3 extension} + fts4 => {Enable the FTS4 extension} + fts5 => {Enable the FTS5 extension} + update-limit => {Enable the UPDATE/DELETE LIMIT clause} + geopoly => {Enable the GEOPOLY extension} + rtree => {Enable the RTREE extension} + session => {Enable the SESSION extension} + all => {Enable FTS4, FTS5, Geopoly, RTree, Sessions} + # + # + readline=1 => {Disable readline support} + # --with-readline-lib is a backwards-compatible alias for + # --with-readline-ldflags + with-readline-lib: + with-readline-ldflags:=auto + => {Readline LDFLAGS, e.g. -lreadline -lncurses} + # --with-readline-inc is a backwards-compatible alias for + # --with-readline-cflags. + with-readline-inc: + with-readline-cflags:=auto + => {Readline CFLAGS, e.g. -I/path/to/includes} + with-readline-header:PATH + => {Full path to readline.h, from which --with-readline-cflags will be derived} + with-linenoise:DIR => {Source directory for linenoise.c and linenoise.h} + editline=0 => {Enable BSD editline support} + # + # + with-icu-ldflags:LDFLAGS + => {Enable SQLITE_ENABLE_ICU and add the given linker flags for the ICU libraries} + with-icu-cflags:CFLAGS + => {Apply extra CFLAGS/CPPFLAGS necessary for building with ICU. e.g. -I/usr/local/include} + with-icu-config:=auto => {Enable SQLITE_ENABLE_ICU. Value must be one of: auto, pkg-config, /path/to/icu-config} + icu-collations=0 => {Enable SQLITE_ENABLE_ICU_COLLATIONS. Requires --with-icu-ldflags=... or --with-icu-config} + # + # + # Note that using the --debug/--enable-debug flag here requires patching + # autosetup/autosetup to rename the --debug to --autosetup-debug. + with-debug=0 + debug=0 => + {Enable debug build flags. This option will impact performance by + as much as 4x, as it includes large numbers of assert()s in + performance-critical loops. Never use --debug for production + builds.} + # +} + +sqlite-post-options-init +sqlite-check-common-bins +sqlite-check-common-system-deps +proj-check-rpath +sqlite-handle-debug +sqlite-handle-threadsafe +sqlite-handle-tempstore +sqlite-handle-line-editing +sqlite-handle-load-extension +sqlite-handle-math +sqlite-handle-icu +sqlite-handle-common-feature-flags +sqlite-show-feature-flags +sqlite-process-dot-in-files +sqlite-post-config-validation diff --git a/autosetup/sqlite-config.tcl b/autosetup/sqlite-config.tcl index 08bd0467e5..c1fc7b00b0 100644 --- a/autosetup/sqlite-config.tcl +++ b/autosetup/sqlite-config.tcl @@ -240,6 +240,11 @@ proc sqlite-handle-common-feature-flags {} { } scanstatus -DSQLITE_ENABLE_STMT_SCANSTATUS {} } { + if {$boolFlag ni $::autosetup(options)} { + # Skip flags which are in the canonical build but not + # the autoconf bundle. + continue + } proj-if-opt-truthy $boolFlag { sqlite-add-feature-flag $featureFlag if {0 != [eval $ifSetEvalThis] && "all" ne $boolFlag} { diff --git a/manifest b/manifest index 2bd5902120..0cd90b08c5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Further\srefactoring\sof\sauto.def\sto\ssimplify\screation\sof\svariant\sbuilds\slike\sthe\sautoconf\sbundle. -D 2025-01-19T18:32:45.973 +C Initial\swork\stowards\sconverting\sthe\sautoconf\sbundle\sto\sautosetup.\sCurrently\snon-functional. +D 2025-01-19T18:58:09.462 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -21,6 +21,7 @@ F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a F autoconf/Makefile.msc ffff61fe851443015ddb6600ab69a9df503cfec25459b336be7ba8c9a9e473f8 F autoconf/README.first 6c4f34fe115ff55d4e8dbfa3cecf04a0188292f7 F autoconf/README.txt 5e946ffb6fbdbb114c81e1bdc862df27fce8beab557d7b0421820b0fe8fc048f +F autoconf/auto.def 28003a20207d21aecb879a74778ca5d6b5c15e84efffbc8f90c3791b8d1d2248 F autoconf/configure.ac ec7fa914c5e74ff212fe879f9bb6918e1234497e05facfb641f30c4d5893b277 F autoconf/tea/Makefile.in ba0556fee8da09c066bad85a4457904e46ee2c2eabaa309c0e83a78f2f151a8e F autoconf/tea/README.txt 61e62e519579e4a112791354d6d440f8b51ea6db3b0bab58d59f29df42d2dfe3 @@ -51,7 +52,7 @@ F autosetup/cc.tcl c0fcc50ca91deff8741e449ddad05bcd08268bc31177e613a6343bbd1fd3e F autosetup/jimsh0.c d40e381ea4526a067590e7b91bd4b2efa6d4980d286f908054c647b3df4aee14 F autosetup/pkg-config.tcl 4e635bf39022ff65e0d5434339dd41503ea48fc53822c9c5bde88b02d3d952ba F autosetup/proj.tcl 50b060ea6760b02ef5cb16650fbe9c1840e16351a0be0ccfc3727c565f74a257 -F autosetup/sqlite-config.tcl 4b1b8288415e26743a66a73a154303f67b8a1ae1aed478868843945cd5a58a29 +F autosetup/sqlite-config.tcl 10cab051ed3de04d5c842703d27881a7cdb6772448339e3d3689140026d1c442 F autosetup/system.tcl 51d4be76cd9a9074704b584e5c9cbba616202c8468cf9ba8a4f8294a7ab1dba9 F configure 9a00b21dfd13757bbfb8d89b30660a89ec1f8f3a79402b8f9f9b6fc475c3303a x F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad @@ -2143,7 +2144,7 @@ F tool/logest.c c34e5944318415de513d29a6098df247a9618c96d83c38d4abd88641fe46e669 F tool/max-limits.c cbb635fbb37ae4d05f240bfb5b5270bb63c54439 F tool/merge-test.tcl de76b62f2de2a92d4c1ca4f976bce0aea6899e0229e250479b229b2a1914b176 F tool/mkamalzip.tcl 8aa5ebe7973c8b8774062d34e15fea9815c4cc2ceea3a9b184695f005910876a -F tool/mkautoconfamal.sh 4fbfd523330c8cf12ead8f0e0acdb3c5c9c08a1bcb293119267aeaa3e0bbe3e1 +F tool/mkautoconfamal.sh 7a9b54df5f3fbcbef9ff7f4d7bffb1b074425db23f999e1b27bd0b544fe7f2ff F tool/mkccode.tcl 210159febe0ef0ecbc53c79833500663ceaba0115b2b374405818dc835b5f84b x F tool/mkctimec.tcl ef6a67ec82e5b6fc19152a4c79f237227b18bf67ff16d155bac7adb94355d9cf x F tool/mkkeywordhash.c 6b0be901c47f9ad42215fc995eb2f4384ac49213b1fba395102ec3e999acf559 @@ -2208,8 +2209,11 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 01ff37584708f3f79c62c1b5ed8cceab721cf8348a69a65f0559b1ef8845e85b -R 8c31a36a753a4b17d602415d7f01de06 +P f806c563a29240c709508316846fbe0cb3ed61b68a6c1d9544eb699e30141d8d +R 37212f5b411c8b75c25b4343cda71606 +T *branch * autoconf-to-autosetup +T *sym-autoconf-to-autosetup * +T -sym-trunk * Cancelled\sby\sbranch. U stephan -Z 2c8a02028d4af4395c0183d2b9aa5b8f +Z f100e7f94531c215a65ef7fb114eddd4 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 8ccb68a4f6..8245556619 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f806c563a29240c709508316846fbe0cb3ed61b68a6c1d9544eb699e30141d8d +d7708372ff2fef4bfa61e56dbfbb363cac7685587a61a151497991d9a08bb07f diff --git a/tool/mkautoconfamal.sh b/tool/mkautoconfamal.sh index f3ce9dd5ba..3b46fc4de8 100644 --- a/tool/mkautoconfamal.sh +++ b/tool/mkautoconfamal.sh @@ -13,7 +13,7 @@ # -# Bail out of the script if any command returns a non-zero exit +# Bail out of the script if any command returns a non-zero exit # status. Or if the script tries to use an unset variable. These # may fail for old /bin/sh interpreters. # @@ -34,12 +34,12 @@ else echo "TEA version number mismatch. Should be $VERSION"; exit 1 fi # If this script is given an argument of --snapshot, then generate a -# snapshot tarball named for the current checkout SHA1 hash, rather than +# snapshot tarball named for the current checkout SHA hash, rather than # the version number. # if test "$#" -ge 1 -a x$1 != x--snapshot then - # Set global variable $ARTIFACT to the "3xxyyzz" string incorporated + # Set global variable $ARTIFACT to the "3xxyyzz" string incorporated # into artifact filenames. And $VERSION2 to the "3.x.y[.z]" form. xx=`echo $VERSION|sed 's/3\.\([0-9]*\)\..*/\1/'` yy=`echo $VERSION|sed 's/3\.[^.]*\.\([0-9]*\).*/\1/'` @@ -54,6 +54,8 @@ fi rm -rf $TMPSPACE cp -R $TOP/autoconf $TMPSPACE +cp -R $TOP/autosetup $TMPSPACE +cp -p $TOP/configure $TMPSPACE cp sqlite3.c $TMPSPACE cp sqlite3.h $TMPSPACE cp sqlite3ext.h $TMPSPACE @@ -63,38 +65,39 @@ cp $TOP/sqlite3.pc.in $TMPSPACE cp shell.c $TMPSPACE cp $TOP/src/sqlite3.rc $TMPSPACE cp $TOP/tool/Replace.cs $TMPSPACE - -cat $TMPSPACE/configure.ac | -sed "s/--SQLITE-VERSION--/$VERSION/" > $TMPSPACE/tmp -mv $TMPSPACE/tmp $TMPSPACE/configure.ac - -cat $TMPSPACE/sqlite3.pc.in | -sed "s/^Libs.private:.*/Libs.private: @LIBS@/" > $TMPSPACE/tmp -mv $TMPSPACE/tmp $TMPSPACE/sqlite3.pc.in +cp $TOP/VERSION $TMPSPACE +cp $TOP/main.mk $TMPSPACE cd $TMPSPACE -autoreconf -i +#autoreconf -i #libtoolize #aclocal #autoconf #automake --add-missing +# This bit is only for use during porting of the +# autoconf bundle to autosetup. +if true; then + find . -name '*~' -exec rm \{} \; +fi + mkdir -p tea/generic -echo "#ifdef USE_SYSTEM_SQLITE" > tea/generic/tclsqlite3.c +echo "#ifdef USE_SYSTEM_SQLITE" > tea/generic/tclsqlite3.c echo "# include " >> tea/generic/tclsqlite3.c echo "#else" >> tea/generic/tclsqlite3.c echo "#include \"sqlite3.c\"" >> tea/generic/tclsqlite3.c echo "#endif" >> tea/generic/tclsqlite3.c cat $TOP/src/tclsqlite.c >> tea/generic/tclsqlite3.c -cat tea/configure.ac | - sed "s/AC_INIT(\[sqlite\], .*)/AC_INIT([sqlite], [$VERSION])/" > tmp +sed "s/AC_INIT(\[sqlite\], .*)/AC_INIT([sqlite], [$VERSION])/" tea/configure.ac > tmp mv tmp tea/configure.ac cd tea autoconf rm -rf autom4te.cache +echo "--------------- TODO: -----------------" +cat < Date: Sun, 19 Jan 2025 19:14:21 +0000 Subject: [PATCH 084/220] Add an SQLITE_TESTCTRL_OPTIMIZATION mask that can disable the query planner heuristics that are designed to help with star queries. FossilOrigin-Name: fec4ff185a2f3f1bee8f27432206276636cf27365d2d41cd7282f8c0425f2e96 --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/shell.c.in | 1 + src/sqliteInt.h | 1 + src/where.c | 10 +++++++--- 5 files changed, 19 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 2bd5902120..c926f45fe9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Further\srefactoring\sof\sauto.def\sto\ssimplify\screation\sof\svariant\sbuilds\slike\sthe\sautoconf\sbundle. -D 2025-01-19T18:32:45.973 +C Add\san\sSQLITE_TESTCTRL_OPTIMIZATION\smask\sthat\scan\sdisable\sthe\squery\splanner\nheuristics\sthat\sare\sdesigned\sto\shelp\swith\sstar\squeries. +D 2025-01-19T19:14:21.044 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -780,11 +780,11 @@ F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c F src/resolve.c c8a5372b97b2a2e972a280676f06ddb5b74e885d3b1f5ce383f839907b57ef68 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 F src/select.c 83e88fbb36f89b6703b348777491619554f0fd6f917c9fdf51e4c2e9cda6c04e -F src/shell.c.in beb370609906092a6810fcd9ea76737be2c91694445061c2eb05c4c0a3753de4 +F src/shell.c.in 9ade75afa953c5c2ded38d076533eaa6c9b2ab1977ef6cce0bc773adac178c50 F src/sqlite.h.in 6afbcaae44140216704a6c82e4c4ea4118c46d5f6573d6c5fa4fc901ed9d369e F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54 -F src/sqliteInt.h 3f20dfb5ae54e787b2643edc0b5bae0cecddfb89988e28afdc3c0b05892e25cc +F src/sqliteInt.h 953f2476f712b115ecb43f7a21183d07c88af8d3b4c32f18317724ce1ce04d56 F src/sqliteLimit.h 1bbdbf72bd0411d003267ffebc59a262f061df5653027a75627d03f48ca30523 F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -863,7 +863,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 4e6181d8780ab0af2e1388d0754cbe6f2f04593d2b1ab6c41699a89942fd8997 F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 -F src/where.c 521472bb0c7cfdd65a9b5b92d44f921e3e0a26a1996cc0416cf53e25301820d2 +F src/where.c 5e74d76b264abcd7e6682e02853756b5d32f543c59fb47bb55a02575b73693ae F src/whereInt.h 2b0804f300c7f65de4046a1d81c65f01b208d6c08950ccd1fa6b8c16162a8af7 F src/wherecode.c 0c3d3199a2b769a5e2bb70feb5003dc85b3d86842ecaf903a47f2b4205ca5dab F src/whereexpr.c 0f93a29cabd3a338d09a1f5c6770620a1ac51ec1157f3229502a7e7767c60b6f @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 01ff37584708f3f79c62c1b5ed8cceab721cf8348a69a65f0559b1ef8845e85b -R 8c31a36a753a4b17d602415d7f01de06 -U stephan -Z 2c8a02028d4af4395c0183d2b9aa5b8f +P f806c563a29240c709508316846fbe0cb3ed61b68a6c1d9544eb699e30141d8d +R a016f5b06b30e7627e9627eb42538187 +U drh +Z 386d6c5415cb5b1ed55b033eb5e08a17 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 8ccb68a4f6..72562901a8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f806c563a29240c709508316846fbe0cb3ed61b68a6c1d9544eb699e30141d8d +fec4ff185a2f3f1bee8f27432206276636cf27365d2d41cd7282f8c0425f2e96 diff --git a/src/shell.c.in b/src/shell.c.in index 17054a961c..d7a0bf55b3 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -11475,6 +11475,7 @@ static int do_meta_command(char *zLine, ShellState *p){ { 0x04000000, 1, "NullUnusedCols" }, { 0x08000000, 1, "OnePass" }, { 0x10000000, 1, "OrderBySubq" }, + { 0x20000000, 1, "StarQuery" }, { 0xffffffff, 0, "All" }, }; unsigned int curOpt; diff --git a/src/sqliteInt.h b/src/sqliteInt.h index b8c9136a59..3045d7c4a5 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1889,6 +1889,7 @@ struct sqlite3 { #define SQLITE_NullUnusedCols 0x04000000 /* NULL unused columns in subqueries */ #define SQLITE_OnePass 0x08000000 /* Single-pass DELETE and UPDATE */ #define SQLITE_OrderBySubq 0x10000000 /* ORDER BY in subquery helps outer */ +#define SQLITE_StarQuery 0x20000000 /* Heurists for star queries */ #define SQLITE_AllOpts 0xffffffff /* All optimizations */ /* diff --git a/src/where.c b/src/where.c index b867e615f7..0b8e5aceaa 100644 --- a/src/where.c +++ b/src/where.c @@ -5459,7 +5459,10 @@ static LogEst whereSortingCost( */ static int computeMxChoice(WhereInfo *pWInfo, LogEst nRowEst){ int nLoop = pWInfo->nLevel; /* Number of terms in the join */ - if( nRowEst==0 && nLoop>=5 ){ + if( nRowEst==0 + && nLoop>=5 + && OptimizationEnabled(pWInfo->pParse->db, SQLITE_StarQuery) + ){ /* Check to see if we are dealing with a star schema and if so, reduce ** the cost of fact tables relative to dimension tables, as a heuristic ** to help keep the fact tables in outer loops. @@ -5487,8 +5490,9 @@ static int computeMxChoice(WhereInfo *pWInfo, LogEst nRowEst){ #ifdef WHERETRACE_ENABLED /* 0x4 */ if( sqlite3WhereTrace&0x4 ){ SrcItem *pItem = pWInfo->pTabList->a + iLoop; - sqlite3DebugPrintf("Fact-table %s: %d dimensions, cost reduced %d\n", - pItem->zAlias ? pItem->zAlias : pItem->pSTab->zName, + sqlite3DebugPrintf( + "Fact-table %s(%d): %d dimensions, cost reduced %d\n", + pItem->zAlias ? pItem->zAlias : pItem->pSTab->zName, iLoop, nDep, rDelta); } #endif From 17dca772e0a87571b40178b8ab0f25d0609732bf Mon Sep 17 00:00:00 2001 From: stephan Date: Sun, 19 Jan 2025 19:51:47 +0000 Subject: [PATCH 085/220] Get the CLI shell building in the autoconf bundle. FossilOrigin-Name: 241cdbc40a2f82df53c149849a103a335b0643a65e229a1e80ab90a0e457bb6b --- Makefile.in | 3 - auto.def | 16 ---- autoconf/Makefile.am | 20 ----- autoconf/Makefile.in | 141 ++++++++++++++++++++++++++++++++++++ autosetup/sqlite-config.tcl | 22 +++++- manifest | 21 +++--- manifest.uuid | 2 +- 7 files changed, 171 insertions(+), 54 deletions(-) delete mode 100644 autoconf/Makefile.am create mode 100644 autoconf/Makefile.in diff --git a/Makefile.in b/Makefile.in index 5fff3d2fc5..15e61217f2 100644 --- a/Makefile.in +++ b/Makefile.in @@ -323,9 +323,6 @@ distclean-autosetup: clean rm -f $(TOP)/tool/emcc.sh rm -f libsqlite3*$(T.dll) rm -f jimsh0* -# -if [ -f ext/wasm/GNUmakefile ]; then \ -# gmake --no-print-directory --ignore-errors -C ext/wasm distclean; \ -# fi >/dev/null 2>&1; true distclean: distclean-autosetup # diff --git a/auto.def b/auto.def index 4e646e6f2b..7fdf61f16c 100644 --- a/auto.def +++ b/auto.def @@ -210,22 +210,6 @@ options [subst -nobackslashes -nocommands $flags] unset flags sqlite-post-options-init -if {1} { - # TODO: move this into autosetup/sqlite-config.tcl once we get the - # version info into autoconf/auto.def. - set srcdir $::autosetup(srcdir) - set PACKAGE_VERSION [proj-file-content -trim $srcdir/VERSION] - define PACKAGE_NAME "sqlite" - define PACKAGE_URL {https://sqlite.org} - define PACKAGE_VERSION $PACKAGE_VERSION - define PACKAGE_STRING "[get-define PACKAGE_NAME] $PACKAGE_VERSION" - define PACKAGE_BUGREPORT [get-define PACKAGE_URL]/forum - msg-result "Source dir = $srcdir" - msg-result "Build dir = $::autosetup(builddir)" - msg-result "Configuring SQLite version $PACKAGE_VERSION" - unset srcdir -} - sqlite-setup-default-cflags proj-if-opt-truthy dev { # --enable-dev needs to come early so that the downstream tests diff --git a/autoconf/Makefile.am b/autoconf/Makefile.am deleted file mode 100644 index 1eaa560ff8..0000000000 --- a/autoconf/Makefile.am +++ /dev/null @@ -1,20 +0,0 @@ - -AM_CFLAGS = @BUILD_CFLAGS@ -lib_LTLIBRARIES = libsqlite3.la -libsqlite3_la_SOURCES = sqlite3.c -libsqlite3_la_LDFLAGS = -no-undefined -version-info 8:6:8 - -bin_PROGRAMS = sqlite3 -sqlite3_SOURCES = shell.c sqlite3.h -EXTRA_sqlite3_SOURCES = sqlite3.c -sqlite3_LDADD = @EXTRA_SHELL_OBJ@ @READLINE_LIBS@ -sqlite3_DEPENDENCIES = @EXTRA_SHELL_OBJ@ -sqlite3_CFLAGS = $(AM_CFLAGS) -DSQLITE_ENABLE_EXPLAIN_COMMENTS -DSQLITE_DQS=0 -DSQLITE_ENABLE_DBPAGE_VTAB -DSQLITE_ENABLE_STMTVTAB -DSQLITE_ENABLE_DBSTAT_VTAB $(SHELL_CFLAGS) - -include_HEADERS = sqlite3.h sqlite3ext.h - -EXTRA_DIST = sqlite3.1 tea Makefile.msc sqlite3.rc sqlite3rc.h README.txt Replace.cs Makefile.fallback -pkgconfigdir = ${libdir}/pkgconfig -pkgconfig_DATA = sqlite3.pc - -man_MANS = sqlite3.1 diff --git a/autoconf/Makefile.in b/autoconf/Makefile.in new file mode 100644 index 0000000000..df97c180a6 --- /dev/null +++ b/autoconf/Makefile.in @@ -0,0 +1,141 @@ +all: + +TOP = @abs_top_srcdir@ + +# +# Filename extensions for binaries and libraries +# +B.exe = @BUILD_EXEEXT@ +T.exe = @TARGET_EXEEXT@ +B.dll = @BUILD_DLLEXT@ +T.dll = @TARGET_DLLEXT@ +B.lib = @BUILD_LIBEXT@ +T.lib = @TARGET_LIBEXT@ + +# +# Autotools-compatibility dirs +# +prefix = @prefix@ +datadir = @datadir@ +mandir = @mandir@ +includedir = @includedir@ +exec_prefix = @exec_prefix@ +bindir = @bindir@ +libdir = @libdir@ + +# +# Required binaries +# +INSTALL = @BIN_INSTALL@ +AR = @AR@ +AR.flags = cr +CC = @CC@ + +CFLAGS = @CFLAGS@ @CPPFLAGS@ +# +# $(LDFLAGS.configure) represents any LDFLAGS=... the client passes to +# configure. See main.mk. +# +LDFLAGS.configure = @LDFLAGS@ + +CFLAGS.core = @SH_CFLAGS@ +LDFLAGS.shlib = @SH_LDFLAGS@ +LDFLAGS.zlib = @LDFLAGS_ZLIB@ +LDFLAGS.math = @LDFLAGS_MATH@ +LDFLAGS.rpath = @LDFLAGS_RPATH@ +LDFLAGS.pthread = @LDFLAGS_PTHREAD@ +LDFLAGS.dlopen = @LDFLAGS_DLOPEN@ +LDFLAGS.readline = @LDFLAGS_READLINE@ +CFLAGS.readline = @CFLAGS_READLINE@ +LDFLAGS.icu = @LDFLAGS_ICU@ +CFLAGS.icu = @CFLAGS_ICU@ +LDFLAGS.libsqlite3.soname = @LDFLAGS_LIBSQLITE3_SONAME@ + +# When cross-compiling, we need to avoid the -s flag because it only +# works on the build host's platform. +INSTALL.strip.1 = $(INSTALL) +INSTALL.strip.0 = $(INSTALL) -s +INSTALL.strip. = $(INSTALL.strip.0) +INSTALL.strip = $(INSTALL.strip.@IS_CROSS_COMPILING@) + +install-dir.bin = $(DESTDIR)$(bindir) +install-dir.lib = $(DESTDIR)$(libdir) +install-dir.include = $(DESTDIR)$(includedir) +install-dir.pkgconfig = $(DESTDIR)$(libdir)/pkgconfig +install-dir.man1 = $(DESTDIR)$(mandir)/man1 +install-dir.all = $(install-dir.bin) $(install-dir.include) \ + $(install-dir.lib) $(install-dir.man1) \ + $(install-dir.pkgconfig) +$(install-dir.all): + $(INSTALL) -d "$@" + + +# +# Vars with the AS_ prefix are specifically related to AutoSetup. +# +# AS_AUTO_DEF is the main configure script. +# +AS_AUTO_DEF = $(TOP)/auto.def + +# +# Shell commands to re-run $(TOP)/configure with the same args it was +# invoked with to produce this makefile. +# +AS_AUTORECONFIG = @SQLITE_AUTORECONFIG@ +Makefile: $(TOP)/Makefile.in $(AS_AUTO_DEF) + $(AS_AUTORECONFIG) + @touch $@ + +sqlite3.pc: $(TOP)/sqlite3.pc.in $(AS_AUTO_DEF) + $(AS_AUTORECONFIG) + @touch $@ + +sqlite_cfg.h: $(AS_AUTO_DEF) + $(AS_AUTORECONFIG) + @touch $@ + +# +# CFLAGS for sqlite3$(T.exe) +# +SHELL_OPT ?= @OPT_SHELL@ + +# +# Library-level feature flags +# +OPT_FEATURE_FLAGS = @OPT_FEATURE_FLAGS@ + +LDFLAGS.libsqlite3 = \ + $(LDFLAGS.rpath) $(LDFLAGS.pthread) \ + $(LDFLAGS.math) $(LDFLAGS.dlopen) \ + $(LDFLAGS.zlib) $(LDFLAGS.icu) \ + $(LDFLAGS.configure) + +sqlite3$(T.exe): shell.c sqlite3.c + $(CC) -o $@ \ + shell.c sqlite3.c \ + $(OPT_FEATURE_FLAGS) $(SHELL_OPT) \ + $(CFLAGS.readline) $(CFLAGS.icu) \ + $(LDFLAGS.libsqlite3) $(LDFLAGS.readline) +all: sqlite3$(T.exe) + +install-shell: sqlite3$(T.exe) $(install-dir.bin) + $(INSTALL.strip) sqlite3$(T.exe) "$(install-dir.bin)" +install: install-shell + +clean: + rm -f *.o sqlite3$(T.exe) + +distclean: clean + rm -f sqlite3.pc + +DIST_FILES := auto.def autosetup tea \ + sqlite3.h sqlite3.c shell.c sqlite3ext.h \ + sqlite3.1 \ + Makefile.msc sqlite3.rc sqlite3rc.h Replace.cs \ + README.txt Makefile.fallback + +dist: + @echo "Not Yet Implemented: $@" + +install: + @echo "Not Yet Implemented: $@" diff --git a/autosetup/sqlite-config.tcl b/autosetup/sqlite-config.tcl index c1fc7b00b0..5e2d121565 100644 --- a/autosetup/sqlite-config.tcl +++ b/autosetup/sqlite-config.tcl @@ -64,11 +64,29 @@ proc sqlite-post-options-init {} { define SQLITE_OS_UNIX 1 define SQLITE_OS_WIN 0 } - set ::sqliteConfig(msg-debug-enabled) [proj-val-truthy [get-env msg-debug 0]] - + sqlite-setup-package-info } +######################################################################## +# Called by [sqlite-post-options-init] to set up PACKAGE_NAME and +# related defines. +proc sqlite-setup-package-info {} { + set srcdir $::autosetup(srcdir) + set PACKAGE_VERSION [proj-file-content -trim $srcdir/VERSION] + define PACKAGE_NAME "sqlite" + define PACKAGE_URL {https://sqlite.org} + define PACKAGE_VERSION $PACKAGE_VERSION + define PACKAGE_STRING "[get-define PACKAGE_NAME] $PACKAGE_VERSION" + define PACKAGE_BUGREPORT [get-define PACKAGE_URL]/forum + msg-result "Source dir = $srcdir" + msg-result "Build dir = $::autosetup(builddir)" + msg-result "Configuring SQLite version $PACKAGE_VERSION" +} + +######################################################################## +# Internal config-time debugging output routine. It generates no +# output unless msg-debug=1 is passed to the configure script. proc msg-debug {msg} { if {$::sqliteConfig(msg-debug-enabled)} { puts stderr [proj-bold "** DEBUG: $msg"] diff --git a/manifest b/manifest index 0cd90b08c5..0058b0f5a7 100644 --- a/manifest +++ b/manifest @@ -1,9 +1,9 @@ -C Initial\swork\stowards\sconverting\sthe\sautoconf\sbundle\sto\sautosetup.\sCurrently\snon-functional. -D 2025-01-19T18:58:09.462 +C Get\sthe\sCLI\sshell\sbuilding\sin\sthe\sautoconf\sbundle. +D 2025-01-19T19:51:47.397 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d -F Makefile.in 572271a39d7ac1ae228ed911c63fdf374300a6a880ceb851b1f3d357e9a9534e +F Makefile.in 38485d15d9190cdad0d7bee25af7b442028865964025dcc61f40fd8d6e369cfc F Makefile.linux-generic bd3e3cacd369821a6241d4ea1967395c962dfe3057e38cb0a435cee0e8b789d0 F Makefile.msc 39785ec45f9ae0311e49094eff2ee079562246fed6be3b9f632a99d4df20056a F README.md c3c0f19532ce28f6297a71870f3c7b424729f0e6d9ab889616d3587dd2332159 @@ -14,10 +14,10 @@ F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90 F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2 F art/sqlite370.svg 40b7e2fe8aac3add5d56dd86ab8d427a4eca5bcb3fe4f8946cb3794e1821d531 -F auto.def 056352c70a74a82929bdb5aaef65b38d44e4b912a8c7ebcb0a7d87fa1fd7c185 +F auto.def 7833c0a8630dd3a3410dcc6c8b4d1b63f25d03d6497267624b8a37aba119cb3e F autoconf/INSTALL 83e4a25da9fd053c7b3665eaaaf7919707915903 -F autoconf/Makefile.am adedc1324b6a87fdd1265ddd336d2fb7d4f36a0e77b86ea553ae7cc4ea239347 F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac +F autoconf/Makefile.in 8ffa4fa39ae65758e72502b86286ea1472befec9eab7999cadb89d8e101d55c7 w autoconf/Makefile.am F autoconf/Makefile.msc ffff61fe851443015ddb6600ab69a9df503cfec25459b336be7ba8c9a9e473f8 F autoconf/README.first 6c4f34fe115ff55d4e8dbfa3cecf04a0188292f7 F autoconf/README.txt 5e946ffb6fbdbb114c81e1bdc862df27fce8beab557d7b0421820b0fe8fc048f @@ -52,7 +52,7 @@ F autosetup/cc.tcl c0fcc50ca91deff8741e449ddad05bcd08268bc31177e613a6343bbd1fd3e F autosetup/jimsh0.c d40e381ea4526a067590e7b91bd4b2efa6d4980d286f908054c647b3df4aee14 F autosetup/pkg-config.tcl 4e635bf39022ff65e0d5434339dd41503ea48fc53822c9c5bde88b02d3d952ba F autosetup/proj.tcl 50b060ea6760b02ef5cb16650fbe9c1840e16351a0be0ccfc3727c565f74a257 -F autosetup/sqlite-config.tcl 10cab051ed3de04d5c842703d27881a7cdb6772448339e3d3689140026d1c442 +F autosetup/sqlite-config.tcl 7a5cf6b40c5763c473c2638041ba8812f32062a78545aff223e0913fc4a7c57d F autosetup/system.tcl 51d4be76cd9a9074704b584e5c9cbba616202c8468cf9ba8a4f8294a7ab1dba9 F configure 9a00b21dfd13757bbfb8d89b30660a89ec1f8f3a79402b8f9f9b6fc475c3303a x F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad @@ -2209,11 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P f806c563a29240c709508316846fbe0cb3ed61b68a6c1d9544eb699e30141d8d -R 37212f5b411c8b75c25b4343cda71606 -T *branch * autoconf-to-autosetup -T *sym-autoconf-to-autosetup * -T -sym-trunk * Cancelled\sby\sbranch. +P d7708372ff2fef4bfa61e56dbfbb363cac7685587a61a151497991d9a08bb07f +R c183fd6972c40e51c2b2f070c9205cc8 U stephan -Z f100e7f94531c215a65ef7fb114eddd4 +Z d3c8e68d7f70bcdf216494cac16a3dcf # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 8245556619..b06bb9fa72 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d7708372ff2fef4bfa61e56dbfbb363cac7685587a61a151497991d9a08bb07f +241cdbc40a2f82df53c149849a103a335b0643a65e229a1e80ab90a0e457bb6b From 87cdd5926de0701f18d479efa4ffc54ea08c5dca Mon Sep 17 00:00:00 2001 From: stephan Date: Sun, 19 Jan 2025 21:47:06 +0000 Subject: [PATCH 086/220] Get libsqlite3.so and .a building in the autoconf bundle. FossilOrigin-Name: 88cee3fc7c8bfd9b6955fb6b2fd6b25660563e4d043ffa5ea18d8abe91afdb7f --- autoconf/Makefile.in | 38 ++++++++++++++++++++++++++++++++------ autoconf/auto.def | 11 +++++++++++ manifest | 14 +++++++------- manifest.uuid | 2 +- 4 files changed, 51 insertions(+), 14 deletions(-) diff --git a/autoconf/Makefile.in b/autoconf/Makefile.in index df97c180a6..18e8e9a740 100644 --- a/autoconf/Makefile.in +++ b/autoconf/Makefile.in @@ -55,8 +55,8 @@ LDFLAGS.libsqlite3.soname = @LDFLAGS_LIBSQLITE3_SONAME@ # works on the build host's platform. INSTALL.strip.1 = $(INSTALL) INSTALL.strip.0 = $(INSTALL) -s -INSTALL.strip. = $(INSTALL.strip.0) INSTALL.strip = $(INSTALL.strip.@IS_CROSS_COMPILING@) +INSTALL.noexec = $(INSTALL) -m 0644 install-dir.bin = $(DESTDIR)$(bindir) install-dir.lib = $(DESTDIR)$(libdir) @@ -109,21 +109,47 @@ LDFLAGS.libsqlite3 = \ $(LDFLAGS.math) $(LDFLAGS.dlopen) \ $(LDFLAGS.zlib) $(LDFLAGS.icu) \ $(LDFLAGS.configure) +LDFLAGS.libsqlite3.soname = @LDFLAGS_LIBSQLITE3_SONAME@ +CFLAGS.libsqlite3 = -I. $(CFLAGS.core) $(CFLAGS.icu) $(OPT_FEATURE_FLAGS) + +sqlite3.o: sqlite3.h sqlite3.c + $(CC) -c sqlite3.c -o $@ $(CFLAGS) $(CFLAGS.libsqlite3) + +libsqlite3.LIB = libsqlite3$(T.lib) +libsqlite3.SO = libsqlite3$(T.dll) + +$(libsqlite3.SO): sqlite3.o + $(CC) -o $@ sqlite3.o $(LDFLAGS.shlib) \ + $(LDFLAGS) $(LDFLAGS.libsqlite3) $(LDFLAGS.libsqlite3.soname) +all: $(libsqlite3.SO) + +$(libsqlite3.LIB): sqlite3.o + $(AR) $(AR.flags) $@ sqlite3.o +all: $(libsqlite3.LIB) sqlite3$(T.exe): shell.c sqlite3.c $(CC) -o $@ \ shell.c sqlite3.c \ - $(OPT_FEATURE_FLAGS) $(SHELL_OPT) \ - $(CFLAGS.readline) $(CFLAGS.icu) \ - $(LDFLAGS.libsqlite3) $(LDFLAGS.readline) + -I. $(OPT_FEATURE_FLAGS) $(SHELL_OPT) \ + $(CFLAGS) $(CFLAGS.readline) $(CFLAGS.icu) \ + $(LDFLAGS) $(LDFLAGS.libsqlite3) $(LDFLAGS.readline) all: sqlite3$(T.exe) install-shell: sqlite3$(T.exe) $(install-dir.bin) $(INSTALL.strip) sqlite3$(T.exe) "$(install-dir.bin)" install: install-shell +install-headers: sqlite3.h $(install-dir.include) + $(INSTALL.noexec) sqlite3.h sqlite3ext.h "$(install-dir.include)" +install: install-headers + +install-pc: sqlite3.pc $(install-dir.pkgconfig) + $(INSTALL.noexec) sqlite3.pc "$(install-dir.pkgconfig)" +install: install-pc + clean: rm -f *.o sqlite3$(T.exe) + rm -f $(libsqlite3.LIB) $(libsqlite3.SO) distclean: clean rm -f sqlite3.pc @@ -135,7 +161,7 @@ DIST_FILES := auto.def autosetup tea \ README.txt Makefile.fallback dist: - @echo "Not Yet Implemented: $@" + @echo "Not Yet Implemented: $@"; exit 1 install: - @echo "Not Yet Implemented: $@" + @echo "Not Yet Implemented: $@"; exit 1 diff --git a/autoconf/auto.def b/autoconf/auto.def index 6aba4216fb..0f9424b555 100644 --- a/autoconf/auto.def +++ b/autoconf/auto.def @@ -65,12 +65,23 @@ options { performance-critical loops. Never use --debug for production builds.} # + soname:=legacy => + # --soname has a long story behind it: https://sqlite.org/src/forumpost/5a3b44f510df8ded + {SONAME for libsqlite3.so. "none", or not using this flag, sets no + soname. "legacy" sets it to its historical value of + libsqlite3.so.0. A value matching the glob "libsqlite3.*" sets + it to that literal value. Any other value is assumed to be a + suffix which gets applied to "libsqlite3.so.", + e.g. --soname=9.10 equates to "libsqlite3.so.9.10". + } } sqlite-post-options-init sqlite-check-common-bins sqlite-check-common-system-deps proj-check-rpath +sqlite-handle-soname +sqlite-setup-default-cflags sqlite-handle-debug sqlite-handle-threadsafe sqlite-handle-tempstore diff --git a/manifest b/manifest index 0058b0f5a7..46cb1f1ef6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Get\sthe\sCLI\sshell\sbuilding\sin\sthe\sautoconf\sbundle. -D 2025-01-19T19:51:47.397 +C Get\slibsqlite3.so\sand\s.a\sbuilding\sin\sthe\sautoconf\sbundle. +D 2025-01-19T21:47:06.974 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -17,11 +17,11 @@ F art/sqlite370.svg 40b7e2fe8aac3add5d56dd86ab8d427a4eca5bcb3fe4f8946cb3794e1821 F auto.def 7833c0a8630dd3a3410dcc6c8b4d1b63f25d03d6497267624b8a37aba119cb3e F autoconf/INSTALL 83e4a25da9fd053c7b3665eaaaf7919707915903 F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac -F autoconf/Makefile.in 8ffa4fa39ae65758e72502b86286ea1472befec9eab7999cadb89d8e101d55c7 w autoconf/Makefile.am +F autoconf/Makefile.in 3fa678c42221c95ac4fc13d60b145840b9b93e7885c7d040669f3e481b5a8e93 F autoconf/Makefile.msc ffff61fe851443015ddb6600ab69a9df503cfec25459b336be7ba8c9a9e473f8 F autoconf/README.first 6c4f34fe115ff55d4e8dbfa3cecf04a0188292f7 F autoconf/README.txt 5e946ffb6fbdbb114c81e1bdc862df27fce8beab557d7b0421820b0fe8fc048f -F autoconf/auto.def 28003a20207d21aecb879a74778ca5d6b5c15e84efffbc8f90c3791b8d1d2248 +F autoconf/auto.def a2c428a91f5e3fa699e733fc3c1621ad145f3ac9f785e6518ecfe73a874f0e03 F autoconf/configure.ac ec7fa914c5e74ff212fe879f9bb6918e1234497e05facfb641f30c4d5893b277 F autoconf/tea/Makefile.in ba0556fee8da09c066bad85a4457904e46ee2c2eabaa309c0e83a78f2f151a8e F autoconf/tea/README.txt 61e62e519579e4a112791354d6d440f8b51ea6db3b0bab58d59f29df42d2dfe3 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P d7708372ff2fef4bfa61e56dbfbb363cac7685587a61a151497991d9a08bb07f -R c183fd6972c40e51c2b2f070c9205cc8 +P 241cdbc40a2f82df53c149849a103a335b0643a65e229a1e80ab90a0e457bb6b +R b35046aa7e07fc080621217913b53d03 U stephan -Z d3c8e68d7f70bcdf216494cac16a3dcf +Z f3e60d1f16fabf25d54188672248bb86 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index b06bb9fa72..a00e35956d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -241cdbc40a2f82df53c149849a103a335b0643a65e229a1e80ab90a0e457bb6b +88cee3fc7c8bfd9b6955fb6b2fd6b25660563e4d043ffa5ea18d8abe91afdb7f From e9763e4ed719cec6d7e70832f0f9af53d752fea3 Mon Sep 17 00:00:00 2001 From: stephan Date: Mon, 20 Jan 2025 16:14:09 +0000 Subject: [PATCH 087/220] configure script: remove an overzealous is-a-file check in the tclsh search which fails to account for implicit .exe extensions on Windows builds. Reported in [forum:c27403ef974df9f1|forum post c27403ef974df9f1]. (Same change as [89306d1a4905] but to a different file, as that content was moved since the 3.48 release.) FossilOrigin-Name: 239a3d1573f4cb720308018280b2add54034e69e38fe7060a7238875eee4f1c9 --- autosetup/sqlite-config.tcl | 4 +--- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/autosetup/sqlite-config.tcl b/autosetup/sqlite-config.tcl index 08bd0467e5..7f42922867 100644 --- a/autosetup/sqlite-config.tcl +++ b/autosetup/sqlite-config.tcl @@ -990,9 +990,7 @@ proc sqlite-check-tcl {} { if {"" ne $with_tclsh} { # --with-tclsh was provided or found above. Validate it and use it # to trump any value passed via --with-tcl=DIR. - if {![file isfile $with_tclsh]} { - proj-fatal "TCL shell $with_tclsh is not a file" - } elseif {![file-isexec $with_tclsh]} { + if {![file-isexec $with_tclsh]} { proj-fatal "TCL shell $with_tclsh is not executable" } else { define TCLSH_CMD $with_tclsh diff --git a/manifest b/manifest index c926f45fe9..0440599bc1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\san\sSQLITE_TESTCTRL_OPTIMIZATION\smask\sthat\scan\sdisable\sthe\squery\splanner\nheuristics\sthat\sare\sdesigned\sto\shelp\swith\sstar\squeries. -D 2025-01-19T19:14:21.044 +C configure\sscript:\sremove\san\soverzealous\sis-a-file\scheck\sin\sthe\stclsh\ssearch\swhich\sfails\sto\saccount\sfor\simplicit\s.exe\sextensions\son\sWindows\sbuilds.\sReported\sin\s[forum:c27403ef974df9f1|forum\spost\sc27403ef974df9f1].\s(Same\schange\sas\s[89306d1a4905]\sbut\sto\sa\sdifferent\sfile,\sas\sthat\scontent\swas\smoved\ssince\sthe\s3.48\srelease.) +D 2025-01-20T16:14:09.083 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -51,7 +51,7 @@ F autosetup/cc.tcl c0fcc50ca91deff8741e449ddad05bcd08268bc31177e613a6343bbd1fd3e F autosetup/jimsh0.c d40e381ea4526a067590e7b91bd4b2efa6d4980d286f908054c647b3df4aee14 F autosetup/pkg-config.tcl 4e635bf39022ff65e0d5434339dd41503ea48fc53822c9c5bde88b02d3d952ba F autosetup/proj.tcl 50b060ea6760b02ef5cb16650fbe9c1840e16351a0be0ccfc3727c565f74a257 -F autosetup/sqlite-config.tcl 4b1b8288415e26743a66a73a154303f67b8a1ae1aed478868843945cd5a58a29 +F autosetup/sqlite-config.tcl 96d07366aaaf717a2a1ff9b0ef89c4d669d6a38f18e7e7ae48a2498d076b39ac F autosetup/system.tcl 51d4be76cd9a9074704b584e5c9cbba616202c8468cf9ba8a4f8294a7ab1dba9 F configure 9a00b21dfd13757bbfb8d89b30660a89ec1f8f3a79402b8f9f9b6fc475c3303a x F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P f806c563a29240c709508316846fbe0cb3ed61b68a6c1d9544eb699e30141d8d -R a016f5b06b30e7627e9627eb42538187 -U drh -Z 386d6c5415cb5b1ed55b033eb5e08a17 +P fec4ff185a2f3f1bee8f27432206276636cf27365d2d41cd7282f8c0425f2e96 +R 25cfe1ba29c81abc6c4cc0abffb7da62 +U stephan +Z 0cb7636a2c620ecf85b9efcc34578b99 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 72562901a8..289c53bcfc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fec4ff185a2f3f1bee8f27432206276636cf27365d2d41cd7282f8c0425f2e96 +239a3d1573f4cb720308018280b2add54034e69e38fe7060a7238875eee4f1c9 From 467e20ad1d579cf8a405a715e250d12ff25de952 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 20 Jan 2025 18:26:58 +0000 Subject: [PATCH 088/220] Fix an assert() that could fail if a virtual table called sqlite3_step() from within the xSync() method while committing a "PRAGMA defer_foreign_keys=1" transaction. FossilOrigin-Name: 39bdbb3f6dd1d30d180526d35c11f789f5e9d45b99ead72fd4a3b136afab66b1 --- ext/fts5/test/fts5misc.test | 22 +++++++++++++++++++++- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/vdbeapi.c | 2 +- test/fkey6.test | 15 +++++++++++++++ 5 files changed, 47 insertions(+), 12 deletions(-) diff --git a/ext/fts5/test/fts5misc.test b/ext/fts5/test/fts5misc.test index c2e580c564..2aca1986a1 100644 --- a/ext/fts5/test/fts5misc.test +++ b/ext/fts5/test/fts5misc.test @@ -591,7 +591,6 @@ do_execsql_test 21.2 { PRAGMA integrity_check } {ok} -breakpoint sqlite3_db_config db DEFENSIVE 1 do_execsql_test 21.3 { CREATE TABLE xyz_notashadow(x, y); @@ -665,5 +664,26 @@ do_execsql_test 25.0 { SELECT fts5_test_poslist(t1) FROM t1('b') ORDER BY rank; } {{}} +#------------------------------------------------------------------------- +reset_db + +do_execsql_test 26.0 { + PRAGMA foreign_keys = ON; + CREATE TABLE t1(x INTEGER PRIMARY KEY); + CREATE TABLE t2(y INTEGER PRIMARY KEY, + z INTEGER REFERENCES t1(x) DEFERRABLE INITIALLY DEFERRED + ); + CREATE VIRTUAL TABLE t3 USING fts5(a, b, content='', tokendata=1); +} + +do_execsql_test 26.1 { + BEGIN; + INSERT INTO t2 VALUES(1,111); + INSERT INTO t3 VALUES(3,3); + PRAGMA defer_foreign_keys=ON; + DELETE FROM t2 WHERE y+1; + COMMIT; +} + finish_test diff --git a/manifest b/manifest index 0440599bc1..6c62b5451d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C configure\sscript:\sremove\san\soverzealous\sis-a-file\scheck\sin\sthe\stclsh\ssearch\swhich\sfails\sto\saccount\sfor\simplicit\s.exe\sextensions\son\sWindows\sbuilds.\sReported\sin\s[forum:c27403ef974df9f1|forum\spost\sc27403ef974df9f1].\s(Same\schange\sas\s[89306d1a4905]\sbut\sto\sa\sdifferent\sfile,\sas\sthat\scontent\swas\smoved\ssince\sthe\s3.48\srelease.) -D 2025-01-20T16:14:09.083 +C Fix\san\sassert()\sthat\scould\sfail\sif\sa\svirtual\stable\scalled\ssqlite3_step()\sfrom\swithin\sthe\sxSync()\smethod\swhile\scommitting\sa\s"PRAGMA\sdefer_foreign_keys=1"\stransaction. +D 2025-01-20T18:26:58.868 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -207,7 +207,7 @@ F ext/fts5/test/fts5locale.test 83ba7ee12628b540d3098f39c39c1de0c0440eddff8f7512 F ext/fts5/test/fts5matchinfo.test 877520582feb86bbfd95ab780099bcba4526f18ac75ee34979144cf86ba3a5a3 F ext/fts5/test/fts5merge.test 2654df0bcdb2d117c2d38b6aeb0168061be01c643f9e9194b36c43a2970e8082 F ext/fts5/test/fts5merge2.test 3ebad1a59d6ad3fb66eff6523a09e95dc6367cbefb3cd73196801dea0425c8e2 -F ext/fts5/test/fts5misc.test 8c3cc771f773dc4bb4973620c51e7729e324ca2cc80eb8894f1c2c605e361f0b +F ext/fts5/test/fts5misc.test f4dee7da898d605a6488c5b7afaace3158ed6bb9addff78faa1b37b402b77fb9 F ext/fts5/test/fts5multi.test a15bc91cdb717492e6e1b66fec1c356cb57386b980c7ba5af1915f97fe878581 F ext/fts5/test/fts5multiclient.test 5ff811c028d6108045ffef737f1e9f05028af2458e456c0937c1d1b8dea56d45 F ext/fts5/test/fts5near.test 33d60867581066e5db7016deb5d651628125d7ff4e0233a88175aa5b65874c74 @@ -851,7 +851,7 @@ F src/vacuum.c b763b6457bd058d2072ef9364832351fd8d11e8abf70cbb349657360f7d55c40 F src/vdbe.c 8a6eb02823b424b273614bae41579392a5c495424592b60423dd2c443a583df0 F src/vdbe.h 9676348d342bd04e21e384c63b57224171ce84fac77853357334ef94c4d33cf4 F src/vdbeInt.h bf294a0c8fc4cc80779e74b04b8bd82c6e1197b3137cefe0b16cdf002fc7dfd6 -F src/vdbeapi.c 38c252a202d70b56cfb734460bc888ddbd581afec1a10cd4d6c894c9e0b5baea +F src/vdbeapi.c 033decc098df353b97a5ca14302ad812e2567f1037747c2d5fcda62aac1bb74e F src/vdbeaux.c 5fcbc642a3d3d88c5ea15cadf2c8b8e4e067cb9ff374beb1875c9d209001299e F src/vdbeblob.c 255be187436da38b01f276c02e6a08103489bbe2a7c6c21537b7aecbe0e1f797 F src/vdbemem.c df568ef0187e4be2788c35174f6d9b8566ab9475f9aff2d73907ed05aa5684b2 @@ -1154,7 +1154,7 @@ F test/fkey2.test 1063d65e5923c054cfb8f0555a92a3ae0fa8c067275a33ee1715bd856cdb30 F test/fkey3.test 76d475c80b84ee7a5d062e56ccb6ea68882e2b49 F test/fkey4.test 86446017011273aad8f9a99c1a65019e7bd9ca9d F test/fkey5.test 6727452e163a427147e84e739da18713da553d79f9783559b04fdcd36d5c7421 -F test/fkey6.test bdb9c808349a149575b87cf4bfd82d4c81612f0c4d954d27b3f42f043a385396 +F test/fkey6.test ebd11efb00b9c70b57f4c6b6184445145c96e320329bd90a175036570c5b25ca F test/fkey7.test 64fb28da03da5dfe3cdef5967aa7e832c2507bf7fb8f0780cacbca1f2338d031 F test/fkey8.test 51deda7f1a1448bca95875e4a6e1a3a75b4bd7215e924e845bd60de60e4d84bf F test/fkey_malloc.test 594a7ea1fbab553c036c70813cd8bd9407d63749 @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P fec4ff185a2f3f1bee8f27432206276636cf27365d2d41cd7282f8c0425f2e96 -R 25cfe1ba29c81abc6c4cc0abffb7da62 -U stephan -Z 0cb7636a2c620ecf85b9efcc34578b99 +P 239a3d1573f4cb720308018280b2add54034e69e38fe7060a7238875eee4f1c9 +R dfc3a0a07b5a7948068bb24ed717b487 +U dan +Z 96f6b83e4a526a99706f87b354741f28 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 289c53bcfc..6465b82876 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -239a3d1573f4cb720308018280b2add54034e69e38fe7060a7238875eee4f1c9 +39bdbb3f6dd1d30d180526d35c11f789f5e9d45b99ead72fd4a3b136afab66b1 diff --git a/src/vdbeapi.c b/src/vdbeapi.c index e33cb2e4d3..5fc04b139c 100644 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@ -783,7 +783,7 @@ static int sqlite3Step(Vdbe *p){ } assert( db->nVdbeWrite>0 || db->autoCommit==0 - || (db->nDeferredCons==0 && db->nDeferredImmCons==0) + || ((db->nDeferredCons + db->nDeferredImmCons)==0) ); #ifndef SQLITE_OMIT_TRACE diff --git a/test/fkey6.test b/test/fkey6.test index 8658759523..72de926b52 100644 --- a/test/fkey6.test +++ b/test/fkey6.test @@ -250,7 +250,22 @@ do_catchsql_test 4.2 { COMMIT; } {1 {FOREIGN KEY constraint failed}} +#------------------------------------------------------------------------- +# +reset_db +do_execsql_test 5.0 { + PRAGMA foreign_keys = 1; + CREATE TABLE p1(a INTEGER PRIMARY KEY, b); + CREATE TABLE c1(x REFERENCES p1 DEFERRABLE INITIALLY DEFERRED); +} +do_execsql_test 5.1 { + BEGIN; + INSERT INTO c1 VALUES(123); + PRAGMA defer_foreign_keys = 1; + INSERT INTO p1 VALUES(123, 'one two three'); + COMMIT; +} finish_test From c69d537b93c85222ca8d44287b4167a2b28d1145 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 20 Jan 2025 19:19:31 +0000 Subject: [PATCH 089/220] Remove an assert() in the unix file locking logic that is not true if alternative VFS "unix-excl" is used for a read-only connection. FossilOrigin-Name: bd5dc92368e41231a07bb59dd3db8942e238129ec7a3c8d785459d9b62bfcba3 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/os_unix.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 6c62b5451d..dfd6f151c7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sassert()\sthat\scould\sfail\sif\sa\svirtual\stable\scalled\ssqlite3_step()\sfrom\swithin\sthe\sxSync()\smethod\swhile\scommitting\sa\s"PRAGMA\sdefer_foreign_keys=1"\stransaction. -D 2025-01-20T18:26:58.868 +C Remove\san\sassert()\sin\sthe\sunix\sfile\slocking\slogic\sthat\sis\snot\strue\nif\salternative\sVFS\s"unix-excl"\sis\sused\sfor\sa\sread-only\sconnection. +D 2025-01-20T19:19:31.053 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -763,7 +763,7 @@ 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 d2edbd92b07a3f778c2defa8a2e9d75acceb6267bda56948c41e8cdda65224d6 +F src/os_unix.c 4c73f89479d90412cb736a180e9ef89ac1495a158753a7f5de1260c197bc8e1f F src/os_win.c 49c7725b500f5867e8360e75eeb30f9d70b62fa1f05c8a101da627210578df32 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 3a1c4e7f69af482e33c8cba8a75afe0dda0ea6391240adac22b040ce1bdeef44 @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 239a3d1573f4cb720308018280b2add54034e69e38fe7060a7238875eee4f1c9 -R dfc3a0a07b5a7948068bb24ed717b487 -U dan -Z 96f6b83e4a526a99706f87b354741f28 +P 39bdbb3f6dd1d30d180526d35c11f789f5e9d45b99ead72fd4a3b136afab66b1 +R 2f208773f4b90552fa108ddc899a9482 +U drh +Z e41ea2237d4e46f40152146fd24a89c1 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 6465b82876..3be5a85248 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -39bdbb3f6dd1d30d180526d35c11f789f5e9d45b99ead72fd4a3b136afab66b1 +bd5dc92368e41231a07bb59dd3db8942e238129ec7a3c8d785459d9b62bfcba3 diff --git a/src/os_unix.c b/src/os_unix.c index b1996278c8..c897895d72 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -1664,7 +1664,7 @@ static int unixFileLock(unixFile *pFile, struct flock *pLock){ if( (pFile->ctrlFlags & (UNIXFILE_EXCL|UNIXFILE_RDONLY))==UNIXFILE_EXCL ){ if( pInode->bProcessLock==0 ){ struct flock lock; - assert( pInode->nLock==0 ); + /* assert( pInode->nLock==0 ); <-- Not true if unix-excl READONLY used */ lock.l_whence = SEEK_SET; lock.l_start = SHARED_FIRST; lock.l_len = SHARED_SIZE; From ae24e13bc7b3d8d24aa1331db56502af7819768f Mon Sep 17 00:00:00 2001 From: stephan Date: Mon, 20 Jan 2025 19:57:32 +0000 Subject: [PATCH 090/220] Add 'dist' and missing 'install' pieces to the autoconf bundle. FossilOrigin-Name: 16fa20413e3f3f0b6ea5d97022945843d1f785ac0142836f2a3651fd1917385f --- autoconf/Makefile.in | 69 ++++++++++++++++++++++++++++++++----- autoconf/auto.def | 7 +++- autosetup/sqlite-config.tcl | 6 ++-- manifest | 19 +++++----- manifest.uuid | 2 +- tool/mkautoconfamal.sh | 11 +++--- 6 files changed, 83 insertions(+), 31 deletions(-) diff --git a/autoconf/Makefile.in b/autoconf/Makefile.in index 18e8e9a740..d43300c829 100644 --- a/autoconf/Makefile.in +++ b/autoconf/Makefile.in @@ -1,7 +1,11 @@ +######################################################################## +# This is a main makefile for the "autoconf" bundle of SQLite. all: TOP = @abs_top_srcdir@ +PACKAGE_VERSION = @PACKAGE_VERSION@ + # # Filename extensions for binaries and libraries # @@ -31,6 +35,10 @@ AR = @AR@ AR.flags = cr CC = @CC@ + +ENABLE_LIB_SHARED = @ENABLE_LIB_SHARED@ +ENABLE_LIB_STATIC = @ENABLE_LIB_STATIC@ + CFLAGS = @CFLAGS@ @CPPFLAGS@ # # $(LDFLAGS.configure) represents any LDFLAGS=... the client passes to @@ -127,6 +135,37 @@ $(libsqlite3.LIB): sqlite3.o $(AR) $(AR.flags) $@ sqlite3.o all: $(libsqlite3.LIB) +install-so-1: $(install-dir.lib) $(libsqlite3.SO) + $(INSTALL) $(libsqlite3.SO) "$(install-dir.lib)" + @echo "Setting up $(libsqlite3.SO) symlinks..."; \ + cd "$(install-dir.lib)" || exit $$?; \ + rm -f $(libsqlite3.SO).0 $(libsqlite3.SO).$(PACKAGE_VERSION) || exit $$?; \ + mv $(libsqlite3.SO) $(libsqlite3.SO).$(PACKAGE_VERSION) || exit $$?; \ + ln -s $(libsqlite3.SO).$(PACKAGE_VERSION) $(libsqlite3.SO) || exit $$?; \ + ln -s $(libsqlite3.SO).$(PACKAGE_VERSION) $(libsqlite3.SO).0 || exit $$?; \ + ls -la $(libsqlite3.SO) $(libsqlite3.SO).[03]*; \ + if [ -e $(libsqlite3.SO).0.8.6 ]; then \ + echo "ACHTUNG: legacy libtool-compatible install found. Re-linking it..."; \ + rm -f libsqlite3.la $(libsqlite3.SO).0.8.6 || exit $$?; \ + ln -s $(libsqlite3.SO).$(PACKAGE_VERSION) $(libsqlite3.SO).0.8.6 || exit $$?; \ + ls -la $(libsqlite3.SO).0.8.6; \ + elif [ x1 = "x$(INSTALL_SO_086_LINK)" ]; then \ + echo "ACHTUNG: installing legacy libtool-style links because INSTALL_SO_086_LINK=1"; \ + rm -f libsqlite3.la $(libsqlite3.SO).0.8.6 || exit $$?; \ + ln -s $(libsqlite3.SO).$(PACKAGE_VERSION) $(libsqlite3.SO).0.8.6 || exit $$?; \ + ls -la $(libsqlite3.SO).0.8.6; \ + fi +install-so-0 install-so-: +install-so: install-so-$(ENABLE_LIB_SHARED) +install: install-so + +install-lib-1: $(install-dir.lib) $(libsqlite3.LIB) + $(INSTALL.noexec) $(libsqlite3.LIB) "$(install-dir.lib)" +install-lib-0 install-lib-: +install-lib: install-lib-$(ENABLE_LIB_STATIC) +install: install-lib + + sqlite3$(T.exe): shell.c sqlite3.c $(CC) -o $@ \ shell.c sqlite3.c \ @@ -147,21 +186,33 @@ install-pc: sqlite3.pc $(install-dir.pkgconfig) $(INSTALL.noexec) sqlite3.pc "$(install-dir.pkgconfig)" install: install-pc +install-man1: sqlite3.1 $(install-dir.man1) + $(INSTALL.noexec) sqlite3.1 "$(install-dir.man1)" +install: install-man1 + clean: rm -f *.o sqlite3$(T.exe) rm -f $(libsqlite3.LIB) $(libsqlite3.SO) distclean: clean - rm -f sqlite3.pc + rm -f jimsh0$(T.exe) config.* sqlite3.pc -DIST_FILES := auto.def autosetup tea \ +DIST_FILES := \ + README.txt VERSION \ + auto.def autosetup configure tea \ sqlite3.h sqlite3.c shell.c sqlite3ext.h \ - sqlite3.1 \ - Makefile.msc sqlite3.rc sqlite3rc.h Replace.cs \ - README.txt Makefile.fallback + Makefile.in Makefile.msc Makefile.fallback \ + sqlite3.rc sqlite3rc.h Replace.cs \ + sqlite3.pc.in sqlite3.1 +# Maintenance note: dist_name must be sqlite-$(PACKAGE_VERSION) so +# that tool/mkautoconfamal.sh knows how to find it. +dist_name = sqlite-$(PACKAGE_VERSION) +dist_tarball = $(dist_name).tar.gz dist: - @echo "Not Yet Implemented: $@"; exit 1 - -install: - @echo "Not Yet Implemented: $@"; exit 1 + rm -fr $(dist_name) + mkdir -p $(dist_name) + cp -rp $(DIST_FILES) $(dist_name)/. + tar czf $(dist_tarball) $(dist_name) + rm -fr $(dist_name) + ls -l $(dist_tarball) diff --git a/autoconf/auto.def b/autoconf/auto.def index 0f9424b555..28faeee391 100644 --- a/autoconf/auto.def +++ b/autoconf/auto.def @@ -11,7 +11,8 @@ use sqlite-config options { # - static=1 => {Disable build of static library (mostly)} + static=1 => {Disable build of static library} + shared=1 => {Disable build of shared library} # # threadsafe=1 => {Disable mutexing} @@ -91,5 +92,9 @@ sqlite-handle-math sqlite-handle-icu sqlite-handle-common-feature-flags sqlite-show-feature-flags + +define ENABLE_LIB_SHARED [opt-bool shared] +define ENABLE_LIB_STATIC [opt-bool static] + sqlite-process-dot-in-files sqlite-post-config-validation diff --git a/autosetup/sqlite-config.tcl b/autosetup/sqlite-config.tcl index 5e2d121565..f1ebc72913 100644 --- a/autosetup/sqlite-config.tcl +++ b/autosetup/sqlite-config.tcl @@ -1013,9 +1013,7 @@ proc sqlite-check-tcl {} { if {"" ne $with_tclsh} { # --with-tclsh was provided or found above. Validate it and use it # to trump any value passed via --with-tcl=DIR. - if {![file isfile $with_tclsh]} { - proj-fatal "TCL shell $with_tclsh is not a file" - } elseif {![file-isexec $with_tclsh]} { + if {![file-isexec $with_tclsh]} { proj-fatal "TCL shell $with_tclsh is not executable" } else { define TCLSH_CMD $with_tclsh @@ -1079,7 +1077,7 @@ proc sqlite-check-tcl {} { # Export a subset of tclConfig.sh to the current TCL-space. If $cfg # is an empty string, this emits empty-string entries for the # various options we're interested in. - eval [exec "$srcdir/tool/tclConfigShToAutoDef.sh" "$cfg"] + eval [exec /bin/sh "$srcdir/tool/tclConfigShToAutoDef.sh" "$cfg"] if {"" eq $with_tclsh && $cfg ne ""} { # We have tclConfig.sh but no tclsh. Attempt to locate a tclsh diff --git a/manifest b/manifest index 46cb1f1ef6..6e1682a339 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Get\slibsqlite3.so\sand\s.a\sbuilding\sin\sthe\sautoconf\sbundle. -D 2025-01-19T21:47:06.974 +C Add\s'dist'\sand\smissing\s'install'\spieces\sto\sthe\sautoconf\sbundle. +D 2025-01-20T19:57:32.754 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -17,11 +17,11 @@ F art/sqlite370.svg 40b7e2fe8aac3add5d56dd86ab8d427a4eca5bcb3fe4f8946cb3794e1821 F auto.def 7833c0a8630dd3a3410dcc6c8b4d1b63f25d03d6497267624b8a37aba119cb3e F autoconf/INSTALL 83e4a25da9fd053c7b3665eaaaf7919707915903 F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac -F autoconf/Makefile.in 3fa678c42221c95ac4fc13d60b145840b9b93e7885c7d040669f3e481b5a8e93 +F autoconf/Makefile.in 330a4f6a43ed3076c6e2e0627b17091a1fb1c8ab136fcc46048d6f1662f8f0d8 F autoconf/Makefile.msc ffff61fe851443015ddb6600ab69a9df503cfec25459b336be7ba8c9a9e473f8 F autoconf/README.first 6c4f34fe115ff55d4e8dbfa3cecf04a0188292f7 F autoconf/README.txt 5e946ffb6fbdbb114c81e1bdc862df27fce8beab557d7b0421820b0fe8fc048f -F autoconf/auto.def a2c428a91f5e3fa699e733fc3c1621ad145f3ac9f785e6518ecfe73a874f0e03 +F autoconf/auto.def 1d740e01d05d34140f0f403201fe625eb6469efb9b5645f068dc6b38cb005c9a F autoconf/configure.ac ec7fa914c5e74ff212fe879f9bb6918e1234497e05facfb641f30c4d5893b277 F autoconf/tea/Makefile.in ba0556fee8da09c066bad85a4457904e46ee2c2eabaa309c0e83a78f2f151a8e F autoconf/tea/README.txt 61e62e519579e4a112791354d6d440f8b51ea6db3b0bab58d59f29df42d2dfe3 @@ -52,7 +52,7 @@ F autosetup/cc.tcl c0fcc50ca91deff8741e449ddad05bcd08268bc31177e613a6343bbd1fd3e F autosetup/jimsh0.c d40e381ea4526a067590e7b91bd4b2efa6d4980d286f908054c647b3df4aee14 F autosetup/pkg-config.tcl 4e635bf39022ff65e0d5434339dd41503ea48fc53822c9c5bde88b02d3d952ba F autosetup/proj.tcl 50b060ea6760b02ef5cb16650fbe9c1840e16351a0be0ccfc3727c565f74a257 -F autosetup/sqlite-config.tcl 7a5cf6b40c5763c473c2638041ba8812f32062a78545aff223e0913fc4a7c57d +F autosetup/sqlite-config.tcl d1d3e66be58bf10100abf925e6b6baa98e0bad0fd581a8c0b7fd953996d6b85f F autosetup/system.tcl 51d4be76cd9a9074704b584e5c9cbba616202c8468cf9ba8a4f8294a7ab1dba9 F configure 9a00b21dfd13757bbfb8d89b30660a89ec1f8f3a79402b8f9f9b6fc475c3303a x F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad @@ -2144,7 +2144,7 @@ F tool/logest.c c34e5944318415de513d29a6098df247a9618c96d83c38d4abd88641fe46e669 F tool/max-limits.c cbb635fbb37ae4d05f240bfb5b5270bb63c54439 F tool/merge-test.tcl de76b62f2de2a92d4c1ca4f976bce0aea6899e0229e250479b229b2a1914b176 F tool/mkamalzip.tcl 8aa5ebe7973c8b8774062d34e15fea9815c4cc2ceea3a9b184695f005910876a -F tool/mkautoconfamal.sh 7a9b54df5f3fbcbef9ff7f4d7bffb1b074425db23f999e1b27bd0b544fe7f2ff +F tool/mkautoconfamal.sh de0dd50c6c5899330bb1f9c9fcaf71e8fbede3229034839cafc1e8485c5e827d F tool/mkccode.tcl 210159febe0ef0ecbc53c79833500663ceaba0115b2b374405818dc835b5f84b x F tool/mkctimec.tcl ef6a67ec82e5b6fc19152a4c79f237227b18bf67ff16d155bac7adb94355d9cf x F tool/mkkeywordhash.c 6b0be901c47f9ad42215fc995eb2f4384ac49213b1fba395102ec3e999acf559 @@ -2209,8 +2209,9 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 241cdbc40a2f82df53c149849a103a335b0643a65e229a1e80ab90a0e457bb6b -R b35046aa7e07fc080621217913b53d03 +P 88cee3fc7c8bfd9b6955fb6b2fd6b25660563e4d043ffa5ea18d8abe91afdb7f +Q +239a3d1573f4cb720308018280b2add54034e69e38fe7060a7238875eee4f1c9 +R e0c333605d60d87f3232edd28cb1fd40 U stephan -Z f3e60d1f16fabf25d54188672248bb86 +Z 675925c45ad830a2f82ac547ac838105 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index a00e35956d..0bb20b59c6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -88cee3fc7c8bfd9b6955fb6b2fd6b25660563e4d043ffa5ea18d8abe91afdb7f +16fa20413e3f3f0b6ea5d97022945843d1f785ac0142836f2a3651fd1917385f diff --git a/tool/mkautoconfamal.sh b/tool/mkautoconfamal.sh index 3b46fc4de8..5c96b26c64 100644 --- a/tool/mkautoconfamal.sh +++ b/tool/mkautoconfamal.sh @@ -22,8 +22,8 @@ set -u TMPSPACE=./mkpkg_tmp_dir VERSION=`cat $TOP/VERSION` -HASH=`sed 's/^\(..........\).*/\1/' $TOP/manifest.uuid` -DATETIME=`grep '^D' $TOP/manifest | sed -e 's/[^0-9]//g' -e 's/\(............\).*/\1/'` +HASH=`cut -c1-10 $TOP/manifest.uuid` +DATETIME=`grep '^D' $TOP/manifest | cut -c3- | tr -c -d '[0-9]'` # Verify that the version number in the TEA autoconf file is correct. # Fail with an error if not. @@ -96,14 +96,11 @@ cd tea autoconf rm -rf autom4te.cache -echo "--------------- TODO: -----------------" -cat < Date: Mon, 20 Jan 2025 20:48:18 +0000 Subject: [PATCH 091/220] configure script: work around msys's inability to 'exec' a '.sh' file by prefixing the call with an explicit 'sh', as reported in [forum:befb352a42a7cd6d|forum post befb352a42a7cd6d]. FossilOrigin-Name: 25b01f1c9a5e606441bfd4e729fb88361436dffc76ef7a10c04a4d4ad0bcc655 --- autosetup/sqlite-config.tcl | 4 +++- manifest | 13 ++++++------- manifest.uuid | 2 +- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/autosetup/sqlite-config.tcl b/autosetup/sqlite-config.tcl index f1ebc72913..96b7d0c1b3 100644 --- a/autosetup/sqlite-config.tcl +++ b/autosetup/sqlite-config.tcl @@ -1077,7 +1077,9 @@ proc sqlite-check-tcl {} { # Export a subset of tclConfig.sh to the current TCL-space. If $cfg # is an empty string, this emits empty-string entries for the # various options we're interested in. - eval [exec /bin/sh "$srcdir/tool/tclConfigShToAutoDef.sh" "$cfg"] + eval [exec sh "$srcdir/tool/tclConfigShToAutoDef.sh" "$cfg"] + # ---------^^ a Windows/msys workaround, without which it cannot + # exec a .sh file: https://sqlite.org/forum/forumpost/befb352a42a7cd6d if {"" eq $with_tclsh && $cfg ne ""} { # We have tclConfig.sh but no tclsh. Attempt to locate a tclsh diff --git a/manifest b/manifest index 6e1682a339..5a5d61168a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\s'dist'\sand\smissing\s'install'\spieces\sto\sthe\sautoconf\sbundle. -D 2025-01-20T19:57:32.754 +C configure\sscript:\swork\saround\smsys's\sinability\sto\s'exec'\sa\s'.sh'\sfile\sby\sprefixing\sthe\scall\swith\san\sexplicit\s'sh',\sas\sreported\sin\s[forum:befb352a42a7cd6d|forum\spost\sbefb352a42a7cd6d]. +D 2025-01-20T20:48:18.754 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -52,7 +52,7 @@ F autosetup/cc.tcl c0fcc50ca91deff8741e449ddad05bcd08268bc31177e613a6343bbd1fd3e F autosetup/jimsh0.c d40e381ea4526a067590e7b91bd4b2efa6d4980d286f908054c647b3df4aee14 F autosetup/pkg-config.tcl 4e635bf39022ff65e0d5434339dd41503ea48fc53822c9c5bde88b02d3d952ba F autosetup/proj.tcl 50b060ea6760b02ef5cb16650fbe9c1840e16351a0be0ccfc3727c565f74a257 -F autosetup/sqlite-config.tcl d1d3e66be58bf10100abf925e6b6baa98e0bad0fd581a8c0b7fd953996d6b85f +F autosetup/sqlite-config.tcl cf9790dc31d498b69ad2b348b7a3a6f2c7df9a86d770b31dff2255c2f62e5015 F autosetup/system.tcl 51d4be76cd9a9074704b584e5c9cbba616202c8468cf9ba8a4f8294a7ab1dba9 F configure 9a00b21dfd13757bbfb8d89b30660a89ec1f8f3a79402b8f9f9b6fc475c3303a x F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad @@ -2209,9 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 88cee3fc7c8bfd9b6955fb6b2fd6b25660563e4d043ffa5ea18d8abe91afdb7f -Q +239a3d1573f4cb720308018280b2add54034e69e38fe7060a7238875eee4f1c9 -R e0c333605d60d87f3232edd28cb1fd40 +P 16fa20413e3f3f0b6ea5d97022945843d1f785ac0142836f2a3651fd1917385f +R 530ea71496225522d46777a9a2bdcaa9 U stephan -Z 675925c45ad830a2f82ac547ac838105 +Z fe186d8bfdcab6314981338fcde5c9d6 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 0bb20b59c6..b94a093c93 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -16fa20413e3f3f0b6ea5d97022945843d1f785ac0142836f2a3651fd1917385f +25b01f1c9a5e606441bfd4e729fb88361436dffc76ef7a10c04a4d4ad0bcc655 From d0db5edf612fff09e4548e952247ffaec53e1c19 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 21 Jan 2025 11:10:16 +0000 Subject: [PATCH 092/220] Use Tcl_GetString() instead of Tcl_GetCharLength() to test for a zero-length string in the TCL interface, since that is much more efficient. FossilOrigin-Name: a8d9dcfd23fbfcd887e451382836c1e88215984cc01e00be11387dbf4ab26fd8 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/tclsqlite.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index dfd6f151c7..993a673926 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\san\sassert()\sin\sthe\sunix\sfile\slocking\slogic\sthat\sis\snot\strue\nif\salternative\sVFS\s"unix-excl"\sis\sused\sfor\sa\sread-only\sconnection. -D 2025-01-20T19:19:31.053 +C Use\sTcl_GetString()\sinstead\sof\sTcl_GetCharLength()\sto\stest\sfor\sa\szero-length\nstring\sin\sthe\sTCL\sinterface,\ssince\sthat\sis\smuch\smore\sefficient. +D 2025-01-21T11:10:16.446 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -788,7 +788,7 @@ F src/sqliteInt.h 953f2476f712b115ecb43f7a21183d07c88af8d3b4c32f18317724ce1ce04d F src/sqliteLimit.h 1bbdbf72bd0411d003267ffebc59a262f061df5653027a75627d03f48ca30523 F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 -F src/tclsqlite.c c6b9d3a0b1100e1e028460c418c41ca180dac5958e96bef79f6799b552522a37 +F src/tclsqlite.c 6a7538560adc856faea295c0f09c33a57a1cfa5c59f85ab4e12aa50dba7ff2de F src/tclsqlite.h 65e2c761446e1c9fa0342b7d2612a703483643c8b6a316d12a65b745a4727395 F src/test1.c 9d2da51b4c33633e7370e4068af6d16d2c52b22a5810ec012ac32e77f8397b64 F src/test2.c 7ebc518e6735939d8979273a6f7b1d9b5702babf059f6ad62499f7f60a9eb9a3 @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 39bdbb3f6dd1d30d180526d35c11f789f5e9d45b99ead72fd4a3b136afab66b1 -R 2f208773f4b90552fa108ddc899a9482 +P bd5dc92368e41231a07bb59dd3db8942e238129ec7a3c8d785459d9b62bfcba3 +R e87ed836260a3ceb4ad61cd2f818556e U drh -Z e41ea2237d4e46f40152146fd24a89c1 +Z 345b10e2ab0f1f1054b6abc135136648 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 3be5a85248..b56b8e91ab 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bd5dc92368e41231a07bb59dd3db8942e238129ec7a3c8d785459d9b62bfcba3 +a8d9dcfd23fbfcd887e451382836c1e88215984cc01e00be11387dbf4ab26fd8 diff --git a/src/tclsqlite.c b/src/tclsqlite.c index 598c9355ff..76c9ef75c1 100644 --- a/src/tclsqlite.c +++ b/src/tclsqlite.c @@ -1964,7 +1964,7 @@ static void DbHookCmd( } if( pArg ){ assert( !(*ppHook) ); - if( Tcl_GetCharLength(pArg)>0 ){ + if( Tcl_GetString(pArg)[0] ){ *ppHook = pArg; Tcl_IncrRefCount(*ppHook); } From b80d01a18237eceabbe86d77b7f43acc1815c73f Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 21 Jan 2025 14:34:59 +0000 Subject: [PATCH 093/220] Have fts5 better handle OOM errors from sqlite3_blob_close(). FossilOrigin-Name: f418350f3f83147bc5817a885be6e39ff9ff5722742a88d17600729c53c65010 --- ext/fts5/fts5_index.c | 53 +++++++++++++++++++++++------------ ext/fts5/test/fts5faultI.test | 35 +++++++++++++++++++++++ manifest | 16 +++++------ manifest.uuid | 2 +- 4 files changed, 79 insertions(+), 27 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index a8ac98b699..c98844e73d 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -778,11 +778,13 @@ static int fts5LeafFirstTermOff(Fts5Data *pLeaf){ /* ** Close the read-only blob handle, if it is open. */ -void sqlite3Fts5IndexCloseReader(Fts5Index *p){ +void fts5IndexCloseReader(Fts5Index *p){ if( p->pReader ){ + int rc; sqlite3_blob *pReader = p->pReader; p->pReader = 0; - sqlite3_blob_close(pReader); + rc = sqlite3_blob_close(pReader); + if( p->rc==SQLITE_OK ) p->rc = rc; } } @@ -807,7 +809,7 @@ static Fts5Data *fts5DataRead(Fts5Index *p, i64 iRowid){ assert( p->pReader==0 ); p->pReader = pBlob; if( rc!=SQLITE_OK ){ - sqlite3Fts5IndexCloseReader(p); + fts5IndexCloseReader(p); } if( rc==SQLITE_ABORT ) rc = SQLITE_OK; } @@ -5009,6 +5011,14 @@ static int fts5IndexReturn(Fts5Index *p){ return rc; } +/* +** Close the read-only blob handle, if it is open. +*/ +void sqlite3Fts5IndexCloseReader(Fts5Index *p){ + fts5IndexCloseReader(p); + fts5IndexReturn(p); +} + typedef struct Fts5FlushCtx Fts5FlushCtx; struct Fts5FlushCtx { Fts5Index *pIdx; @@ -6730,7 +6740,7 @@ int sqlite3Fts5IndexBeginWrite(Fts5Index *p, int bDelete, i64 iRowid){ int sqlite3Fts5IndexSync(Fts5Index *p){ assert( p->rc==SQLITE_OK ); fts5IndexFlush(p); - sqlite3Fts5IndexCloseReader(p); + fts5IndexCloseReader(p); return fts5IndexReturn(p); } @@ -6741,11 +6751,10 @@ int sqlite3Fts5IndexSync(Fts5Index *p){ ** records must be invalidated. */ int sqlite3Fts5IndexRollback(Fts5Index *p){ - sqlite3Fts5IndexCloseReader(p); + fts5IndexCloseReader(p); fts5IndexDiscardData(p); fts5StructureInvalidate(p); - /* assert( p->rc==SQLITE_OK ); */ - return SQLITE_OK; + return fts5IndexReturn(p); } /* @@ -6946,6 +6955,16 @@ static void fts5SegIterSetEOF(Fts5SegIter *pSeg){ pSeg->pLeaf = 0; } +void fts5IterClose(Fts5IndexIter *pIndexIter){ + if( pIndexIter ){ + Fts5Iter *pIter = (Fts5Iter*)pIndexIter; + Fts5Index *pIndex = pIter->pIndex; + fts5TokendataIterDelete(pIter->pTokenDataIter); + fts5MultiIterFree(pIter); + fts5IndexCloseReader(pIndex); + } +} + /* ** This function appends iterator pAppend to Fts5TokenDataIter pIn and ** returns the result. @@ -6973,7 +6992,7 @@ static Fts5TokenDataIter *fts5AppendTokendataIter( } } if( p->rc ){ - sqlite3Fts5IterClose((Fts5IndexIter*)pAppend); + fts5IterClose((Fts5IndexIter*)pAppend); }else{ pRet->apIter[pRet->nIter++] = pAppend; } @@ -7186,7 +7205,7 @@ static Fts5Iter *fts5SetupTokendataIter( fts5BufferSet(&p->rc, &bSeek, nToken, pToken); } if( p->rc ){ - sqlite3Fts5IterClose((Fts5IndexIter*)pNew); + fts5IterClose((Fts5IndexIter*)pNew); break; } @@ -7251,7 +7270,7 @@ static Fts5Iter *fts5SetupTokendataIter( ** not point to any terms that match the query. So delete it and break ** out of the loop - all required iterators have been collected. */ if( pSmall==0 ){ - sqlite3Fts5IterClose((Fts5IndexIter*)pNew); + fts5IterClose((Fts5IndexIter*)pNew); break; } @@ -7380,9 +7399,9 @@ int sqlite3Fts5IndexQuery( } if( p->rc ){ - sqlite3Fts5IterClose((Fts5IndexIter*)pRet); + fts5IterClose((Fts5IndexIter*)pRet); pRet = 0; - sqlite3Fts5IndexCloseReader(p); + fts5IndexCloseReader(p); } *ppIter = (Fts5IndexIter*)pRet; @@ -7632,11 +7651,9 @@ int sqlite3Fts5IndexIterWriteTokendata( */ void sqlite3Fts5IterClose(Fts5IndexIter *pIndexIter){ if( pIndexIter ){ - Fts5Iter *pIter = (Fts5Iter*)pIndexIter; - Fts5Index *pIndex = pIter->pIndex; - fts5TokendataIterDelete(pIter->pTokenDataIter); - fts5MultiIterFree(pIter); - sqlite3Fts5IndexCloseReader(pIndex); + Fts5Index *pIndex = ((Fts5Iter*)pIndexIter)->pIndex; + fts5IterClose(pIndexIter); + fts5IndexReturn(pIndex); } } @@ -8166,7 +8183,7 @@ static int fts5QueryCksum( rc = sqlite3Fts5IterNext(pIter); } } - sqlite3Fts5IterClose(pIter); + fts5IterClose(pIter); *pCksum = cksum; return rc; diff --git a/ext/fts5/test/fts5faultI.test b/ext/fts5/test/fts5faultI.test index 72f25caee1..ab84d37de5 100644 --- a/ext/fts5/test/fts5faultI.test +++ b/ext/fts5/test/fts5faultI.test @@ -290,5 +290,40 @@ do_faultsim_test 11 -faults oom* -prep { faultsim_test_result {0 {}} } +#------------------------------------------------------------------------- +reset_db + +ifcapable foreignkey { + do_execsql_test 12.0 { + CREATE VIRTUAL TABLE f1 USING fts5(content); + CREATE TABLE p1(a INTEGER PRIMARY KEY); + CREATE TABLE c1(b REFERENCES p1 DEFERRABLE INITIALLY DEFERRED); + } + + faultsim_save_and_close + + do_faultsim_test 11 -faults oom* -prep { + faultsim_restore_and_reopen + execsql { + PRAGMA foreign_keys = 1; + BEGIN; + INSERT INTO c1 VALUES(123); + SAVEPOINT xyz; + } + } -body { + execsql { + INSERT INTO f1 VALUES('a b c'); + ROLLBACK TO xyz; + COMMIT; + } + } -test { + execsql { SELECT 123 } + faultsim_test_result \ + {1 {FOREIGN KEY constraint failed}} \ + {1 {out of memory}} \ + {1 {constraint failed}} + } +} + finish_test diff --git a/manifest b/manifest index 993a673926..b6bbc0b68f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\sTcl_GetString()\sinstead\sof\sTcl_GetCharLength()\sto\stest\sfor\sa\szero-length\nstring\sin\sthe\sTCL\sinterface,\ssince\sthat\sis\smuch\smore\sefficient. -D 2025-01-21T11:10:16.446 +C Have\sfts5\sbetter\shandle\sOOM\serrors\sfrom\ssqlite3_blob_close(). +D 2025-01-21T14:34:59.118 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -113,7 +113,7 @@ F ext/fts5/fts5_buffer.c 0eec58bff585f1a44ea9147eae5da2447292080ea435957f7488c70 F ext/fts5/fts5_config.c e7d8dd062b44a66cd77e5a0f74f23a2354cd1f3f8575afb967b2773c3384f7f8 F ext/fts5/fts5_expr.c 69b8d976058512c07dfe86e229521b7a871768157bd1607cedf1a5038dfd72c9 F ext/fts5/fts5_hash.c adda4272be401566a6e0ba1acbe70ee5cb97fce944bc2e04dc707152a0ec91b1 -F ext/fts5/fts5_index.c f1f6da5938af616e0a5e54f0423a3134df95b9f17ac1c6ebf2e2e8132bbc75b9 +F ext/fts5/fts5_index.c 1ce1e2b43fdd86a2047619c2ea3aafa5c7b909d0cef75185d0fda31e82f0e9c6 F ext/fts5/fts5_main.c 9a1daef7247f9b8a50b4159323e340efa6b0e4bea4fcd83580480f94d4f2c888 F ext/fts5/fts5_storage.c 1ad05dab4830a4e2eaf2900bb143477f93bc17437093582f36f4b818809e88d8 F ext/fts5/fts5_tcl.c 7fb5a3d3404099075aaa2457307cb459bbc257c0de3dbd52b1e80a5b503e0329 @@ -192,7 +192,7 @@ F ext/fts5/test/fts5faultE.test 844586ce71dab4be85bb86880e87b624d089f851654cd22e F ext/fts5/test/fts5faultF.test 4abef99f86e99d9f0c6460dd68c586a766b6b9f1f660ada55bf2e8266bd1bbc1 F ext/fts5/test/fts5faultG.test 0544411ffcb3e19b42866f757a8a5e0fb8fef3a62c06f61d14deebc571bb7ea9 F ext/fts5/test/fts5faultH.test 2b2b5b8cb1b3fd7679f488c06e22af44107fbc6137eaf45b3e771dc7b149312d -F ext/fts5/test/fts5faultI.test 0706b307b208638554c9e65b4091e1c0dd8c92941535089a301df454ff2c56f4 +F ext/fts5/test/fts5faultI.test 9b33d664bccee4bbde0f275a48b2df3ea2f05d41f6d1d171aa2e844382cba621 F ext/fts5/test/fts5first.test bfd685b96905bf541d99d8644e0a7219d1d833455a08ab64e344071a613b6ba9 F ext/fts5/test/fts5full.test 97d263c1072f4a560929cca31e70f65d2ae232610e17e6affcf7e979df59547b F ext/fts5/test/fts5fuzz1.test 238d8c45f3b81342aa384de3e581ff2fa330bf922a7b69e484bbc06051a1080e @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P bd5dc92368e41231a07bb59dd3db8942e238129ec7a3c8d785459d9b62bfcba3 -R e87ed836260a3ceb4ad61cd2f818556e -U drh -Z 345b10e2ab0f1f1054b6abc135136648 +P a8d9dcfd23fbfcd887e451382836c1e88215984cc01e00be11387dbf4ab26fd8 +R 0ff09c4d1a6df4a00a8ce3e62a42f2fa +U dan +Z dbb8340d556717da4724fb10b820bbe7 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index b56b8e91ab..07c5f158d9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a8d9dcfd23fbfcd887e451382836c1e88215984cc01e00be11387dbf4ab26fd8 +f418350f3f83147bc5817a885be6e39ff9ff5722742a88d17600729c53c65010 From 631900291d8471903a8bb24b4401cd5b14fd78e1 Mon Sep 17 00:00:00 2001 From: stephan Date: Tue, 21 Jan 2025 14:40:35 +0000 Subject: [PATCH 094/220] Remove now-extraneous autoconf/INSTALL and autoconf/configure.ac and update autoconf/README.* to account for the port to autosetup. FossilOrigin-Name: 646667af8ca2140d823facf4578105c3d9815ea34b2a4cb96103c2fe7d718229 --- autoconf/INSTALL | 370 ------------------------------------------ autoconf/README.first | 13 +- autoconf/README.txt | 25 +-- autoconf/auto.def | 6 +- autoconf/configure.ac | 270 ------------------------------ manifest | 18 +- manifest.uuid | 2 +- 7 files changed, 32 insertions(+), 672 deletions(-) delete mode 100644 autoconf/INSTALL delete mode 100644 autoconf/configure.ac diff --git a/autoconf/INSTALL b/autoconf/INSTALL deleted file mode 100644 index a1e89e18ad..0000000000 --- a/autoconf/INSTALL +++ /dev/null @@ -1,370 +0,0 @@ -Installation Instructions -************************* - -Copyright (C) 1994-1996, 1999-2002, 2004-2011 Free Software Foundation, -Inc. - - Copying and distribution of this file, with or without modification, -are permitted in any medium without royalty provided the copyright -notice and this notice are preserved. This file is offered as-is, -without warranty of any kind. - -Basic Installation -================== - - Briefly, the shell commands `./configure; make; make install' should -configure, build, and install this package. The following -more-detailed instructions are generic; see the `README' file for -instructions specific to this package. Some packages provide this -`INSTALL' file but do not implement all of the features documented -below. The lack of an optional feature in a given package is not -necessarily a bug. More recommendations for GNU packages can be found -in *note Makefile Conventions: (standards)Makefile Conventions. - - The `configure' shell script attempts to guess correct values for -various system-dependent variables used during compilation. It uses -those values to create a `Makefile' in each directory of the package. -It may also create one or more `.h' files containing system-dependent -definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, and a -file `config.log' containing compiler output (useful mainly for -debugging `configure'). - - It can also use an optional file (typically called `config.cache' -and enabled with `--cache-file=config.cache' or simply `-C') that saves -the results of its tests to speed up reconfiguring. Caching is -disabled by default to prevent problems with accidental use of stale -cache files. - - If you need to do unusual things to compile the package, please try -to figure out how `configure' could check whether to do them, and mail -diffs or instructions to the address given in the `README' so they can -be considered for the next release. If you are using the cache, and at -some point `config.cache' contains results you don't want to keep, you -may remove or edit it. - - The file `configure.ac' (or `configure.in') is used to create -`configure' by a program called `autoconf'. You need `configure.ac' if -you want to change it or regenerate `configure' using a newer version -of `autoconf'. - - The simplest way to compile this package is: - - 1. `cd' to the directory containing the package's source code and type - `./configure' to configure the package for your system. - - Running `configure' might take a while. While running, it prints - some messages telling which features it is checking for. - - 2. Type `make' to compile the package. - - 3. Optionally, type `make check' to run any self-tests that come with - the package, generally using the just-built uninstalled binaries. - - 4. Type `make install' to install the programs and any data files and - documentation. When installing into a prefix owned by root, it is - recommended that the package be configured and built as a regular - user, and only the `make install' phase executed with root - privileges. - - 5. Optionally, type `make installcheck' to repeat any self-tests, but - this time using the binaries in their final installed location. - This target does not install anything. Running this target as a - regular user, particularly if the prior `make install' required - root privileges, verifies that the installation completed - correctly. - - 6. You can remove the program binaries and object files from the - source code directory by typing `make clean'. To also remove the - files that `configure' created (so you can compile the package for - a different kind of computer), type `make distclean'. There is - also a `make maintainer-clean' target, but that is intended mainly - for the package's developers. If you use it, you may have to get - all sorts of other programs in order to regenerate files that came - with the distribution. - - 7. Often, you can also type `make uninstall' to remove the installed - files again. In practice, not all packages have tested that - uninstallation works correctly, even though it is required by the - GNU Coding Standards. - - 8. Some packages, particularly those that use Automake, provide `make - distcheck', which can by used by developers to test that all other - targets like `make install' and `make uninstall' work correctly. - This target is generally not run by end users. - -Compilers and Options -===================== - - Some systems require unusual options for compilation or linking that -the `configure' script does not know about. Run `./configure --help' -for details on some of the pertinent environment variables. - - You can give `configure' initial values for configuration parameters -by setting variables in the command line or in the environment. Here -is an example: - - ./configure CC=c99 CFLAGS=-g LIBS=-lposix - - *Note Defining Variables::, for more details. - -Compiling For Multiple Architectures -==================================== - - You can compile the package for more than one kind of computer at the -same time, by placing the object files for each architecture in their -own directory. To do this, you can use GNU `make'. `cd' to the -directory where you want the object files and executables to go and run -the `configure' script. `configure' automatically checks for the -source code in the directory that `configure' is in and in `..'. This -is known as a "VPATH" build. - - With a non-GNU `make', it is safer to compile the package for one -architecture at a time in the source code directory. After you have -installed the package for one architecture, use `make distclean' before -reconfiguring for another architecture. - - On MacOS X 10.5 and later systems, you can create libraries and -executables that work on multiple system types--known as "fat" or -"universal" binaries--by specifying multiple `-arch' options to the -compiler but only a single `-arch' option to the preprocessor. Like -this: - - ./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ - CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \ - CPP="gcc -E" CXXCPP="g++ -E" - - This is not guaranteed to produce working output in all cases, you -may have to build one architecture at a time and combine the results -using the `lipo' tool if you have problems. - -Installation Names -================== - - By default, `make install' installs the package's commands under -`/usr/local/bin', include files under `/usr/local/include', etc. You -can specify an installation prefix other than `/usr/local' by giving -`configure' the option `--prefix=PREFIX', where PREFIX must be an -absolute file name. - - You can specify separate installation prefixes for -architecture-specific files and architecture-independent files. If you -pass the option `--exec-prefix=PREFIX' to `configure', the package uses -PREFIX as the prefix for installing programs and libraries. -Documentation and other data files still use the regular prefix. - - In addition, if you use an unusual directory layout you can give -options like `--bindir=DIR' to specify different values for particular -kinds of files. Run `configure --help' for a list of the directories -you can set and what kinds of files go in them. In general, the -default for these options is expressed in terms of `${prefix}', so that -specifying just `--prefix' will affect all of the other directory -specifications that were not explicitly provided. - - The most portable way to affect installation locations is to pass the -correct locations to `configure'; however, many packages provide one or -both of the following shortcuts of passing variable assignments to the -`make install' command line to change installation locations without -having to reconfigure or recompile. - - The first method involves providing an override variable for each -affected directory. For example, `make install -prefix=/alternate/directory' will choose an alternate location for all -directory configuration variables that were expressed in terms of -`${prefix}'. Any directories that were specified during `configure', -but not in terms of `${prefix}', must each be overridden at install -time for the entire installation to be relocated. The approach of -makefile variable overrides for each directory variable is required by -the GNU Coding Standards, and ideally causes no recompilation. -However, some platforms have known limitations with the semantics of -shared libraries that end up requiring recompilation when using this -method, particularly noticeable in packages that use GNU Libtool. - - The second method involves providing the `DESTDIR' variable. For -example, `make install DESTDIR=/alternate/directory' will prepend -`/alternate/directory' before all installation names. The approach of -`DESTDIR' overrides is not required by the GNU Coding Standards, and -does not work on platforms that have drive letters. On the other hand, -it does better at avoiding recompilation issues, and works well even -when some directory options were not specified in terms of `${prefix}' -at `configure' time. - -Optional Features -================= - - If the package supports it, you can cause programs to be installed -with an extra prefix or suffix on their names by giving `configure' the -option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. - - Some packages pay attention to `--enable-FEATURE' options to -`configure', where FEATURE indicates an optional part of the package. -They may also pay attention to `--with-PACKAGE' options, where PACKAGE -is something like `gnu-as' or `x' (for the X Window System). The -`README' should mention any `--enable-' and `--with-' options that the -package recognizes. - - For packages that use the X Window System, `configure' can usually -find the X include and library files automatically, but if it doesn't, -you can use the `configure' options `--x-includes=DIR' and -`--x-libraries=DIR' to specify their locations. - - Some packages offer the ability to configure how verbose the -execution of `make' will be. For these packages, running `./configure ---enable-silent-rules' sets the default to minimal output, which can be -overridden with `make V=1'; while running `./configure ---disable-silent-rules' sets the default to verbose, which can be -overridden with `make V=0'. - -Particular systems -================== - - On HP-UX, the default C compiler is not ANSI C compatible. If GNU -CC is not installed, it is recommended to use the following options in -order to use an ANSI C compiler: - - ./configure CC="cc -Ae -D_XOPEN_SOURCE=500" - -and if that doesn't work, install pre-built binaries of GCC for HP-UX. - - HP-UX `make' updates targets which have the same time stamps as -their prerequisites, which makes it generally unusable when shipped -generated files such as `configure' are involved. Use GNU `make' -instead. - - On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot -parse its `' header file. The option `-nodtk' can be used as -a workaround. If GNU CC is not installed, it is therefore recommended -to try - - ./configure CC="cc" - -and if that doesn't work, try - - ./configure CC="cc -nodtk" - - On Solaris, don't put `/usr/ucb' early in your `PATH'. This -directory contains several dysfunctional programs; working variants of -these programs are available in `/usr/bin'. So, if you need `/usr/ucb' -in your `PATH', put it _after_ `/usr/bin'. - - On Haiku, software installed for all users goes in `/boot/common', -not `/usr/local'. It is recommended to use the following options: - - ./configure --prefix=/boot/common - -Specifying the System Type -========================== - - There may be some features `configure' cannot figure out -automatically, but needs to determine by the type of machine the package -will run on. Usually, assuming the package is built to be run on the -_same_ architectures, `configure' can figure that out, but if it prints -a message saying it cannot guess the machine type, give it the -`--build=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name which has the form: - - CPU-COMPANY-SYSTEM - -where SYSTEM can have one of these forms: - - OS - KERNEL-OS - - See the file `config.sub' for the possible values of each field. If -`config.sub' isn't included in this package, then this package doesn't -need to know the machine type. - - If you are _building_ compiler tools for cross-compiling, you should -use the option `--target=TYPE' to select the type of system they will -produce code for. - - If you want to _use_ a cross compiler, that generates code for a -platform different from the build platform, you should specify the -"host" platform (i.e., that on which the generated programs will -eventually be run) with `--host=TYPE'. - -Sharing Defaults -================ - - If you want to set default values for `configure' scripts to share, -you can create a site shell script called `config.site' that gives -default values for variables like `CC', `cache_file', and `prefix'. -`configure' looks for `PREFIX/share/config.site' if it exists, then -`PREFIX/etc/config.site' if it exists. Or, you can set the -`CONFIG_SITE' environment variable to the location of the site script. -A warning: not all `configure' scripts look for a site script. - -Defining Variables -================== - - Variables not defined in a site shell script can be set in the -environment passed to `configure'. However, some packages may run -configure again during the build, and the customized values of these -variables may be lost. In order to avoid this problem, you should set -them in the `configure' command line, using `VAR=value'. For example: - - ./configure CC=/usr/local2/bin/gcc - -causes the specified `gcc' to be used as the C compiler (unless it is -overridden in the site shell script). - -Unfortunately, this technique does not work for `CONFIG_SHELL' due to -an Autoconf bug. Until the bug is fixed you can use this workaround: - - CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash - -`configure' Invocation -====================== - - `configure' recognizes the following options to control how it -operates. - -`--help' -`-h' - Print a summary of all of the options to `configure', and exit. - -`--help=short' -`--help=recursive' - Print a summary of the options unique to this package's - `configure', and exit. The `short' variant lists options used - only in the top level, while the `recursive' variant lists options - also present in any nested packages. - -`--version' -`-V' - Print the version of Autoconf used to generate the `configure' - script, and exit. - -`--cache-file=FILE' - Enable the cache: use and save the results of the tests in FILE, - traditionally `config.cache'. FILE defaults to `/dev/null' to - disable caching. - -`--config-cache' -`-C' - Alias for `--cache-file=config.cache'. - -`--quiet' -`--silent' -`-q' - Do not print messages saying which checks are being made. To - suppress all normal output, redirect it to `/dev/null' (any error - messages will still be shown). - -`--srcdir=DIR' - Look for the package's source code in directory DIR. Usually - `configure' can determine that directory automatically. - -`--prefix=DIR' - Use DIR as the installation prefix. *note Installation Names:: - for more details, including other options available for fine-tuning - the installation locations. - -`--no-create' -`-n' - Run the configure checks, but stop before creating any output - files. - -`configure' also accepts some other, not widely useful, options. Run -`configure --help' for more details. - diff --git a/autoconf/README.first b/autoconf/README.first index 5c2ea0a70f..75c4a76d61 100644 --- a/autoconf/README.first +++ b/autoconf/README.first @@ -1,11 +1,12 @@ -This directory contains components use to build an autoconf-ready package -of the SQLite amalgamation: sqlite-autoconf-30XXXXXX.tar.gz +This directory contains components used to build an autoconf-like +package of the SQLite amalgamation: sqlite-autoconf-30XXXXXX.tar.gz -To build the autoconf amalgamation, run from the top-level: +To build the autoconf amalgamation, run from the top of the canonical +source tree: ./configure make amalgamation-tarball -The amalgamation-tarball target (also available in "main.mk") runs the -script tool/mkautoconfamal.sh which does the work. Refer to that script -for details. +The amalgamation-tarball target (available in "main.mk") runs the +script tool/mkautoconfamal.sh which does the work. Refer to that +script for details. diff --git a/autoconf/README.txt b/autoconf/README.txt index b3d3510746..646c0a1215 100644 --- a/autoconf/README.txt +++ b/autoconf/README.txt @@ -4,7 +4,7 @@ This package contains: * the sqlite3.h and sqlite3ext.h header files that define the C-language interface to the sqlite3.c library file * the shell.c file used to build the sqlite3 command-line shell program - * autoconf/automake installation infrastucture for building on POSIX + * autoconf-like installation infrastucture for building on POSIX compliant systems * a Makefile.msc, sqlite3.rc, and Replace.cs for building with Microsoft Visual C++ on Windows @@ -19,8 +19,10 @@ using only generic tools and without having to install TCL. The purpose of this package is to provide that capability. This package contains a pre-build SQLite amalgamation file "sqlite3.c" -(and its associated header file "sqlite3.h"). Because the amalgamation -has been pre-built, no TCL is required. +(and its associated header file "sqlite3.h"). Because the +amalgamation has been pre-built, no TCL is required for the code +generate (the configure script itself is written in TCL but it can use +the embedded copy of JimTCL). REASONS TO USE THE CANONICAL BUILD SYSTEM RATHER THAN THIS PACKAGE ================================================================== @@ -47,14 +49,12 @@ SUMMARY OF HOW TO BUILD USING THIS PACKAGE BUILDING ON POSIX ================= -The generic installation instructions for autoconf/automake are found -in the INSTALL file. +The configure script follows common conventions, making it easy +to use for anyone who has configured a software tree before. +It supports a number of build-time flags, the full list of which +can be seen by running: -The following SQLite specific boolean options are supported: - - --enable-readline use readline in shell tool [default=yes] - --enable-threadsafe build a thread-safe library [default=yes] - --enable-dynamic-extensions support loadable extensions [default=yes] + ./configure --help The default value for the CFLAGS variable (options passed to the C compiler) includes debugging symbols in the build, resulting in larger @@ -65,10 +65,11 @@ line like this: to produce a smaller installation footprint. -Other SQLite compilation parameters can also be set using CFLAGS. For +Many SQLite compilation parameters can be defined by passing flags +to the configure script. Others may be passed on in the CFLAGS. For example: - $ CFLAGS="-Os -DSQLITE_THREADSAFE=0" ./configure + $ CFLAGS="-Os -DSQLITE_OMIT_DEPRECATED" ./configure BUILDING WITH MICROSOFT VISUAL C++ diff --git a/autoconf/auto.def b/autoconf/auto.def index 28faeee391..0f36e733ca 100644 --- a/autoconf/auto.def +++ b/autoconf/auto.def @@ -2,10 +2,10 @@ # ^^^ help out editors which guess this file's content type. # # This is the main autosetup-compatible configure script for the -# TEA build of the SQLite project. +# "autoconf" bundle of the SQLite project. # -# This script should be kept compatible with JimTCL, a copy of which -# is included in this source tree as ./autosetup/jimsh0.c. +# This script must be kept compatible with JimTCL, a copy of which is +# included in this source tree as ./autosetup/jimsh0.c. # use sqlite-config diff --git a/autoconf/configure.ac b/autoconf/configure.ac deleted file mode 100644 index 0c7a32db1f..0000000000 --- a/autoconf/configure.ac +++ /dev/null @@ -1,270 +0,0 @@ - -#----------------------------------------------------------------------- -# Supports the following non-standard switches. -# -# --enable-threadsafe -# --enable-readline -# --enable-editline -# --enable-static-shell -# --enable-dynamic-extensions -# - -AC_PREREQ(2.61) -AC_INIT(sqlite, --SQLITE-VERSION--, http://www.sqlite.org) -AC_CONFIG_SRCDIR([sqlite3.c]) -AC_CONFIG_AUX_DIR([.]) - -# Use automake. -AM_INIT_AUTOMAKE([foreign]) - -AC_SYS_LARGEFILE - -# Check for required programs. -AC_PROG_CC -AC_PROG_LIBTOOL -AC_PROG_MKDIR_P - -# Check for library functions that SQLite can optionally use. -AC_CHECK_FUNCS([fdatasync usleep fullfsync localtime_r gmtime_r]) -AC_FUNC_STRERROR_R - -AC_CONFIG_FILES([Makefile sqlite3.pc]) -BUILD_CFLAGS= -AC_SUBST(BUILD_CFLAGS) - -#------------------------------------------------------------------------- -# Two options to enable readline compatible libraries: -# -# --enable-editline -# --enable-readline -# -# Both are enabled by default. If, after command line processing both are -# still enabled, the script searches for editline first and automatically -# disables readline if it is found. So, to use readline explicitly, the -# user must pass "--disable-editline". To disable command line editing -# support altogether, "--disable-editline --disable-readline". -# -# When searching for either library, check for headers before libraries -# as some distros supply packages that contain libraries but not header -# files, which come as a separate development package. -# -AC_ARG_ENABLE(editline, [AS_HELP_STRING([--enable-editline],[use BSD libedit])]) -AC_ARG_ENABLE(readline, [AS_HELP_STRING([--enable-readline],[use readline])]) - -AS_IF([ test x"$enable_editline" != xno ],[ - AC_CHECK_HEADERS([editline/readline.h],[ - sLIBS=$LIBS - LIBS="" - AC_SEARCH_LIBS([readline],[edit],[ - AC_DEFINE([HAVE_EDITLINE],1,Define to use BSD editline) - READLINE_LIBS="$LIBS -ltinfo" - enable_readline=no - ],[],[-ltinfo]) - AS_UNSET(ac_cv_search_readline) - LIBS=$sLIBS - ]) -]) - -AS_IF([ test x"$enable_readline" != xno ],[ - AC_CHECK_HEADERS([readline/readline.h],[ - sLIBS=$LIBS - LIBS="" - AC_SEARCH_LIBS(tgetent, termcap curses ncurses ncursesw, [], []) - AC_SEARCH_LIBS(readline,[readline edit], [ - AC_DEFINE([HAVE_READLINE],1,Define to use readline or wrapper) - READLINE_LIBS=$LIBS - ]) - LIBS=$sLIBS - ]) -]) - -AC_SUBST(READLINE_LIBS) -#----------------------------------------------------------------------- - -#----------------------------------------------------------------------- -# --enable-threadsafe -# -AC_ARG_ENABLE(threadsafe, [AS_HELP_STRING( - [--enable-threadsafe], [build a thread-safe library [default=yes]])], - [], [enable_threadsafe=yes]) -if test x"$enable_threadsafe" == "xno"; then - BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_THREADSAFE=0" -else - BUILD_CFLAGS="$BUILD_CFLAGS -D_REENTRANT=1 -DSQLITE_THREADSAFE=1" - AC_SEARCH_LIBS(pthread_create, pthread) - AC_SEARCH_LIBS(pthread_mutexattr_init, pthread) -fi -#----------------------------------------------------------------------- - -#----------------------------------------------------------------------- -# --enable-dynamic-extensions -# -AC_ARG_ENABLE(dynamic-extensions, [AS_HELP_STRING( - [--enable-dynamic-extensions], [support loadable extensions [default=yes]])], - [], [enable_dynamic_extensions=yes]) -if test x"$enable_dynamic_extensions" != "xno"; then - AC_SEARCH_LIBS(dlopen, dl) -else - BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_OMIT_LOAD_EXTENSION=1" -fi -AC_MSG_CHECKING([for whether to support dynamic extensions]) -AC_MSG_RESULT($enable_dynamic_extensions) -#----------------------------------------------------------------------- - -#----------------------------------------------------------------------- -# --enable-math -# -AC_ARG_ENABLE(math, [AS_HELP_STRING( - [--enable-math], [SQL math functions [default=yes]])], - [], [enable_math=yes]) -AC_MSG_CHECKING([SQL math functions]) -if test x"$enable_math" = "xyes"; then - BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_ENABLE_MATH_FUNCTIONS" - AC_MSG_RESULT([enabled]) - AC_SEARCH_LIBS(ceil, m) -else - AC_MSG_RESULT([disabled]) -fi -#----------------------------------------------------------------------- - -#----------------------------------------------------------------------- -# --enable-fts4 -# -AC_ARG_ENABLE(fts4, [AS_HELP_STRING( - [--enable-fts4], [include fts4 support [default=yes]])], - [], [enable_fts4=yes]) -AC_MSG_CHECKING([FTS4 extension]) -if test x"$enable_fts4" = "xyes"; then - BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_ENABLE_FTS4" - AC_MSG_RESULT([enabled]) -else - AC_MSG_RESULT([disabled]) -fi -#----------------------------------------------------------------------- - -#----------------------------------------------------------------------- -# --enable-fts3 -# -AC_ARG_ENABLE(fts3, [AS_HELP_STRING( - [--enable-fts3], [include fts3 support [default=no]])], - [], []) -AC_MSG_CHECKING([FTS3 extension]) -if test x"$enable_fts3" = "xyes" -a x"$enable_fts4" = "xno"; then - BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_ENABLE_FTS3" - AC_MSG_RESULT([enabled]) -else - AC_MSG_RESULT([disabled]) -fi -#----------------------------------------------------------------------- - -#----------------------------------------------------------------------- -# --enable-fts5 -# -AC_ARG_ENABLE(fts5, [AS_HELP_STRING( - [--enable-fts5], [include fts5 support [default=yes]])], - [], [enable_fts5=yes]) -AC_MSG_CHECKING([FTS5 extension]) -if test x"$enable_fts5" = "xyes"; then - AC_MSG_RESULT([enabled]) - AC_SEARCH_LIBS(log, m) - BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_ENABLE_FTS5" -else - AC_MSG_RESULT([disabled]) -fi -#----------------------------------------------------------------------- - -#----------------------------------------------------------------------- -# --enable-rtree -# -AC_ARG_ENABLE(rtree, [AS_HELP_STRING( - [--enable-rtree], [include rtree support [default=yes]])], - [], [enable_rtree=yes]) -AC_MSG_CHECKING([RTREE extension]) -if test x"$enable_rtree" = "xyes"; then - BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_GEOPOLY" - AC_MSG_RESULT([enabled]) -else - AC_MSG_RESULT([disabled]) -fi -#----------------------------------------------------------------------- - -#----------------------------------------------------------------------- -# --enable-session -# -AC_ARG_ENABLE(session, [AS_HELP_STRING( - [--enable-session], [enable the session extension [default=no]])], - [], []) -AC_MSG_CHECKING([Session extension]) -if test x"$enable_session" = "xyes"; then - BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_ENABLE_SESSION -DSQLITE_ENABLE_PREUPDATE_HOOK" - AC_MSG_RESULT([enabled]) -else - AC_MSG_RESULT([disabled]) -fi -#----------------------------------------------------------------------- - -#----------------------------------------------------------------------- -# --enable-debug -# -AC_ARG_ENABLE(debug, [AS_HELP_STRING( - [--enable-debug], [build with debugging features enabled [default=no]])], - [], []) -AC_MSG_CHECKING([Build type]) -if test x"$enable_debug" = "xyes"; then - BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_DEBUG -DSQLITE_ENABLE_SELECTTRACE -DSQLITE_ENABLE_WHERETRACE" - CFLAGS="-g -O0" - AC_MSG_RESULT([debug]) -else - AC_MSG_RESULT([release]) -fi -#----------------------------------------------------------------------- - -#----------------------------------------------------------------------- -# --enable-static-shell -# -AC_ARG_ENABLE(static-shell, [AS_HELP_STRING( - [--enable-static-shell], - [statically link libsqlite3 into shell tool [default=yes]])], - [], [enable_static_shell=yes]) -if test x"$enable_static_shell" = "xyes"; then - EXTRA_SHELL_OBJ=sqlite3-sqlite3.$OBJEXT -else - EXTRA_SHELL_OBJ=libsqlite3.la -fi -AC_SUBST(EXTRA_SHELL_OBJ) -#----------------------------------------------------------------------- - -AC_CHECK_FUNCS(posix_fallocate) -AC_CHECK_HEADERS(zlib.h,[ - AC_SEARCH_LIBS(deflate,z,[BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_HAVE_ZLIB"]) -]) - -AC_SEARCH_LIBS(system,,,[SHELL_CFLAGS="-DSQLITE_NOHAVE_SYSTEM"]) -AC_SUBST(SHELL_CFLAGS) - -#----------------------------------------------------------------------- -# UPDATE: Maybe it's better if users just set CFLAGS before invoking -# configure. This option doesn't really add much... -# -# --enable-tempstore -# -# AC_ARG_ENABLE(tempstore, [AS_HELP_STRING( -# [--enable-tempstore], -# [in-memory temporary tables (never, no, yes, always) [default=no]])], -# [], [enable_tempstore=no]) -# AC_MSG_CHECKING([for whether or not to store temp tables in-memory]) -# case "$enable_tempstore" in -# never ) TEMP_STORE=0 ;; -# no ) TEMP_STORE=1 ;; -# always ) TEMP_STORE=3 ;; -# yes ) TEMP_STORE=3 ;; -# * ) -# TEMP_STORE=1 -# enable_tempstore=yes -# ;; -# esac -# AC_MSG_RESULT($enable_tempstore) -# AC_SUBST(TEMP_STORE) -#----------------------------------------------------------------------- - -AC_OUTPUT diff --git a/manifest b/manifest index 5a5d61168a..f787520fce 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C configure\sscript:\swork\saround\smsys's\sinability\sto\s'exec'\sa\s'.sh'\sfile\sby\sprefixing\sthe\scall\swith\san\sexplicit\s'sh',\sas\sreported\sin\s[forum:befb352a42a7cd6d|forum\spost\sbefb352a42a7cd6d]. -D 2025-01-20T20:48:18.754 +C Remove\snow-extraneous\sautoconf/INSTALL\sand\sautoconf/configure.ac\sand\supdate\sautoconf/README.*\sto\saccount\sfor\sthe\sport\sto\sautosetup. +D 2025-01-21T14:40:35.953 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -15,14 +15,12 @@ F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90 F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2 F art/sqlite370.svg 40b7e2fe8aac3add5d56dd86ab8d427a4eca5bcb3fe4f8946cb3794e1821d531 F auto.def 7833c0a8630dd3a3410dcc6c8b4d1b63f25d03d6497267624b8a37aba119cb3e -F autoconf/INSTALL 83e4a25da9fd053c7b3665eaaaf7919707915903 F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac F autoconf/Makefile.in 330a4f6a43ed3076c6e2e0627b17091a1fb1c8ab136fcc46048d6f1662f8f0d8 F autoconf/Makefile.msc ffff61fe851443015ddb6600ab69a9df503cfec25459b336be7ba8c9a9e473f8 -F autoconf/README.first 6c4f34fe115ff55d4e8dbfa3cecf04a0188292f7 -F autoconf/README.txt 5e946ffb6fbdbb114c81e1bdc862df27fce8beab557d7b0421820b0fe8fc048f -F autoconf/auto.def 1d740e01d05d34140f0f403201fe625eb6469efb9b5645f068dc6b38cb005c9a -F autoconf/configure.ac ec7fa914c5e74ff212fe879f9bb6918e1234497e05facfb641f30c4d5893b277 +F autoconf/README.first f1d3876e9a7852c22f275a6f06814e64934cecbc0b5b9617d64849094c1fd136 +F autoconf/README.txt 7f01dc3915e2d68f329011073662369e62a0938a2c69398807823c57591cb288 +F autoconf/auto.def 623e0d2339cbccc86b1c5e58d65702dc91a9fec4843a4c6198139e248579858e F autoconf/tea/Makefile.in ba0556fee8da09c066bad85a4457904e46ee2c2eabaa309c0e83a78f2f151a8e F autoconf/tea/README.txt 61e62e519579e4a112791354d6d440f8b51ea6db3b0bab58d59f29df42d2dfe3 F autoconf/tea/aclocal.m4 52c47aac44ce0ddb1f918b6993e8beb8eee88f43 @@ -2209,8 +2207,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 16fa20413e3f3f0b6ea5d97022945843d1f785ac0142836f2a3651fd1917385f -R 530ea71496225522d46777a9a2bdcaa9 +P 25b01f1c9a5e606441bfd4e729fb88361436dffc76ef7a10c04a4d4ad0bcc655 +R 3def29cc56a0bda1ef86cab9a156aa58 U stephan -Z fe186d8bfdcab6314981338fcde5c9d6 +Z 97ba8d81293efc855c346a0339493c53 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index b94a093c93..a7c2090ea7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -25b01f1c9a5e606441bfd4e729fb88361436dffc76ef7a10c04a4d4ad0bcc655 +646667af8ca2140d823facf4578105c3d9815ea34b2a4cb96103c2fe7d718229 From 2e899ccaff0baca5cd6db7e8a24be8728c97a371 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 21 Jan 2025 15:12:00 +0000 Subject: [PATCH 095/220] The FuncDev.nArg field values -3 and -4 now have special meansing of 1 or more or 2 or more arguments, respectively. This saves space in the built-in function table, resulting in slightly faster performance and a reduced binary size. FossilOrigin-Name: 753fd747f24c5e9a019eb00b8a4f66e65c6733ba10a7adbd1b55786867c32ca6 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/callback.c | 10 ++++++++-- src/func.c | 17 +++++------------ 4 files changed, 22 insertions(+), 23 deletions(-) diff --git a/manifest b/manifest index b6bbc0b68f..b6f6b78089 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Have\sfts5\sbetter\shandle\sOOM\serrors\sfrom\ssqlite3_blob_close(). -D 2025-01-21T14:34:59.118 +C The\sFuncDev.nArg\sfield\svalues\s-3\sand\s-4\snow\shave\sspecial\smeansing\sof\s1\sor\smore\nor\s2\sor\smore\sarguments,\srespectively.\s\sThis\ssaves\sspace\sin\sthe\sbuilt-in\nfunction\stable,\sresulting\sin\sslightly\sfaster\sperformance\sand\sa\sreduced\sbinary\nsize. +D 2025-01-21T15:12:00.408 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -722,7 +722,7 @@ F src/btree.c 63ca6b647342e8cef643863cd0962a542f133e1069460725ba4461dcda92b03c F src/btree.h 18e5e7b2124c23426a283523e5f31a4bff029131b795bb82391f9d2f3136fc50 F src/btreeInt.h 98aadb6dcb77b012cab2574d6a728fad56b337fc946839b9898c4b4c969e30b6 F src/build.c c6b09342d870a509529244ed8e19b4175a261f2e3163c199241d69e1d8a57607 -F src/callback.c db3a45e376deff6a16c0058163fe0ae2b73a2945f3f408ca32cf74960b28d490 +F src/callback.c acae8c8dddda41ee85cfdf19b926eefe830f371069f8aadca3aa39adf5b1c859 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c d35723024b963edce9c0fad5b3303e8bb9266083784844baed10a6dedfe26f3b F src/date.c 89ce1ff20512a7fa5070ba6e7dd5c171148ca7d580955795bf97c79c2456144a @@ -732,7 +732,7 @@ F src/delete.c 03a77ba20e54f0f42ebd8eddf15411ed6bdb06a2c472ac4b6b336521bf7cea42 F src/expr.c 30a407765d4e4b592f9f958085fb4e8336e54fa46a70ade7f5a67111bc191563 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 928ed2517e8732113d2b9821aa37af639688d752f4ea9ac6e0e393d713eeb76f -F src/func.c 89b733a5f513c4bc06b7271384363d5693d62782de8295bc87b97d79862c9714 +F src/func.c 30051410d0379059e1e3642ffc0caae6963a2b01b3b6d9dd44c5e09b1a66d066 F src/global.c a19e4b1ca1335f560e9560e590fc13081e21f670643367f99cb9e8f9dc7d615b F src/hash.c 9ee4269fb1d6632a6fecfb9479c93a1f29271bddbbaf215dd60420bcb80c7220 F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51 @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P a8d9dcfd23fbfcd887e451382836c1e88215984cc01e00be11387dbf4ab26fd8 -R 0ff09c4d1a6df4a00a8ce3e62a42f2fa -U dan -Z dbb8340d556717da4724fb10b820bbe7 +P f418350f3f83147bc5817a885be6e39ff9ff5722742a88d17600729c53c65010 +R 214f345108f048affd4b7abd9f2ea035 +U drh +Z b46d6184b5d599a41424bec3e41b4c80 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 07c5f158d9..bad8235170 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f418350f3f83147bc5817a885be6e39ff9ff5722742a88d17600729c53c65010 +753fd747f24c5e9a019eb00b8a4f66e65c6733ba10a7adbd1b55786867c32ca6 diff --git a/src/callback.c b/src/callback.c index c36d51a4ec..6fe21a2956 100644 --- a/src/callback.c +++ b/src/callback.c @@ -302,12 +302,18 @@ static int matchQuality( u8 enc /* Desired text encoding */ ){ int match; - assert( p->nArg>=-1 ); + assert( p->nArg>=(-4) && p->nArg!=(-2) ); + assert( nArg>=(-2) ); /* Wrong number of arguments means "no match" */ if( p->nArg!=nArg ){ - if( nArg==(-2) ) return (p->xSFunc==0) ? 0 : FUNC_PERFECT_MATCH; + if( nArg==(-2) ) return p->xSFunc==0 ? 0 : FUNC_PERFECT_MATCH; if( p->nArg>=0 ) return 0; + /* Special p->nArg values available to built-in functions only: + ** -3 1 or more arguments required + ** -4 2 or more arguments required + */ + if( p->nArg<(-2) && nArg<(-2-p->nArg) ) return 0; } /* Give a better score to a function with a specific number of arguments diff --git a/src/func.c b/src/func.c index 7a4774527d..2bd4be31ca 100644 --- a/src/func.c +++ b/src/func.c @@ -2695,12 +2695,10 @@ void sqlite3RegisterBuiltinFunctions(void){ FUNCTION(rtrim, 2, 2, 0, trimFunc ), FUNCTION(trim, 1, 3, 0, trimFunc ), FUNCTION(trim, 2, 3, 0, trimFunc ), - FUNCTION(min, -1, 0, 1, minmaxFunc ), - FUNCTION(min, 0, 0, 1, 0 ), + FUNCTION(min, -3, 0, 1, minmaxFunc ), WAGGREGATE(min, 1, 0, 1, minmaxStep, minMaxFinalize, minMaxValue, 0, SQLITE_FUNC_MINMAX|SQLITE_FUNC_ANYORDER ), - FUNCTION(max, -1, 1, 1, minmaxFunc ), - FUNCTION(max, 0, 1, 1, 0 ), + FUNCTION(max, -3, 1, 1, minmaxFunc ), WAGGREGATE(max, 1, 1, 1, minmaxStep, minMaxFinalize, minMaxValue, 0, SQLITE_FUNC_MINMAX|SQLITE_FUNC_ANYORDER ), FUNCTION2(typeof, 1, 0, 0, typeofFunc, SQLITE_FUNC_TYPEOF), @@ -2727,11 +2725,8 @@ void sqlite3RegisterBuiltinFunctions(void){ FUNCTION(hex, 1, 0, 0, hexFunc ), FUNCTION(unhex, 1, 0, 0, unhexFunc ), FUNCTION(unhex, 2, 0, 0, unhexFunc ), - FUNCTION(concat, -1, 0, 0, concatFunc ), - FUNCTION(concat, 0, 0, 0, 0 ), - FUNCTION(concat_ws, -1, 0, 0, concatwsFunc ), - FUNCTION(concat_ws, 0, 0, 0, 0 ), - FUNCTION(concat_ws, 1, 0, 0, 0 ), + FUNCTION(concat, -3, 0, 0, concatFunc ), + FUNCTION(concat_ws, -4, 0, 0, concatwsFunc ), INLINE_FUNC(ifnull, 2, INLINEFUNC_coalesce, 0 ), VFUNCTION(random, 0, 0, 0, randomFunc ), VFUNCTION(randomblob, 1, 0, 0, randomBlob ), @@ -2775,8 +2770,6 @@ void sqlite3RegisterBuiltinFunctions(void){ #ifdef SQLITE_ENABLE_UNKNOWN_SQL_FUNCTION FUNCTION(unknown, -1, 0, 0, unknownFunc ), #endif - FUNCTION(coalesce, 1, 0, 0, 0 ), - FUNCTION(coalesce, 0, 0, 0, 0 ), #ifdef SQLITE_ENABLE_MATH_FUNCTIONS MFUNCTION(ceil, 1, xCeil, ceilingFunc ), MFUNCTION(ceiling, 1, xCeil, ceilingFunc ), @@ -2814,7 +2807,7 @@ void sqlite3RegisterBuiltinFunctions(void){ MFUNCTION(pi, 0, 0, piFunc ), #endif /* SQLITE_ENABLE_MATH_FUNCTIONS */ FUNCTION(sign, 1, 0, 0, signFunc ), - INLINE_FUNC(coalesce, -1, INLINEFUNC_coalesce, 0 ), + INLINE_FUNC(coalesce, -4, INLINEFUNC_coalesce, 0 ), INLINE_FUNC(iif, 2, INLINEFUNC_iif, 0 ), INLINE_FUNC(iif, 3, INLINEFUNC_iif, 0 ), INLINE_FUNC(if, 2, INLINEFUNC_iif, 0 ), From a6b62a26d49d952f0d64efc8562a68dc287e4cb6 Mon Sep 17 00:00:00 2001 From: stephan Date: Tue, 21 Jan 2025 15:45:03 +0000 Subject: [PATCH 096/220] Explain the lack of docs in autoconf/Makefile.in and refer interested readers to main.mk in canonical tree. Minor cleanups and fixes in tool/mkautoconfamal.sh. FossilOrigin-Name: e5bbc2428f1000a451c1b4afd287742b9896a1a6c82d9706c6b8e7d6fb3b1e44 --- autoconf/Makefile.in | 5 ++++- manifest | 14 +++++++------- manifest.uuid | 2 +- tool/mkautoconfamal.sh | 30 ++++++++++++++---------------- 4 files changed, 26 insertions(+), 25 deletions(-) diff --git a/autoconf/Makefile.in b/autoconf/Makefile.in index d43300c829..0c97f16321 100644 --- a/autoconf/Makefile.in +++ b/autoconf/Makefile.in @@ -1,5 +1,8 @@ ######################################################################## -# This is a main makefile for the "autoconf" bundle of SQLite. +# This is a main makefile for the "autoconf" bundle of SQLite. This is +# a trimmed-down version of the canonical makefile, devoid of most +# documentation. For the full docs, see 'main.mk' in the canonical +# source tree. all: TOP = @abs_top_srcdir@ diff --git a/manifest b/manifest index f787520fce..6bd9ed83f1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\snow-extraneous\sautoconf/INSTALL\sand\sautoconf/configure.ac\sand\supdate\sautoconf/README.*\sto\saccount\sfor\sthe\sport\sto\sautosetup. -D 2025-01-21T14:40:35.953 +C Explain\sthe\slack\sof\sdocs\sin\sautoconf/Makefile.in\sand\srefer\sinterested\sreaders\sto\smain.mk\sin\scanonical\stree.\sMinor\scleanups\sand\sfixes\sin\stool/mkautoconfamal.sh. +D 2025-01-21T15:45:03.498 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -16,7 +16,7 @@ F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2 F art/sqlite370.svg 40b7e2fe8aac3add5d56dd86ab8d427a4eca5bcb3fe4f8946cb3794e1821d531 F auto.def 7833c0a8630dd3a3410dcc6c8b4d1b63f25d03d6497267624b8a37aba119cb3e F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac -F autoconf/Makefile.in 330a4f6a43ed3076c6e2e0627b17091a1fb1c8ab136fcc46048d6f1662f8f0d8 +F autoconf/Makefile.in 56697ad25ecf23afa317148b06bdc14f85960b42e5ec434ac1ba87f63a3cb789 F autoconf/Makefile.msc ffff61fe851443015ddb6600ab69a9df503cfec25459b336be7ba8c9a9e473f8 F autoconf/README.first f1d3876e9a7852c22f275a6f06814e64934cecbc0b5b9617d64849094c1fd136 F autoconf/README.txt 7f01dc3915e2d68f329011073662369e62a0938a2c69398807823c57591cb288 @@ -2142,7 +2142,7 @@ F tool/logest.c c34e5944318415de513d29a6098df247a9618c96d83c38d4abd88641fe46e669 F tool/max-limits.c cbb635fbb37ae4d05f240bfb5b5270bb63c54439 F tool/merge-test.tcl de76b62f2de2a92d4c1ca4f976bce0aea6899e0229e250479b229b2a1914b176 F tool/mkamalzip.tcl 8aa5ebe7973c8b8774062d34e15fea9815c4cc2ceea3a9b184695f005910876a -F tool/mkautoconfamal.sh de0dd50c6c5899330bb1f9c9fcaf71e8fbede3229034839cafc1e8485c5e827d +F tool/mkautoconfamal.sh 67e14ee5d0c6d8e83bca19807c4761ab3a22e14c8bf5f3bdc56989674770c25e F tool/mkccode.tcl 210159febe0ef0ecbc53c79833500663ceaba0115b2b374405818dc835b5f84b x F tool/mkctimec.tcl ef6a67ec82e5b6fc19152a4c79f237227b18bf67ff16d155bac7adb94355d9cf x F tool/mkkeywordhash.c 6b0be901c47f9ad42215fc995eb2f4384ac49213b1fba395102ec3e999acf559 @@ -2207,8 +2207,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 25b01f1c9a5e606441bfd4e729fb88361436dffc76ef7a10c04a4d4ad0bcc655 -R 3def29cc56a0bda1ef86cab9a156aa58 +P 646667af8ca2140d823facf4578105c3d9815ea34b2a4cb96103c2fe7d718229 +R 9bbf87fd9926eb3023e4de6818e02af4 U stephan -Z 97ba8d81293efc855c346a0339493c53 +Z c74dae274099c477daebfdd70dd618de # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index a7c2090ea7..0adcfc52ad 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -646667af8ca2140d823facf4578105c3d9815ea34b2a4cb96103c2fe7d718229 +e5bbc2428f1000a451c1b4afd287742b9896a1a6c82d9706c6b8e7d6fb3b1e44 diff --git a/tool/mkautoconfamal.sh b/tool/mkautoconfamal.sh index 5c96b26c64..0771d5bf84 100644 --- a/tool/mkautoconfamal.sh +++ b/tool/mkautoconfamal.sh @@ -23,7 +23,7 @@ set -u TMPSPACE=./mkpkg_tmp_dir VERSION=`cat $TOP/VERSION` HASH=`cut -c1-10 $TOP/manifest.uuid` -DATETIME=`grep '^D' $TOP/manifest | cut -c3- | tr -c -d '[0-9]'` +DATETIME=`grep '^D' $TOP/manifest | tr -c -d '[0-9]' | cut -c1-12` # Verify that the version number in the TEA autoconf file is correct. # Fail with an error if not. @@ -69,24 +69,22 @@ cp $TOP/VERSION $TMPSPACE cp $TOP/main.mk $TMPSPACE cd $TMPSPACE -#autoreconf -i -#libtoolize -#aclocal -#autoconf -#automake --add-missing -# This bit is only for use during porting of the -# autoconf bundle to autosetup. -if true; then - find . -name '*~' -exec rm \{} \; -fi +#if true; then + # Clean up *~ files (emacs-generated backups). + # This bit is only for use during development of + # the autoconf bundle. +# find . -name '*~' -exec rm \{} \; +#fi mkdir -p tea/generic -echo "#ifdef USE_SYSTEM_SQLITE" > tea/generic/tclsqlite3.c -echo "# include " >> tea/generic/tclsqlite3.c -echo "#else" >> tea/generic/tclsqlite3.c -echo "#include \"sqlite3.c\"" >> tea/generic/tclsqlite3.c -echo "#endif" >> tea/generic/tclsqlite3.c +cat < tea/generic/tclsqlite3.c +#ifdef USE_SYSTEM_SQLITE +# include +#else +# include "sqlite3.c" +#endif +EOF cat $TOP/src/tclsqlite.c >> tea/generic/tclsqlite3.c sed "s/AC_INIT(\[sqlite\], .*)/AC_INIT([sqlite], [$VERSION])/" tea/configure.ac > tmp From 8e7a16895c62f8c56e8ada82cecdacaf1e97fcd3 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 21 Jan 2025 16:30:55 +0000 Subject: [PATCH 097/220] Performance improvements to the (debug-use only) Mem.pScopyFrom logic, resulting in about 8x faster performance under -DSQLITE_DEBUG for the query in from [forum:/forumpost/0025389d0860af82|forum post 0025389d0860af82]. This change only affects builds that use -DSQLITE_DEBUG. FossilOrigin-Name: 7fb1ae25d1572dd7709a0f850c148a5f745a524f01ea231e29a1ebc37c173fb9 --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/vdbe.c | 3 +++ src/vdbeInt.h | 1 + src/vdbeapi.c | 1 + src/vdbeaux.c | 1 + src/vdbemem.c | 41 ++++++++++++++++++++++------------------- 7 files changed, 39 insertions(+), 30 deletions(-) diff --git a/manifest b/manifest index b6f6b78089..b9e1cd0b1e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\sFuncDev.nArg\sfield\svalues\s-3\sand\s-4\snow\shave\sspecial\smeansing\sof\s1\sor\smore\nor\s2\sor\smore\sarguments,\srespectively.\s\sThis\ssaves\sspace\sin\sthe\sbuilt-in\nfunction\stable,\sresulting\sin\sslightly\sfaster\sperformance\sand\sa\sreduced\sbinary\nsize. -D 2025-01-21T15:12:00.408 +C Performance\simprovements\sto\sthe\s(debug-use\sonly)\sMem.pScopyFrom\slogic,\sresulting\nin\sabout\s8x\sfaster\sperformance\sunder\s-DSQLITE_DEBUG\sfor\sthe\squery\sin\sfrom\n[forum:/forumpost/0025389d0860af82|forum\spost\s0025389d0860af82].\s\sThis\schange\nonly\saffects\sbuilds\sthat\suse\s-DSQLITE_DEBUG. +D 2025-01-21T16:30:55.694 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -848,13 +848,13 @@ F src/upsert.c 215328c3f91623c520ec8672c44323553f12caeb4f01b1090ebdca99fdf7b4f1 F src/utf.c 8b29d9a5956569ea2700f869669b8ef67a9662ee5e724ff77ab3c387e27094ba F src/util.c e5f6a5eeaa26b69054a43bbd0048cfe3d2851f6961052b35aed8f695df922850 F src/vacuum.c b763b6457bd058d2072ef9364832351fd8d11e8abf70cbb349657360f7d55c40 -F src/vdbe.c 8a6eb02823b424b273614bae41579392a5c495424592b60423dd2c443a583df0 +F src/vdbe.c b428a751953c0c2ff85e3e152ec16e29d488895cd541c8c20876ff9f3bf6978a F src/vdbe.h 9676348d342bd04e21e384c63b57224171ce84fac77853357334ef94c4d33cf4 -F src/vdbeInt.h bf294a0c8fc4cc80779e74b04b8bd82c6e1197b3137cefe0b16cdf002fc7dfd6 -F src/vdbeapi.c 033decc098df353b97a5ca14302ad812e2567f1037747c2d5fcda62aac1bb74e -F src/vdbeaux.c 5fcbc642a3d3d88c5ea15cadf2c8b8e4e067cb9ff374beb1875c9d209001299e +F src/vdbeInt.h 895b1ab7536f018d3d70d690f6c0adbd1062b6dddce1c2cad912927856d4033c +F src/vdbeapi.c 76fa76b21f46afc70e71ecd69954f601e9b80b5fb0c1eb7ace06d30802255768 +F src/vdbeaux.c 885e16100597507fbbe09d82cbb963bff3fd8a9c1e358dc4f463fc95feb18e8b F src/vdbeblob.c 255be187436da38b01f276c02e6a08103489bbe2a7c6c21537b7aecbe0e1f797 -F src/vdbemem.c df568ef0187e4be2788c35174f6d9b8566ab9475f9aff2d73907ed05aa5684b2 +F src/vdbemem.c 977438546df236c6a3e7d8b4fe86c0643c13b89b00235db1f11c3a91a4796d30 F src/vdbesort.c d0a3c7056c081703c8b6d91ad60f17da5e062a5c64bf568ed0fa1b5f4cae311f F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823 F src/vdbevtab.c fc46b9cbd759dc013f0b3724549cc0d71379183c667df3a5988f7e2f1bd485f3 @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P f418350f3f83147bc5817a885be6e39ff9ff5722742a88d17600729c53c65010 -R 214f345108f048affd4b7abd9f2ea035 +P 753fd747f24c5e9a019eb00b8a4f66e65c6733ba10a7adbd1b55786867c32ca6 +R f2e8145ad0d67966271c1c923a7301c7 U drh -Z b46d6184b5d599a41424bec3e41b4c80 +Z 86ef734f24e1aa297cb586202f4cb17a # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index bad8235170..14622345fc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -753fd747f24c5e9a019eb00b8a4f66e65c6733ba10a7adbd1b55786867c32ca6 +7fb1ae25d1572dd7709a0f850c148a5f745a524f01ea231e29a1ebc37c173fb9 diff --git a/src/vdbe.c b/src/vdbe.c index 558970ed95..d41ac8d517 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -607,6 +607,7 @@ static void registerTrace(int iReg, Mem *p){ printf("R[%d] = ", iReg); memTracePrint(p); if( p->pScopyFrom ){ + assert( p->pScopyFrom->bScopy ); printf(" <== R[%d]", (int)(p->pScopyFrom - &p[-iReg])); } printf("\n"); @@ -1590,6 +1591,7 @@ case OP_Move: { { int i; for(i=1; inMem; i++){ if( aMem[i].pScopyFrom==pIn1 ){ + assert( aMem[i].bScopy ); aMem[i].pScopyFrom = pOut; } } @@ -1662,6 +1664,7 @@ case OP_SCopy: { /* out2 */ #ifdef SQLITE_DEBUG pOut->pScopyFrom = pIn1; pOut->mScopyFlags = pIn1->flags; + pIn1->bScopy = 1; #endif break; } diff --git a/src/vdbeInt.h b/src/vdbeInt.h index 2cb4f8c2a1..24cf1ac56c 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -244,6 +244,7 @@ struct sqlite3_value { #ifdef SQLITE_DEBUG Mem *pScopyFrom; /* This Mem is a shallow copy of pScopyFrom */ u16 mScopyFlags; /* flags value immediately after the shallow copy */ + u8 bScopy; /* The pScopyFrom of some other Mem *might* point here */ #endif }; diff --git a/src/vdbeapi.c b/src/vdbeapi.c index 5fc04b139c..113b8a9c04 100644 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@ -1294,6 +1294,7 @@ static const Mem *columnNullValue(void){ #ifdef SQLITE_DEBUG /* .pScopyFrom = */ (Mem*)0, /* .mScopyFlags= */ 0, + /* .bScopy = */ 0, #endif }; return &nullMem; diff --git a/src/vdbeaux.c b/src/vdbeaux.c index b9e8b3cdf8..81dca10f02 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -2152,6 +2152,7 @@ static void initMemArray(Mem *p, int N, sqlite3 *db, u16 flags){ p->szMalloc = 0; #ifdef SQLITE_DEBUG p->pScopyFrom = 0; + p->bScopy = 0; #endif p++; }while( (--N)>0 ); diff --git a/src/vdbemem.c b/src/vdbemem.c index 0fc6b68f5e..38ba5abe80 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -1046,27 +1046,30 @@ int sqlite3VdbeMemTooBig(Mem *p){ void sqlite3VdbeMemAboutToChange(Vdbe *pVdbe, Mem *pMem){ int i; Mem *pX; - for(i=1, pX=pVdbe->aMem+1; inMem; i++, pX++){ - if( pX->pScopyFrom==pMem ){ - u16 mFlags; - if( pVdbe->db->flags & SQLITE_VdbeTrace ){ - sqlite3DebugPrintf("Invalidate R[%d] due to change in R[%d]\n", - (int)(pX - pVdbe->aMem), (int)(pMem - pVdbe->aMem)); + if( pMem->bScopy ){ + for(i=1, pX=pVdbe->aMem+1; inMem; i++, pX++){ + if( pX->pScopyFrom==pMem ){ + u16 mFlags; + if( pVdbe->db->flags & SQLITE_VdbeTrace ){ + sqlite3DebugPrintf("Invalidate R[%d] due to change in R[%d]\n", + (int)(pX - pVdbe->aMem), (int)(pMem - pVdbe->aMem)); + } + /* If pX is marked as a shallow copy of pMem, then try to verify that + ** no significant changes have been made to pX since the OP_SCopy. + ** A significant change would indicated a missed call to this + ** function for pX. Minor changes, such as adding or removing a + ** dual type, are allowed, as long as the underlying value is the + ** same. */ + mFlags = pMem->flags & pX->flags & pX->mScopyFlags; + assert( (mFlags&(MEM_Int|MEM_IntReal))==0 || pMem->u.i==pX->u.i ); + + /* pMem is the register that is changing. But also mark pX as + ** undefined so that we can quickly detect the shallow-copy error */ + pX->flags = MEM_Undefined; + pX->pScopyFrom = 0; } - /* If pX is marked as a shallow copy of pMem, then try to verify that - ** no significant changes have been made to pX since the OP_SCopy. - ** A significant change would indicated a missed call to this - ** function for pX. Minor changes, such as adding or removing a - ** dual type, are allowed, as long as the underlying value is the - ** same. */ - mFlags = pMem->flags & pX->flags & pX->mScopyFlags; - assert( (mFlags&(MEM_Int|MEM_IntReal))==0 || pMem->u.i==pX->u.i ); - - /* pMem is the register that is changing. But also mark pX as - ** undefined so that we can quickly detect the shallow-copy error */ - pX->flags = MEM_Undefined; - pX->pScopyFrom = 0; } + pMem->bScopy = 0; } pMem->pScopyFrom = 0; } From 255548562b125e6c148bb27d49aaa01b2fe61dba Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 21 Jan 2025 17:37:58 +0000 Subject: [PATCH 098/220] Fix date/time computations to deal with the sub-millisecond rounding problem identified in [forum:/forumpost/766a2c9231|forum post 766a2c9231]. FossilOrigin-Name: afb0a5923a6db4045fab5226198aab970d746d4866294ebba943c6986e97ecde --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/date.c | 5 ++++- test/date.test | 8 ++++++++ 4 files changed, 20 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index b9e1cd0b1e..2ab7b29c59 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Performance\simprovements\sto\sthe\s(debug-use\sonly)\sMem.pScopyFrom\slogic,\sresulting\nin\sabout\s8x\sfaster\sperformance\sunder\s-DSQLITE_DEBUG\sfor\sthe\squery\sin\sfrom\n[forum:/forumpost/0025389d0860af82|forum\spost\s0025389d0860af82].\s\sThis\schange\nonly\saffects\sbuilds\sthat\suse\s-DSQLITE_DEBUG. -D 2025-01-21T16:30:55.694 +C Fix\sdate/time\scomputations\sto\sdeal\swith\sthe\ssub-millisecond\srounding\nproblem\sidentified\sin\s[forum:/forumpost/766a2c9231|forum\spost\s766a2c9231]. +D 2025-01-21T17:37:58.001 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -725,7 +725,7 @@ F src/build.c c6b09342d870a509529244ed8e19b4175a261f2e3163c199241d69e1d8a57607 F src/callback.c acae8c8dddda41ee85cfdf19b926eefe830f371069f8aadca3aa39adf5b1c859 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c d35723024b963edce9c0fad5b3303e8bb9266083784844baed10a6dedfe26f3b -F src/date.c 89ce1ff20512a7fa5070ba6e7dd5c171148ca7d580955795bf97c79c2456144a +F src/date.c 842c08ac143a56a627b05ac51d68624f2b7b03e3b4cba596205e735eed64ee57 F src/dbpage.c e90410e5d4c0217dfddc4184a81e38ec4903c25d4ec0f201060a0e54e7c2099f F src/dbstat.c 73362c0df0f40ad5523a6f5501224959d0976757b511299bf892313e79d14f5c F src/delete.c 03a77ba20e54f0f42ebd8eddf15411ed6bdb06a2c472ac4b6b336521bf7cea42 @@ -1068,7 +1068,7 @@ F test/ctime.test 340f362f41f92972bbd71f44e10569a5cc694062b692231bd08aa6fe6c1c47 F test/cursorhint.test 05cf0febe5c5f8a31f199401fd1c9322249e753950d55f26f9d5aca61408a270 F test/cursorhint2.test 6f3aa9cb19e7418967a10ec6905209bcbb5968054da855fc36c8beee9ae9c42f F test/dataversion1.test 6e5e86ac681f0782e766ebcb56c019ae001522d114e0e111e5ebf68ccf2a7bb8 -F test/date.test c8ff835023f2107b57ce7a45c92265d51c98a23fc93231e998f12d850831aad6 +F test/date.test 8911c3d9fb0e496e92e0259697f431a00707222d2b3438ce1105d1790a3c0d51 F test/date2.test 7e12ec14aaf4d5e6294b4ba140445b0eca06ea50062a9c3a69c4ee13d0b6f8b1 F test/date3.test a1b77abf05c6772fe5ca2337cac1398892f2a41e62bce7e6be0f4a08a0e64ae5 F test/date4.test 75dc8401e8c0639a228cd26a6eaa4ff5ea8ccda912b9853d1c9462c476670e17 @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 753fd747f24c5e9a019eb00b8a4f66e65c6733ba10a7adbd1b55786867c32ca6 -R f2e8145ad0d67966271c1c923a7301c7 +P 7fb1ae25d1572dd7709a0f850c148a5f745a524f01ea231e29a1ebc37c173fb9 +R b5ed3ff5cc6ba0a7bea1d83d8e8c82a9 U drh -Z 86ef734f24e1aa297cb586202f4cb17a +Z a3888b28f8eea48eee70a7de9cd84dd2 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 14622345fc..a04023f095 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7fb1ae25d1572dd7709a0f850c148a5f745a524f01ea231e29a1ebc37c173fb9 +afb0a5923a6db4045fab5226198aab970d746d4866294ebba943c6986e97ecde diff --git a/src/date.c b/src/date.c index 8c48a81fa5..de27366370 100644 --- a/src/date.c +++ b/src/date.c @@ -222,6 +222,9 @@ static int parseHhMmSs(const char *zDate, DateTime *p){ zDate++; } ms /= rScale; + /* Truncate to avoid problems with sub-milliseconds + ** rounding. https://sqlite.org/forum/forumpost/766a2c9231 */ + if( ms>0.999 ) ms = 0.999; } }else{ s = 0; @@ -1429,7 +1432,7 @@ static void strftimeFunc( } case 'f': { /* Fractional seconds. (Non-standard) */ double s = x.s; - if( s>59.999 ) s = 59.999; + if( NEVER(s>59.999) ) s = 59.999; sqlite3_str_appendf(&sRes, "%06.3f", s); break; } diff --git a/test/date.test b/test/date.test index d22b652b47..2042880a92 100644 --- a/test/date.test +++ b/test/date.test @@ -651,5 +651,13 @@ datetest 19.51 {date('2000-08-31','+0022-06-00','floor')} {2023-02-28} datetest 19.52 {date('2000-08-31','+0023-06-00','ceiling')} {2024-03-02} datetest 19.53 {date('2000-08-31','+0022-06-00','ceiling')} {2023-03-03} +# 2025-01-21 +# https://sqlite.org/forum/forumpost/766a2c9231 +# +datetest 20.1 {datetime('2024-12-31 23:59:59.9990')} {2024-12-31 23:59:59} +datetest 20.2 {datetime('2024-12-31 23:59:59.9999999999999')} \ + {2024-12-31 23:59:59} +datetest 20.3 {datetime('2024-12-31 23:59:59.9995')} {2024-12-31 23:59:59} +datetest 20.4 {datetime('2024-12-31 23:59:58.9995')} {2024-12-31 23:59:58} finish_test From 9489aefb83fd72aa64fafe6a98617af9dfdcc538 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 22 Jan 2025 17:18:53 +0000 Subject: [PATCH 099/220] Add the -q/--quiet option to test/speedtest.tcl. Automatically enable -DSQLITE_OMIT_LOAD_EXTENSION and -DSQLITE_THREADSAFE=0 so that no extra libraries are required. FossilOrigin-Name: c20d21b473d8a45267262c5df1d7b102eccce8e4cfbe1e467ea66c474aea0af5 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/speedtest.tcl | 13 +++++++++++-- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 2ab7b29c59..7b86302386 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sdate/time\scomputations\sto\sdeal\swith\sthe\ssub-millisecond\srounding\nproblem\sidentified\sin\s[forum:/forumpost/766a2c9231|forum\spost\s766a2c9231]. -D 2025-01-21T17:37:58.001 +C Add\sthe\s-q/--quiet\soption\sto\stest/speedtest.tcl.\s\sAutomatically\senable\n-DSQLITE_OMIT_LOAD_EXTENSION\sand\s-DSQLITE_THREADSAFE=0\sso\sthat\sno\sextra\nlibraries\sare\srequired. +D 2025-01-22T17:18:53.134 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -1679,7 +1679,7 @@ F test/speed4.test abc0ad3399dcf9703abed2fff8705e4f8e416715 F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa F test/speed4p.test 377a0c48e5a92e0b11c1c5ebb1bc9d83a7312c922bc0cb05970ef5d6a96d1f0c F test/speedtest.md e4f467683acfdb2834ca1d6ce209c3d883dfecf73c41f77234b2368be9579de2 -F test/speedtest.tcl 96052cb8c5d44f69e0600e690794557f176ef99bd87cb4360080982d1f479a70 x +F test/speedtest.tcl 8a9362c1e429318e741b91d26888e7edcc326f98c3aea505ffd618cc5b9e7f0a x F test/speedtest1.c 323ce0956430a5aae56ea20f502da7bea3fb62b8ed02e9b0f12ab078b2b258f5 F test/spellfix.test 951a6405d49d1a23d6b78027d3877b4a33eeb8221dcab5704b499755bb4f552e F test/spellfix2.test dfc8f519a3fc204cb2dfa8b4f29821ae90f6f8c3 @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 7fb1ae25d1572dd7709a0f850c148a5f745a524f01ea231e29a1ebc37c173fb9 -R b5ed3ff5cc6ba0a7bea1d83d8e8c82a9 +P afb0a5923a6db4045fab5226198aab970d746d4866294ebba943c6986e97ecde +R 9d6f6255d4d3d13ac3e7250fb9209015 U drh -Z a3888b28f8eea48eee70a7de9cd84dd2 +Z 359fbb7e57428de2830f61ee25224064 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index a04023f095..ad960cacc6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -afb0a5923a6db4045fab5226198aab970d746d4866294ebba943c6986e97ecde +c20d21b473d8a45267262c5df1d7b102eccce8e4cfbe1e467ea66c474aea0af5 diff --git a/test/speedtest.tcl b/test/speedtest.tcl index b353077e7c..93b407c94e 100755 --- a/test/speedtest.tcl +++ b/test/speedtest.tcl @@ -26,6 +26,7 @@ Other options include: --lean "Lean" mode. --lookaside N SZ Lookahead uses N slots of SZ bytes each. --pagesize N Use N as the page size. + --quiet | -q "Quite". Put results in file but don't pop up editor --testset TEST Specify the specific testset to use. The default is "mix1". Other options include: "main", "json", "cte", "orm", "fp", "rtree". @@ -33,10 +34,11 @@ Other options include: set srcfile {} set outfile {} set difffile {} -set cflags {} +set cflags {-DSQLITE_OMIT_LOAD_EXTENSION -DSQLITE_THREADSAFE=0} set cc gcc set testset mix1 set dryrun 0 +set quiet 0 set speedtestflags {--shrink-memory --reprepare --stats --heap 40000000 64} lappend speedtestflags --journal wal --size 5 @@ -87,6 +89,11 @@ for {set i 0} {$i<[llength $argv]} {incr i} { puts $usage exit 0 } + -q - + -quiet - + --quiet { + set quiet 1 + } default { lappend cflags $arg } @@ -265,7 +272,9 @@ exec size speedtest1 >>$outfile # Processed cachegrind output should now be in the $outfile ############################################################################# -if {$difffile!=""} { +if {$quiet} { + # Skip this last part of popping up a GUI viewer +} elseif {$difffile!=""} { set fossilcmd {fossil xdiff --tk -c 20} lappend fossilcmd $difffile lappend fossilcmd $outfile From c850c2be757ffbf11423b47f8ef94bd0ce20f048 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 22 Jan 2025 19:37:47 +0000 Subject: [PATCH 100/220] Add two new sqlite3_db_config() options that enable the ATTACH command to create new database files and to open databases read/write. Both default to on for backwards compatibility. FossilOrigin-Name: fe0c58d00b491d1af7c0894f5c32542954aeea2e6510853b3bcbf13ac0bf5ce0 --- manifest | 23 +++++++++++++---------- manifest.uuid | 2 +- src/attach.c | 6 ++++++ src/main.c | 6 +++++- src/shell.c.in | 2 ++ src/sqlite.h.in | 39 ++++++++++++++++++++++++++++++++++++++- src/sqliteInt.h | 2 ++ 7 files changed, 67 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 7b86302386..7527c1a3fb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s-q/--quiet\soption\sto\stest/speedtest.tcl.\s\sAutomatically\senable\n-DSQLITE_OMIT_LOAD_EXTENSION\sand\s-DSQLITE_THREADSAFE=0\sso\sthat\sno\sextra\nlibraries\sare\srequired. -D 2025-01-22T17:18:53.134 +C Add\stwo\snew\ssqlite3_db_config()\soptions\sthat\senable\sthe\sATTACH\scommand\nto\screate\snew\sdatabase\sfiles\sand\sto\sopen\sdatabases\sread/write.\s\sBoth\ndefault\sto\son\sfor\sbackwards\scompatibility. +D 2025-01-22T19:37:47.938 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -713,7 +713,7 @@ F sqlite3.1 acdff36db796e2d00225b911d3047d580cd136547298435426ce9d40347973cc F sqlite3.pc.in 0977c03a4da7c4204bd60e784a0efb8d51a190448aba78a4e973fe7192bdaf03 F src/alter.c aa93e37e4a36a0525bbb2a2aeda20d2018f0aa995542c7dc658e031375e3f532 F src/analyze.c 9a8b67239d899ac12289db5db3f5bfe7f7a0ad1277f80f87ead1d048085876eb -F src/attach.c f35bb8cc1fcdde8f6815a7ef09ae413bcac71821d530796800ba24b3c7da1e80 +F src/attach.c 3a5cb9ee4aad6c5b22268287340a4f2f7b07959b7a522201be30fee23cd802e9 F src/auth.c 54ab9c6c5803b47c0d45b76ce27eff22a03b4b1f767c5945a3a4eb13aa4c78dc F src/backup.c 5c97e8023aab1ce14a42387eb3ae00ba5a0644569e3476f38661fa6f824c3523 F src/bitvec.c 9eac5f42c11914d5ef00a75605bb205e934f435c579687f985f1f8b0995c8645 @@ -742,7 +742,7 @@ F src/insert.c f8d1a0f8ee258411009c6b7f2d93170e351bd19f5ad89d57e1180644297cbe70 F src/json.c 68a98c020c22127f2d65f08855f7fc7460ff352a6ce0b543d8931dde83319c22 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 7432c944ff197046d67a1207790a1b13eec4548c85a9457eb0896bb3641dfb36 -F src/main.c a19dc8b47760ed95f3fbb255cfa8d3f7146b33c263eb4af05ab05e0115d161b9 +F src/main.c 84239c53aaac3aa1734eaf33a41d575c1d2494313bd8af5e6d885f0dc0547cfd F src/malloc.c 410e570b30c26cc36e3372577df50f7a96ee3eed5b2b161c6b6b48773c650c5e F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c 3bb59158c38e05f6270e761a9f435bf19827a264c13d1631c58b84bdc96d73b2 @@ -780,11 +780,11 @@ F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c F src/resolve.c c8a5372b97b2a2e972a280676f06ddb5b74e885d3b1f5ce383f839907b57ef68 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 F src/select.c 83e88fbb36f89b6703b348777491619554f0fd6f917c9fdf51e4c2e9cda6c04e -F src/shell.c.in 9ade75afa953c5c2ded38d076533eaa6c9b2ab1977ef6cce0bc773adac178c50 -F src/sqlite.h.in 6afbcaae44140216704a6c82e4c4ea4118c46d5f6573d6c5fa4fc901ed9d369e +F src/shell.c.in 9915487b27e3169d59a4018c88d14246059c392c662d98fc516264267396b65e +F src/sqlite.h.in 666fa171bf5a9fa532b637571303a596c80723e89f3e10962c0d81378b2b789d F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54 -F src/sqliteInt.h 953f2476f712b115ecb43f7a21183d07c88af8d3b4c32f18317724ce1ce04d56 +F src/sqliteInt.h dd2385d05fbc892d865296fa3f493ba132044a2bbbd15bfad67984bb4afba1d3 F src/sqliteLimit.h 1bbdbf72bd0411d003267ffebc59a262f061df5653027a75627d03f48ca30523 F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -2208,8 +2208,11 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P afb0a5923a6db4045fab5226198aab970d746d4866294ebba943c6986e97ecde -R 9d6f6255d4d3d13ac3e7250fb9209015 +P c20d21b473d8a45267262c5df1d7b102eccce8e4cfbe1e467ea66c474aea0af5 +R 1e3a803f41f6c1dff31eede2c9428a7d +T *branch * enable-attach +T *sym-enable-attach * +T -sym-trunk * U drh -Z 359fbb7e57428de2830f61ee25224064 +Z 45431d003e2c2a4fccdcefe1b482f2e1 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index ad960cacc6..4aa4c3121f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c20d21b473d8a45267262c5df1d7b102eccce8e4cfbe1e467ea66c474aea0af5 +fe0c58d00b491d1af7c0894f5c32542954aeea2e6510853b3bcbf13ac0bf5ce0 diff --git a/src/attach.c b/src/attach.c index 9f23dce1ed..399a6cb537 100644 --- a/src/attach.c +++ b/src/attach.c @@ -175,6 +175,12 @@ static void attachFunc( sqlite3_free(zErr); return; } + if( (db->flags & SQLITE_AttachWrite)==0 ){ + flags &= ~(SQLITE_OPEN_CREATE|SQLITE_OPEN_READWRITE); + flags |= SQLITE_OPEN_READONLY; + }else if( (db->flags & SQLITE_AttachCreate)==0 ){ + flags &= ~SQLITE_OPEN_CREATE; + } assert( pVfs ); flags |= SQLITE_OPEN_MAIN_DB; rc = sqlite3BtreeOpen(pVfs, zPath, db, &pNew->pBt, 0, flags); diff --git a/src/main.c b/src/main.c index 1163deb6e3..943478d6da 100644 --- a/src/main.c +++ b/src/main.c @@ -959,7 +959,7 @@ int sqlite3_db_config(sqlite3 *db, int op, ...){ default: { static const struct { int op; /* The opcode */ - u32 mask; /* Mask of the bit in sqlite3.flags to set/clear */ + u64 mask; /* Mask of the bit in sqlite3.flags to set/clear */ } aFlagOp[] = { { SQLITE_DBCONFIG_ENABLE_FKEY, SQLITE_ForeignKeys }, { SQLITE_DBCONFIG_ENABLE_TRIGGER, SQLITE_EnableTrigger }, @@ -980,6 +980,8 @@ int sqlite3_db_config(sqlite3 *db, int op, ...){ { SQLITE_DBCONFIG_TRUSTED_SCHEMA, SQLITE_TrustedSchema }, { SQLITE_DBCONFIG_STMT_SCANSTATUS, SQLITE_StmtScanStatus }, { SQLITE_DBCONFIG_REVERSE_SCANORDER, SQLITE_ReverseOrder }, + { SQLITE_DBCONFIG_ENABLE_ATTACH_CREATE, SQLITE_AttachCreate }, + { SQLITE_DBCONFIG_ENABLE_ATTACH_WRITE, SQLITE_AttachWrite }, }; unsigned int i; rc = SQLITE_ERROR; /* IMP: R-42790-23372 */ @@ -3321,6 +3323,8 @@ static int openDatabase( | SQLITE_EnableTrigger | SQLITE_EnableView | SQLITE_CacheSpill + | SQLITE_AttachCreate + | SQLITE_AttachWrite #if !defined(SQLITE_TRUSTED_SCHEMA) || SQLITE_TRUSTED_SCHEMA+0!=0 | SQLITE_TrustedSchema #endif diff --git a/src/shell.c.in b/src/shell.c.in index d7a0bf55b3..be6508fb1f 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -8725,6 +8725,8 @@ static int do_meta_command(char *zLine, ShellState *p){ const char *zName; int op; } aDbConfig[] = { + { "attach_create", SQLITE_DBCONFIG_ENABLE_ATTACH_CREATE }, + { "attach_write", SQLITE_DBCONFIG_ENABLE_ATTACH_WRITE }, { "defensive", SQLITE_DBCONFIG_DEFENSIVE }, { "dqs_ddl", SQLITE_DBCONFIG_DQS_DDL }, { "dqs_dml", SQLITE_DBCONFIG_DQS_DML }, diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 9a117fa54e..46336bf3e7 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -2523,6 +2523,41 @@ struct sqlite3_mem_methods { ** first argument. ** ** +** [[SQLITE_DBCONFIG_ENABLE_ATTACH_CREATE]] +**
                SQLITE_DBCONFIG_ENABLE_ATTACH_CREATE
                +**
                The SQLITE_DBCONFIG_ENABLE_ATTACH_CREATE option enables the ability +** of the [ATTACH DATABASE] SQL command to create a new database if the +** database filed named by the SQL command does not already exist. This +** ability of [ATTACH] to create a new database is enabled by default, but +** can be disabled, using the current DBCONFIG option if desired. +** This option takes two arguments which are an integer and a pointer +** to an integer. The first argument is 1, 0, or -1 to enable, disable, or +** leave unchanged the attach-create flag, respectively. If the second +** argument is not NULL, then 0 or 1 is written into the integer that the +** second argument points to depending on if the attach-create flag is set +** after processing the first argument. +**
                +** +** [[SQLITE_DBCONFIG_ENABLE_ATTACH_WRITE]] +**
                SQLITE_DBCONFIG_ENABLE_ATTACH_WRITE
                +**
                The SQLITE_DBCONFIG_ENABLE_ATTACH_WRITE option enables the ability +** of the [ATTACH DATABASE] SQL command to create a new database that is +** open for writing. This capability is enabled by default, but +** can be disabled, using the current DBCONFIG option if desired. If this +** capability is disabled, the [ATTACH] command will still work, but the +** database is opened read-only. If this option is disabled, then the +** ability to create a new database using [ATTACH] is also disabled, +** regardless of the value of the [SQLITE_DBCONFIG_ENABLE_ATTACH_CREATE] +** option. +** This option takes two arguments which are an integer and a pointer +** to an integer. The first argument is 1, 0, or -1 to enable, disable, or +** leave unchanged the ability to ATTACH another database for writing, +** respectively. If the second argument is not NULL, then 0 or 1 is written +** into the integer that the second argument points to depending on if the +** ability to ATTACH a read/write database is set +** after processing the first argument. +**
                +** ** */ #define SQLITE_DBCONFIG_MAINDBNAME 1000 /* const char* */ @@ -2545,7 +2580,9 @@ struct sqlite3_mem_methods { #define SQLITE_DBCONFIG_TRUSTED_SCHEMA 1017 /* int int* */ #define SQLITE_DBCONFIG_STMT_SCANSTATUS 1018 /* int int* */ #define SQLITE_DBCONFIG_REVERSE_SCANORDER 1019 /* int int* */ -#define SQLITE_DBCONFIG_MAX 1019 /* Largest DBCONFIG */ +#define SQLITE_DBCONFIG_ENABLE_ATTACH_CREATE 1020 /* int int* */ +#define SQLITE_DBCONFIG_ENABLE_ATTACH_WRITE 1021 /* int int* */ +#define SQLITE_DBCONFIG_MAX 1021 /* Largest DBCONFIG */ /* ** CAPI3REF: Enable Or Disable Extended Result Codes diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 3045d7c4a5..aa7e297e77 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1830,6 +1830,8 @@ struct sqlite3 { #define SQLITE_CorruptRdOnly HI(0x00002) /* Prohibit writes due to error */ #define SQLITE_ReadUncommit HI(0x00004) /* READ UNCOMMITTED in shared-cache */ #define SQLITE_FkNoAction HI(0x00008) /* Treat all FK as NO ACTION */ +#define SQLITE_AttachCreate HI(0x00010) /* ATTACH allowed to create new dbs */ +#define SQLITE_AttachWrite HI(0x00020) /* ATTACH allowed to open for write */ /* Flags used only if debugging */ #ifdef SQLITE_DEBUG From 83baa239e7000295cc17b9b9a0ea317b03dfb3c0 Mon Sep 17 00:00:00 2001 From: stephan Date: Thu, 23 Jan 2025 06:10:54 +0000 Subject: [PATCH 101/220] Do not strip binaries during 'make install', for consistency with the legacy build and per request from package maintainers. FossilOrigin-Name: cd3fed5c2082c250c32c4d99eecd49a1ab840583fc343bcfd27fb536715d0ce9 --- main.mk | 11 ++--------- manifest | 15 +++++++-------- manifest.uuid | 2 +- 3 files changed, 10 insertions(+), 18 deletions(-) diff --git a/main.mk b/main.mk index d83c39b3a9..1def7d1d0d 100644 --- a/main.mk +++ b/main.mk @@ -351,13 +351,6 @@ T.cc += $(OPTS) INSTALL.noexec = $(INSTALL) -m 0644 # ^^^ do not use GNU-specific flags to $(INSTALL), e.g. --mode=... -# When cross-compiling, we need to avoid the -s flag because it only -# works on the build host's platform. -INSTALL.strip.1 = $(INSTALL) -INSTALL.strip.0 = $(INSTALL) -s -INSTALL.strip. = $(INSTALL.strip.0) -INSTALL.strip = $(INSTALL.strip.$(IS_CROSS_COMPILING)) - # # $(T.compile) = generic target platform compiler invocation, # differing only from $(T.cc) in that it appends $(T.compile.extras), @@ -2024,7 +2017,7 @@ sqlite3d$(T.exe): shell.c $(LIBOBJS0) $(LDFLAGS.libsqlite3) $(LDFLAGS.readline) install-shell-0: sqlite3$(T.exe) $(install-dir.bin) - $(INSTALL.strip) sqlite3$(T.exe) "$(install-dir.bin)" + $(INSTALL) sqlite3$(T.exe) "$(install-dir.bin)" install-shell-1: install: install-shell-$(HAVE_WASI_SDK) @@ -2038,7 +2031,7 @@ sqldiff$(T.exe): $(sqldiff.$(LINK_TOOLS_DYNAMICALLY).deps) $(sqldiff.$(LINK_TOOLS_DYNAMICALLY).rules) install-diff: sqldiff$(T.exe) $(install-dir.bin) - $(INSTALL.strip) sqldiff$(T.exe) "$(install-dir.bin)" + $(INSTALL) sqldiff$(T.exe) "$(install-dir.bin)" #install: install-diff dbhash$(T.exe): $(TOP)/tool/dbhash.c sqlite3.o sqlite3.h diff --git a/manifest b/manifest index 522504c0c9..a49d904122 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Replace\sthe\suse\sof\sthe\sAutools\sin\s./autoconf/\swith\sAutosetup\sand\sextend\sits\sconfigure\sscript\sto\sinclude\smany\sof\sthe\sflags\savailable\sin\sthe\scanonical\sbuild. -D 2025-01-22T21:34:53.714 +C Do\snot\sstrip\sbinaries\sduring\s'make\sinstall',\sfor\sconsistency\swith\sthe\slegacy\sbuild\sand\sper\srequest\sfrom\spackage\smaintainers. +D 2025-01-23T06:10:54.168 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -16,7 +16,7 @@ F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2 F art/sqlite370.svg 40b7e2fe8aac3add5d56dd86ab8d427a4eca5bcb3fe4f8946cb3794e1821d531 F auto.def 7833c0a8630dd3a3410dcc6c8b4d1b63f25d03d6497267624b8a37aba119cb3e F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac -F autoconf/Makefile.in 56697ad25ecf23afa317148b06bdc14f85960b42e5ec434ac1ba87f63a3cb789 w autoconf/Makefile.am +F autoconf/Makefile.in 56697ad25ecf23afa317148b06bdc14f85960b42e5ec434ac1ba87f63a3cb789 F autoconf/Makefile.msc ffff61fe851443015ddb6600ab69a9df503cfec25459b336be7ba8c9a9e473f8 F autoconf/README.first f1d3876e9a7852c22f275a6f06814e64934cecbc0b5b9617d64849094c1fd136 F autoconf/README.txt 7f01dc3915e2d68f329011073662369e62a0938a2c69398807823c57591cb288 @@ -700,7 +700,7 @@ F ext/wasm/tests/opfs/concurrency/test.js d08889a5bb6e61937d0b8cbb78c9efbefbf65a F ext/wasm/tests/opfs/concurrency/worker.js 0a8c1a3e6ebb38aabbee24f122693f1fb29d599948915c76906681bb7da1d3d2 F ext/wasm/wasmfs.make bc8bb227f35d5bd3863a7bd2233437c37472a0d81585979f058f9b9b503bef35 F magic.txt 5ade0bc977aa135e79e3faaea894d5671b26107cc91e70783aa7dc83f22f3ba0 -F main.mk a187ada134ccb55b5d59ea3eb8f71cc6b19bfc244689e24a729f7a64aa500dc3 +F main.mk 18b859068a43818d29172b36d624a9bc8ce8204350ebd18a9f96994970081ab9 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 F mptest/crash01.test 61e61469e257df0850df4293d7d4d6c2af301421 @@ -2207,9 +2207,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P c20d21b473d8a45267262c5df1d7b102eccce8e4cfbe1e467ea66c474aea0af5 e5bbc2428f1000a451c1b4afd287742b9896a1a6c82d9706c6b8e7d6fb3b1e44 -R 2375827128bc5d50768932667a2d6889 -T +closed e5bbc2428f1000a451c1b4afd287742b9896a1a6c82d9706c6b8e7d6fb3b1e44 Closed\sby\sintegrate-merge. +P 8c60d4c901af716d4d4dfd1dd4aa626c758fac2cb46112b24b0838b7888fc66f +R f8ba6d19954b4d49ab26ed596b2e234d U stephan -Z b7887b7452fd09e55e3fce7da3a1b70f +Z 3c78270c553a7173f56e21c430eac6f8 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 02ec10f1aa..fa88295178 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8c60d4c901af716d4d4dfd1dd4aa626c758fac2cb46112b24b0838b7888fc66f +cd3fed5c2082c250c32c4d99eecd49a1ab840583fc343bcfd27fb536715d0ce9 From c9bf7ed9ad146a64aea26fc58c1d91fb281b6693 Mon Sep 17 00:00:00 2001 From: stephan Date: Thu, 23 Jan 2025 11:21:29 +0000 Subject: [PATCH 102/220] Remove unnecessary --minify 0 emcc flag from the wasm build, as -g3 implies that capability along with other anti-minification features we rely on. FossilOrigin-Name: 10c91f9cd074e8d35af1c7f8251ac18e5dd91fa14df3fe4e1fb44441c4f08c7a --- ext/wasm/GNUmakefile | 1 - manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/ext/wasm/GNUmakefile b/ext/wasm/GNUmakefile index ad6fafacc7..d782a8122e 100644 --- a/ext/wasm/GNUmakefile +++ b/ext/wasm/GNUmakefile @@ -618,7 +618,6 @@ emcc.cflags += -I. -I$(dir.top) ######################################################################## # emcc flags specific to building .js/.wasm files... emcc.jsflags := -fPIC -emcc.jsflags += --minify 0 emcc.jsflags += --no-entry emcc.jsflags += -sWASM_BIGINT=$(emcc.WASM_BIGINT) emcc.jsflags += -sMODULARIZE diff --git a/manifest b/manifest index a49d904122..87b1fdc1da 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Do\snot\sstrip\sbinaries\sduring\s'make\sinstall',\sfor\sconsistency\swith\sthe\slegacy\sbuild\sand\sper\srequest\sfrom\spackage\smaintainers. -D 2025-01-23T06:10:54.168 +C Remove\sunnecessary\s--minify\s0\semcc\sflag\sfrom\sthe\swasm\sbuild,\sas\s-g3\simplies\sthat\scapability\salong\swith\sother\santi-minification\sfeatures\swe\srely\son. +D 2025-01-23T11:21:29.495 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -618,7 +618,7 @@ F ext/session/sqlite3session.c d6f5e3e83b9b0bbc4a8db4837284f0ecc6af5321d4c8e7136 F ext/session/sqlite3session.h 683ccbf16e2c2521661fc4c1cf918ce57002039efbcabcd8097fa4bca569104b F ext/session/test_session.c 12e0a2c15fd60f92da4bb29c697c9177ff0c0dbcdc5129a54c47e999f147937a F ext/wasm/EXPORTED_FUNCTIONS.fiddle.in 27450c8b8c70875a260aca55435ec927068b34cef801a96205adb81bdcefc65c -F ext/wasm/GNUmakefile 78f49e47146d58fa44f9ac624627a718fba4b2b2baeaea641bcf6fed300c0f0d +F ext/wasm/GNUmakefile ccd219b2db93f5dba54ba5ed45d71b46eb219e2b27a541d3dc21f98b16dc0f5f F ext/wasm/README-dist.txt 6382cb9548076fca472fb3330bbdba3a55c1ea0b180ff9253f084f07ff383576 F ext/wasm/README.md a8a2962c3aebdf8d2104a9102e336c5554e78fc6072746e5daf9c61514e7d193 F ext/wasm/SQLTester/GNUmakefile e0794f676d55819951bbfae45cc5e8d7818dc460492dc317ce7f0d2eca15caff @@ -2207,8 +2207,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 8c60d4c901af716d4d4dfd1dd4aa626c758fac2cb46112b24b0838b7888fc66f -R f8ba6d19954b4d49ab26ed596b2e234d +P cd3fed5c2082c250c32c4d99eecd49a1ab840583fc343bcfd27fb536715d0ce9 +R de609fdf581bc64ebd30372c2fbf1eb4 U stephan -Z 3c78270c553a7173f56e21c430eac6f8 +Z a93ce720e037c2af4cd69560e744cedd # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index fa88295178..3ce03ee524 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cd3fed5c2082c250c32c4d99eecd49a1ab840583fc343bcfd27fb536715d0ce9 +10c91f9cd074e8d35af1c7f8251ac18e5dd91fa14df3fe4e1fb44441c4f08c7a From 72543206e59eb55e4040603e2fe98bde15772d44 Mon Sep 17 00:00:00 2001 From: stephan Date: Thu, 23 Jan 2025 14:09:02 +0000 Subject: [PATCH 103/220] Move small parts of ext/wasm/GNUmakefile into ext/wasm/config.make.in and have the configure script populate that, rather than dynamically determining those values on each 'make' invocation. Add a configure-time check for the optional wasm-opt binary in prep for pending experimentation with using it to reduce the wasm file sizes. FossilOrigin-Name: 0a426a549577b883e2de7cd0605041cc97b57f53ee6657bc318b0bfde7b62677 --- autosetup/proj.tcl | 18 ++-- autosetup/sqlite-config.tcl | 57 ++++++++--- ext/wasm/GNUmakefile | 182 ++++++++++++++++++------------------ ext/wasm/config.make.in | 14 +++ ext/wasm/mkwasmbuilds.c | 15 ++- manifest | 19 ++-- manifest.uuid | 2 +- 7 files changed, 182 insertions(+), 125 deletions(-) create mode 100644 ext/wasm/config.make.in diff --git a/autosetup/proj.tcl b/autosetup/proj.tcl index 915a6b1349..88da2112cf 100644 --- a/autosetup/proj.tcl +++ b/autosetup/proj.tcl @@ -276,9 +276,9 @@ proc proj-find-executable-path {args} { # a binary, sets a define (see below) to the result, and returns the # result (an empty string if not found). # -# The define'd name is: if defName is empty then "BIN_X" is used, -# where X is the upper-case form of $binName with any '-' characters -# replaced with '_'. +# The define'd name is: If $defName is not empty, it is used as-is. If +# $defName is empty then "BIN_X" is used, where X is the upper-case +# form of $binName with any '-' characters replaced with '_'. proc proj-bin-define {binName {defName {}}} { set check [proj-find-executable-path -v $binName] if {"" eq $defName} { @@ -850,16 +850,16 @@ proc proj-affirm-files-exist {args} { # If the given directory is found, it expects to find emsdk_env.sh in # that directory, as well as the emcc compiler somewhere under there. # -# If the --with-emsdk flag is explicitly provided and the SDK is not -# found then a fatal error is generated, otherwise failure to find the -# SDK is not fatal. +# If the --with-emsdk[=DIR] flag is explicitly provided and the SDK is +# not found then a fatal error is generated, otherwise failure to find +# the SDK is not fatal. # # Defines the following: # -# - EMSDK_HOME = top dir of the emsdk or "". -# - EMSDK_ENV_SH = path to EMSDK_HOME/emsdk_env.sh or "" -# - BIN_EMCC = $EMSDK_HOME/upstream/emscripten/emcc or "" # - HAVE_EMSDK = 0 or 1 (this function's return value) +# - EMSDK_HOME = "" or top dir of the emsdk +# - EMSDK_ENV_SH = "" or $EMSDK_HOME/emsdk_env.sh +# - BIN_EMCC = "" or $EMSDK_HOME/upstream/emscripten/emcc # # Returns 1 if EMSDK_ENV_SH is found, else 0. If EMSDK_HOME is not empty # but BIN_EMCC is then emcc was not found in the EMSDK_HOME, in which diff --git a/autosetup/sqlite-config.tcl b/autosetup/sqlite-config.tcl index 96b7d0c1b3..40941687e4 100644 --- a/autosetup/sqlite-config.tcl +++ b/autosetup/sqlite-config.tcl @@ -418,26 +418,58 @@ proc sqlite-handle-tempstore {} { ######################################################################## # Check for the Emscripten SDK for building the web-based wasm # components. The core lib and tools do not require this but ext/wasm -# does. +# does. Most of the work is done via [proj-check-emsdk], then this +# function adds the following defines: +# +# - EMCC_WRAPPER = "" or top-srcdir/tool/emcc.sh +# - BIN_WASM_OPT = "" or path to wasm-opt +# - BIN_WASM_STRIP = "" or path to wasm-strip +# +# Noting that: +# +# 1) Not finding the SDK is not fatal at this level, nor is failure to +# find one of the related binaries. +# +# 2) wasm-strip is part of the wabt package: +# +# https://github.com/WebAssembly/wabt +# +# and this project requires it for production-mode builds but not dev +# builds. +# proc sqlite-handle-emsdk {} { + define EMCC_WRAPPER "" + define BIN_WASM_STRIP "" + define BIN_WASM_OPT "" set srcdir $::autosetup(srcdir) if {$srcdir ne $::autosetup(builddir)} { # The EMSDK pieces require writing to the original source tree # even when doing an out-of-tree build. The ext/wasm pieces do not - # support an out-of-tree build so we catch that case and treat it - # as if EMSDK were not found. + # support an out-of-tree build so we treat that case as if EMSDK + # were not found. msg-result "Out-of tree build: not checking for EMSDK." - define EMCC_WRAPPER "" return } - set emccsh $srcdir/tool/emcc.sh + set emccSh $srcdir/tool/emcc.sh + set extWasmConfig $srcdir/ext/wasm/config.make if {![get-define HAVE_WASI_SDK] && [proj-check-emsdk]} { - define EMCC_WRAPPER $emccsh - proj-make-from-dot-in $emccsh - catch {exec chmod u+x $emccsh} + define EMCC_WRAPPER $emccSh + set emsdkHome [get-define EMSDK_HOME ""] + proj-assert {"" ne $emsdkHome} + #define EMCC_WRAPPER ""; # just for testing + proj-bin-define wasm-strip + proj-bin-define bash; # ext/wasm/GNUmakefile requires bash + if {[file-isexec $emsdkHome/upstream/bin/wasm-opt]} { + define BIN_WASM_OPT $emsdkHome/upstream/bin/wasm-opt + } else { + # Maybe there's a copy in the path? + proj-bin-define wasm-opt BIN_WASM_OPT + } + proj-make-from-dot-in $emccSh $extWasmConfig + catch {exec chmod u+x $emccSh} } else { define EMCC_WRAPPER "" - file delete -force $emccsh + file delete -force -- $emccSh $extWasmConfig } } @@ -851,11 +883,14 @@ proc sqlite-post-config-validation {} { # Check #1: ensure that files which get filtered for @VAR@ do not # contain any unresolved @VAR@ refs. That may indicate an # unexported/unused var or a typo. - foreach f "Makefile sqlite3.pc $::autosetup(srcdir)/tool/emcc.sh" { + set srcdir $::autosetup(srcdir) + foreach f [list Makefile sqlite3.pc \ + $srcdir/tool/emcc.sh \ + $srcdir/ext/wasm/config.make] { if {![file exists $f]} continue set lnno 1 foreach line [proj-file-content-list $f] { - if {[regexp {(@[A-Za-z_]+@)} $line match]} { + if {[regexp {(@[A-Za-z0-9_]+@)} $line match]} { error "Unresolved reference to $match at line $lnno of $f" } incr lnno diff --git a/ext/wasm/GNUmakefile b/ext/wasm/GNUmakefile index d782a8122e..258c4a466e 100644 --- a/ext/wasm/GNUmakefile +++ b/ext/wasm/GNUmakefile @@ -38,13 +38,9 @@ ######################################################################## default: all #default: quick -SHELL := $(firstword $(shell which bash) $(wildcard /usr/local/bin/bash /usr/bin/bash /bin/bash)) -ifeq (,$(SHELL)) - $(error Cannot find the bash shell) -endif MAKEFILE := $(lastword $(MAKEFILE_LIST)) CLEAN_FILES := -DISTCLEAN_FILES := +DISTCLEAN_FILES := config.make MAKING_CLEAN := $(if $(filter %clean,$(MAKECMDGOALS)),1,0) .PHONY: clean distclean clean: @@ -52,6 +48,67 @@ clean: distclean: clean -rm -f $(DISTCLEAN_FILES) + +######################################################################## +# Special-case builds for which we require certain pre-conditions +# which, if not met, may cause warnings or fatal errors in the build. +# This also affects the default optimization level flags. Note that +# the fiddle targets are in this list because they are used for +# generating sqlite.org/fiddle. +OPTIMIZED_TARGETS := dist snapshot fiddle fiddle.debug + +ifeq (1,$(MAKING_CLEAN)) + bin.wasm-strip := echo "not stripping" + bin.wasm-opt := irrelevant + bin.emcc := irrelevant + bin.bash := irrelevant + emcc.version := unknown +else + # Include config.make and perform some bootstrapping... + ifeq (,$(wildcard ./config.make)) + $(error Missing config.make (gets generated by the configure script if the EMSDK is found)) + endif + include ./config.make + ifeq (,$(bin.bash)) + $(error Configure script did not find the bash shell) + endif + ifeq (,$(bin.emcc)) + $(error Configure script did not find emcc) + endif + emcc.version := $(shell $(bin.emcc) --version | sed -n 1p | sed -e 's/^.* \([3-9][^ ]*\) .*$$/\1/;') + $(info using emcc version [$(emcc.version)]) + ifeq (,$(bin.wasm-strip)) + #################################################################### + # We need wasm-strip for release builds (see below for why) but + # not strictly for non-release builds. + $(info WARNING: *******************************************************************) + $(info WARNING: Builds using -Oz will minify WASM-exported names, breaking) + $(info WARNING: _All The Things_. The workaround for that is to build) + $(info WARNING: with -g3 (which explodes the file size) and then strip the debug) + $(info WARNING: info after compilation, using wasm-strip, to shrink the wasm file.) + $(info WARNING: wasm-strip was not found in the PATH so we cannot strip those.) + $(info WARNING: If this build uses any optimization level higher than -O1 then) + $(info WARNING: the ***resulting JS code WILL NOT BE USABLE***.) + $(info WARNING: wasm-strip is part of the wabt package:) + $(info WARNING: https://github.com/WebAssembly/wabt) + $(info WARNING: on Ubuntu-like systems it can be installed with:) + $(info WARNING: sudo apt install wabt) + $(info WARNING: *******************************************************************) + ifneq (,$(filter $(OPTIMIZED_TARGETS),$(MAKECMDGOALS))) + $(error Cannot make release-quality binary because wasm-strip is not available.) + endif + bin.wasm-strip := echo "not wasm-stripping" + endif + ifeq (,$(filter $(OPTIMIZED_TARGETS),$(MAKECMDGOALS))) + $(info ==============================================================) + $(info == Development build. Make one of (dist, snapshot) for a) + $(info == smaller release build.) + $(info ==============================================================) + endif +endif +# ^^^ end of are-we-MAKING_CLEAN +maybe-wasm-strip := $(bin.wasm-strip) + ######################################################################## # JS_BUILD_NAMES exists for documentation purposes only. It enumerates # the core build styles: @@ -133,13 +190,15 @@ sqlite3.canonical.c := $(dir.top)/sqlite3.c sqlite3.c ?= $(firstword $(wildcard $(dir.top)/sqlite3-see.c) $(sqlite3.canonical.c)) sqlite3.h := $(dir.top)/sqlite3.h -ifneq (1,$(MAKING_CLEAN)) -ifeq (,$(shell grep sqlite3_activate_see $(sqlite3.c))) +ifeq (1,$(MAKING_CLEAN)) SQLITE_C_IS_SEE := 0 else - SQLITE_C_IS_SEE := 1 - $(info This is an SEE build) -endif + ifeq (,$(shell grep sqlite3_activate_see $(sqlite3.c))) + SQLITE_C_IS_SEE := 0 + else + SQLITE_C_IS_SEE := 1 + $(info This is an SEE build) + endif endif ########################################################################@ @@ -151,65 +210,6 @@ $(sqlite3.h): $(MAKE) -C $(dir.top) sqlite3.c $(sqlite3.c): $(sqlite3.h) -######################################################################## -# Special-case builds for which we require certain pre-conditions -# which, if not met, may cause warnings or fatal errors in the build. -# This also affects the default optimization level flags. Note that -# the fiddle targets are in this list because they are used for -# generating sqlite.org/fiddle. -OPTIMIZED_TARGETS := dist snapshot fiddle fiddle.debug - -ifneq (1,$(MAKING_CLEAN)) - ifeq (,$(filter $(OPTIMIZED_TARGETS),$(MAKECMDGOALS))) - $(info ==============================================================) - $(info == Development build. Make one of (dist, snapshot) for a) - $(info == smaller release build.) - $(info ==============================================================) - endif -endif - -######################################################################## -# Find emcc (Emscripten compiler)... -ifeq (1,$(MAKING_CLEAN)) - emcc.bin := echo - emcc.version := unknown -else - emcc.bin := $(dir.tool)/emcc.sh - ifeq (,$(wildcard $(emcc.bin))) - $(error Configure script did not find emcc.) - endif - emcc.version := $(shell $(emcc.bin) --version | sed -n 1p | sed -e 's/^.* \([3-9][^ ]*\) .*$$/\1/;') - $(info using emcc version [$(emcc.version)]) -endif -######################################################################### -# Find wasm-strip, which we need for release builds (see below for -# why) but not strictly for non-release builds. -ifeq (1,$(MAKING_CLEAN)) - wasm-strip.bin := irrelevant -else - wasm-strip.bin ?= $(shell which wasm-strip 2>/dev/null) - ifeq (,$(wasm-strip.bin)) - $(info WARNING: *******************************************************************) - $(info WARNING: Builds using -O2/-O3/-Os/-Oz will minify WASM-exported names,) - $(info WARNING: breaking _All The Things_. The workaround for that is to build) - $(info WARNING: with -g3 (which explodes the file size) and then strip the debug) - $(info WARNING: info after compilation, using wasm-strip, to shrink the wasm file.) - $(info WARNING: wasm-strip was not found in the PATH so we cannot strip those.) - $(info WARNING: If this build uses any optimization level higher than -O1 then) - $(info WARNING: the ***resulting JS code WILL NOT BE USABLE***.) - $(info WARNING: wasm-strip is part of the wabt package:) - $(info WARNING: https://github.com/WebAssembly/wabt) - $(info WARNING: on Ubuntu-like systems it can be installed with:) - $(info WARNING: sudo apt install wabt) - $(info WARNING: *******************************************************************) - ifneq (,$(filter $(OPTIMIZED_TARGETS),$(MAKECMDGOALS))) - $(error Cannot make release-quality binary because wasm-strip is not available.) - endif - wasm-strip.bin := echo "not wasm-stripping" - endif -endif -maybe-wasm-strip := $(wasm-strip.bin) - ######################################################################## # barebones=1 disables all "extraneous" stuff from sqlite3-wasm.c, the # goal being to create a WASM file with only the core APIs. @@ -375,19 +375,6 @@ $(bin.stripccomments): $(bin.stripccomments).c $(MAKEFILE) $(CC) -o $@ $< DISTCLEAN_FILES += $(bin.stripccomments) -######################################################################## -# bin.mkwb is used for generating some of the makefile code for the -# various wasm builds. It used to be generated in this makefile via a -# difficult-to-read/maintain block of $(eval)'d code. Attempts were -# made to generate it from tcl and bash (shell) but having to escape -# the $ references in those languages made it just as illegible as the -# native makefile code. Somewhat surprisingly, moving that code generation -# to C makes it slightly less illegible than the previous 3 options. -bin.mkwb := ./mkwasmbuilds -$(bin.mkwb): $(bin.mkwb).c $(MAKEFILE) - $(CC) -o $@ $< -DISTCLEAN_FILES += $(bin.mkwb) - ######################################################################## # C-PP.FILTER: a $(call)able to transform $(1) to $(2) via: # @@ -872,14 +859,6 @@ sqlite3-node.mjs := $(dir.dout)/sqlite3-node.mjs sqlite3-api-wasmfs.mjs := $(dir.tmp)/sqlite3-api-wasmfs.mjs sqlite3-wasmfs.mjs := $(dir.wasmfs)/sqlite3-wasmfs.mjs EXPORTED_FUNCTIONS.fiddle := $(dir.tmp)/EXPORTED_FUNCTIONS.fiddle -ifneq (1,$(MAKING_CLEAN)) -.wasmbuilds.make: $(bin.mkwb) - @rm -f $@ - $(bin.mkwb) > $@ - @chmod -w $@ --include .wasmbuilds.make -endif -DISTCLEAN_FILES += .wasmbuilds.make # The various -D... values used by *.c-pp.js include: # @@ -960,6 +939,27 @@ sqlite3-api.ext.jses += \ all quick: $(sqlite3-api.ext.jses) q: quick +ifneq (1,$(MAKING_CLEAN)) +######################################################################## +# bin.mkwb is used for generating some of the makefile code for the +# various wasm builds. It used to be generated in this makefile via a +# difficult-to-read/maintain block of $(eval)'d code. Attempts were +# made to generate it from tcl and bash (shell) but having to escape +# the $ references in those languages made it just as illegible as the +# native makefile code. Somewhat surprisingly, moving that code generation +# to C makes it slightly less illegible than the previous 3 options. +bin.mkwb := ./mkwasmbuilds +$(bin.mkwb): $(bin.mkwb).c $(MAKEFILE) + $(CC) -o $@ $< +DISTCLEAN_FILES += $(bin.mkwb) +.wasmbuilds.make: $(bin.mkwb) + @rm -f $@ + $(bin.mkwb) > $@ + @chmod -w $@ +-include .wasmbuilds.make +endif +DISTCLEAN_FILES += .wasmbuilds.make + ######################################################################## # batch-runner.js is part of one of the test apps which reads in SQL # dumps generated by $(speedtest1) and executes them. @@ -1041,7 +1041,7 @@ $(speedtest1.js): $(MAKEFILE) $(speedtest1.cfiles) \ $(pre-post-speedtest1-vanilla.deps) \ $(EXPORTED_FUNCTIONS.speedtest1) @echo "Building $@ ..." - $(emcc.bin) \ + $(bin.emcc) \ $(emcc.speedtest1) \ $(emcc.speedtest1.common) \ $(emcc.flags.speedtest1-vanilla) $(pre-post-speedtest1-vanilla.flags) \ diff --git a/ext/wasm/config.make.in b/ext/wasm/config.make.in new file mode 100644 index 0000000000..caaceb4bb2 --- /dev/null +++ b/ext/wasm/config.make.in @@ -0,0 +1,14 @@ +# Gets filtered by the configure script +bin.bash = @BIN_BASH@ +bin.emcc = @EMCC_WRAPPER@ +bin.wasm-strip = @BIN_WASM_STRIP@ +bin.wasm-opt = @BIN_WASM_OPT@ + +SHELL := $(bin.bash) + +# The following overrides can be activated to test +# various validation in GNUmakefile: +# +#bin.bash := +#bin.emcc := +#bin.wasm-strip := diff --git a/ext/wasm/mkwasmbuilds.c b/ext/wasm/mkwasmbuilds.c index d7a9a3e71c..ece1185a36 100644 --- a/ext/wasm/mkwasmbuilds.c +++ b/ext/wasm/mkwasmbuilds.c @@ -157,7 +157,7 @@ static void mk_fiddle(){ if( 1==i ){/*fiddle.debug*/ pf(" @test -d \"$(dir $@)\" || mkdir -p \"$(dir $@)\"\n"); } - pf(" $(emcc.bin) -o $@ $(fiddle.emcc-flags%s) " + pf(" $(bin.emcc) -o $@ $(fiddle.emcc-flags%s) " "$(pre-post-fiddle-module-vanilla.flags) $(fiddle.cses)\n", zTail); pf(" $(maybe-wasm-strip) $(fiddle-module.wasm%s)\n", zTail); @@ -213,10 +213,17 @@ static void mk_lib_mode(const char *zName /* build name */, /* target zJsOut */ pf("%s: %s $(MAKEFILE) $(sqlite3-wasm.cfiles) $(EXPORTED_FUNCTIONS.api) " - "$(pre-post-%s-%s.deps)\n", + "$(pre-post-%s-%s.deps) " + "$(sqlite3-api.ext.jses)" + /* ^^^ maintenance reminder: we set these as deps so that they + get copied into place early. That allows the developer to + reload the base-most test pages while the later-stage builds + are still compiling, which is especially helpful when running + builds with long build times (like -Oz). */ + "\n", zJsOut, zApiJsOut, zNM); pf("\t@echo \"Building $@ ...\"\n"); - pf("\t$(emcc.bin) -o $@ $(emcc_opt_full) $(emcc.flags) \\\n"); + pf("\t$(bin.emcc) -o $@ $(emcc_opt_full) $(emcc.flags) \\\n"); pf("\t\t$(emcc.jsflags) -sENVIRONMENT=$(emcc.environment.%s) \\\n", zMode); pf("\t\t$(pre-post-%s-%s.flags) \\\n", zNM); pf("\t\t$(emcc.flags.%s) $(emcc.flags.%s.%s) \\\n", zName, zNM); @@ -241,7 +248,7 @@ static void mk_lib_mode(const char *zName /* build name */, speed up lib init, and reduce memory cost considerably, by stripping them out. */; /* - ** The above $(emcc.bin) call will write zJsOut and will create a + ** The above $(bin.emcc) call will write zJsOut and will create a ** like-named .wasm file. That .wasm file name gets hard-coded into ** zJsOut so we need to, for some cases, patch zJsOut to use the ** name sqlite3.wasm instead. Note that the resulting .wasm file is diff --git a/manifest b/manifest index 87b1fdc1da..2bb299c38b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sunnecessary\s--minify\s0\semcc\sflag\sfrom\sthe\swasm\sbuild,\sas\s-g3\simplies\sthat\scapability\salong\swith\sother\santi-minification\sfeatures\swe\srely\son. -D 2025-01-23T11:21:29.495 +C Move\ssmall\sparts\sof\sext/wasm/GNUmakefile\sinto\sext/wasm/config.make.in\sand\shave\sthe\sconfigure\sscript\spopulate\sthat,\srather\sthan\sdynamically\sdetermining\sthose\svalues\son\seach\s'make'\sinvocation.\sAdd\sa\sconfigure-time\scheck\sfor\sthe\soptional\swasm-opt\sbinary\sin\sprep\sfor\spending\sexperimentation\swith\susing\sit\sto\sreduce\sthe\swasm\sfile\ssizes. +D 2025-01-23T14:09:02.122 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -49,8 +49,8 @@ F autosetup/cc-shared.tcl 4f024e94a47f427ba61de1739f6381ef0080210f9fae89112d5c1d F autosetup/cc.tcl c0fcc50ca91deff8741e449ddad05bcd08268bc31177e613a6343bbd1fd3e45f F autosetup/jimsh0.c d40e381ea4526a067590e7b91bd4b2efa6d4980d286f908054c647b3df4aee14 F autosetup/pkg-config.tcl 4e635bf39022ff65e0d5434339dd41503ea48fc53822c9c5bde88b02d3d952ba -F autosetup/proj.tcl 50b060ea6760b02ef5cb16650fbe9c1840e16351a0be0ccfc3727c565f74a257 -F autosetup/sqlite-config.tcl cf9790dc31d498b69ad2b348b7a3a6f2c7df9a86d770b31dff2255c2f62e5015 +F autosetup/proj.tcl 9adf1539673cef15bff862d9360b479e6920cc2c0d85de707b0ba31c04ce4531 +F autosetup/sqlite-config.tcl f37f6961c8fb2454960f97a28011a29994f6c591b1da392a9ae28af96e0c15a2 F autosetup/system.tcl 51d4be76cd9a9074704b584e5c9cbba616202c8468cf9ba8a4f8294a7ab1dba9 F configure 9a00b21dfd13757bbfb8d89b30660a89ec1f8f3a79402b8f9f9b6fc475c3303a x F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad @@ -618,7 +618,7 @@ F ext/session/sqlite3session.c d6f5e3e83b9b0bbc4a8db4837284f0ecc6af5321d4c8e7136 F ext/session/sqlite3session.h 683ccbf16e2c2521661fc4c1cf918ce57002039efbcabcd8097fa4bca569104b F ext/session/test_session.c 12e0a2c15fd60f92da4bb29c697c9177ff0c0dbcdc5129a54c47e999f147937a F ext/wasm/EXPORTED_FUNCTIONS.fiddle.in 27450c8b8c70875a260aca55435ec927068b34cef801a96205adb81bdcefc65c -F ext/wasm/GNUmakefile ccd219b2db93f5dba54ba5ed45d71b46eb219e2b27a541d3dc21f98b16dc0f5f +F ext/wasm/GNUmakefile 5c36cb9ad5217e74f8936861210dac0b052b9cd418cbabe915cc9d646c5743a0 F ext/wasm/README-dist.txt 6382cb9548076fca472fb3330bbdba3a55c1ea0b180ff9253f084f07ff383576 F ext/wasm/README.md a8a2962c3aebdf8d2104a9102e336c5554e78fc6072746e5daf9c61514e7d193 F ext/wasm/SQLTester/GNUmakefile e0794f676d55819951bbfae45cc5e8d7818dc460492dc317ce7f0d2eca15caff @@ -659,6 +659,7 @@ F ext/wasm/common/SqliteTestUtil.js 7adaeffef757d8708418dc9190f72df22367b5318317 F ext/wasm/common/emscripten.css 11bd104b6c0d597c67d40cc8ecc0a60dae2b965151e3b6a37fa5708bac3acd15 F ext/wasm/common/testing.css e97549bab24126c24e0daabfe2de9bb478fb0a69fdb2ddd0a73a992c091aad6f F ext/wasm/common/whwasmutil.js d76c69617e95d85ffc9996f7d9d7481df6976dcbd860ecd82bd8c075e3a101ae +F ext/wasm/config.make.in f830c98f0f668f7628d9521bc0b1175ab15b050f20fe3234346be346d747c587 F ext/wasm/demo-123-worker.html a0b58d9caef098a626a1a1db567076fca4245e8d60ba94557ede8684350a81ed F ext/wasm/demo-123.html 8c70a412ce386bd3796534257935eb1e3ea5c581e5d5aea0490b8232e570a508 F ext/wasm/demo-123.js c7b3cca50c55841c381a9ca4f9396e5bbdc6114273d0b10a43e378e32e7be5bf @@ -678,7 +679,7 @@ F ext/wasm/index-dist.html 564b5ec5669676482c5a25dea9e721d8eafed426ecb155f93d29a F ext/wasm/index.html e4bbffdb3d40eff12b3f9c7abedef91787e2935620b7f8d40f2c774b80ad8fa9 F ext/wasm/jaccwabyt/jaccwabyt.js 1264710db3cfbcb6887d95665b7aeba60c1126eaef789ca4cf1a4a17d5bc7f54 F ext/wasm/jaccwabyt/jaccwabyt.md 59a20df389abcc3606eb4eaea7fb7ba14504beb3e345dbea9b99a0618ba3bec8 -F ext/wasm/mkwasmbuilds.c af06fd14fcb7803c0adacab276047bb696c07f5b683a6f70adc5b3f146cf61f3 +F ext/wasm/mkwasmbuilds.c 619b99bffb9538c681f0622395a177e4ba2e2658bc1b94bb7f6605245b6e365e F ext/wasm/module-symbols.html dc476b403369b26a1a23773e13b80f41b9a49f0825e81435fe3600a7cfbbe337 F ext/wasm/scratchpad-wasmfs.html a3d7388f3c4b263676b58b526846e9d02dfcb4014ff29d3a5040935286af5b96 F ext/wasm/scratchpad-wasmfs.mjs 66034b9256b218de59248aad796760a1584c1dd842231505895eff00dbd57c63 @@ -2207,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P cd3fed5c2082c250c32c4d99eecd49a1ab840583fc343bcfd27fb536715d0ce9 -R de609fdf581bc64ebd30372c2fbf1eb4 +P 10c91f9cd074e8d35af1c7f8251ac18e5dd91fa14df3fe4e1fb44441c4f08c7a +R 07e50a0cf41474faaa27c1572e1c844e U stephan -Z a93ce720e037c2af4cd69560e744cedd +Z 685755e90bacd2eb62f10206ae6eb72e # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 3ce03ee524..8753d034c2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -10c91f9cd074e8d35af1c7f8251ac18e5dd91fa14df3fe4e1fb44441c4f08c7a +0a426a549577b883e2de7cd0605041cc97b57f53ee6657bc318b0bfde7b62677 From efafde5eb44fa2791e914445e5189b26a5c63063 Mon Sep 17 00:00:00 2001 From: stephan Date: Thu, 23 Jan 2025 15:58:01 +0000 Subject: [PATCH 104/220] Initial support for post-processing wasm files with wasm-opt (if it's available). This currently shaves 12kb off of the release-mode build of sqlite3.wasm but there are many dozens of wasm-opt flags left to try. FossilOrigin-Name: 5d16e3f28364de2d6b6456a6fc56bf604b9106c3ae15719f2862192ae3020cc1 --- ext/wasm/GNUmakefile | 6 +++--- ext/wasm/config.make.in | 6 ++++++ ext/wasm/mkwasmbuilds.c | 47 +++++++++++++++++++++++++++++++---------- ext/wasm/wasmfs.make | 2 +- manifest | 18 ++++++++-------- manifest.uuid | 2 +- 6 files changed, 56 insertions(+), 25 deletions(-) diff --git a/ext/wasm/GNUmakefile b/ext/wasm/GNUmakefile index 258c4a466e..5623965478 100644 --- a/ext/wasm/GNUmakefile +++ b/ext/wasm/GNUmakefile @@ -812,7 +812,7 @@ sqlite3-wasmfs.cfiles := $(sqlite3-wasm.cfiles) ######################################################################## ######################################################################## -# SQLITE3.xJS.ESM-EXPORT-DEFAULT is used by mkwasmbuilds.c and the +# SQLITE.CALL.xJS.ESM-EXPORT-DEFAULT is used by mkwasmbuilds.c and the # wasmfs build. $1 is 1 if the build mode needs this workaround # (modes: esm, bundler-friendly, node) and 0 if not (vanilla). $2 must # be 0 for all builds except sqlite3-wasmfs.mjs, in which case it must @@ -833,9 +833,9 @@ sqlite3-wasmfs.cfiles := $(sqlite3-wasm.cfiles) # # Maintenance reminder: Mac sed works differently than GNU sed, so we # use awk instead of sed for this. -define SQLITE3.xJS.ESM-EXPORT-DEFAULT +define SQLITE.CALL.xJS.ESM-EXPORT-DEFAULT if [ x1 = x$(1) ]; then \ - echo "Fragile workaround for emscripten/issues/18237. See SQLITE3.xJS.ESM-EXPORT-DEFAULT."; \ + echo "Fragile workaround for emscripten/issues/18237. See SQLITE.CALL.xJS.ESM-EXPORT-DEFAULT."; \ {\ awk '/^export default/ && !f{f=1; next} 1' $@ > $@.tmp && mv $@.tmp $@; \ } || exit $$?; \ diff --git a/ext/wasm/config.make.in b/ext/wasm/config.make.in index caaceb4bb2..3218541b37 100644 --- a/ext/wasm/config.make.in +++ b/ext/wasm/config.make.in @@ -4,6 +4,12 @@ bin.emcc = @EMCC_WRAPPER@ bin.wasm-strip = @BIN_WASM_STRIP@ bin.wasm-opt = @BIN_WASM_OPT@ +ifeq (,$(bin.wasm-opt)) + # wasm-opt is an optional optimization step. We install a dummy + # command in its place if it's not available to simplify the make + # recipes which use it. + #bin.wasm-opt = echo "[not wasm-opt]" +endif SHELL := $(bin.bash) # The following overrides can be activated to test diff --git a/ext/wasm/mkwasmbuilds.c b/ext/wasm/mkwasmbuilds.c index ece1185a36..27aa3b156f 100644 --- a/ext/wasm/mkwasmbuilds.c +++ b/ext/wasm/mkwasmbuilds.c @@ -64,6 +64,24 @@ static void mk_prologue(void){ ps("# pre-post-jses.deps.* = a list of dependencies for the"); ps("# --[extern-][pre/post]-js files."); ps("pre-post-jses.deps.common := $(extern-pre-js.js) $(sqlite3-license-version.js)"); + + /* SQLITE.CALL.WASM-OPT = shell code to run $(1) (source wasm file + ** name) through $(bin.wasm-opt) */ + ps("ifeq (,$(bin.wasm-opt))"); + ps("define SQLITE.CALL.WASM-OPT"); + ps("echo 'wasm-opt not available: $(1)'"); + ps("endef"); + ps("else"); + ps("define SQLITE.CALL.WASM-OPT"); + ps("echo -n 'Before wasm-opt:'; ls -l $(1);\\\n" + "\trm -f wasm-opt-tmp.wasm;\\\n" + "\t$(bin.wasm-opt) --enable-bulk-memory-opt --all-features --post-emscripten\\\n" + "\t$(1) -o wasm-opt-tmp.wasm || exit;\\\n" + "\tmv wasm-opt-tmp.wasm $(1); " + "echo -n 'After wasm-opt: '; ls -l $(1)" + ); + ps("endef"); + ps("endif"); } /* @@ -193,6 +211,10 @@ static void mk_lib_mode(const char *zName /* build name */, const char *zJsOut /* name of generated sqlite3.js/.mjs */, const char *zCmppD /* extra -D flags for c-pp */, const char *zEmcc /* extra flags for emcc */){ + const char * zTgtWasmName = "$(basename $@).wasm" + /* The various targets named X.js or X.mjs (zJsOut) also generate + ** X.wasm, and we need that part of the name to perform some + ** post-processing after Emscripten generates X.wasm. */; assert( zName ); assert( zMode ); assert( zApiJsOut ); @@ -234,14 +256,16 @@ static void mk_lib_mode(const char *zName /* build name */, /* TODO? Replace this CALL with the corresponding makefile code. ** OTOH, we also use this $(call) in the speedtest1-wasmfs build, ** which is not part of the rules emitted by this program. */ - pf("\t@$(call SQLITE3.xJS.ESM-EXPORT-DEFAULT,1,%d)\n", + pf("\t@$(call SQLITE.CALL.xJS.ESM-EXPORT-DEFAULT,1,%d)\n", 0==strcmp("sqlite3-wasmfs", zName) ? 1 : 0); } - pf("\t@dotwasm=$(basename $@).wasm; \\\n" - "\tchmod -x $$dotwasm; \\\n" - "\t$(maybe-wasm-strip) $$dotwasm; \\\n"); - pf("\tsed -i -e '/^var _sqlite3.*createExportWrapper/d' %s; \\\n" - "\techo 'Stripped out createExportWrapper() parts.'; \\\n", + pf("\t@chmod -x %s; \\\n" + "\t$(maybe-wasm-strip) %s;\n", + zTgtWasmName, zTgtWasmName); + pf("\t@$(call SQLITE.CALL.WASM-OPT,%s)\n", zTgtWasmName); + pf("\t@sed -i -e '/^var _sqlite3.*createExportWrapper/d' %s || exit; \\\n" + /* ^^^^^^ reminder: Mac/BSD sed has no -i flag */ + "\techo 'Stripped out createExportWrapper() parts.'\n", zJsOut) /* Our JS code installs bindings of each WASM export. The generated Emscripten JS file does the same using its own framework, but we don't use those results and can @@ -255,13 +279,14 @@ static void mk_lib_mode(const char *zName /* build name */, ** identical for all builds for which zEmcc is empty. */ if( 0==strcmp("bundler-friendly", zMode) - || 0==strcmp("node", zMode) ) { - pf("\techo 'Patching $@ for %s.wasm...' \\\n", zName); - pf("\trm -f $$dotwasm; dotwasm=; \\\n" - "\tsed -i -e 's/%s-%s.wasm/%s.wasm/g' $@ || exit $$?; \\\n", + || 0==strcmp("node", zMode) ){ + pf("\t@echo 'Patching $@ for %s.wasm...'; \\\n", zName); + pf("\trm -f %s; \\\n", zTgtWasmName); + pf("\tsed -i -e 's/%s-%s.wasm/%s.wasm/g' $@ || exit;\n", + /* ^^^^^^ reminder: Mac/BSD sed has no -i flag */ zNM, zName); } - pf("\tls -la $$dotwasm $@\n"); + pf("\t@ls -la %s $@\n", zTgtWasmName); if( 0!=strcmp("sqlite3-wasmfs", zName) ){ /* The sqlite3-wasmfs build is optional and needs to be invoked ** conditionally using info we don't have here. */ diff --git a/ext/wasm/wasmfs.make b/ext/wasm/wasmfs.make index 9de5574f26..2c6fa35bdd 100644 --- a/ext/wasm/wasmfs.make +++ b/ext/wasm/wasmfs.make @@ -101,7 +101,7 @@ $(speedtest1-wasmfs.mjs): $(speedtest1.cfiles) $(sqlite3-wasmfs.js) \ $(emcc.flags.sqlite3-wasmfs) \ $(emcc.flags.speedtest1-wasmfs) \ -o $@ $(speedtest1.cfiles) -lm - @$(call SQLITE3.xJS.ESM-EXPORT-DEFAULT,1,1) + @$(call SQLITE.CALL.xJS.ESM-EXPORT-DEFAULT,1,1) $(maybe-wasm-strip) $(speedtest1-wasmfs.wasm) chmod -x $(speedtest1-wasmfs.wasm) ls -la $@ $(speedtest1-wasmfs.wasm) diff --git a/manifest b/manifest index 2bb299c38b..a531e94568 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Move\ssmall\sparts\sof\sext/wasm/GNUmakefile\sinto\sext/wasm/config.make.in\sand\shave\sthe\sconfigure\sscript\spopulate\sthat,\srather\sthan\sdynamically\sdetermining\sthose\svalues\son\seach\s'make'\sinvocation.\sAdd\sa\sconfigure-time\scheck\sfor\sthe\soptional\swasm-opt\sbinary\sin\sprep\sfor\spending\sexperimentation\swith\susing\sit\sto\sreduce\sthe\swasm\sfile\ssizes. -D 2025-01-23T14:09:02.122 +C Initial\ssupport\sfor\spost-processing\swasm\sfiles\swith\swasm-opt\s(if\sit's\savailable).\sThis\scurrently\sshaves\s12kb\soff\sof\sthe\srelease-mode\sbuild\sof\ssqlite3.wasm\sbut\sthere\sare\smany\sdozens\sof\swasm-opt\sflags\sleft\sto\stry. +D 2025-01-23T15:58:01.776 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -618,7 +618,7 @@ F ext/session/sqlite3session.c d6f5e3e83b9b0bbc4a8db4837284f0ecc6af5321d4c8e7136 F ext/session/sqlite3session.h 683ccbf16e2c2521661fc4c1cf918ce57002039efbcabcd8097fa4bca569104b F ext/session/test_session.c 12e0a2c15fd60f92da4bb29c697c9177ff0c0dbcdc5129a54c47e999f147937a F ext/wasm/EXPORTED_FUNCTIONS.fiddle.in 27450c8b8c70875a260aca55435ec927068b34cef801a96205adb81bdcefc65c -F ext/wasm/GNUmakefile 5c36cb9ad5217e74f8936861210dac0b052b9cd418cbabe915cc9d646c5743a0 +F ext/wasm/GNUmakefile 999ea962c098a934daa18e724c53856493adf1e03b3237465a5ee5b6fde28880 F ext/wasm/README-dist.txt 6382cb9548076fca472fb3330bbdba3a55c1ea0b180ff9253f084f07ff383576 F ext/wasm/README.md a8a2962c3aebdf8d2104a9102e336c5554e78fc6072746e5daf9c61514e7d193 F ext/wasm/SQLTester/GNUmakefile e0794f676d55819951bbfae45cc5e8d7818dc460492dc317ce7f0d2eca15caff @@ -659,7 +659,7 @@ F ext/wasm/common/SqliteTestUtil.js 7adaeffef757d8708418dc9190f72df22367b5318317 F ext/wasm/common/emscripten.css 11bd104b6c0d597c67d40cc8ecc0a60dae2b965151e3b6a37fa5708bac3acd15 F ext/wasm/common/testing.css e97549bab24126c24e0daabfe2de9bb478fb0a69fdb2ddd0a73a992c091aad6f F ext/wasm/common/whwasmutil.js d76c69617e95d85ffc9996f7d9d7481df6976dcbd860ecd82bd8c075e3a101ae -F ext/wasm/config.make.in f830c98f0f668f7628d9521bc0b1175ab15b050f20fe3234346be346d747c587 +F ext/wasm/config.make.in a44a2f9657c80c9ef0f5a462937a7c2f64916c8b99fb0a28b67d37f961997c94 F ext/wasm/demo-123-worker.html a0b58d9caef098a626a1a1db567076fca4245e8d60ba94557ede8684350a81ed F ext/wasm/demo-123.html 8c70a412ce386bd3796534257935eb1e3ea5c581e5d5aea0490b8232e570a508 F ext/wasm/demo-123.js c7b3cca50c55841c381a9ca4f9396e5bbdc6114273d0b10a43e378e32e7be5bf @@ -679,7 +679,7 @@ F ext/wasm/index-dist.html 564b5ec5669676482c5a25dea9e721d8eafed426ecb155f93d29a F ext/wasm/index.html e4bbffdb3d40eff12b3f9c7abedef91787e2935620b7f8d40f2c774b80ad8fa9 F ext/wasm/jaccwabyt/jaccwabyt.js 1264710db3cfbcb6887d95665b7aeba60c1126eaef789ca4cf1a4a17d5bc7f54 F ext/wasm/jaccwabyt/jaccwabyt.md 59a20df389abcc3606eb4eaea7fb7ba14504beb3e345dbea9b99a0618ba3bec8 -F ext/wasm/mkwasmbuilds.c 619b99bffb9538c681f0622395a177e4ba2e2658bc1b94bb7f6605245b6e365e +F ext/wasm/mkwasmbuilds.c 9f4e0527043a20fab98463e455eeaf287e58b01700248b213159b86a6c3fbb5f F ext/wasm/module-symbols.html dc476b403369b26a1a23773e13b80f41b9a49f0825e81435fe3600a7cfbbe337 F ext/wasm/scratchpad-wasmfs.html a3d7388f3c4b263676b58b526846e9d02dfcb4014ff29d3a5040935286af5b96 F ext/wasm/scratchpad-wasmfs.mjs 66034b9256b218de59248aad796760a1584c1dd842231505895eff00dbd57c63 @@ -699,7 +699,7 @@ F ext/wasm/tester1.c-pp.js 228101c290003423f0bfb66a6ebbfc6904fa7b1b69466e700c135 F ext/wasm/tests/opfs/concurrency/index.html 657578a6e9ce1e9b8be951549ed93a6a471f4520a99e5b545928668f4285fb5e F ext/wasm/tests/opfs/concurrency/test.js d08889a5bb6e61937d0b8cbb78c9efbefbf65ad09f510589c779b7cc6a803a88 F ext/wasm/tests/opfs/concurrency/worker.js 0a8c1a3e6ebb38aabbee24f122693f1fb29d599948915c76906681bb7da1d3d2 -F ext/wasm/wasmfs.make bc8bb227f35d5bd3863a7bd2233437c37472a0d81585979f058f9b9b503bef35 +F ext/wasm/wasmfs.make 68999f5bd8c489239592d59a420f8c627c99169bbd6fa16a404751f757b9f702 F magic.txt 5ade0bc977aa135e79e3faaea894d5671b26107cc91e70783aa7dc83f22f3ba0 F main.mk 18b859068a43818d29172b36d624a9bc8ce8204350ebd18a9f96994970081ab9 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 10c91f9cd074e8d35af1c7f8251ac18e5dd91fa14df3fe4e1fb44441c4f08c7a -R 07e50a0cf41474faaa27c1572e1c844e +P 0a426a549577b883e2de7cd0605041cc97b57f53ee6657bc318b0bfde7b62677 +R 2d32486992b9b3356e014d934b282b6a U stephan -Z 685755e90bacd2eb62f10206ae6eb72e +Z edbdf887524cd901e3308cf68c45b681 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 8753d034c2..d0f50acaa8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0a426a549577b883e2de7cd0605041cc97b57f53ee6657bc318b0bfde7b62677 +5d16e3f28364de2d6b6456a6fc56bf604b9106c3ae15719f2862192ae3020cc1 From 726a047a4767ebde16b64a807ca4d9132aa39a5e Mon Sep 17 00:00:00 2001 From: stephan Date: Thu, 23 Jan 2025 16:11:24 +0000 Subject: [PATCH 105/220] Remove some now-dead makefile code, rename a var for consistency, and fix a recipe bug introduced in the previous checkin in the bundler-friendly build. FossilOrigin-Name: 0acd4ef3addb311476f4a670be0c4c4a0f3f88b0420886d4c1c3c3027dd51d73 --- ext/wasm/config.make.in | 11 +++-------- ext/wasm/mkwasmbuilds.c | 29 ++++++++++++++++------------- manifest | 14 +++++++------- manifest.uuid | 2 +- 4 files changed, 27 insertions(+), 29 deletions(-) diff --git a/ext/wasm/config.make.in b/ext/wasm/config.make.in index 3218541b37..f30baac3f1 100644 --- a/ext/wasm/config.make.in +++ b/ext/wasm/config.make.in @@ -4,17 +4,12 @@ bin.emcc = @EMCC_WRAPPER@ bin.wasm-strip = @BIN_WASM_STRIP@ bin.wasm-opt = @BIN_WASM_OPT@ -ifeq (,$(bin.wasm-opt)) - # wasm-opt is an optional optimization step. We install a dummy - # command in its place if it's not available to simplify the make - # recipes which use it. - #bin.wasm-opt = echo "[not wasm-opt]" -endif SHELL := $(bin.bash) -# The following overrides can be activated to test -# various validation in GNUmakefile: +# The following overrides can be uncommented to test various +# validation and if/else branches the makefile code: # #bin.bash := #bin.emcc := #bin.wasm-strip := +#bin.wasm-opt := diff --git a/ext/wasm/mkwasmbuilds.c b/ext/wasm/mkwasmbuilds.c index 27aa3b156f..738885ff34 100644 --- a/ext/wasm/mkwasmbuilds.c +++ b/ext/wasm/mkwasmbuilds.c @@ -69,7 +69,7 @@ static void mk_prologue(void){ ** name) through $(bin.wasm-opt) */ ps("ifeq (,$(bin.wasm-opt))"); ps("define SQLITE.CALL.WASM-OPT"); - ps("echo 'wasm-opt not available: $(1)'"); + ps("echo 'wasm-opt not available for $(1)'"); ps("endef"); ps("else"); ps("define SQLITE.CALL.WASM-OPT"); @@ -211,7 +211,7 @@ static void mk_lib_mode(const char *zName /* build name */, const char *zJsOut /* name of generated sqlite3.js/.mjs */, const char *zCmppD /* extra -D flags for c-pp */, const char *zEmcc /* extra flags for emcc */){ - const char * zTgtWasmName = "$(basename $@).wasm" + const char * zWasmOut = "$(basename $@).wasm" /* The various targets named X.js or X.mjs (zJsOut) also generate ** X.wasm, and we need that part of the name to perform some ** post-processing after Emscripten generates X.wasm. */; @@ -260,12 +260,12 @@ static void mk_lib_mode(const char *zName /* build name */, 0==strcmp("sqlite3-wasmfs", zName) ? 1 : 0); } pf("\t@chmod -x %s; \\\n" - "\t$(maybe-wasm-strip) %s;\n", - zTgtWasmName, zTgtWasmName); - pf("\t@$(call SQLITE.CALL.WASM-OPT,%s)\n", zTgtWasmName); + "\t\t$(maybe-wasm-strip) %s;\n", + zWasmOut, zWasmOut); + pf("\t@$(call SQLITE.CALL.WASM-OPT,%s)\n", zWasmOut); pf("\t@sed -i -e '/^var _sqlite3.*createExportWrapper/d' %s || exit; \\\n" /* ^^^^^^ reminder: Mac/BSD sed has no -i flag */ - "\techo 'Stripped out createExportWrapper() parts.'\n", + "\t\techo 'Stripped out createExportWrapper() parts.'\n", zJsOut) /* Our JS code installs bindings of each WASM export. The generated Emscripten JS file does the same using its own framework, but we don't use those results and can @@ -273,20 +273,23 @@ static void mk_lib_mode(const char *zName /* build name */, considerably, by stripping them out. */; /* ** The above $(bin.emcc) call will write zJsOut and will create a - ** like-named .wasm file. That .wasm file name gets hard-coded into - ** zJsOut so we need to, for some cases, patch zJsOut to use the - ** name sqlite3.wasm instead. Note that the resulting .wasm file is - ** identical for all builds for which zEmcc is empty. + ** like-named .wasm file (zWasmOut). That .wasm file name gets + ** hard-coded into zJsOut so we need to, for some cases, patch + ** zJsOut to use the name sqlite3.wasm instead. Note that the + ** resulting .wasm file is identical for all builds for which zEmcc + ** is empty. */ if( 0==strcmp("bundler-friendly", zMode) || 0==strcmp("node", zMode) ){ pf("\t@echo 'Patching $@ for %s.wasm...'; \\\n", zName); - pf("\trm -f %s; \\\n", zTgtWasmName); - pf("\tsed -i -e 's/%s-%s.wasm/%s.wasm/g' $@ || exit;\n", + pf("\t\trm -f %s; \\\n", zWasmOut); + pf("\t\tsed -i -e 's/%s-%s.wasm/%s.wasm/g' $@ || exit;\n", /* ^^^^^^ reminder: Mac/BSD sed has no -i flag */ zNM, zName); + pf("\t@ls -la $@\n"); + }else{ + pf("\t@ls -la %s $@\n", zWasmOut); } - pf("\t@ls -la %s $@\n", zTgtWasmName); if( 0!=strcmp("sqlite3-wasmfs", zName) ){ /* The sqlite3-wasmfs build is optional and needs to be invoked ** conditionally using info we don't have here. */ diff --git a/manifest b/manifest index a531e94568..db22f48ef3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Initial\ssupport\sfor\spost-processing\swasm\sfiles\swith\swasm-opt\s(if\sit's\savailable).\sThis\scurrently\sshaves\s12kb\soff\sof\sthe\srelease-mode\sbuild\sof\ssqlite3.wasm\sbut\sthere\sare\smany\sdozens\sof\swasm-opt\sflags\sleft\sto\stry. -D 2025-01-23T15:58:01.776 +C Remove\ssome\snow-dead\smakefile\scode,\srename\sa\svar\sfor\sconsistency,\sand\sfix\sa\srecipe\sbug\sintroduced\sin\sthe\sprevious\scheckin\sin\sthe\sbundler-friendly\sbuild. +D 2025-01-23T16:11:24.436 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -659,7 +659,7 @@ F ext/wasm/common/SqliteTestUtil.js 7adaeffef757d8708418dc9190f72df22367b5318317 F ext/wasm/common/emscripten.css 11bd104b6c0d597c67d40cc8ecc0a60dae2b965151e3b6a37fa5708bac3acd15 F ext/wasm/common/testing.css e97549bab24126c24e0daabfe2de9bb478fb0a69fdb2ddd0a73a992c091aad6f F ext/wasm/common/whwasmutil.js d76c69617e95d85ffc9996f7d9d7481df6976dcbd860ecd82bd8c075e3a101ae -F ext/wasm/config.make.in a44a2f9657c80c9ef0f5a462937a7c2f64916c8b99fb0a28b67d37f961997c94 +F ext/wasm/config.make.in 4bc43443f768a61efd43cf995a5e618f58ac9afc0936706014193537d82c41cb F ext/wasm/demo-123-worker.html a0b58d9caef098a626a1a1db567076fca4245e8d60ba94557ede8684350a81ed F ext/wasm/demo-123.html 8c70a412ce386bd3796534257935eb1e3ea5c581e5d5aea0490b8232e570a508 F ext/wasm/demo-123.js c7b3cca50c55841c381a9ca4f9396e5bbdc6114273d0b10a43e378e32e7be5bf @@ -679,7 +679,7 @@ F ext/wasm/index-dist.html 564b5ec5669676482c5a25dea9e721d8eafed426ecb155f93d29a F ext/wasm/index.html e4bbffdb3d40eff12b3f9c7abedef91787e2935620b7f8d40f2c774b80ad8fa9 F ext/wasm/jaccwabyt/jaccwabyt.js 1264710db3cfbcb6887d95665b7aeba60c1126eaef789ca4cf1a4a17d5bc7f54 F ext/wasm/jaccwabyt/jaccwabyt.md 59a20df389abcc3606eb4eaea7fb7ba14504beb3e345dbea9b99a0618ba3bec8 -F ext/wasm/mkwasmbuilds.c 9f4e0527043a20fab98463e455eeaf287e58b01700248b213159b86a6c3fbb5f +F ext/wasm/mkwasmbuilds.c 0c85aef64ac94f903964c046e7d5a291a95afbbc881d2a96b7871e825e1d175c F ext/wasm/module-symbols.html dc476b403369b26a1a23773e13b80f41b9a49f0825e81435fe3600a7cfbbe337 F ext/wasm/scratchpad-wasmfs.html a3d7388f3c4b263676b58b526846e9d02dfcb4014ff29d3a5040935286af5b96 F ext/wasm/scratchpad-wasmfs.mjs 66034b9256b218de59248aad796760a1584c1dd842231505895eff00dbd57c63 @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 0a426a549577b883e2de7cd0605041cc97b57f53ee6657bc318b0bfde7b62677 -R 2d32486992b9b3356e014d934b282b6a +P 5d16e3f28364de2d6b6456a6fc56bf604b9106c3ae15719f2862192ae3020cc1 +R f70ac1b6c598112d9638929ed475c3d8 U stephan -Z edbdf887524cd901e3308cf68c45b681 +Z e841368168cc448b3b9bb4f562d2f5fb # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index d0f50acaa8..374beb8fa4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5d16e3f28364de2d6b6456a6fc56bf604b9106c3ae15719f2862192ae3020cc1 +0acd4ef3addb311476f4a670be0c4c4a0f3f88b0420886d4c1c3c3027dd51d73 From 02e81f72a06964998971059312fe36fc64e9dda8 Mon Sep 17 00:00:00 2001 From: stephan Date: Thu, 23 Jan 2025 19:44:09 +0000 Subject: [PATCH 106/220] When running wasm-opt, ignore any failure because it will fail for unknown flags and the set of legal flags will change from version to version. Document the size-reduction effect (or non-effect) of a dozen-odd wasm-opt flags and retain those which demonstrate a wasm file size reduction in -Oz builds (our production build mode). Total size savings: roughly 13kb. FossilOrigin-Name: c9dc581e0287e3462ac55f80ca76e7e98d31157022052c892517363c45287a7b --- ext/wasm/mkwasmbuilds.c | 85 ++++++++++++++++++++++++++++++++--------- manifest | 12 +++--- manifest.uuid | 2 +- 3 files changed, 75 insertions(+), 24 deletions(-) diff --git a/ext/wasm/mkwasmbuilds.c b/ext/wasm/mkwasmbuilds.c index 738885ff34..a3c0e4c067 100644 --- a/ext/wasm/mkwasmbuilds.c +++ b/ext/wasm/mkwasmbuilds.c @@ -65,23 +65,74 @@ static void mk_prologue(void){ ps("# --[extern-][pre/post]-js files."); ps("pre-post-jses.deps.common := $(extern-pre-js.js) $(sqlite3-license-version.js)"); - /* SQLITE.CALL.WASM-OPT = shell code to run $(1) (source wasm file - ** name) through $(bin.wasm-opt) */ - ps("ifeq (,$(bin.wasm-opt))"); - ps("define SQLITE.CALL.WASM-OPT"); - ps("echo 'wasm-opt not available for $(1)'"); - ps("endef"); - ps("else"); - ps("define SQLITE.CALL.WASM-OPT"); - ps("echo -n 'Before wasm-opt:'; ls -l $(1);\\\n" - "\trm -f wasm-opt-tmp.wasm;\\\n" - "\t$(bin.wasm-opt) --enable-bulk-memory-opt --all-features --post-emscripten\\\n" - "\t$(1) -o wasm-opt-tmp.wasm || exit;\\\n" - "\tmv wasm-opt-tmp.wasm $(1); " - "echo -n 'After wasm-opt: '; ls -l $(1)" - ); - ps("endef"); - ps("endif"); + { + /* SQLITE.CALL.WASM-OPT = shell code to run $(1) (source wasm file + ** name) through $(bin.wasm-opt) */ + const char * zOptFlags = + /* + ** Flags for wasm-opt. It has many, many, MANY "passes" options + ** and the ones which appear here were selected solely on the + ** basis of trial and error. + ** + ** All wasm file size savings/costs mentioned below are based on + ** the vanilla build of sqlite3.wasm with -Oz (our shipping + ** configuration). Comments like "saves nothing" may not be + ** technically correct: "nothing" means "some neglible amount." + ** + ** Note that performance gains/losses are _not_ taken into + ** account here: only wasm file size. + */ + "--enable-bulk-memory-opt " /* required */ + "--all-features " /* required */ + "--post-emscripten " /* Saves roughly 12kb */ + "--strip-debug " /* We already wasm-strip, but in + ** case this environment has no + ** wasm-strip... */ + /* + ** The rest are trial-and-error. See wasm-opt --help and search + ** for "Optimization passes" to find the full list. + ** + ** With many flags this gets unusuably slow. + */ + /*"--converge " saves nothing for the options we're using */ + /*"--dce " saves nothing */ + /*"--directize " saves nothing */ + /*"--gsi " no: requires --closed-world flag, which does not + ** sound like something we want. */ + /*"--gufa --gufa-cast-all --gufa-optimizing " costs roughly 2kb */ + /*"--heap-store-optimization " saves nothing */ + /*"--heap2local " saves nothing */ + //"--inlining --inlining-optimizing " costs roughly 3kb */ + "--local-cse " /* saves roughly 1kb */ + /*"--once-reduction " saves nothing */ + /*"--remove-memory-init " presumably a performance tweak */ + /*"--remove-unused-names " saves nothing */ + /*"--safe-heap "*/ + /*"--vacuum " saves nothing */ + ; + ps("ifeq (,$(bin.wasm-opt))"); + ps("define SQLITE.CALL.WASM-OPT"); + ps("echo 'wasm-opt not available for $(1)'"); + ps("endef"); + ps("else"); + ps("define SQLITE.CALL.WASM-OPT"); + pf("echo -n 'Before wasm-opt:'; ls -l $(1);\\\n" + "\trm -f wasm-opt-tmp.wasm;\\\n" + /* It's very likely that the set of wasm-opt flags varies from + ** version to version, so we'll ignore any errors here. */ + "\tif $(bin.wasm-opt) $(1) -o wasm-opt-tmp.wasm \\\n" + "\t\t%s; then \\\n" + "\t\tmv wasm-opt-tmp.wasm $(1); \\\n" + "\t\techo -n 'After wasm-opt: '; \\\n" + "\t\tls -l $(1); \\\n" + "\telse \\\n" + "\t\techo 'WARNING: ignoring wasm-opt failure'; \\\n" + "\tfi\n", + zOptFlags + ); + ps("endef"); + ps("endif"); + } } /* diff --git a/manifest b/manifest index db22f48ef3..7b5514b31f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\ssome\snow-dead\smakefile\scode,\srename\sa\svar\sfor\sconsistency,\sand\sfix\sa\srecipe\sbug\sintroduced\sin\sthe\sprevious\scheckin\sin\sthe\sbundler-friendly\sbuild. -D 2025-01-23T16:11:24.436 +C When\srunning\swasm-opt,\signore\sany\sfailure\sbecause\sit\swill\sfail\sfor\sunknown\sflags\sand\sthe\sset\sof\slegal\sflags\swill\schange\sfrom\sversion\sto\sversion.\s\sDocument\sthe\ssize-reduction\seffect\s(or\snon-effect)\sof\sa\sdozen-odd\swasm-opt\sflags\sand\sretain\sthose\swhich\sdemonstrate\sa\swasm\sfile\ssize\sreduction\sin\s-Oz\sbuilds\s(our\sproduction\sbuild\smode).\sTotal\ssize\ssavings:\sroughly\s13kb. +D 2025-01-23T19:44:09.613 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -679,7 +679,7 @@ F ext/wasm/index-dist.html 564b5ec5669676482c5a25dea9e721d8eafed426ecb155f93d29a F ext/wasm/index.html e4bbffdb3d40eff12b3f9c7abedef91787e2935620b7f8d40f2c774b80ad8fa9 F ext/wasm/jaccwabyt/jaccwabyt.js 1264710db3cfbcb6887d95665b7aeba60c1126eaef789ca4cf1a4a17d5bc7f54 F ext/wasm/jaccwabyt/jaccwabyt.md 59a20df389abcc3606eb4eaea7fb7ba14504beb3e345dbea9b99a0618ba3bec8 -F ext/wasm/mkwasmbuilds.c 0c85aef64ac94f903964c046e7d5a291a95afbbc881d2a96b7871e825e1d175c +F ext/wasm/mkwasmbuilds.c 1d5ba1e274d0331b2c8549b288ed108f6764674deb3fa7105b0bb0cea6f68cd5 F ext/wasm/module-symbols.html dc476b403369b26a1a23773e13b80f41b9a49f0825e81435fe3600a7cfbbe337 F ext/wasm/scratchpad-wasmfs.html a3d7388f3c4b263676b58b526846e9d02dfcb4014ff29d3a5040935286af5b96 F ext/wasm/scratchpad-wasmfs.mjs 66034b9256b218de59248aad796760a1584c1dd842231505895eff00dbd57c63 @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 5d16e3f28364de2d6b6456a6fc56bf604b9106c3ae15719f2862192ae3020cc1 -R f70ac1b6c598112d9638929ed475c3d8 +P 0acd4ef3addb311476f4a670be0c4c4a0f3f88b0420886d4c1c3c3027dd51d73 +R 1bff543c29d839d27b34bab0c548a658 U stephan -Z e841368168cc448b3b9bb4f562d2f5fb +Z 154b3ea92135b6fb56c35822cc74d582 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 374beb8fa4..780c9d3745 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0acd4ef3addb311476f4a670be0c4c4a0f3f88b0420886d4c1c3c3027dd51d73 +c9dc581e0287e3462ac55f80ca76e7e98d31157022052c892517363c45287a7b From 1519675a1acb02e18edb5014068a70698e670648 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 23 Jan 2025 21:06:59 +0000 Subject: [PATCH 107/220] Fix a possible infinity loop in debugging-printf logic in the query planner. No changes to production code. FossilOrigin-Name: 9a20b94080f5379867530772e081b737ae4cf6b416469dcabb85b8dd819f491f --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/where.c | 7 +++++-- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 7b5514b31f..30ff3f1fd0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\srunning\swasm-opt,\signore\sany\sfailure\sbecause\sit\swill\sfail\sfor\sunknown\sflags\sand\sthe\sset\sof\slegal\sflags\swill\schange\sfrom\sversion\sto\sversion.\s\sDocument\sthe\ssize-reduction\seffect\s(or\snon-effect)\sof\sa\sdozen-odd\swasm-opt\sflags\sand\sretain\sthose\swhich\sdemonstrate\sa\swasm\sfile\ssize\sreduction\sin\s-Oz\sbuilds\s(our\sproduction\sbuild\smode).\sTotal\ssize\ssavings:\sroughly\s13kb. -D 2025-01-23T19:44:09.613 +C Fix\sa\spossible\sinfinity\sloop\sin\sdebugging-printf\slogic\sin\sthe\squery\splanner.\nNo\schanges\sto\sproduction\scode. +D 2025-01-23T21:06:59.817 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -863,7 +863,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 4e6181d8780ab0af2e1388d0754cbe6f2f04593d2b1ab6c41699a89942fd8997 F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 -F src/where.c 5e74d76b264abcd7e6682e02853756b5d32f543c59fb47bb55a02575b73693ae +F src/where.c 6722991bece039c7094e9e31bb57b9eb155299f01d2209f1378a81c9605ded31 F src/whereInt.h 2b0804f300c7f65de4046a1d81c65f01b208d6c08950ccd1fa6b8c16162a8af7 F src/wherecode.c 0c3d3199a2b769a5e2bb70feb5003dc85b3d86842ecaf903a47f2b4205ca5dab F src/whereexpr.c 0f93a29cabd3a338d09a1f5c6770620a1ac51ec1157f3229502a7e7767c60b6f @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 0acd4ef3addb311476f4a670be0c4c4a0f3f88b0420886d4c1c3c3027dd51d73 -R 1bff543c29d839d27b34bab0c548a658 -U stephan -Z 154b3ea92135b6fb56c35822cc74d582 +P c9dc581e0287e3462ac55f80ca76e7e98d31157022052c892517363c45287a7b +R fa61ff8d8db6242b1ed2cb7c9f3ef7ec +U drh +Z 2dbdf3625aeab02b475903def004e928 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 780c9d3745..e686eed397 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c9dc581e0287e3462ac55f80ca76e7e98d31157022052c892517363c45287a7b +9a20b94080f5379867530772e081b737ae4cf6b416469dcabb85b8dd819f491f diff --git a/src/where.c b/src/where.c index 0b8e5aceaa..cad66e70bc 100644 --- a/src/where.c +++ b/src/where.c @@ -5838,8 +5838,10 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ if( sqlite3WhereTrace & 0x02 ){ LogEst rMin, rFloor = 0; int nDone = 0; + int nProgress; sqlite3DebugPrintf("---- after round %d ----\n", iLoop); - while( nDonerCost>rFloor && pTo->rCostrCost; @@ -5855,10 +5857,11 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ sqlite3DebugPrintf("\n"); } nDone++; + nProgress++; } } rFloor = rMin; - } + }while( nDone0 ); } #endif From 07a2e5d1ed4fbfd283c48c7201f2743c5295005a Mon Sep 17 00:00:00 2001 From: stephan Date: Thu, 23 Jan 2025 22:23:31 +0000 Subject: [PATCH 108/220] wasm: de-list demo-worker1-promiser-esm.html from the test pages because (per Chrome 131) "Module scripts don't support importScripts()", where "don't" means "they used to but no longer do". FossilOrigin-Name: 4aa025a943a4024094b91f13abfb8945bbbb8334e3ec904dee5315852845bfe1 --- ext/wasm/index-dist.html | 4 ++-- ext/wasm/index.html | 4 ++-- manifest | 16 ++++++++-------- manifest.uuid | 2 +- 4 files changed, 13 insertions(+), 13 deletions(-) diff --git a/ext/wasm/index-dist.html b/ext/wasm/index-dist.html index 7b778b0205..47bae3f7a9 100644 --- a/ext/wasm/index-dist.html +++ b/ext/wasm/index-dist.html @@ -97,8 +97,8 @@ wrapper is significantly easier to use, however.
              1. demo-worker1-promiser: a demo of the Promise-based wrapper of the Worker1 API.
              2. -
              3. demo-worker1-promiser-esm: - same as the previous demo except loads the promiser from an ESM module.
              4. +
        4. diff --git a/ext/wasm/index.html b/ext/wasm/index.html index a3d41f1a9c..5d53b62d48 100644 --- a/ext/wasm/index.html +++ b/ext/wasm/index.html @@ -84,8 +84,8 @@ wrapper is significantly easier to use, however.
        5. demo-worker1-promiser: a demo of the Promise-based wrapper of the Worker1 API.
        6. -
        7. demo-worker1-promiser-esm: - same as the previous demo except loads the promiser from an ESM module.
        8. +
        9. speedtest1 ports (sqlite3's primary benchmarking tool)... diff --git a/manifest b/manifest index 30ff3f1fd0..16562bac12 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\spossible\sinfinity\sloop\sin\sdebugging-printf\slogic\sin\sthe\squery\splanner.\nNo\schanges\sto\sproduction\scode. -D 2025-01-23T21:06:59.817 +C wasm:\sde-list\sdemo-worker1-promiser-esm.html\sfrom\sthe\stest\spages\sbecause\s(per\sChrome\s131)\s"Module\sscripts\sdon't\ssupport\simportScripts()",\swhere\s"don't"\smeans\s"they\sused\sto\sbut\sno\slonger\sdo". +D 2025-01-23T22:23:31.384 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -675,8 +675,8 @@ F ext/wasm/fiddle.make d4969f0322a582c57a22ce3541f10a5b09a609d14eab32891f613f43b F ext/wasm/fiddle/fiddle-worker.js 850e66fce39b89d59e161d1abac43a181a4caa89ddeea162765d660277cd84ce F ext/wasm/fiddle/fiddle.js b444a5646a9aac9f3fc06c53d78af5e1912eb235d69a8e6010723e4eb0e9d4a1 F ext/wasm/fiddle/index.html c79b1741cbeba78f88af0a84cf5ec7de87a909a6a8d10a369b1f4824c66c2088 -F ext/wasm/index-dist.html 564b5ec5669676482c5a25dea9e721d8eafed426ecb155f93d29aeff8507511f -F ext/wasm/index.html e4bbffdb3d40eff12b3f9c7abedef91787e2935620b7f8d40f2c774b80ad8fa9 +F ext/wasm/index-dist.html 56132399702b15d70c474c3f1952541e25cb0922942868f70daf188f024b3730 +F ext/wasm/index.html 10ff3ad190aadccb713109fa55a38e5c1f3c2a8cf05cd31783745bab3f184079 F ext/wasm/jaccwabyt/jaccwabyt.js 1264710db3cfbcb6887d95665b7aeba60c1126eaef789ca4cf1a4a17d5bc7f54 F ext/wasm/jaccwabyt/jaccwabyt.md 59a20df389abcc3606eb4eaea7fb7ba14504beb3e345dbea9b99a0618ba3bec8 F ext/wasm/mkwasmbuilds.c 1d5ba1e274d0331b2c8549b288ed108f6764674deb3fa7105b0bb0cea6f68cd5 @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P c9dc581e0287e3462ac55f80ca76e7e98d31157022052c892517363c45287a7b -R fa61ff8d8db6242b1ed2cb7c9f3ef7ec -U drh -Z 2dbdf3625aeab02b475903def004e928 +P 9a20b94080f5379867530772e081b737ae4cf6b416469dcabb85b8dd819f491f +R 1263da0640161ebdae6e992388a26d15 +U stephan +Z 4ee9ffdcb199c9538a20ad596279afe3 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index e686eed397..fe61a8162e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9a20b94080f5379867530772e081b737ae4cf6b416469dcabb85b8dd819f491f +4aa025a943a4024094b91f13abfb8945bbbb8334e3ec904dee5315852845bfe1 From c70631623c314bb699f0fab9ba1bd884cef11289 Mon Sep 17 00:00:00 2001 From: stephan Date: Fri, 24 Jan 2025 08:58:54 +0000 Subject: [PATCH 109/220] Remove extraneous are-we-making-clean guards from the generated wasm build rules, as that guard is set at a higher level. Rename a makefile call()able for consistency. FossilOrigin-Name: 7f9074e2a7ff62bdcf343895e80a51224de62a22afbbf82068ec5fea7eeda0bb --- ext/wasm/GNUmakefile | 43 +++++++++++++++++++++-------------------- ext/wasm/mkwasmbuilds.c | 12 +++++------- manifest | 14 +++++++------- manifest.uuid | 2 +- 4 files changed, 35 insertions(+), 36 deletions(-) diff --git a/ext/wasm/GNUmakefile b/ext/wasm/GNUmakefile index 5623965478..3e9621c6d2 100644 --- a/ext/wasm/GNUmakefile +++ b/ext/wasm/GNUmakefile @@ -32,7 +32,8 @@ # # - Emscripten SDK: https://emscripten.org/docs/getting_started/downloads.html # - The bash shell -# - GNU make, GNU sed, GNU awk, GNU grep (all in the $PATH) +# - GNU make, GNU sed, GNU awk, GNU grep (all in the $PATH and without +# a "g" prefix like they have on some non-GNU systems) # - wasm-strip for release builds: https://github.com/WebAssembly/wabt # - InfoZip for 'dist' zip file ######################################################################## @@ -376,7 +377,7 @@ $(bin.stripccomments): $(bin.stripccomments).c $(MAKEFILE) DISTCLEAN_FILES += $(bin.stripccomments) ######################################################################## -# C-PP.FILTER: a $(call)able to transform $(1) to $(2) via: +# SQLITE.CALL.C-PP.FILTER: a $(call)able to transform $(1) to $(2) via: # # ./c-pp -f $(1) -o $(2) $(3) # @@ -406,7 +407,7 @@ DISTCLEAN_FILES += $(bin.stripccomments) # JS/WASM build. They are solely for use with $(bin.c-pp) itself. # # -D... flags which should be included in all invocations should be -# appended to $(C-PP.FILTER.global). +# appended to $(SQLITE.CALL.C-PP.FILTER.global). bin.c-pp := ./c-pp $(bin.c-pp): c-pp.c $(sqlite3.c) $(MAKEFILE) $(CC) -O0 -o $@ c-pp.c $(sqlite3.c) '-DCMPP_DEFAULT_DELIM="//#"' -I$(dir.top) \ @@ -414,20 +415,20 @@ $(bin.c-pp): c-pp.c $(sqlite3.c) $(MAKEFILE) -DSQLITE_OMIT_SHARED_CACHE -DSQLITE_OMIT_WAL -DSQLITE_THREADSAFE=0 \ -DSQLITE_TEMP_STORE=3 DISTCLEAN_FILES += $(bin.c-pp) -C-PP.FILTER.global ?= +SQLITE.CALL.C-PP.FILTER.global ?= ifeq (1,$(SQLITE_C_IS_SEE)) - C-PP.FILTER.global += -Denable-see + SQLITE.CALL.C-PP.FILTER.global += -Denable-see endif -define C-PP.FILTER +define SQLITE.CALL.C-PP.FILTER # Create $2 from $1 using $(bin.c-pp) # $1 = Input file: c-pp -f $(1).js # $2 = Output file: c-pp -o $(2).js # $3 = optional c-pp -D... flags $(2): $(1) $$(MAKEFILE) $$(bin.c-pp) - $$(bin.c-pp) -f $(1) -o $$@ $(3) $(C-PP.FILTER.global) + $$(bin.c-pp) -f $(1) -o $$@ $(3) $(SQLITE.CALL.C-PP.FILTER.global) #CLEAN_FILES += $(2) endef -# /end C-PP.FILTER +# /end SQLITE.CALL.C-PP.FILTER ######################################################################## # cflags.common = C compiler flags for all builds @@ -908,22 +909,22 @@ sqlite3-worker1-promiser.js := $(dir.dout)/sqlite3-worker1-promiser.js sqlite3-worker1-promiser.mjs := $(dir.dout)/sqlite3-worker1-promiser.mjs sqlite3-worker1-bundler-friendly.mjs := $(dir.dout)/sqlite3-worker1-bundler-friendly.mjs sqlite3-worker1-promiser-bundler-friendly.js := $(dir.dout)/sqlite3-worker1-promiser-bundler-friendly.js -$(eval $(call C-PP.FILTER,$(sqlite3-worker1.js.in),$(sqlite3-worker1.js))) -$(eval $(call C-PP.FILTER,$(sqlite3-worker1.js.in),$(sqlite3-worker1-bundler-friendly.mjs),\ +$(eval $(call SQLITE.CALL.C-PP.FILTER,$(sqlite3-worker1.js.in),$(sqlite3-worker1.js))) +$(eval $(call SQLITE.CALL.C-PP.FILTER,$(sqlite3-worker1.js.in),$(sqlite3-worker1-bundler-friendly.mjs),\ $(c-pp.D.sqlite3-bundler-friendly))) -$(eval $(call C-PP.FILTER,$(sqlite3-worker1-promiser.js.in),$(sqlite3-worker1-promiser.js))) -$(eval $(call C-PP.FILTER,$(sqlite3-worker1-promiser.js.in),\ +$(eval $(call SQLITE.CALL.C-PP.FILTER,$(sqlite3-worker1-promiser.js.in),$(sqlite3-worker1-promiser.js))) +$(eval $(call SQLITE.CALL.C-PP.FILTER,$(sqlite3-worker1-promiser.js.in),\ $(sqlite3-worker1-promiser-bundler-friendly.js),\ $(c-pp.D.sqlite3-bundler-friendly))) -$(eval $(call C-PP.FILTER,$(sqlite3-worker1-promiser.js.in),$(sqlite3-worker1-promiser.mjs),\ +$(eval $(call SQLITE.CALL.C-PP.FILTER,$(sqlite3-worker1-promiser.js.in),$(sqlite3-worker1-promiser.mjs),\ -Dtarget=es6-module -Dtarget=es6-bundler-friendly)) $(sqlite3-bundler-friendly.mjs): $(sqlite3-worker1-bundler-friendly.mjs) \ $(sqlite3-worker1-promiser-bundler-friendly.js) -$(eval $(call C-PP.FILTER,demo-worker1-promiser.c-pp.js,demo-worker1-promiser.js)) -$(eval $(call C-PP.FILTER,demo-worker1-promiser.c-pp.js,demo-worker1-promiser.mjs,\ +$(eval $(call SQLITE.CALL.C-PP.FILTER,demo-worker1-promiser.c-pp.js,demo-worker1-promiser.js)) +$(eval $(call SQLITE.CALL.C-PP.FILTER,demo-worker1-promiser.c-pp.js,demo-worker1-promiser.mjs,\ -Dtarget=es6-module)) -$(eval $(call C-PP.FILTER,demo-worker1-promiser.c-pp.html,demo-worker1-promiser.html)) -$(eval $(call C-PP.FILTER,demo-worker1-promiser.c-pp.html,demo-worker1-promiser-esm.html,\ +$(eval $(call SQLITE.CALL.C-PP.FILTER,demo-worker1-promiser.c-pp.html,demo-worker1-promiser.html)) +$(eval $(call SQLITE.CALL.C-PP.FILTER,demo-worker1-promiser.c-pp.html,demo-worker1-promiser-esm.html,\ -Dtarget=es6-module)) all: $(sqlite3-worker1.js) \ $(sqlite3-worker1-promiser.js) $(sqlite3-worker1-promiser.mjs) @@ -1077,10 +1078,10 @@ all: speedtest1 # tester1.mjs: cases 3 and 4 # # To create those, we filter tester1.c-pp.js with $(bin.c-pp)... -$(eval $(call C-PP.FILTER,tester1.c-pp.js,tester1.js)) -$(eval $(call C-PP.FILTER,tester1.c-pp.js,tester1.mjs,$(c-pp.D.sqlite3-esm))) -$(eval $(call C-PP.FILTER,tester1.c-pp.html,tester1.html)) -$(eval $(call C-PP.FILTER,tester1.c-pp.html,tester1-esm.html,$(c-pp.D.sqlite3-esm))) +$(eval $(call SQLITE.CALL.C-PP.FILTER,tester1.c-pp.js,tester1.js)) +$(eval $(call SQLITE.CALL.C-PP.FILTER,tester1.c-pp.js,tester1.mjs,$(c-pp.D.sqlite3-esm))) +$(eval $(call SQLITE.CALL.C-PP.FILTER,tester1.c-pp.html,tester1.html)) +$(eval $(call SQLITE.CALL.C-PP.FILTER,tester1.c-pp.html,tester1-esm.html,$(c-pp.D.sqlite3-esm))) tester1: tester1.js tester1.mjs tester1.html tester1-esm.html # Note that we do not include $(sqlite3-bundler-friendly.mjs) in this # because bundlers are client-specific. diff --git a/ext/wasm/mkwasmbuilds.c b/ext/wasm/mkwasmbuilds.c index a3c0e4c067..86c98cf9d3 100644 --- a/ext/wasm/mkwasmbuilds.c +++ b/ext/wasm/mkwasmbuilds.c @@ -153,14 +153,14 @@ static void mk_pre_post(const char *zName /* build name */, zNM, zNM); pf("$(pre-js.js.%s-%s): $(MAKEFILE)\n", zNM); #if 1 - pf("$(eval $(call C-PP.FILTER,$(pre-js.js.in),$(pre-js.js.%s-%s)," + pf("$(eval $(call SQLITE.CALL.C-PP.FILTER,$(pre-js.js.in),$(pre-js.js.%s-%s)," "$(c-pp.D.%s-%s)))\n", zNM, zNM); #else /* This part is needed if/when we re-enable the custom ** Module.instantiateModule() impl in api/pre-js.c-pp.js. */ pf("pre-js.js.%s-%s.intermediary := $(dir.tmp)/pre-js.%s-%s.intermediary.js\n", zNM, zNM); - pf("$(eval $(call C-PP.FILTER,$(pre-js.js.in),$(pre-js.js.%s-%s.intermediary)," + pf("$(eval $(call SQLITE.CALL.C-PP.FILTER,$(pre-js.js.in),$(pre-js.js.%s-%s.intermediary)," "$(c-pp.D.%s-%s) -Dcustom-Module.instantiateModule))\n", zNM, zNM); pf("$(pre-js.js.%s-%s): $(pre-js.js.%s-%s.intermediary)\n", zNM, zNM); pf("\tcp $(pre-js.js.%s-%s.intermediary) $@\n", zNM); @@ -176,12 +176,12 @@ static void mk_pre_post(const char *zName /* build name */, /* --post-js=... */ pf("post-js.js.%s-%s := $(dir.tmp)/post-js.%s-%s.js\n", zNM, zNM); - pf("$(eval $(call C-PP.FILTER,$(post-js.js.in)," + pf("$(eval $(call SQLITE.CALL.C-PP.FILTER,$(post-js.js.in)," "$(post-js.js.%s-%s),$(c-pp.D.%s-%s)))\n", zNM, zNM); /* --extern-post-js=... */ pf("extern-post-js.js.%s-%s := $(dir.tmp)/extern-post-js.%s-%s.js\n", zNM, zNM); - pf("$(eval $(call C-PP.FILTER,$(extern-post-js.js.in),$(extern-post-js.js.%s-%s)," + pf("$(eval $(call SQLITE.CALL.C-PP.FILTER,$(extern-post-js.js.in),$(extern-post-js.js.%s-%s)," "$(c-pp.D.%s-%s)))\n", zNM, zNM); /* Combine flags for use with emcc... */ @@ -274,14 +274,13 @@ static void mk_lib_mode(const char *zName /* build name */, if( !zEmcc ) zEmcc = ""; pf("%s# Begin build [%s-%s]\n", zBanner, zNM); - pf("ifneq (1,$(MAKING_CLEAN))\n"); pf("$(info Setting up build [%s-%s]: %s)\n", zNM, zJsOut); mk_pre_post(zNM, zCmppD); pf("\nemcc.flags.%s.%s ?=\n", zNM); if( zEmcc[0] ){ pf("emcc.flags.%s.%s += %s\n", zNM, zEmcc); } - pf("$(eval $(call C-PP.FILTER, $(sqlite3-api.js.in), %s, %s))\n", + pf("$(eval $(call SQLITE.CALL.C-PP.FILTER, $(sqlite3-api.js.in), %s, %s))\n", zApiJsOut, zCmppD); /* target zJsOut */ @@ -346,7 +345,6 @@ static void mk_lib_mode(const char *zName /* build name */, ** conditionally using info we don't have here. */ pf("all: %s\n", zJsOut); } - ps("endif\n# ^^^ !$(MAKING_CLEAN)"); pf("# End build [%s-%s]%s", zNM, zBanner); } diff --git a/manifest b/manifest index 16562bac12..90e606e2e4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C wasm:\sde-list\sdemo-worker1-promiser-esm.html\sfrom\sthe\stest\spages\sbecause\s(per\sChrome\s131)\s"Module\sscripts\sdon't\ssupport\simportScripts()",\swhere\s"don't"\smeans\s"they\sused\sto\sbut\sno\slonger\sdo". -D 2025-01-23T22:23:31.384 +C Remove\sextraneous\sare-we-making-clean\sguards\sfrom\sthe\sgenerated\swasm\sbuild\srules,\sas\sthat\sguard\sis\sset\sat\sa\shigher\slevel.\sRename\sa\smakefile\scall()able\sfor\sconsistency. +D 2025-01-24T08:58:54.139 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -618,7 +618,7 @@ F ext/session/sqlite3session.c d6f5e3e83b9b0bbc4a8db4837284f0ecc6af5321d4c8e7136 F ext/session/sqlite3session.h 683ccbf16e2c2521661fc4c1cf918ce57002039efbcabcd8097fa4bca569104b F ext/session/test_session.c 12e0a2c15fd60f92da4bb29c697c9177ff0c0dbcdc5129a54c47e999f147937a F ext/wasm/EXPORTED_FUNCTIONS.fiddle.in 27450c8b8c70875a260aca55435ec927068b34cef801a96205adb81bdcefc65c -F ext/wasm/GNUmakefile 999ea962c098a934daa18e724c53856493adf1e03b3237465a5ee5b6fde28880 +F ext/wasm/GNUmakefile 47f121d057c08ba49443c06c1c51ba2572e3d5d28a06c968cf0b2ccd5878c3d3 F ext/wasm/README-dist.txt 6382cb9548076fca472fb3330bbdba3a55c1ea0b180ff9253f084f07ff383576 F ext/wasm/README.md a8a2962c3aebdf8d2104a9102e336c5554e78fc6072746e5daf9c61514e7d193 F ext/wasm/SQLTester/GNUmakefile e0794f676d55819951bbfae45cc5e8d7818dc460492dc317ce7f0d2eca15caff @@ -679,7 +679,7 @@ F ext/wasm/index-dist.html 56132399702b15d70c474c3f1952541e25cb0922942868f70daf1 F ext/wasm/index.html 10ff3ad190aadccb713109fa55a38e5c1f3c2a8cf05cd31783745bab3f184079 F ext/wasm/jaccwabyt/jaccwabyt.js 1264710db3cfbcb6887d95665b7aeba60c1126eaef789ca4cf1a4a17d5bc7f54 F ext/wasm/jaccwabyt/jaccwabyt.md 59a20df389abcc3606eb4eaea7fb7ba14504beb3e345dbea9b99a0618ba3bec8 -F ext/wasm/mkwasmbuilds.c 1d5ba1e274d0331b2c8549b288ed108f6764674deb3fa7105b0bb0cea6f68cd5 +F ext/wasm/mkwasmbuilds.c 7f0dabf715456274bf2df1e9405aa1f658a6134ee3e863ce87b4efde954f73fb F ext/wasm/module-symbols.html dc476b403369b26a1a23773e13b80f41b9a49f0825e81435fe3600a7cfbbe337 F ext/wasm/scratchpad-wasmfs.html a3d7388f3c4b263676b58b526846e9d02dfcb4014ff29d3a5040935286af5b96 F ext/wasm/scratchpad-wasmfs.mjs 66034b9256b218de59248aad796760a1584c1dd842231505895eff00dbd57c63 @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 9a20b94080f5379867530772e081b737ae4cf6b416469dcabb85b8dd819f491f -R 1263da0640161ebdae6e992388a26d15 +P 4aa025a943a4024094b91f13abfb8945bbbb8334e3ec904dee5315852845bfe1 +R 42d46d94722ee7e44271375fb148ccd7 U stephan -Z 4ee9ffdcb199c9538a20ad596279afe3 +Z 819bc68a21feb3b1bb7fc8b14a535d25 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index fe61a8162e..effe5e06c0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4aa025a943a4024094b91f13abfb8945bbbb8334e3ec904dee5315852845bfe1 +7f9074e2a7ff62bdcf343895e80a51224de62a22afbbf82068ec5fea7eeda0bb From dfb5f32758e26299a1f5edfa004c3d068a3237cb Mon Sep 17 00:00:00 2001 From: stephan Date: Fri, 24 Jan 2025 09:18:19 +0000 Subject: [PATCH 110/220] Update ext/wasm/README.md to reflect simplifications permitted by the current configure script behavior. FossilOrigin-Name: 9abb56c6acb1c84c2df8534ca3ebb2894afd68bc7b8331d4d12611896c576749 --- ext/wasm/README.md | 37 ++++++++++++++++++++++++++++++------- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 37 insertions(+), 14 deletions(-) diff --git a/ext/wasm/README.md b/ext/wasm/README.md index 0c328310d9..3c68755690 100644 --- a/ext/wasm/README.md +++ b/ext/wasm/README.md @@ -29,8 +29,16 @@ $ ./emsdk install latest $ ./emsdk activate latest ``` -The following needs to be run for each shell instance which needs the -`emcc` compiler: +(Sidebar: Emscripten updates can and do _change things_, i.e. _break +things_, so it's considered _required practice_ to test thoroughly +after upgrading it! Our build process makes no guarantees about which +Emscripten version(s) will or won't work, but it's important that +production builds are built using a compatible version. During active +development, the EMSDK is frequently updated, the goal being to keep +sqlite3.wasm working with "the latest" EMSDK) + +The SQLite configure script will search for the EMSDK. One way +to ensure that it finds it is: ``` # Activate PATH and other environment variables in the current terminal: @@ -38,15 +46,27 @@ $ source ./emsdk_env.sh $ which emcc /path/to/emsdk/upstream/emscripten/emcc + +$ ./configure ... ``` -Optionally, add that to your login shell's resource file (`~/.bashrc` -or equivalent). +Optionally, add that `source` part to your login shell's resource file +(`~/.bashrc` or equivalent). -That `env` script needs to be sourced for building this application -from the top of the sqlite3 build tree: +Another way is to pass the EMSDK dir to configure: ``` +$ ./configure --with-emsdk=/path/to/emsdk +``` + +The build tree uses a small wrapper for invoking the `emcc` (the +Emscripten compiler): `tool/emcc.sh` is generated from +`tool/emcc.sh.in` using the EMSDK path found by the configure process. + +With that in place, the most common build approaches are: + +``` +# From the top of the tree: $ make fiddle ``` @@ -57,7 +77,7 @@ $ cd ext/wasm $ make ``` -That will generate the a number of files required for a handful of +Those will generate the a number of files required for a handful of test and demo applications which can be accessed via `index.html`. WASM content cannot, due to XMLHttpRequest security limitations, be loaded if the containing HTML file is opened directly @@ -68,8 +88,11 @@ needs to be served via an HTTP server. For example, using ``` $ cd ext/wasm $ althttpd --enable-sab --max-age 1 --page index.html +# Or, more simply: +$ make httpd ``` + That will open the system's browser and run the index page, from which all of the test and demo applications can be accessed. diff --git a/manifest b/manifest index 90e606e2e4..3ebae6c9f9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sextraneous\sare-we-making-clean\sguards\sfrom\sthe\sgenerated\swasm\sbuild\srules,\sas\sthat\sguard\sis\sset\sat\sa\shigher\slevel.\sRename\sa\smakefile\scall()able\sfor\sconsistency. -D 2025-01-24T08:58:54.139 +C Update\sext/wasm/README.md\sto\sreflect\ssimplifications\spermitted\sby\sthe\scurrent\sconfigure\sscript\sbehavior. +D 2025-01-24T09:18:19.598 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -620,7 +620,7 @@ F ext/session/test_session.c 12e0a2c15fd60f92da4bb29c697c9177ff0c0dbcdc5129a54c4 F ext/wasm/EXPORTED_FUNCTIONS.fiddle.in 27450c8b8c70875a260aca55435ec927068b34cef801a96205adb81bdcefc65c F ext/wasm/GNUmakefile 47f121d057c08ba49443c06c1c51ba2572e3d5d28a06c968cf0b2ccd5878c3d3 F ext/wasm/README-dist.txt 6382cb9548076fca472fb3330bbdba3a55c1ea0b180ff9253f084f07ff383576 -F ext/wasm/README.md a8a2962c3aebdf8d2104a9102e336c5554e78fc6072746e5daf9c61514e7d193 +F ext/wasm/README.md 463b41328cf5b286ca910731263337aecb76e7f821e2a96d2bbc78e425eba064 F ext/wasm/SQLTester/GNUmakefile e0794f676d55819951bbfae45cc5e8d7818dc460492dc317ce7f0d2eca15caff F ext/wasm/SQLTester/SQLTester.mjs 66e1adc3d79467b68e3e40614fd42c1a577c7e219ec0985db966eded52a941e5 F ext/wasm/SQLTester/SQLTester.run.mjs 57f2adb33f43f2784abbf8026c1bfd049d8013af1998e7dcb8b50c89ffc332e0 @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 4aa025a943a4024094b91f13abfb8945bbbb8334e3ec904dee5315852845bfe1 -R 42d46d94722ee7e44271375fb148ccd7 +P 7f9074e2a7ff62bdcf343895e80a51224de62a22afbbf82068ec5fea7eeda0bb +R 9870d8aac6c5ee0536c13705fc8fd884 U stephan -Z 819bc68a21feb3b1bb7fc8b14a535d25 +Z 82e929fd8c92d791a9c756aa05ed50ac # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index effe5e06c0..90b751cd4a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7f9074e2a7ff62bdcf343895e80a51224de62a22afbbf82068ec5fea7eeda0bb +9abb56c6acb1c84c2df8534ca3ebb2894afd68bc7b8331d4d12611896c576749 From 4331e6bd1d04099fb9e3f3a99f40c46e910c73c6 Mon Sep 17 00:00:00 2001 From: stephan Date: Fri, 24 Jan 2025 09:21:39 +0000 Subject: [PATCH 111/220] Minor additions to ext/wasm/README.md. FossilOrigin-Name: 85747ea1654c74d330614aa174ede4a989b6456eb1fc5eb0fc9f2d1418b6ef99 --- ext/wasm/README.md | 12 +++++++----- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/ext/wasm/README.md b/ext/wasm/README.md index 3c68755690..21330f0eba 100644 --- a/ext/wasm/README.md +++ b/ext/wasm/README.md @@ -35,7 +35,7 @@ after upgrading it! Our build process makes no guarantees about which Emscripten version(s) will or won't work, but it's important that production builds are built using a compatible version. During active development, the EMSDK is frequently updated, the goal being to keep -sqlite3.wasm working with "the latest" EMSDK) +sqlite3.wasm working with "the latest" EMSDK.) The SQLite configure script will search for the EMSDK. One way to ensure that it finds it is: @@ -88,13 +88,15 @@ needs to be served via an HTTP server. For example, using ``` $ cd ext/wasm $ althttpd --enable-sab --max-age 1 --page index.html -# Or, more simply: +# Or, more simply, from the ext/wasm dir: $ make httpd ``` - -That will open the system's browser and run the index page, from which -all of the test and demo applications can be accessed. +That will open the system's browser and visit the index page, from +which (almost) all of the test and demo applications can be accessed. +(`ext/wasm/SQLTester` is not listed in that page because it's only of +real utility when it's used in conjunction with the proprietary test +suite, which most users don't have access to.) Note that when serving this app via [althttpd][], it must be a version from 2022-09-26 or newer so that it recognizes the `--enable-sab` diff --git a/manifest b/manifest index 3ebae6c9f9..c3a2065573 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sext/wasm/README.md\sto\sreflect\ssimplifications\spermitted\sby\sthe\scurrent\sconfigure\sscript\sbehavior. -D 2025-01-24T09:18:19.598 +C Minor\sadditions\sto\sext/wasm/README.md. +D 2025-01-24T09:21:39.150 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -620,7 +620,7 @@ F ext/session/test_session.c 12e0a2c15fd60f92da4bb29c697c9177ff0c0dbcdc5129a54c4 F ext/wasm/EXPORTED_FUNCTIONS.fiddle.in 27450c8b8c70875a260aca55435ec927068b34cef801a96205adb81bdcefc65c F ext/wasm/GNUmakefile 47f121d057c08ba49443c06c1c51ba2572e3d5d28a06c968cf0b2ccd5878c3d3 F ext/wasm/README-dist.txt 6382cb9548076fca472fb3330bbdba3a55c1ea0b180ff9253f084f07ff383576 -F ext/wasm/README.md 463b41328cf5b286ca910731263337aecb76e7f821e2a96d2bbc78e425eba064 +F ext/wasm/README.md 6c1dd9e4448c672f4a072c56d3ce9164b3c7dc818ea8f18b49c6834bfd5efe24 F ext/wasm/SQLTester/GNUmakefile e0794f676d55819951bbfae45cc5e8d7818dc460492dc317ce7f0d2eca15caff F ext/wasm/SQLTester/SQLTester.mjs 66e1adc3d79467b68e3e40614fd42c1a577c7e219ec0985db966eded52a941e5 F ext/wasm/SQLTester/SQLTester.run.mjs 57f2adb33f43f2784abbf8026c1bfd049d8013af1998e7dcb8b50c89ffc332e0 @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 7f9074e2a7ff62bdcf343895e80a51224de62a22afbbf82068ec5fea7eeda0bb -R 9870d8aac6c5ee0536c13705fc8fd884 +P 9abb56c6acb1c84c2df8534ca3ebb2894afd68bc7b8331d4d12611896c576749 +R b60ec68df024b8f8f0b2a3ce728fcf4f U stephan -Z 82e929fd8c92d791a9c756aa05ed50ac +Z e5bd1e0cb1773df371cd520b4807bcb1 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 90b751cd4a..3d6d41ac1b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9abb56c6acb1c84c2df8534ca3ebb2894afd68bc7b8331d4d12611896c576749 +85747ea1654c74d330614aa174ede4a989b6456eb1fc5eb0fc9f2d1418b6ef99 From 8bfb18672821e70893a3d2a5ac6c96faf8daf4a2 Mon Sep 17 00:00:00 2001 From: stephan Date: Fri, 24 Jan 2025 12:54:59 +0000 Subject: [PATCH 112/220] Replace a handful of hard tabs in string literals with \t in mkwasmbuilds.c. FossilOrigin-Name: e8e4d497a7b6aae450cb93927c7583fcce3fe971cd3691f9d9cad605de3cfb1f --- ext/wasm/mkwasmbuilds.c | 18 +++++++++--------- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/ext/wasm/mkwasmbuilds.c b/ext/wasm/mkwasmbuilds.c index 86c98cf9d3..1e09f83c01 100644 --- a/ext/wasm/mkwasmbuilds.c +++ b/ext/wasm/mkwasmbuilds.c @@ -224,23 +224,23 @@ static void mk_fiddle(){ "$(SOAP.js)\n", zTail, (i ? " $(fiddle-module.js)" : "")); if( 1==i ){/*fiddle.debug*/ - pf(" @test -d \"$(dir $@)\" || mkdir -p \"$(dir $@)\"\n"); + pf("\t@test -d \"$(dir $@)\" || mkdir -p \"$(dir $@)\"\n"); } - pf(" $(bin.emcc) -o $@ $(fiddle.emcc-flags%s) " + pf("\t$(bin.emcc) -o $@ $(fiddle.emcc-flags%s) " "$(pre-post-fiddle-module-vanilla.flags) $(fiddle.cses)\n", zTail); - pf(" $(maybe-wasm-strip) $(fiddle-module.wasm%s)\n", zTail); - pf(" @cp -p $(SOAP.js) $(dir $@)\n"); + pf("\t$(maybe-wasm-strip) $(fiddle-module.wasm%s)\n", zTail); + pf("\t@cp -p $(SOAP.js) $(dir $@)\n"); if( 1==i ){/*fiddle.debug*/ - pf(" cp -p $(dir.fiddle)/index.html " + pf("\tcp -p $(dir.fiddle)/index.html " "$(dir.fiddle)/fiddle.js " "$(dir.fiddle)/fiddle-worker.js " "$(dir $@)\n"); } - pf(" @for i in %s/*.*js %s/*.html %s/*.wasm; do \\\n" - " test -f $${i} || continue; \\\n" - " gzip < $${i} > $${i}.gz; \\\n" - " done\n", zDir, zDir, zDir); + pf("\t@for i in %s/*.*js %s/*.html %s/*.wasm; do \\\n" + "\t\ttest -f $${i} || continue; \\\n" + "\t\tgzip < $${i} > $${i}.gz; \\\n" + "\tdone\n", zDir, zDir, zDir); if( 0==i ){ ps("fiddle: $(fiddle-module.js)"); }else{ diff --git a/manifest b/manifest index c3a2065573..85c94391b1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\sadditions\sto\sext/wasm/README.md. -D 2025-01-24T09:21:39.150 +C Replace\sa\shandful\sof\shard\stabs\sin\sstring\sliterals\swith\s\\t\sin\smkwasmbuilds.c. +D 2025-01-24T12:54:59.643 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -679,7 +679,7 @@ F ext/wasm/index-dist.html 56132399702b15d70c474c3f1952541e25cb0922942868f70daf1 F ext/wasm/index.html 10ff3ad190aadccb713109fa55a38e5c1f3c2a8cf05cd31783745bab3f184079 F ext/wasm/jaccwabyt/jaccwabyt.js 1264710db3cfbcb6887d95665b7aeba60c1126eaef789ca4cf1a4a17d5bc7f54 F ext/wasm/jaccwabyt/jaccwabyt.md 59a20df389abcc3606eb4eaea7fb7ba14504beb3e345dbea9b99a0618ba3bec8 -F ext/wasm/mkwasmbuilds.c 7f0dabf715456274bf2df1e9405aa1f658a6134ee3e863ce87b4efde954f73fb +F ext/wasm/mkwasmbuilds.c d5885bacf2253bed913cdc7eb16b44f9c9e782133e10600652d1a78841c337af F ext/wasm/module-symbols.html dc476b403369b26a1a23773e13b80f41b9a49f0825e81435fe3600a7cfbbe337 F ext/wasm/scratchpad-wasmfs.html a3d7388f3c4b263676b58b526846e9d02dfcb4014ff29d3a5040935286af5b96 F ext/wasm/scratchpad-wasmfs.mjs 66034b9256b218de59248aad796760a1584c1dd842231505895eff00dbd57c63 @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 9abb56c6acb1c84c2df8534ca3ebb2894afd68bc7b8331d4d12611896c576749 -R b60ec68df024b8f8f0b2a3ce728fcf4f +P 85747ea1654c74d330614aa174ede4a989b6456eb1fc5eb0fc9f2d1418b6ef99 +R f289df2f01e608fa0d2578a973e6c703 U stephan -Z e5bd1e0cb1773df371cd520b4807bcb1 +Z 87e6ba9e21ab9593bfe7380a7c7c21ab # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 3d6d41ac1b..80506a8ac8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -85747ea1654c74d330614aa174ede4a989b6456eb1fc5eb0fc9f2d1418b6ef99 +e8e4d497a7b6aae450cb93927c7583fcce3fe971cd3691f9d9cad605de3cfb1f From 7a16413a849bf4f28f8aa7a29c27b704c8e64944 Mon Sep 17 00:00:00 2001 From: stephan Date: Fri, 24 Jan 2025 14:13:20 +0000 Subject: [PATCH 113/220] Update autosetup/README.md to reflect recent refactoring. FossilOrigin-Name: 601636829b79888deda7d4dc5786f82b4f0b302d84663ee96b4d47fcb429abcf --- autosetup/README.md | 36 +++++++++++++++++++++++++++--------- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 34 insertions(+), 16 deletions(-) diff --git a/autosetup/README.md b/autosetup/README.md index fd426d56d9..288ac87c3b 100644 --- a/autosetup/README.md +++ b/autosetup/README.md @@ -33,12 +33,26 @@ $ ./configure --reference | less That will include any docs from any TCL files in the `./autosetup` dir which contain certain (simple) markup defined by autosetup. -This project's own autosetup-related APIs are in [proj.tcl][] or -[auto.def][]. The former contains helper APIs which are, more or -less, portable across projects (that file is re-used as-is in other -projects) and all have a `proj-` name prefix. The latter is the main -configure script driver and contains related functions which are -specific to this tree. +This project's own configuration-related TCL code is spread across the +following files: + +- [proj.tcl][]: project-agnostic utility code for autosetup-driven + projects. This file is designed to be shared between this project, + other projects managed under the SQLite/Hwaci umbrella + (e.g. Fossil), and personal projects of SQLite's developers. It is + essentially an amalgamation of a decade's worth of autosetup-related + utility code. +- [auto.def][]: the primary driver for the `./configure` process. + When we talk about "the configure script," we're referring to + this file. +- [sqlite-config.tcl][]: utility code which is too project-specific + for `proj.tcl`. We split this out of `auto.def` so that it can be + used by both `auto.def` and... +- [autoconf/auto.def][]: the main driver script for the "autoconf" + bundle's configure script. It is essentially a slightly trimmed-down + version of the main `auto.def` file. The `autoconf` dir was ported + from the Autotools to Autosetup in the 3.39 dev cycle but retains + the "autoconf" name to minimize downstream disruption. @@ -47,9 +61,11 @@ Autosetup API Tips This section briefly covers only APIs which are frequently useful in day-to-day maintenance and might not be immediately recognized as such -obvious from a casual perusal of [auto.def][]. The complete docs of -those with `proj-` prefix can be found in [proj.tcl][]. The others are -scattered around [the TCL files in ./autosetup](/dir/autosetup). +obvious from a casual perusal of the relevant TCL files. The complete +docs of those with `proj-` prefix can be found in [proj.tcl][] and +those with an `sqlite-` prefix are in [sqlite-config.tcl][]. The +others are scattered around [the TCL files in +./autosetup](/dir/autosetup). In (mostly) alphabetical order: @@ -331,8 +347,10 @@ If autosetup is upgraded and this patch is _not_ applied the invoking [Autosetup]: https://msteveb.github.io/autosetup/ [auto.def]: /file/auto.def +[autoconf/auto.def]: /file/autoconf/auto.def [autosetup-git]: https://github.com/msteveb/autosetup [proj.tcl]: /file/autosetup/proj.tcl +[sqlite-config.tcl]: /file/autosetup/sqlite-config.tcl [Makefile.in]: /file/Makefile.in [main.mk]: /file/main.mk [JimTCL]: https://jim.tcl.tk diff --git a/manifest b/manifest index 85c94391b1..fc696fccec 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Replace\sa\shandful\sof\shard\stabs\sin\sstring\sliterals\swith\s\\t\sin\smkwasmbuilds.c. -D 2025-01-24T12:54:59.643 +C Update\sautosetup/README.md\sto\sreflect\srecent\srefactoring. +D 2025-01-24T14:13:20.824 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -37,7 +37,7 @@ F autoconf/tea/win/rules.vc 94a18c3e453535459b4a643983acca52fb8756e79055bd2ad4b0 F autoconf/tea/win/targets.vc 96a25a1fa6e9e9cfb348fd3760a5395b4ce8acafc8ed10f0412937ec200d5dbd F autosetup/LICENSE 41a26aebdd2cd185d1e2b210f71b7ce234496979f6b35aef2cbf6b80cbed4ce4 F autosetup/README.autosetup a78ff8c4a3d2636a4268736672a74bf14a82f42687fcf0631a70c516075c031e -F autosetup/README.md 1a02f5a94fd460eb7ffc8dea5d6f1657e38ddf8ffa2d6c5dce9a630b97021a69 +F autosetup/README.md 3bd13779b29479c3ff5cab776a2932215d96d05df510ed2035b165338566eb9f F autosetup/autosetup df8b53928b1fe3c67db5bc77c8e1eb8160c1b6a26c370e9a06c68748f803b7e4 x F autosetup/autosetup-config.guess dfa101c5e8220e864d5e9c72a85e87110df60260d36cb951ad0a85d6d9eaa463 x F autosetup/autosetup-config.sub a38fb074d0dece01cf919e9fb534a26011608aa8fa606490864295328526cd73 x @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 85747ea1654c74d330614aa174ede4a989b6456eb1fc5eb0fc9f2d1418b6ef99 -R f289df2f01e608fa0d2578a973e6c703 +P e8e4d497a7b6aae450cb93927c7583fcce3fe971cd3691f9d9cad605de3cfb1f +R cc2c59119834894a1981954ea1b6c946 U stephan -Z 87e6ba9e21ab9593bfe7380a7c7c21ab +Z cd03a612b740dea69fa91e8f1fbec1aa # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 80506a8ac8..7c9511a739 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e8e4d497a7b6aae450cb93927c7583fcce3fe971cd3691f9d9cad605de3cfb1f +601636829b79888deda7d4dc5786f82b4f0b302d84663ee96b4d47fcb429abcf From 299fe02393f94ed2905c2b147acea78a066cc95d Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 24 Jan 2025 14:51:15 +0000 Subject: [PATCH 114/220] When looking for star-queries, do not count a table as a dimension table if that table is separated from the fact table by an OUTER or CROSS join or if the table is a self-join. FossilOrigin-Name: 5aebd7df0d577e98b3affd22b84b42dfe84a9f37fa29187505cc245b95460ba4 --- manifest | 15 ++++---- manifest.uuid | 2 +- src/where.c | 99 ++++++++++++++++++++++++++++++++++++++++----------- 3 files changed, 89 insertions(+), 27 deletions(-) diff --git a/manifest b/manifest index 30ff3f1fd0..04cbc622ad 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\spossible\sinfinity\sloop\sin\sdebugging-printf\slogic\sin\sthe\squery\splanner.\nNo\schanges\sto\sproduction\scode. -D 2025-01-23T21:06:59.817 +C When\slooking\sfor\sstar-queries,\sdo\snot\scount\sa\stable\sas\sa\sdimension\stable\nif\sthat\stable\sis\sseparated\sfrom\sthe\sfact\stable\sby\san\sOUTER\sor\sCROSS\sjoin\nor\sif\sthe\stable\sis\sa\sself-join. +D 2025-01-24T14:51:15.886 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -863,7 +863,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 4e6181d8780ab0af2e1388d0754cbe6f2f04593d2b1ab6c41699a89942fd8997 F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 -F src/where.c 6722991bece039c7094e9e31bb57b9eb155299f01d2209f1378a81c9605ded31 +F src/where.c 5112b3f0a27bc9708b26b8dc0a513a38c3f03e58a3ad2a6323aa706d8459d7b7 F src/whereInt.h 2b0804f300c7f65de4046a1d81c65f01b208d6c08950ccd1fa6b8c16162a8af7 F src/wherecode.c 0c3d3199a2b769a5e2bb70feb5003dc85b3d86842ecaf903a47f2b4205ca5dab F src/whereexpr.c 0f93a29cabd3a338d09a1f5c6770620a1ac51ec1157f3229502a7e7767c60b6f @@ -2208,8 +2208,11 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P c9dc581e0287e3462ac55f80ca76e7e98d31157022052c892517363c45287a7b -R fa61ff8d8db6242b1ed2cb7c9f3ef7ec +P 9a20b94080f5379867530772e081b737ae4cf6b416469dcabb85b8dd819f491f +R fc36952f8e44ca6141073778b4516171 +T *branch * star-query-heuristic +T *sym-star-query-heuristic * +T -sym-trunk * U drh -Z 2dbdf3625aeab02b475903def004e928 +Z d58ed75293e728cbf22986bd4a983f27 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index e686eed397..03fb6a033f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9a20b94080f5379867530772e081b737ae4cf6b416469dcabb85b8dd819f491f +5aebd7df0d577e98b3affd22b84b42dfe84a9f37fa29187505cc245b95460ba4 diff --git a/src/where.c b/src/where.c index cad66e70bc..6327f7688e 100644 --- a/src/where.c +++ b/src/where.c @@ -5441,11 +5441,13 @@ static LogEst whereSortingCost( ** 18 for star queries ** 12 otherwise ** -** For the purposes of SQLite, a star-query is defined as a query -** with a large central table that is joined (using an INNER JOIN, -** not a LEFT JOIN) against four or more smaller tables. The central -** table is called the "fact" table. The smaller tables that get -** joined are "dimension tables". +** For the purposes of this heuristic, a star-query is defined as a query +** with a large central table that is joined using an INNER JOIN, +** not CROSS or OUTER JOINs, against four or more smaller tables. +* The central table is called the "fact" table. The smaller tables +** that get joined are "dimension tables". Also, any table that is +** self-joined cannot be a dimension table; we assume that dimension +** tables may only be joined against fact tables. ** ** SIDE EFFECT: (and really the whole point of this subroutine) ** @@ -5456,44 +5458,101 @@ static LogEst whereSortingCost( ** resulting in poor query plans. The total amount of heuristic cost ** adjustment is stored in pWInfo->nOutStarDelta and the cost adjustment ** for each WhereLoop is stored in its rStarDelta field. +** +** This heuristic can be completely disabled, so that no query is +** considered a star-query, using SQLITE_TESTCTRL_OPTIMIZATION to +** disable the SQLITE_StarQuery optimization. In the CLI, the command +** to do that is: ".testctrl opt -starquery". */ static int computeMxChoice(WhereInfo *pWInfo, LogEst nRowEst){ int nLoop = pWInfo->nLevel; /* Number of terms in the join */ + WhereLoop *pWLoop; /* For looping over WhereLoops */ + +#ifdef SQLITE_DEBUG + /* The star-query detection code below makes use of the following + ** properties of the WhereLoop list, so verifying them before + ** continuing: + ** (1) .maskSelf is the bitmask corresponding to .iTab + ** (2) The WhereLoop list is in ascending .iTab order + */ + for(pWLoop=pWInfo->pLoops; pWLoop; pWLoop=pWLoop->pNextLoop){ + assert( pWLoop->maskSelf==MASKBIT(pWLoop->iTab) ); + assert( pWLoop->pNextLoop==0 || pWLoop->iTab<=pWLoop->pNextLoop->iTab ); + } +#endif /* SQLITE_DEBUG */ + if( nRowEst==0 && nLoop>=5 && OptimizationEnabled(pWInfo->pParse->db, SQLITE_StarQuery) ){ + SrcItem *aFromTabs; /* All terms of the FROM clause */ + int iFromIdx; /* Term of FROM clause is the candidate fact-table */ + Bitmask m; /* Bitmask for candidate fact-table */ + Bitmask mSelfJoin = 0; /* Tables that cannot be dimension tables */ + WhereLoop *pStart; /* Where to start searching for dimension-tables */ + /* Check to see if we are dealing with a star schema and if so, reduce ** the cost of fact tables relative to dimension tables, as a heuristic ** to help keep the fact tables in outer loops. */ - int iLoop; /* Counter over join terms */ - Bitmask m; /* Bitmask for current loop */ assert( pWInfo->nOutStarDelta==0 ); - for(iLoop=0, m=1; iLooppTabList->a; + pStart = pWInfo->pLoops; + for(iFromIdx=0, m=1; iFromIdxpLoops; pWLoop; pWLoop=pWLoop->pNextLoop){ - if( (pWLoop->prereq & m)!=0 /* pWInfo depends on iLoop */ + SrcItem *pFactTab; /* The candidate fact table */ + + pFactTab = aFromTabs + iFromIdx; + if( (pFactTab->fg.jointype & (JT_OUTER|JT_CROSS))!=0 ){ + /* If the candidate fact-table is the right table of an outer join + ** restrict the search for dimension-tables to be tables to the right + ** of the fact-table. */ + if( iFromIdx+4 > nLoop ) break; /* Impossible to reach nDep>=4 */ + while( ALWAYS(pStart) && pStart->iTab<=iFromIdx ){ + pStart = pStart->pNextLoop; + } + } + for(pWLoop=pStart; pWLoop; pWLoop=pWLoop->pNextLoop){ + if( (aFromTabs[pWLoop->iTab].fg.jointype & (JT_OUTER|JT_CROSS))!=0 ){ + /* Fact-tables and dimension-tables cannot be separated by an + ** outer join (at least for the definition of fact- and dimension- + ** used by this heuristic). */ + break; + } + if( (pWLoop->prereq & m)!=0 /* pWInfo depends on iFromIdx */ && (pWLoop->maskSelf & mSeen)==0 /* pWInfo not already a dependency */ - && (pWInfo->pTabList->a[pWLoop->iTab].fg.jointype & JT_LEFT)==0 - /* ^- pWInfo isn't a LEFT JOIN */ + && (pWLoop->maskSelf & mSelfJoin)==0 /* Not a self-join */ ){ - nDep++; - mSeen |= pWLoop->maskSelf; + if( aFromTabs[pWLoop->iTab].pSTab==pFactTab->pSTab ){ + mSelfJoin |= m; + }else{ + nDep++; + mSeen |= pWLoop->maskSelf; + } } } if( nDep<=3 ) continue; rDelta = 15*(nDep-3); #ifdef WHERETRACE_ENABLED /* 0x4 */ if( sqlite3WhereTrace&0x4 ){ - SrcItem *pItem = pWInfo->pTabList->a + iLoop; - sqlite3DebugPrintf( - "Fact-table %s(%d): %d dimensions, cost reduced %d\n", - pItem->zAlias ? pItem->zAlias : pItem->pSTab->zName, iLoop, - nDep, rDelta); + Bitmask x; + int ii; + sqlite3DebugPrintf( + "Fact-table %s(%d): cost reduced %d due to %d dimension tables:", + pFactTab->zAlias ? pFactTab->zAlias : pFactTab->pSTab->zName, + iFromIdx, rDelta, nDep + ); + for(ii=0, x=1; iizAlias ? pDim->zAlias : pDim->pSTab->zName, ii + ); + } + } + sqlite3DebugPrintf("\n"); } #endif if( pWInfo->nOutStarDelta==0 ){ From 7ae051df2a29b834ff049a7159dea11882602858 Mon Sep 17 00:00:00 2001 From: stephan Date: Fri, 24 Jan 2025 15:41:33 +0000 Subject: [PATCH 115/220] Correct a version number in autosetup/README.md. FossilOrigin-Name: c338caf0fd4adc7baacf20f6d4274b1776b9487a5a976b8d85e490791be82b11 --- autosetup/README.md | 2 +- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/autosetup/README.md b/autosetup/README.md index 288ac87c3b..19a16c943a 100644 --- a/autosetup/README.md +++ b/autosetup/README.md @@ -51,7 +51,7 @@ following files: - [autoconf/auto.def][]: the main driver script for the "autoconf" bundle's configure script. It is essentially a slightly trimmed-down version of the main `auto.def` file. The `autoconf` dir was ported - from the Autotools to Autosetup in the 3.39 dev cycle but retains + from the Autotools to Autosetup in the 3.49.0 dev cycle but retains the "autoconf" name to minimize downstream disruption. diff --git a/manifest b/manifest index fc696fccec..3b7ea01db7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sautosetup/README.md\sto\sreflect\srecent\srefactoring. -D 2025-01-24T14:13:20.824 +C Correct\sa\sversion\snumber\sin\sautosetup/README.md. +D 2025-01-24T15:41:33.001 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -37,7 +37,7 @@ F autoconf/tea/win/rules.vc 94a18c3e453535459b4a643983acca52fb8756e79055bd2ad4b0 F autoconf/tea/win/targets.vc 96a25a1fa6e9e9cfb348fd3760a5395b4ce8acafc8ed10f0412937ec200d5dbd F autosetup/LICENSE 41a26aebdd2cd185d1e2b210f71b7ce234496979f6b35aef2cbf6b80cbed4ce4 F autosetup/README.autosetup a78ff8c4a3d2636a4268736672a74bf14a82f42687fcf0631a70c516075c031e -F autosetup/README.md 3bd13779b29479c3ff5cab776a2932215d96d05df510ed2035b165338566eb9f +F autosetup/README.md 2737c4eb44b022a694b1f93fb01c3b6c3a45b4f663e18490c2106643a77b39da F autosetup/autosetup df8b53928b1fe3c67db5bc77c8e1eb8160c1b6a26c370e9a06c68748f803b7e4 x F autosetup/autosetup-config.guess dfa101c5e8220e864d5e9c72a85e87110df60260d36cb951ad0a85d6d9eaa463 x F autosetup/autosetup-config.sub a38fb074d0dece01cf919e9fb534a26011608aa8fa606490864295328526cd73 x @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P e8e4d497a7b6aae450cb93927c7583fcce3fe971cd3691f9d9cad605de3cfb1f -R cc2c59119834894a1981954ea1b6c946 +P 601636829b79888deda7d4dc5786f82b4f0b302d84663ee96b4d47fcb429abcf +R 7edf0e5d3b3392becf43b655692773e3 U stephan -Z cd03a612b740dea69fa91e8f1fbec1aa +Z 8a4c0606d9fc49f835c4115814c6ca15 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 7c9511a739..12aa7b8716 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -601636829b79888deda7d4dc5786f82b4f0b302d84663ee96b4d47fcb429abcf +c338caf0fd4adc7baacf20f6d4274b1776b9487a5a976b8d85e490791be82b11 From f1c5830311d5d9382a89b87184fb9fb5f5db5420 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 24 Jan 2025 15:55:20 +0000 Subject: [PATCH 116/220] Minor tweaks to the star-query detection and processing. FossilOrigin-Name: 61f76a45ac7aa454419fd7539a3d8e60f0733fb5a2abd034d795328f3c1b6e9b --- manifest | 17 +++++++---------- manifest.uuid | 2 +- src/where.c | 26 +++++++++++++++----------- src/whereInt.h | 4 ++++ 4 files changed, 27 insertions(+), 22 deletions(-) diff --git a/manifest b/manifest index 04cbc622ad..a6cc524f90 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\slooking\sfor\sstar-queries,\sdo\snot\scount\sa\stable\sas\sa\sdimension\stable\nif\sthat\stable\sis\sseparated\sfrom\sthe\sfact\stable\sby\san\sOUTER\sor\sCROSS\sjoin\nor\sif\sthe\stable\sis\sa\sself-join. -D 2025-01-24T14:51:15.886 +C Minor\stweaks\sto\sthe\sstar-query\sdetection\sand\sprocessing. +D 2025-01-24T15:55:20.191 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -863,8 +863,8 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 4e6181d8780ab0af2e1388d0754cbe6f2f04593d2b1ab6c41699a89942fd8997 F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 -F src/where.c 5112b3f0a27bc9708b26b8dc0a513a38c3f03e58a3ad2a6323aa706d8459d7b7 -F src/whereInt.h 2b0804f300c7f65de4046a1d81c65f01b208d6c08950ccd1fa6b8c16162a8af7 +F src/where.c 3dacc2fa210fa44a55041ddaa6f89da1626a48017817f196f12ceed52723bba0 +F src/whereInt.h 3b2ef4617758174d00c6940850e4988c1b195d39bcc20f2965319a1f7bffc714 F src/wherecode.c 0c3d3199a2b769a5e2bb70feb5003dc85b3d86842ecaf903a47f2b4205ca5dab F src/whereexpr.c 0f93a29cabd3a338d09a1f5c6770620a1ac51ec1157f3229502a7e7767c60b6f F src/window.c 2bf01f9941a64fbcead61a0e3cb5db3fca5094b30d2ff0d23274c2a81d2e2385 @@ -2208,11 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 9a20b94080f5379867530772e081b737ae4cf6b416469dcabb85b8dd819f491f -R fc36952f8e44ca6141073778b4516171 -T *branch * star-query-heuristic -T *sym-star-query-heuristic * -T -sym-trunk * +P 5aebd7df0d577e98b3affd22b84b42dfe84a9f37fa29187505cc245b95460ba4 +R f847747d05c8cfe1b5f92bc976034b08 U drh -Z d58ed75293e728cbf22986bd4a983f27 +Z b010436488b72486e8da8913eae9dd55 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 03fb6a033f..f9eccc3e4a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5aebd7df0d577e98b3affd22b84b42dfe84a9f37fa29187505cc245b95460ba4 +61f76a45ac7aa454419fd7539a3d8e60f0733fb5a2abd034d795328f3c1b6e9b diff --git a/src/where.c b/src/where.c index 6327f7688e..4fa281c158 100644 --- a/src/where.c +++ b/src/where.c @@ -5464,7 +5464,7 @@ static LogEst whereSortingCost( ** disable the SQLITE_StarQuery optimization. In the CLI, the command ** to do that is: ".testctrl opt -starquery". */ -static int computeMxChoice(WhereInfo *pWInfo, LogEst nRowEst){ +static int computeMxChoice(WhereInfo *pWInfo){ int nLoop = pWInfo->nLevel; /* Number of terms in the join */ WhereLoop *pWLoop; /* For looping over WhereLoops */ @@ -5481,8 +5481,8 @@ static int computeMxChoice(WhereInfo *pWInfo, LogEst nRowEst){ } #endif /* SQLITE_DEBUG */ - if( nRowEst==0 - && nLoop>=5 + if( nLoop>=5 + && !pWInfo->bStarDone && OptimizationEnabled(pWInfo->pParse->db, SQLITE_StarQuery) ){ SrcItem *aFromTabs; /* All terms of the FROM clause */ @@ -5491,6 +5491,8 @@ static int computeMxChoice(WhereInfo *pWInfo, LogEst nRowEst){ Bitmask mSelfJoin = 0; /* Tables that cannot be dimension tables */ WhereLoop *pStart; /* Where to start searching for dimension-tables */ + pWInfo->bStarDone = 1; /* Only do this computation once */ + /* Check to see if we are dealing with a star schema and if so, reduce ** the cost of fact tables relative to dimension tables, as a heuristic ** to help keep the fact tables in outer loops. @@ -5555,12 +5557,10 @@ static int computeMxChoice(WhereInfo *pWInfo, LogEst nRowEst){ sqlite3DebugPrintf("\n"); } #endif - if( pWInfo->nOutStarDelta==0 ){ - for(pWLoop=pWInfo->pLoops; pWLoop; pWLoop=pWLoop->pNextLoop){ - pWLoop->rStarDelta = 0; - } + for(pWLoop=pWInfo->pLoops; pWLoop; pWLoop=pWLoop->pNextLoop){ + pWLoop->rStarDelta = 0; } - pWInfo->nOutStarDelta += rDelta; + pWInfo->nOutStarDelta = rDelta; for(pWLoop=pWInfo->pLoops; pWLoop; pWLoop=pWLoop->pNextLoop){ if( pWLoop->maskSelf==m ){ pWLoop->rRun -= rDelta; @@ -5568,7 +5568,7 @@ static int computeMxChoice(WhereInfo *pWInfo, LogEst nRowEst){ pWLoop->rStarDelta = rDelta; } } - } + } } return pWInfo->nOutStarDelta>0 ? 18 : 12; } @@ -5646,7 +5646,7 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ }else if( nLoop==2 ){ mxChoice = 5; }else{ - mxChoice = computeMxChoice(pWInfo, nRowEst); + mxChoice = computeMxChoice(pWInfo); } assert( nLoop<=pWInfo->pTabList->nSrc ); @@ -6015,6 +6015,9 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ } pWInfo->nRowOut = pFrom->nRow + pWInfo->nOutStarDelta; +#ifdef WHERETRACE_ENABLED + pWInfo->rTotalCost = pFrom->rCost + pWInfo->nOutStarDelta; +#endif /* Free temporary memory and return success */ sqlite3StackFreeNN(pParse->db, pSpace); @@ -6895,7 +6898,8 @@ WhereInfo *sqlite3WhereBegin( assert( db->mallocFailed==0 ); #ifdef WHERETRACE_ENABLED if( sqlite3WhereTrace ){ - sqlite3DebugPrintf("---- Solution nRow=%d", pWInfo->nRowOut); + sqlite3DebugPrintf("---- Solution cost=%d, nRow=%d", + pWInfo->rTotalCost, pWInfo->nRowOut); if( pWInfo->nOBSat>0 ){ sqlite3DebugPrintf(" ORDERBY=%d,0x%llx", pWInfo->nOBSat, pWInfo->revMask); } diff --git a/src/whereInt.h b/src/whereInt.h index f44c040418..5bea70ba9f 100644 --- a/src/whereInt.h +++ b/src/whereInt.h @@ -486,8 +486,12 @@ struct WhereInfo { unsigned untestedTerms :1; /* Not all WHERE terms resolved by outer loop */ unsigned bOrderedInnerLoop:1;/* True if only the inner-most loop is ordered */ unsigned sorted :1; /* True if really sorted (not just grouped) */ + unsigned bStarDone :1; /* True if check for star-query is complete */ LogEst nOutStarDelta; /* Artifical nOut reduction for star-query */ LogEst nRowOut; /* Estimated number of output rows */ +#ifdef WHERETRACE_ENABLED + LogEst rTotalCost; /* Total cost of the solution */ +#endif int iTop; /* The very beginning of the WHERE loop */ int iEndWhere; /* End of the WHERE clause itself */ WhereLoop *pLoops; /* List of all WhereLoop objects */ From d37412b80c754e4ca1e45d373bb3b3d832662c73 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 24 Jan 2025 16:27:18 +0000 Subject: [PATCH 117/220] The debugging output for WhereLoop objects now shows cost estimate changes due to the star-query heuristic. FossilOrigin-Name: a280f5f5480e560fc2b80e8947d8062e8b3487d930e71cb60fc9ba90d87977c1 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/where.c | 11 +++++++++-- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index a6cc524f90..71a6bc9616 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\stweaks\sto\sthe\sstar-query\sdetection\sand\sprocessing. -D 2025-01-24T15:55:20.191 +C The\sdebugging\soutput\sfor\sWhereLoop\sobjects\snow\sshows\scost\nestimate\schanges\sdue\sto\sthe\sstar-query\sheuristic. +D 2025-01-24T16:27:18.228 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -863,7 +863,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 4e6181d8780ab0af2e1388d0754cbe6f2f04593d2b1ab6c41699a89942fd8997 F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 -F src/where.c 3dacc2fa210fa44a55041ddaa6f89da1626a48017817f196f12ceed52723bba0 +F src/where.c 647dfba23202523c64ca204f3501a09d18670ea081acea680ddcb1e63beda163 F src/whereInt.h 3b2ef4617758174d00c6940850e4988c1b195d39bcc20f2965319a1f7bffc714 F src/wherecode.c 0c3d3199a2b769a5e2bb70feb5003dc85b3d86842ecaf903a47f2b4205ca5dab F src/whereexpr.c 0f93a29cabd3a338d09a1f5c6770620a1ac51ec1157f3229502a7e7767c60b6f @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 5aebd7df0d577e98b3affd22b84b42dfe84a9f37fa29187505cc245b95460ba4 -R f847747d05c8cfe1b5f92bc976034b08 +P 61f76a45ac7aa454419fd7539a3d8e60f0733fb5a2abd034d795328f3c1b6e9b +R b5fb3d6f32de07f513e6a24731e9896f U drh -Z b010436488b72486e8da8913eae9dd55 +Z 6f36bcae3e1b7a772902eff5e8fa7c2d # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index f9eccc3e4a..dad04bb867 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -61f76a45ac7aa454419fd7539a3d8e60f0733fb5a2abd034d795328f3c1b6e9b +a280f5f5480e560fc2b80e8947d8062e8b3487d930e71cb60fc9ba90d87977c1 diff --git a/src/where.c b/src/where.c index 4fa281c158..14dc99e5c1 100644 --- a/src/where.c +++ b/src/where.c @@ -2431,8 +2431,9 @@ void sqlite3WhereClausePrint(WhereClause *pWC){ ** 1.002.001 t2.t2xy 2 f 010241 N 2 cost 0,56,31 */ void sqlite3WhereLoopPrint(const WhereLoop *p, const WhereClause *pWC){ + WhereInfo *pWInfo; if( pWC ){ - WhereInfo *pWInfo = pWC->pWInfo; + pWInfo = pWC->pWInfo; int nb = 1+(pWInfo->pTabList->nSrc+3)/4; SrcItem *pItem = pWInfo->pTabList->a + p->iTab; Table *pTab = pItem->pSTab; @@ -2442,6 +2443,7 @@ void sqlite3WhereLoopPrint(const WhereLoop *p, const WhereClause *pWC){ sqlite3DebugPrintf(" %12s", pItem->zAlias ? pItem->zAlias : pTab->zName); }else{ + pWInfo = 0; sqlite3DebugPrintf("%c%2d.%03llx.%03llx %c%d", p->cId, p->iTab, p->maskSelf, p->prereq & 0xfff, p->cId, p->iTab); } @@ -2473,7 +2475,12 @@ void sqlite3WhereLoopPrint(const WhereLoop *p, const WhereClause *pWC){ }else{ sqlite3DebugPrintf(" f %06x N %d", p->wsFlags, p->nLTerm); } - sqlite3DebugPrintf(" cost %d,%d,%d\n", p->rSetup, p->rRun, p->nOut); + if( pWInfo && pWInfo->nOutStarDelta>0 && p->rStarDelta!=0 ){ + sqlite3DebugPrintf(" cost %d,%d,%d delta=%d\n", + p->rSetup, p->rRun, p->nOut, -p->rStarDelta); + }else{ + sqlite3DebugPrintf(" cost %d,%d,%d\n", p->rSetup, p->rRun, p->nOut); + } if( p->nLTerm && (sqlite3WhereTrace & 0x4000)!=0 ){ int i; for(i=0; inLTerm; i++){ From 77731d5ec03b4fecbe615c21bb45e4bc53f64fdf Mon Sep 17 00:00:00 2001 From: stephan Date: Fri, 24 Jan 2025 18:37:55 +0000 Subject: [PATCH 118/220] Clarify handling of a NULL for the 2nd argument to sqlite3_serialize(), as pointed out in [forum:3df7168b90|forum post 3df7168b90]. FossilOrigin-Name: 340edbe5540762656b648c18a359ab7039b4a0af15db199fc86317a415e2bafa --- manifest | 15 +++++++-------- manifest.uuid | 2 +- src/sqlite.h.in | 5 +++-- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 87f0cf85ca..3bd11a690c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improve\sthe\sstar-query\sheuristic\sso\sthat\sit\sdoes\sa\sbetter\sjob\sof\sidentifying\nactual\sstar\squeries.\s\sAlso\sincludes\simproved\sdiagnostic\soutput\sfrom\sthe\nquery\splanner. -D 2025-01-24T16:37:31.813 +C Clarify\shandling\sof\sa\sNULL\sfor\sthe\s2nd\sargument\sto\ssqlite3_serialize(),\sas\spointed\sout\sin\s[forum:3df7168b90|forum\spost\s3df7168b90]. +D 2025-01-24T18:37:55.155 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -781,7 +781,7 @@ F src/resolve.c c8a5372b97b2a2e972a280676f06ddb5b74e885d3b1f5ce383f839907b57ef68 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 F src/select.c 83e88fbb36f89b6703b348777491619554f0fd6f917c9fdf51e4c2e9cda6c04e F src/shell.c.in 9ade75afa953c5c2ded38d076533eaa6c9b2ab1977ef6cce0bc773adac178c50 -F src/sqlite.h.in 6afbcaae44140216704a6c82e4c4ea4118c46d5f6573d6c5fa4fc901ed9d369e +F src/sqlite.h.in 135c4479d03d5dcff7f580c1997f351d94954cf37346db560948c7add6159d9a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54 F src/sqliteInt.h 953f2476f712b115ecb43f7a21183d07c88af8d3b4c32f18317724ce1ce04d56 @@ -2208,9 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P c338caf0fd4adc7baacf20f6d4274b1776b9487a5a976b8d85e490791be82b11 a280f5f5480e560fc2b80e8947d8062e8b3487d930e71cb60fc9ba90d87977c1 -R 7125d6757cc5225f643dd2f0408b79ed -T +closed a280f5f5480e560fc2b80e8947d8062e8b3487d930e71cb60fc9ba90d87977c1 -U drh -Z f818ed71ad97105ec5c66c8cb2f2a934 +P 7cfbe14d199bb631abd4d009698eeaee9b8450d5061ded612095ee4738ac6a1f +R d95198c99c03bf1086d509885c532867 +U stephan +Z 8d7df02ae4ad22d5b811a7e9945d57db # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 38a6c8e782..de6b6e3649 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7cfbe14d199bb631abd4d009698eeaee9b8450d5061ded612095ee4738ac6a1f +340edbe5540762656b648c18a359ab7039b4a0af15db199fc86317a415e2bafa diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 9a117fa54e..b6863b30fa 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -10748,8 +10748,9 @@ SQLITE_EXPERIMENTAL int sqlite3_snapshot_recover(sqlite3 *db, const char *zDb); /* ** CAPI3REF: Serialize a database ** -** The sqlite3_serialize(D,S,P,F) interface returns a pointer to memory -** that is a serialization of the S database on [database connection] D. +** The sqlite3_serialize(D,S,P,F) interface returns a pointer to +** memory that is a serialization of the S database on [database +** connection] D. If S is a NULL pointer, the main database is used. ** If P is not a NULL pointer, then the size of the database in bytes ** is written into *P. ** From bc7e41c03c9009c96cf3f1179ba0545ba3561abe Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 24 Jan 2025 20:59:12 +0000 Subject: [PATCH 119/220] Remove an incorrect ALWAYS() added in check-in [7cfbe14d199bb631]. FossilOrigin-Name: 431a1a29f93dc642779dc21c3a0edad5fcda1d175e9d1e3b216fa02c234fe774 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/where.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 3bd11a690c..0784f8fab1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Clarify\shandling\sof\sa\sNULL\sfor\sthe\s2nd\sargument\sto\ssqlite3_serialize(),\sas\spointed\sout\sin\s[forum:3df7168b90|forum\spost\s3df7168b90]. -D 2025-01-24T18:37:55.155 +C Remove\san\sincorrect\sALWAYS()\sadded\sin\scheck-in\s[7cfbe14d199bb631]. +D 2025-01-24T20:59:12.630 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -863,7 +863,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 4e6181d8780ab0af2e1388d0754cbe6f2f04593d2b1ab6c41699a89942fd8997 F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 -F src/where.c 647dfba23202523c64ca204f3501a09d18670ea081acea680ddcb1e63beda163 +F src/where.c e1bd86a1f86e8713e571928db044e786d6ca99033a1642f054275cd9c4192b6c F src/whereInt.h 3b2ef4617758174d00c6940850e4988c1b195d39bcc20f2965319a1f7bffc714 F src/wherecode.c 0c3d3199a2b769a5e2bb70feb5003dc85b3d86842ecaf903a47f2b4205ca5dab F src/whereexpr.c 0f93a29cabd3a338d09a1f5c6770620a1ac51ec1157f3229502a7e7767c60b6f @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 7cfbe14d199bb631abd4d009698eeaee9b8450d5061ded612095ee4738ac6a1f -R d95198c99c03bf1086d509885c532867 -U stephan -Z 8d7df02ae4ad22d5b811a7e9945d57db +P 340edbe5540762656b648c18a359ab7039b4a0af15db199fc86317a415e2bafa +R 6b5e2e687d0ef7732e967617df5d4d35 +U drh +Z e079a1f3d11224b9203a1e2c133626d6 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index de6b6e3649..2a7fb17f5d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -340edbe5540762656b648c18a359ab7039b4a0af15db199fc86317a415e2bafa +431a1a29f93dc642779dc21c3a0edad5fcda1d175e9d1e3b216fa02c234fe774 diff --git a/src/where.c b/src/where.c index 14dc99e5c1..eeea2e13d0 100644 --- a/src/where.c +++ b/src/where.c @@ -5519,7 +5519,7 @@ static int computeMxChoice(WhereInfo *pWInfo){ ** restrict the search for dimension-tables to be tables to the right ** of the fact-table. */ if( iFromIdx+4 > nLoop ) break; /* Impossible to reach nDep>=4 */ - while( ALWAYS(pStart) && pStart->iTab<=iFromIdx ){ + while( pStart && pStart->iTab<=iFromIdx ){ pStart = pStart->pNextLoop; } } From dea434ea6513a3f91bf15ce4106db0c54a9d6161 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 25 Jan 2025 00:07:14 +0000 Subject: [PATCH 120/220] Avoid calling computeMxChoice() after an OOM as some assert()s can fail in that routine if a prior OOM occurred while building the WhereLoop array. FossilOrigin-Name: 8b9e621dbf599d7e75e07d75d4c400247d693ea76e00eba0919f4e33e3e10bdd --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/where.c | 2 ++ 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 0784f8fab1..ec0df49442 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\san\sincorrect\sALWAYS()\sadded\sin\scheck-in\s[7cfbe14d199bb631]. -D 2025-01-24T20:59:12.630 +C Avoid\scalling\scomputeMxChoice()\safter\san\sOOM\sas\ssome\sassert()s\scan\sfail\nin\sthat\sroutine\sif\sa\sprior\sOOM\soccurred\swhile\sbuilding\sthe\sWhereLoop\sarray. +D 2025-01-25T00:07:14.255 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -863,7 +863,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 4e6181d8780ab0af2e1388d0754cbe6f2f04593d2b1ab6c41699a89942fd8997 F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 -F src/where.c e1bd86a1f86e8713e571928db044e786d6ca99033a1642f054275cd9c4192b6c +F src/where.c 75427197cc4a6251f7e643c27512a846593a8fc349381ca210b8e1c5b87c5fdb F src/whereInt.h 3b2ef4617758174d00c6940850e4988c1b195d39bcc20f2965319a1f7bffc714 F src/wherecode.c 0c3d3199a2b769a5e2bb70feb5003dc85b3d86842ecaf903a47f2b4205ca5dab F src/whereexpr.c 0f93a29cabd3a338d09a1f5c6770620a1ac51ec1157f3229502a7e7767c60b6f @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 340edbe5540762656b648c18a359ab7039b4a0af15db199fc86317a415e2bafa -R 6b5e2e687d0ef7732e967617df5d4d35 +P 431a1a29f93dc642779dc21c3a0edad5fcda1d175e9d1e3b216fa02c234fe774 +R 5b1c7e21f9360cd4e11f23b85175a095 U drh -Z e079a1f3d11224b9203a1e2c133626d6 +Z 397108c3fd80a1eae2be914e45c3c459 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 2a7fb17f5d..848e01e8a7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -431a1a29f93dc642779dc21c3a0edad5fcda1d175e9d1e3b216fa02c234fe774 +8b9e621dbf599d7e75e07d75d4c400247d693ea76e00eba0919f4e33e3e10bdd diff --git a/src/where.c b/src/where.c index eeea2e13d0..24674f91df 100644 --- a/src/where.c +++ b/src/where.c @@ -5652,6 +5652,8 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ mxChoice = 1; }else if( nLoop==2 ){ mxChoice = 5; + }else if( pParse->nErr ){ + mxChoice = 1; }else{ mxChoice = computeMxChoice(pWInfo); } From 0186ee1cd742a78f8b98fd1ec7e197aaf8f1c2f8 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 25 Jan 2025 14:30:36 +0000 Subject: [PATCH 121/220] Improvments to debug output on the star-query heuristic. FossilOrigin-Name: b3ebeb0682a2c837987acf4ed92f06cf91aea235830c5a0f9dd1ce64afe16e84 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/sqliteInt.h | 4 +++- src/where.c | 22 +++++++++++++++++----- 4 files changed, 28 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index ec0df49442..b407f7242e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\scalling\scomputeMxChoice()\safter\san\sOOM\sas\ssome\sassert()s\scan\sfail\nin\sthat\sroutine\sif\sa\sprior\sOOM\soccurred\swhile\sbuilding\sthe\sWhereLoop\sarray. -D 2025-01-25T00:07:14.255 +C Improvments\sto\sdebug\soutput\son\sthe\sstar-query\sheuristic. +D 2025-01-25T14:30:36.057 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -784,7 +784,7 @@ F src/shell.c.in 9ade75afa953c5c2ded38d076533eaa6c9b2ab1977ef6cce0bc773adac178c5 F src/sqlite.h.in 135c4479d03d5dcff7f580c1997f351d94954cf37346db560948c7add6159d9a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54 -F src/sqliteInt.h 953f2476f712b115ecb43f7a21183d07c88af8d3b4c32f18317724ce1ce04d56 +F src/sqliteInt.h e28d3ad85c671effec0892f156e1e0f949733fb0995335406b5ec3803faba3a4 F src/sqliteLimit.h 1bbdbf72bd0411d003267ffebc59a262f061df5653027a75627d03f48ca30523 F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -863,7 +863,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 4e6181d8780ab0af2e1388d0754cbe6f2f04593d2b1ab6c41699a89942fd8997 F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 -F src/where.c 75427197cc4a6251f7e643c27512a846593a8fc349381ca210b8e1c5b87c5fdb +F src/where.c 8fb5ce22e5fbc82f8e53a059e76ff492113f3de8ff26c3639d52c75e94088596 F src/whereInt.h 3b2ef4617758174d00c6940850e4988c1b195d39bcc20f2965319a1f7bffc714 F src/wherecode.c 0c3d3199a2b769a5e2bb70feb5003dc85b3d86842ecaf903a47f2b4205ca5dab F src/whereexpr.c 0f93a29cabd3a338d09a1f5c6770620a1ac51ec1157f3229502a7e7767c60b6f @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 431a1a29f93dc642779dc21c3a0edad5fcda1d175e9d1e3b216fa02c234fe774 -R 5b1c7e21f9360cd4e11f23b85175a095 +P 8b9e621dbf599d7e75e07d75d4c400247d693ea76e00eba0919f4e33e3e10bdd +R e6dd9f24405ca06acecad76b774b4e57 U drh -Z 397108c3fd80a1eae2be914e45c3c459 +Z 5c57dd71c02ea0fa33cecfe1d8ec4eed # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 848e01e8a7..a25e3e3f14 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8b9e621dbf599d7e75e07d75d4c400247d693ea76e00eba0919f4e33e3e10bdd +b3ebeb0682a2c837987acf4ed92f06cf91aea235830c5a0f9dd1ce64afe16e84 diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 3045d7c4a5..d29b2e3930 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1151,7 +1151,7 @@ extern u32 sqlite3WhereTrace; ** 0xFFFF---- Low-level debug messages ** ** 0x00000001 Code generation -** 0x00000002 Solver +** 0x00000002 Solver (Use 0x40000 for less detail) ** 0x00000004 Solver costs ** 0x00000008 WhereLoop inserts ** @@ -1170,6 +1170,8 @@ extern u32 sqlite3WhereTrace; ** ** 0x00010000 Show more detail when printing WHERE terms ** 0x00020000 Show WHERE terms returned from whereScanNext() +** 0x00040000 Solver overview messages +** 0x00080000 Star-query heuristic */ diff --git a/src/where.c b/src/where.c index 24674f91df..d25a1723d3 100644 --- a/src/where.c +++ b/src/where.c @@ -5544,8 +5544,8 @@ static int computeMxChoice(WhereInfo *pWInfo){ } if( nDep<=3 ) continue; rDelta = 15*(nDep-3); -#ifdef WHERETRACE_ENABLED /* 0x4 */ - if( sqlite3WhereTrace&0x4 ){ +#ifdef WHERETRACE_ENABLED /* 0x80000 */ + if( sqlite3WhereTrace & 0x80000 ){ Bitmask x; int ii; sqlite3DebugPrintf( @@ -5564,10 +5564,12 @@ static int computeMxChoice(WhereInfo *pWInfo){ sqlite3DebugPrintf("\n"); } #endif - for(pWLoop=pWInfo->pLoops; pWLoop; pWLoop=pWLoop->pNextLoop){ - pWLoop->rStarDelta = 0; + if( pWInfo->nOutStarDelta==0 ){ + for(pWLoop=pWInfo->pLoops; pWLoop; pWLoop=pWLoop->pNextLoop){ + pWLoop->rStarDelta = 0; + } } - pWInfo->nOutStarDelta = rDelta; + pWInfo->nOutStarDelta += rDelta; for(pWLoop=pWInfo->pLoops; pWLoop; pWLoop=pWLoop->pNextLoop){ if( pWLoop->maskSelf==m ){ pWLoop->rRun -= rDelta; @@ -5576,6 +5578,16 @@ static int computeMxChoice(WhereInfo *pWInfo){ } } } +#ifdef WHERETRACE_ENABLED /* 0x80000 */ + if( (sqlite3WhereTrace & 0x80000)!=0 && pWInfo->nOutStarDelta ){ + sqlite3DebugPrintf("WhereLoops changed by star-query heuristic:\n"); + for(pWLoop=pWInfo->pLoops; pWLoop; pWLoop=pWLoop->pNextLoop){ + if( pWLoop->rStarDelta ){ + sqlite3WhereLoopPrint(pWLoop, &pWInfo->sWC); + } + } + } +#endif } return pWInfo->nOutStarDelta>0 ? 18 : 12; } From fb9e8e48fd70b463fb7ba6d99e00f2be54df749e Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 25 Jan 2025 23:04:05 +0000 Subject: [PATCH 122/220] Revise the strategy used by the star-query heuristic: Instead of decreasing the cost of all fact-table WhereLoops, increase the run-cost of WhereLoops that are SCANs of dimension tables. FossilOrigin-Name: 1bc09c9e8bd77ac41ecbe510c7e003757fc11d0f586da6cdf3584315aa9d6407 --- manifest | 14 ++++---- manifest.uuid | 2 +- src/where.c | 87 ++++++++++++++++++++++++++------------------------ src/whereInt.h | 4 +-- 4 files changed, 55 insertions(+), 52 deletions(-) diff --git a/manifest b/manifest index b407f7242e..c6113e84a4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improvments\sto\sdebug\soutput\son\sthe\sstar-query\sheuristic. -D 2025-01-25T14:30:36.057 +C Revise\sthe\sstrategy\sused\sby\sthe\sstar-query\sheuristic:\s\sInstead\sof\sdecreasing\nthe\scost\sof\sall\sfact-table\sWhereLoops,\sincrease\sthe\srun-cost\sof\sWhereLoops\sthat\nare\sSCANs\sof\sdimension\stables. +D 2025-01-25T23:04:05.646 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -863,8 +863,8 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 4e6181d8780ab0af2e1388d0754cbe6f2f04593d2b1ab6c41699a89942fd8997 F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 -F src/where.c 8fb5ce22e5fbc82f8e53a059e76ff492113f3de8ff26c3639d52c75e94088596 -F src/whereInt.h 3b2ef4617758174d00c6940850e4988c1b195d39bcc20f2965319a1f7bffc714 +F src/where.c 3917a56c85951be386057ee4e9af8a6746427f6f26e8ffce293a61e334b76498 +F src/whereInt.h 510b12f85a763602a1b1e70a9cc643a73082a63cda2ca204dd912daaa540115d F src/wherecode.c 0c3d3199a2b769a5e2bb70feb5003dc85b3d86842ecaf903a47f2b4205ca5dab F src/whereexpr.c 0f93a29cabd3a338d09a1f5c6770620a1ac51ec1157f3229502a7e7767c60b6f F src/window.c 2bf01f9941a64fbcead61a0e3cb5db3fca5094b30d2ff0d23274c2a81d2e2385 @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 8b9e621dbf599d7e75e07d75d4c400247d693ea76e00eba0919f4e33e3e10bdd -R e6dd9f24405ca06acecad76b774b4e57 +P b3ebeb0682a2c837987acf4ed92f06cf91aea235830c5a0f9dd1ce64afe16e84 +R a3d46d3d0d804ef5b7f52b211e4f3855 U drh -Z 5c57dd71c02ea0fa33cecfe1d8ec4eed +Z 01bfb692a509c7bcf6c556a6b5d760a5 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index a25e3e3f14..29b013c9fc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b3ebeb0682a2c837987acf4ed92f06cf91aea235830c5a0f9dd1ce64afe16e84 +1bc09c9e8bd77ac41ecbe510c7e003757fc11d0f586da6cdf3584315aa9d6407 diff --git a/src/where.c b/src/where.c index d25a1723d3..0db7cbc1e2 100644 --- a/src/where.c +++ b/src/where.c @@ -2475,9 +2475,9 @@ void sqlite3WhereLoopPrint(const WhereLoop *p, const WhereClause *pWC){ }else{ sqlite3DebugPrintf(" f %06x N %d", p->wsFlags, p->nLTerm); } - if( pWInfo && pWInfo->nOutStarDelta>0 && p->rStarDelta!=0 ){ + if( pWInfo && pWInfo->bStarUsed && p->rStarDelta!=0 ){ sqlite3DebugPrintf(" cost %d,%d,%d delta=%d\n", - p->rSetup, p->rRun, p->nOut, -p->rStarDelta); + p->rSetup, p->rRun, p->nOut, p->rStarDelta); }else{ sqlite3DebugPrintf(" cost %d,%d,%d\n", p->rSetup, p->rRun, p->nOut); } @@ -5458,13 +5458,13 @@ static LogEst whereSortingCost( ** ** SIDE EFFECT: (and really the whole point of this subroutine) ** -** If pWInfo describes a star-query, then the cost on WhereLoops for the -** fact table is reduced. This heuristic helps keep fact tables in +** If pWInfo describes a star-query, then the cost for SCANs of dimension +** WhereLoops is increased to be slightly larger than the cost of a SCAN +** in the fact table. This heuristic helps keep fact tables in ** outer loops. Without this heuristic, paths with fact tables in outer ** loops tend to get pruned by the mxChoice limit on the number of paths, -** resulting in poor query plans. The total amount of heuristic cost -** adjustment is stored in pWInfo->nOutStarDelta and the cost adjustment -** for each WhereLoop is stored in its rStarDelta field. +** resulting in poor query plans. The cost adjustment for each WhereLoop +** is stored in its rStarDelta field. ** ** This heuristic can be completely disabled, so that no query is ** considered a star-query, using SQLITE_TESTCTRL_OPTIMIZATION to @@ -5488,7 +5488,7 @@ static int computeMxChoice(WhereInfo *pWInfo){ } #endif /* SQLITE_DEBUG */ - if( nLoop>=5 + if( nLoop>=5 && !pWInfo->bStarDone && OptimizationEnabled(pWInfo->pParse->db, SQLITE_StarQuery) ){ @@ -5504,12 +5504,12 @@ static int computeMxChoice(WhereInfo *pWInfo){ ** the cost of fact tables relative to dimension tables, as a heuristic ** to help keep the fact tables in outer loops. */ - assert( pWInfo->nOutStarDelta==0 ); + assert( !pWInfo->bStarUsed ); aFromTabs = pWInfo->pTabList->a; pStart = pWInfo->pLoops; for(iFromIdx=0, m=1; iFromIdxzAlias ? pFactTab->zAlias : pFactTab->pSTab->zName, - iFromIdx, rDelta, nDep - ); - for(ii=0, x=1; iizAlias ? pDim->zAlias : pDim->pSTab->zName, ii - ); - } - } - sqlite3DebugPrintf("\n"); + + /* Compute the maximum cost of any WhereLoop for the iFromIdx-th term */ + mxRun = -32767; + for(pWLoop=pStart; pWLoop; pWLoop=pWLoop->pNextLoop){ + if( pWLoop->iTabiTab>iFromIdx ) break; + if( pWLoop->rRun>mxRun ) mxRun = pWLoop->rRun; } -#endif - if( pWInfo->nOutStarDelta==0 ){ + + /* Make sure rStarDelta values are initialized */ + if( !pWInfo->bStarUsed ){ for(pWLoop=pWInfo->pLoops; pWLoop; pWLoop=pWLoop->pNextLoop){ pWLoop->rStarDelta = 0; } + pWInfo->bStarUsed = 1; } - pWInfo->nOutStarDelta += rDelta; - for(pWLoop=pWInfo->pLoops; pWLoop; pWLoop=pWLoop->pNextLoop){ - if( pWLoop->maskSelf==m ){ - pWLoop->rRun -= rDelta; - pWLoop->nOut -= rDelta; - pWLoop->rStarDelta = rDelta; + + /* Increase the cost of table scans for dimension tables to be slightly + ** more than the maximum cost of fact table */ + for(pWLoop=pStart; pWLoop; pWLoop=pWLoop->pNextLoop){ + if( (pWLoop->maskSelf & mSeen)==0 ) continue; + if( pWLoop->nLTerm ) continue; + if( pWLoop->rRun<=mxRun ){ +#ifdef WHERETRACE_ENABLED /* 0x80000 */ + if( sqlite3WhereTrace & 0x80000 ){ + SrcItem *pDim = aFromTabs + pWLoop->iTab; + sqlite3DebugPrintf( + "Increase SCAN cost of dimension %s(%d) of fact %s(%d) to %d\n", + pDim->zAlias ? pDim->zAlias: pDim->pSTab->zName, pWLoop->iTab, + pFactTab->zAlias ? pFactTab->zAlias : pFactTab->pSTab->zName, + iFromIdx, mxRun+1 + ); + } +#endif /* WHERETRACE_ENABLED */ + pWLoop->rStarDelta = mxRun+1 - pWLoop->rRun; + pWLoop->rRun = mxRun+1; } } } #ifdef WHERETRACE_ENABLED /* 0x80000 */ - if( (sqlite3WhereTrace & 0x80000)!=0 && pWInfo->nOutStarDelta ){ + if( (sqlite3WhereTrace & 0x80000)!=0 && pWInfo->bStarUsed ){ sqlite3DebugPrintf("WhereLoops changed by star-query heuristic:\n"); for(pWLoop=pWInfo->pLoops; pWLoop; pWLoop=pWLoop->pNextLoop){ if( pWLoop->rStarDelta ){ @@ -5589,7 +5593,7 @@ static int computeMxChoice(WhereInfo *pWInfo){ } #endif } - return pWInfo->nOutStarDelta>0 ? 18 : 12; + return pWInfo->bStarUsed ? 18 : 12; } /* @@ -6035,9 +6039,9 @@ static int wherePathSolver(WhereInfo *pWInfo, LogEst nRowEst){ } } - pWInfo->nRowOut = pFrom->nRow + pWInfo->nOutStarDelta; + pWInfo->nRowOut = pFrom->nRow; #ifdef WHERETRACE_ENABLED - pWInfo->rTotalCost = pFrom->rCost + pWInfo->nOutStarDelta; + pWInfo->rTotalCost = pFrom->rCost; #endif /* Free temporary memory and return success */ @@ -6436,7 +6440,6 @@ static SQLITE_NOINLINE void whereCheckIfBloomFilterIsUseful( } } nSearch += pLoop->nOut; - if( pWInfo->nOutStarDelta ) nSearch += pLoop->rStarDelta; } } diff --git a/src/whereInt.h b/src/whereInt.h index 5bea70ba9f..35bfe581dd 100644 --- a/src/whereInt.h +++ b/src/whereInt.h @@ -163,7 +163,7 @@ struct WhereLoop { # define WHERE_LOOP_XFER_SZ offsetof(WhereLoop,nLSlot) u16 nLSlot; /* Number of slots allocated for aLTerm[] */ LogEst rStarDelta; /* Cost delta due to star-schema heuristic. Not - ** initialized unless pWInfo->nOutStarDelta>0 */ + ** initialized unless pWInfo->bStarUsed */ WhereTerm **aLTerm; /* WhereTerms used */ WhereLoop *pNextLoop; /* Next WhereLoop object in the WhereClause */ WhereTerm *aLTermSpace[3]; /* Initial aLTerm[] space */ @@ -487,7 +487,7 @@ struct WhereInfo { unsigned bOrderedInnerLoop:1;/* True if only the inner-most loop is ordered */ unsigned sorted :1; /* True if really sorted (not just grouped) */ unsigned bStarDone :1; /* True if check for star-query is complete */ - LogEst nOutStarDelta; /* Artifical nOut reduction for star-query */ + unsigned bStarUsed :1; /* True if cost adjustments for star-query */ LogEst nRowOut; /* Estimated number of output rows */ #ifdef WHERETRACE_ENABLED LogEst rTotalCost; /* Total cost of the solution */ From fe54b7a1f442a4c5b1a23fe83821adbe04b782cf Mon Sep 17 00:00:00 2001 From: drh <> Date: Sun, 26 Jan 2025 17:29:33 +0000 Subject: [PATCH 123/220] Small size and complexity reduction on the star-query heuristic. Improved comments for the star-query heuristic. FossilOrigin-Name: a7ecb2f4b7eee78b88f1b2e026dffed2007ca4ffeb152632624ab2582839b250 --- manifest | 18 +++++------ manifest.uuid | 2 +- src/sqliteInt.h | 2 ++ src/where.c | 73 +++++++++++++++++++++++++++++-------------- src/whereInt.h | 6 ++-- test/starschema1.test | 2 +- 6 files changed, 66 insertions(+), 37 deletions(-) diff --git a/manifest b/manifest index c6113e84a4..e2dc85219e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Revise\sthe\sstrategy\sused\sby\sthe\sstar-query\sheuristic:\s\sInstead\sof\sdecreasing\nthe\scost\sof\sall\sfact-table\sWhereLoops,\sincrease\sthe\srun-cost\sof\sWhereLoops\sthat\nare\sSCANs\sof\sdimension\stables. -D 2025-01-25T23:04:05.646 +C Small\ssize\sand\scomplexity\sreduction\son\sthe\sstar-query\sheuristic.\s\sImproved\ncomments\sfor\sthe\sstar-query\sheuristic. +D 2025-01-26T17:29:33.018 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -784,7 +784,7 @@ F src/shell.c.in 9ade75afa953c5c2ded38d076533eaa6c9b2ab1977ef6cce0bc773adac178c5 F src/sqlite.h.in 135c4479d03d5dcff7f580c1997f351d94954cf37346db560948c7add6159d9a F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54 -F src/sqliteInt.h e28d3ad85c671effec0892f156e1e0f949733fb0995335406b5ec3803faba3a4 +F src/sqliteInt.h 5c859fc5b1b9fa489bc7a39d37606472b70f808f965eab11c24f14d8d7654330 F src/sqliteLimit.h 1bbdbf72bd0411d003267ffebc59a262f061df5653027a75627d03f48ca30523 F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -863,8 +863,8 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 4e6181d8780ab0af2e1388d0754cbe6f2f04593d2b1ab6c41699a89942fd8997 F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 -F src/where.c 3917a56c85951be386057ee4e9af8a6746427f6f26e8ffce293a61e334b76498 -F src/whereInt.h 510b12f85a763602a1b1e70a9cc643a73082a63cda2ca204dd912daaa540115d +F src/where.c adda3afc98a4f58713973997c699be2a8515c591701092e8380695f1a0a7b220 +F src/whereInt.h d20cddddb1d61b18d5cb1fcfa9b77fbeebbc4afe44d996e603452a23b3009ee1 F src/wherecode.c 0c3d3199a2b769a5e2bb70feb5003dc85b3d86842ecaf903a47f2b4205ca5dab F src/whereexpr.c 0f93a29cabd3a338d09a1f5c6770620a1ac51ec1157f3229502a7e7767c60b6f F src/window.c 2bf01f9941a64fbcead61a0e3cb5db3fca5094b30d2ff0d23274c2a81d2e2385 @@ -1688,7 +1688,7 @@ F test/spellfix4.test 51c7c26514ade169855c66bcf130bd5acfb4d7fd090cc624645ab275ae F test/sqldiff1.test 1b7ab4f312442c5cc6b3a5f299fa8ca051416d1dd173cb1126fd51bf64f2c3fb F test/sqllimits1.test 408131e4975d61868711c83f101a56d4602313cc5cae88d3eee81c1da364fd89 F test/sqllog.test 6af6cb0b09f4e44e1917e06ce85be7670302517a -F test/starschema1.test a84205f97fe278a015ac39546c86b97228d22043af28f3a2ef809e8d5637ce1d +F test/starschema1.test f5388cd32527ab18d3f98f9e3402ec780f6a186e04e0d9c8531d7568ee734e11 F test/startup.c 1beb5ca66fcc0fce95c3444db9d1674f90fc605499a574ae2434dcfc10d22805 F test/stat.test 123212a20ceb496893d5254a5f6c76442ce549fdc08d1702d8288a2bbaac8408 F test/statfault.test 064f43379e4992b5221b7d9ac887c313b3191f85cce605d78e416fc4045da64e @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P b3ebeb0682a2c837987acf4ed92f06cf91aea235830c5a0f9dd1ce64afe16e84 -R a3d46d3d0d804ef5b7f52b211e4f3855 +P 1bc09c9e8bd77ac41ecbe510c7e003757fc11d0f586da6cdf3584315aa9d6407 +R c0f75689e724495cafe203db572d7b59 U drh -Z 01bfb692a509c7bcf6c556a6b5d760a5 +Z 5884f43bd01d477b04985ecdd4572f42 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 29b013c9fc..22688c5390 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1bc09c9e8bd77ac41ecbe510c7e003757fc11d0f586da6cdf3584315aa9d6407 +a7ecb2f4b7eee78b88f1b2e026dffed2007ca4ffeb152632624ab2582839b250 diff --git a/src/sqliteInt.h b/src/sqliteInt.h index d29b2e3930..205f8f3e0e 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -881,6 +881,8 @@ typedef u64 tRowcnt; ** 0.5 -> -10 0.1 -> -33 0.0625 -> -40 */ typedef INT16_TYPE LogEst; +#define LOGEST_MIN (-32768) +#define LOGEST_MAX (32767) /* ** Set the SQLITE_PTRSIZE macro to the number of bytes in a pointer diff --git a/src/where.c b/src/where.c index 0db7cbc1e2..01f8ff0d9a 100644 --- a/src/where.c +++ b/src/where.c @@ -5451,7 +5451,7 @@ static LogEst whereSortingCost( ** For the purposes of this heuristic, a star-query is defined as a query ** with a large central table that is joined using an INNER JOIN, ** not CROSS or OUTER JOINs, against four or more smaller tables. -* The central table is called the "fact" table. The smaller tables +** The central table is called the "fact" table. The smaller tables ** that get joined are "dimension tables". Also, any table that is ** self-joined cannot be a dimension table; we assume that dimension ** tables may only be joined against fact tables. @@ -5460,16 +5460,35 @@ static LogEst whereSortingCost( ** ** If pWInfo describes a star-query, then the cost for SCANs of dimension ** WhereLoops is increased to be slightly larger than the cost of a SCAN -** in the fact table. This heuristic helps keep fact tables in -** outer loops. Without this heuristic, paths with fact tables in outer -** loops tend to get pruned by the mxChoice limit on the number of paths, -** resulting in poor query plans. The cost adjustment for each WhereLoop -** is stored in its rStarDelta field. +** in the fact table. Only SCAN costs are increased. SEARCH costs are +** unchanged. This heuristic helps keep fact tables in outer loops. Without +** this heuristic, paths with fact tables in outer loops tend to get pruned +** by the mxChoice limit on the number of paths, resulting in poor query +** plans. See the starschema1.test test module for examples of queries +** that need this heuristic to find good query plans. ** ** This heuristic can be completely disabled, so that no query is ** considered a star-query, using SQLITE_TESTCTRL_OPTIMIZATION to ** disable the SQLITE_StarQuery optimization. In the CLI, the command ** to do that is: ".testctrl opt -starquery". +** +** HISTORICAL NOTES: +** +** This optimization was first added on 2024-05-09 by check-in 38db9b5c83d. +** The original optimization reduced the cost and output size estimate for +** fact tables to help them move to outer loops. But months later (as people +** started upgrading) performance regression reports started caming in, +** including: +** +** forum post b18ef983e68d06d1 (2024-12-21) +** forum post 0025389d0860af82 (2025-01-14) +** forum post d87570a145599033 (2025-01-17) +** +** To address these, the criteria for a star-query was tightened to exclude +** cases where the fact and dimensions are separated by an outer join, and +** the affect of star-schema detection was changed to increase the rRun cost +** on just full table scans of dimension tables, rather than reducing costs +** in the all access methods of the fact table. */ static int computeMxChoice(WhereInfo *pWInfo){ int nLoop = pWInfo->nLevel; /* Number of terms in the join */ @@ -5477,7 +5496,7 @@ static int computeMxChoice(WhereInfo *pWInfo){ #ifdef SQLITE_DEBUG /* The star-query detection code below makes use of the following - ** properties of the WhereLoop list, so verifying them before + ** properties of the WhereLoop list, so verify them before ** continuing: ** (1) .maskSelf is the bitmask corresponding to .iTab ** (2) The WhereLoop list is in ascending .iTab order @@ -5500,9 +5519,10 @@ static int computeMxChoice(WhereInfo *pWInfo){ pWInfo->bStarDone = 1; /* Only do this computation once */ - /* Check to see if we are dealing with a star schema and if so, reduce - ** the cost of fact tables relative to dimension tables, as a heuristic - ** to help keep the fact tables in outer loops. + /* Check to see if we are dealing with a star schema and if so, adjust + ** SCAN cost of dimensino tables so that they are as large as the SCAN + ** cost of the fact table. This is a heuristic that helps keep the + ** fact tables in outer loops. */ assert( !pWInfo->bStarUsed ); aFromTabs = pWInfo->pTabList->a; @@ -5543,29 +5563,34 @@ static int computeMxChoice(WhereInfo *pWInfo){ } } if( nDep<=3 ) continue; - - /* Compute the maximum cost of any WhereLoop for the iFromIdx-th term */ - mxRun = -32767; - for(pWLoop=pStart; pWLoop; pWLoop=pWLoop->pNextLoop){ - if( pWLoop->iTabiTab>iFromIdx ) break; - if( pWLoop->rRun>mxRun ) mxRun = pWLoop->rRun; - } - + /* If we reach this point, it means that pFactTab is a fact table */ + +#ifdef WHERETRACE_ENABLED /* Make sure rStarDelta values are initialized */ if( !pWInfo->bStarUsed ){ for(pWLoop=pWInfo->pLoops; pWLoop; pWLoop=pWLoop->pNextLoop){ pWLoop->rStarDelta = 0; } - pWInfo->bStarUsed = 1; } +#endif + pWInfo->bStarUsed = 1; + + /* Compute one more than the maximum cost of any WhereLoop for the + ** fact table */ + mxRun = LOGEST_MIN; + for(pWLoop=pStart; pWLoop; pWLoop=pWLoop->pNextLoop){ + if( pWLoop->iTabiTab>iFromIdx ) break; + if( pWLoop->rRun>mxRun ) mxRun = pWLoop->rRun; + } + if( ALWAYS(mxRunpNextLoop){ if( (pWLoop->maskSelf & mSeen)==0 ) continue; if( pWLoop->nLTerm ) continue; - if( pWLoop->rRun<=mxRun ){ + if( pWLoop->rRuniTab; @@ -5573,12 +5598,12 @@ static int computeMxChoice(WhereInfo *pWInfo){ "Increase SCAN cost of dimension %s(%d) of fact %s(%d) to %d\n", pDim->zAlias ? pDim->zAlias: pDim->pSTab->zName, pWLoop->iTab, pFactTab->zAlias ? pFactTab->zAlias : pFactTab->pSTab->zName, - iFromIdx, mxRun+1 + iFromIdx, mxRun ); } + pWLoop->rStarDelta = mxRun - pWLoop->rRun; #endif /* WHERETRACE_ENABLED */ - pWLoop->rStarDelta = mxRun+1 - pWLoop->rRun; - pWLoop->rRun = mxRun+1; + pWLoop->rRun = mxRun; } } } diff --git a/src/whereInt.h b/src/whereInt.h index 35bfe581dd..8ba8a7072d 100644 --- a/src/whereInt.h +++ b/src/whereInt.h @@ -162,8 +162,10 @@ struct WhereLoop { /**** whereLoopXfer() copies fields above ***********************/ # define WHERE_LOOP_XFER_SZ offsetof(WhereLoop,nLSlot) u16 nLSlot; /* Number of slots allocated for aLTerm[] */ +#ifdef WHERETRACE_ENABLED LogEst rStarDelta; /* Cost delta due to star-schema heuristic. Not ** initialized unless pWInfo->bStarUsed */ +#endif WhereTerm **aLTerm; /* WhereTerms used */ WhereLoop *pNextLoop; /* Next WhereLoop object in the WhereClause */ WhereTerm *aLTermSpace[3]; /* Initial aLTerm[] space */ @@ -485,9 +487,9 @@ struct WhereInfo { unsigned bDeferredSeek :1; /* Uses OP_DeferredSeek */ unsigned untestedTerms :1; /* Not all WHERE terms resolved by outer loop */ unsigned bOrderedInnerLoop:1;/* True if only the inner-most loop is ordered */ - unsigned sorted :1; /* True if really sorted (not just grouped) */ + unsigned sorted :1; /* True if really sorted (not just grouped) */ unsigned bStarDone :1; /* True if check for star-query is complete */ - unsigned bStarUsed :1; /* True if cost adjustments for star-query */ + unsigned bStarUsed :1; /* True if star-query heuristic is used */ LogEst nRowOut; /* Estimated number of output rows */ #ifdef WHERETRACE_ENABLED LogEst rTotalCost; /* Total cost of the solution */ diff --git a/test/starschema1.test b/test/starschema1.test index af8168b510..bb7d8aa79b 100644 --- a/test/starschema1.test +++ b/test/starschema1.test @@ -10,7 +10,7 @@ #*********************************************************************** # # Test cases for the ability of the query planner to cope with -# star-schema queries on databases with goofy indexes. +# star-schema queries. # set testdir [file dirname $argv0] From 2228567ad33a41951fc79205d5555c51f7881562 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sun, 26 Jan 2025 20:09:57 +0000 Subject: [PATCH 124/220] Further comment improvements in the star-query heuristic. Add an ALWAYS() on an unreachable branch to achieve MC/DC. FossilOrigin-Name: 5e18ce68fbc5e73e6694936f3ba71f5b5e3758cf380951805ca6ea6a3f0943aa --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/where.c | 22 ++++++++++++---------- 3 files changed, 19 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index e2dc85219e..7bdfce7763 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Small\ssize\sand\scomplexity\sreduction\son\sthe\sstar-query\sheuristic.\s\sImproved\ncomments\sfor\sthe\sstar-query\sheuristic. -D 2025-01-26T17:29:33.018 +C Further\scomment\simprovements\sin\sthe\sstar-query\sheuristic.\s\sAdd\san\sALWAYS()\non\san\sunreachable\sbranch\sto\sachieve\sMC/DC. +D 2025-01-26T20:09:57.061 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -863,7 +863,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 4e6181d8780ab0af2e1388d0754cbe6f2f04593d2b1ab6c41699a89942fd8997 F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 -F src/where.c adda3afc98a4f58713973997c699be2a8515c591701092e8380695f1a0a7b220 +F src/where.c 72cd936dcaa391fdce021840fbd1d9cbe51e34f821e0a09a05a2cc99ab506e92 F src/whereInt.h d20cddddb1d61b18d5cb1fcfa9b77fbeebbc4afe44d996e603452a23b3009ee1 F src/wherecode.c 0c3d3199a2b769a5e2bb70feb5003dc85b3d86842ecaf903a47f2b4205ca5dab F src/whereexpr.c 0f93a29cabd3a338d09a1f5c6770620a1ac51ec1157f3229502a7e7767c60b6f @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 1bc09c9e8bd77ac41ecbe510c7e003757fc11d0f586da6cdf3584315aa9d6407 -R c0f75689e724495cafe203db572d7b59 +P a7ecb2f4b7eee78b88f1b2e026dffed2007ca4ffeb152632624ab2582839b250 +R 56a3a416133fa0f7166c060fc9c27138 U drh -Z 5884f43bd01d477b04985ecdd4572f42 +Z a3e111b0c87ac0b331649395aaa39e29 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 22688c5390..fbc82e399e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a7ecb2f4b7eee78b88f1b2e026dffed2007ca4ffeb152632624ab2582839b250 +5e18ce68fbc5e73e6694936f3ba71f5b5e3758cf380951805ca6ea6a3f0943aa diff --git a/src/where.c b/src/where.c index 01f8ff0d9a..8f467e9787 100644 --- a/src/where.c +++ b/src/where.c @@ -5519,10 +5519,9 @@ static int computeMxChoice(WhereInfo *pWInfo){ pWInfo->bStarDone = 1; /* Only do this computation once */ - /* Check to see if we are dealing with a star schema and if so, adjust - ** SCAN cost of dimensino tables so that they are as large as the SCAN - ** cost of the fact table. This is a heuristic that helps keep the - ** fact tables in outer loops. + /* Look for fact tables with four or more dimensions where the + ** dimension tables are not separately from the fact tables by an outer + ** or cross join. Adjust cost weights if found. */ assert( !pWInfo->bStarUsed ); aFromTabs = pWInfo->pTabList->a; @@ -5539,7 +5538,7 @@ static int computeMxChoice(WhereInfo *pWInfo){ ** restrict the search for dimension-tables to be tables to the right ** of the fact-table. */ if( iFromIdx+4 > nLoop ) break; /* Impossible to reach nDep>=4 */ - while( pStart && pStart->iTab<=iFromIdx ){ + while( ALWAYS(pStart) && pStart->iTab<=iFromIdx ){ pStart = pStart->pNextLoop; } } @@ -5563,7 +5562,10 @@ static int computeMxChoice(WhereInfo *pWInfo){ } } if( nDep<=3 ) continue; - /* If we reach this point, it means that pFactTab is a fact table */ + + /* If we reach this point, it means that pFactTab is a fact table + ** with four or more dimensions connected by inner joins. Proceed + ** to make cost adjustments. */ #ifdef WHERETRACE_ENABLED /* Make sure rStarDelta values are initialized */ @@ -5575,8 +5577,8 @@ static int computeMxChoice(WhereInfo *pWInfo){ #endif pWInfo->bStarUsed = 1; - /* Compute one more than the maximum cost of any WhereLoop for the - ** fact table */ + /* Compute the maximum cost of any WhereLoop for the + ** fact table plus one epsilon */ mxRun = LOGEST_MIN; for(pWLoop=pStart; pWLoop; pWLoop=pWLoop->pNextLoop){ if( pWLoop->iTabpNextLoop){ if( (pWLoop->maskSelf & mSeen)==0 ) continue; if( pWLoop->nLTerm ) continue; From e097db7210321c5c98a810a88e9efc87730dc202 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sun, 26 Jan 2025 23:34:49 +0000 Subject: [PATCH 125/220] Make two private routines in FTS "static" so that they are not callable from outside of SQLite itself. FossilOrigin-Name: 9b11bed0448b95319206b413c35f23bb80f3f4c0a4394d40f2e64066400a01ed --- ext/fts5/fts5_index.c | 4 ++-- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index c98844e73d..c53bad8248 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -778,7 +778,7 @@ static int fts5LeafFirstTermOff(Fts5Data *pLeaf){ /* ** Close the read-only blob handle, if it is open. */ -void fts5IndexCloseReader(Fts5Index *p){ +static void fts5IndexCloseReader(Fts5Index *p){ if( p->pReader ){ int rc; sqlite3_blob *pReader = p->pReader; @@ -6955,7 +6955,7 @@ static void fts5SegIterSetEOF(Fts5SegIter *pSeg){ pSeg->pLeaf = 0; } -void fts5IterClose(Fts5IndexIter *pIndexIter){ +static void fts5IterClose(Fts5IndexIter *pIndexIter){ if( pIndexIter ){ Fts5Iter *pIter = (Fts5Iter*)pIndexIter; Fts5Index *pIndex = pIter->pIndex; diff --git a/manifest b/manifest index 7bdfce7763..27b5bb653a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Further\scomment\simprovements\sin\sthe\sstar-query\sheuristic.\s\sAdd\san\sALWAYS()\non\san\sunreachable\sbranch\sto\sachieve\sMC/DC. -D 2025-01-26T20:09:57.061 +C Make\stwo\sprivate\sroutines\sin\sFTS\s"static"\sso\sthat\sthey\sare\snot\scallable\sfrom\noutside\sof\sSQLite\sitself. +D 2025-01-26T23:34:49.014 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -112,7 +112,7 @@ F ext/fts5/fts5_buffer.c 0eec58bff585f1a44ea9147eae5da2447292080ea435957f7488c70 F ext/fts5/fts5_config.c e7d8dd062b44a66cd77e5a0f74f23a2354cd1f3f8575afb967b2773c3384f7f8 F ext/fts5/fts5_expr.c 69b8d976058512c07dfe86e229521b7a871768157bd1607cedf1a5038dfd72c9 F ext/fts5/fts5_hash.c adda4272be401566a6e0ba1acbe70ee5cb97fce944bc2e04dc707152a0ec91b1 -F ext/fts5/fts5_index.c 1ce1e2b43fdd86a2047619c2ea3aafa5c7b909d0cef75185d0fda31e82f0e9c6 +F ext/fts5/fts5_index.c a59ccd06af157da2471f356198af14bc37d86e46231e4e1858b2af2f94c2c6e4 F ext/fts5/fts5_main.c 9a1daef7247f9b8a50b4159323e340efa6b0e4bea4fcd83580480f94d4f2c888 F ext/fts5/fts5_storage.c 1ad05dab4830a4e2eaf2900bb143477f93bc17437093582f36f4b818809e88d8 F ext/fts5/fts5_tcl.c 7fb5a3d3404099075aaa2457307cb459bbc257c0de3dbd52b1e80a5b503e0329 @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P a7ecb2f4b7eee78b88f1b2e026dffed2007ca4ffeb152632624ab2582839b250 -R 56a3a416133fa0f7166c060fc9c27138 +P 5e18ce68fbc5e73e6694936f3ba71f5b5e3758cf380951805ca6ea6a3f0943aa +R a54b570883d195008f2678c7c81be853 U drh -Z a3e111b0c87ac0b331649395aaa39e29 +Z dcfa08d4408fce3e0f4c19a22b5dac4d # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index fbc82e399e..8dfffe85a9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5e18ce68fbc5e73e6694936f3ba71f5b5e3758cf380951805ca6ea6a3f0943aa +9b11bed0448b95319206b413c35f23bb80f3f4c0a4394d40f2e64066400a01ed From 7c727bb61b0494913992635eb267425c25bcf298 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 27 Jan 2025 14:12:14 +0000 Subject: [PATCH 126/220] Avoid splitting a hyperlink across lines in the documentation comment for sqlite3_serialize(). FossilOrigin-Name: 74b770bd445d98ff883000ab2e31603d729e415e4e4f640646eef30825634f48 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqlite.h.in | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 27b5bb653a..421ef339e6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\stwo\sprivate\sroutines\sin\sFTS\s"static"\sso\sthat\sthey\sare\snot\scallable\sfrom\noutside\sof\sSQLite\sitself. -D 2025-01-26T23:34:49.014 +C Avoid\ssplitting\sa\shyperlink\sacross\slines\sin\sthe\sdocumentation\scomment\sfor\nsqlite3_serialize(). +D 2025-01-27T14:12:14.624 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -781,7 +781,7 @@ F src/resolve.c c8a5372b97b2a2e972a280676f06ddb5b74e885d3b1f5ce383f839907b57ef68 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 F src/select.c 83e88fbb36f89b6703b348777491619554f0fd6f917c9fdf51e4c2e9cda6c04e F src/shell.c.in 9ade75afa953c5c2ded38d076533eaa6c9b2ab1977ef6cce0bc773adac178c50 -F src/sqlite.h.in 135c4479d03d5dcff7f580c1997f351d94954cf37346db560948c7add6159d9a +F src/sqlite.h.in f1362730549010733d30fff4de369f0e48b0857f71e874cca91ffcfecf587eba F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54 F src/sqliteInt.h 5c859fc5b1b9fa489bc7a39d37606472b70f808f965eab11c24f14d8d7654330 @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 5e18ce68fbc5e73e6694936f3ba71f5b5e3758cf380951805ca6ea6a3f0943aa -R a54b570883d195008f2678c7c81be853 +P 9b11bed0448b95319206b413c35f23bb80f3f4c0a4394d40f2e64066400a01ed +R e2b813a3abd3bf21562fc924e1b6e152 U drh -Z dcfa08d4408fce3e0f4c19a22b5dac4d +Z 538ef5af19384f8d48d29325a60a77c0 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 8dfffe85a9..804b833798 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9b11bed0448b95319206b413c35f23bb80f3f4c0a4394d40f2e64066400a01ed +74b770bd445d98ff883000ab2e31603d729e415e4e4f640646eef30825634f48 diff --git a/src/sqlite.h.in b/src/sqlite.h.in index b6863b30fa..a9a08d4ffd 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -10749,8 +10749,8 @@ SQLITE_EXPERIMENTAL int sqlite3_snapshot_recover(sqlite3 *db, const char *zDb); ** CAPI3REF: Serialize a database ** ** The sqlite3_serialize(D,S,P,F) interface returns a pointer to -** memory that is a serialization of the S database on [database -** connection] D. If S is a NULL pointer, the main database is used. +** memory that is a serialization of the S database on +** [database connection] D. If S is a NULL pointer, the main database is used. ** If P is not a NULL pointer, then the size of the database in bytes ** is written into *P. ** From 5dcf5890ae72c446217f679b8f805a7d3cf34f72 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 27 Jan 2025 17:48:51 +0000 Subject: [PATCH 127/220] Enhance ./configure to issue an unambiguious error if the pathname to either the source tree or the build directory contains any space characters. FossilOrigin-Name: 614ae5c74f3b534f50432c875681d7a1e6135be883508939c9c57822cc1e9361 --- auto.def | 10 ++++++++++ manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/auto.def b/auto.def index 7fdf61f16c..dade81613f 100644 --- a/auto.def +++ b/auto.def @@ -14,6 +14,16 @@ # use sqlite-config +if {[string first " " $autosetup(srcdir)] != -1} { + user-error "The pathname of the source tree\ + may not contain space characters" +} +if {[string first " " $autosetup(builddir)] != -1} { + user-error "The pathname of the build directory\ + may not contain space characters" +} + + ######################################################################## # Regarding flag compatibility with the historical autotool configure # script: diff --git a/manifest b/manifest index 421ef339e6..9658ed78bb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\ssplitting\sa\shyperlink\sacross\slines\sin\sthe\sdocumentation\scomment\sfor\nsqlite3_serialize(). -D 2025-01-27T14:12:14.624 +C Enhance\s./configure\sto\sissue\san\sunambiguious\serror\sif\sthe\spathname\sto\seither\nthe\ssource\stree\sor\sthe\sbuild\sdirectory\scontains\sany\sspace\scharacters. +D 2025-01-27T17:48:51.296 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -14,7 +14,7 @@ F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90 F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2 F art/sqlite370.svg 40b7e2fe8aac3add5d56dd86ab8d427a4eca5bcb3fe4f8946cb3794e1821d531 -F auto.def 7833c0a8630dd3a3410dcc6c8b4d1b63f25d03d6497267624b8a37aba119cb3e +F auto.def caf7cca9c235fc6a3d7639e00eb75972d9bf8527717498b9fa1d7112d50b5720 F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac F autoconf/Makefile.in 56697ad25ecf23afa317148b06bdc14f85960b42e5ec434ac1ba87f63a3cb789 F autoconf/Makefile.msc ffff61fe851443015ddb6600ab69a9df503cfec25459b336be7ba8c9a9e473f8 @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 9b11bed0448b95319206b413c35f23bb80f3f4c0a4394d40f2e64066400a01ed -R e2b813a3abd3bf21562fc924e1b6e152 +P 74b770bd445d98ff883000ab2e31603d729e415e4e4f640646eef30825634f48 +R 0d48e3ec7a39c2ed6a320258adde1027 U drh -Z 538ef5af19384f8d48d29325a60a77c0 +Z 7ae24fa2aff28dbc435f2d2a94f34ec6 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 804b833798..8f386fb7b5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -74b770bd445d98ff883000ab2e31603d729e415e4e4f640646eef30825634f48 +614ae5c74f3b534f50432c875681d7a1e6135be883508939c9c57822cc1e9361 From 44980e816985953ed7125b657751a1d09560df02 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 27 Jan 2025 21:18:13 +0000 Subject: [PATCH 128/220] Use hashing to accelerate column matching on INSERT statements. Code is smaller and about 1.8% faster overall according to test/speedtest.tcl. FossilOrigin-Name: 8be956383e0344fb613ec2e56fce7b518f439ae34bf9ddb424de2bd9b31c9889 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/insert.c | 5 ++++- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 9658ed78bb..73dc628f2b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\s./configure\sto\sissue\san\sunambiguious\serror\sif\sthe\spathname\sto\seither\nthe\ssource\stree\sor\sthe\sbuild\sdirectory\scontains\sany\sspace\scharacters. -D 2025-01-27T17:48:51.296 +C Use\shashing\sto\saccelerate\scolumn\smatching\son\sINSERT\sstatements.\s\sCode\sis\nsmaller\sand\sabout\s1.8%\sfaster\soverall\saccording\sto\stest/speedtest.tcl. +D 2025-01-27T21:18:13.459 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -738,7 +738,7 @@ F src/hash.c 9ee4269fb1d6632a6fecfb9479c93a1f29271bddbbaf215dd60420bcb80c7220 F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51 F src/hwtime.h f9c2dfb84dce7acf95ce6d289e46f5f9d3d1afd328e53da8f8e9008e3b3caae6 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c f8d1a0f8ee258411009c6b7f2d93170e351bd19f5ad89d57e1180644297cbe70 +F src/insert.c ed2eeba6f0584b91dfe1fc0b68257162ffc003bec429f7f86515fc45a12a9f0e F src/json.c 68a98c020c22127f2d65f08855f7fc7460ff352a6ce0b543d8931dde83319c22 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 7432c944ff197046d67a1207790a1b13eec4548c85a9457eb0896bb3641dfb36 @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 74b770bd445d98ff883000ab2e31603d729e415e4e4f640646eef30825634f48 -R 0d48e3ec7a39c2ed6a320258adde1027 +P 614ae5c74f3b534f50432c875681d7a1e6135be883508939c9c57822cc1e9361 +R 03aea741a0703ca96f0d93fb17714919 U drh -Z 7ae24fa2aff28dbc435f2d2a94f34ec6 +Z 0ad560704a9a8a0c8ed384deaa40c4eb # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 8f386fb7b5..8b991c86cb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -614ae5c74f3b534f50432c875681d7a1e6135be883508939c9c57822cc1e9361 +8be956383e0344fb613ec2e56fce7b518f439ae34bf9ddb424de2bd9b31c9889 diff --git a/src/insert.c b/src/insert.c index d380281bed..a93a465570 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1077,8 +1077,11 @@ void sqlite3Insert( pColumn->a[i].u4.idx = -1; } for(i=0; inId; i++){ + const char *zCName = pColumn->a[i].zName; + u8 hName = sqlite3StrIHash(zCName); for(j=0; jnCol; j++){ - if( sqlite3StrICmp(pColumn->a[i].zName, pTab->aCol[j].zCnName)==0 ){ + if( pTab->aCol[j].hName!=hName ) continue; + if( sqlite3StrICmp(zCName, pTab->aCol[j].zCnName)==0 ){ pColumn->a[i].u4.idx = j; if( i!=j ) bIdListInOrder = 0; if( j==pTab->iPKey ){ From d8c37bbc54d1c4d74a0038addcbc28df7a178074 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 28 Jan 2025 00:48:01 +0000 Subject: [PATCH 129/220] Remove an ALWAYS() in the star-query heuristic that is sometimes false if you have a corrupt database. dbsqlfuzz c37ba7728d79859b79c8341b59297e88fba017d3. Test case in TH3. FossilOrigin-Name: 6b9a339628eb8bfb6dfbee02000a6ac91cc8a9ae16bd990e62c4142b9f912c36 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/where.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 73dc628f2b..1d8c3e1f3e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\shashing\sto\saccelerate\scolumn\smatching\son\sINSERT\sstatements.\s\sCode\sis\nsmaller\sand\sabout\s1.8%\sfaster\soverall\saccording\sto\stest/speedtest.tcl. -D 2025-01-27T21:18:13.459 +C Remove\san\sALWAYS()\sin\sthe\sstar-query\sheuristic\sthat\sis\ssometimes\sfalse\sif\syou\nhave\sa\scorrupt\sdatabase.\s\sdbsqlfuzz\sc37ba7728d79859b79c8341b59297e88fba017d3.\nTest\scase\sin\sTH3. +D 2025-01-28T00:48:01.787 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -863,7 +863,7 @@ F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 4e6181d8780ab0af2e1388d0754cbe6f2f04593d2b1ab6c41699a89942fd8997 F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 -F src/where.c 72cd936dcaa391fdce021840fbd1d9cbe51e34f821e0a09a05a2cc99ab506e92 +F src/where.c 09dc313e7223ca1217c39c7026b00f16ff449a8323511a762fcba7863a00f4cd F src/whereInt.h d20cddddb1d61b18d5cb1fcfa9b77fbeebbc4afe44d996e603452a23b3009ee1 F src/wherecode.c 0c3d3199a2b769a5e2bb70feb5003dc85b3d86842ecaf903a47f2b4205ca5dab F src/whereexpr.c 0f93a29cabd3a338d09a1f5c6770620a1ac51ec1157f3229502a7e7767c60b6f @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 614ae5c74f3b534f50432c875681d7a1e6135be883508939c9c57822cc1e9361 -R 03aea741a0703ca96f0d93fb17714919 +P 8be956383e0344fb613ec2e56fce7b518f439ae34bf9ddb424de2bd9b31c9889 +R 77d3f24a906693f579bd3b508d5195e5 U drh -Z 0ad560704a9a8a0c8ed384deaa40c4eb +Z 249159a5b98132893f1e97c49e03bb71 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 8b991c86cb..a380877b99 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8be956383e0344fb613ec2e56fce7b518f439ae34bf9ddb424de2bd9b31c9889 +6b9a339628eb8bfb6dfbee02000a6ac91cc8a9ae16bd990e62c4142b9f912c36 diff --git a/src/where.c b/src/where.c index 8f467e9787..5cb52b8adb 100644 --- a/src/where.c +++ b/src/where.c @@ -5538,7 +5538,7 @@ static int computeMxChoice(WhereInfo *pWInfo){ ** restrict the search for dimension-tables to be tables to the right ** of the fact-table. */ if( iFromIdx+4 > nLoop ) break; /* Impossible to reach nDep>=4 */ - while( ALWAYS(pStart) && pStart->iTab<=iFromIdx ){ + while( pStart && pStart->iTab<=iFromIdx ){ pStart = pStart->pNextLoop; } } From 50637ca5c5420f807b9a49a0645f5d0c31aa3523 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 28 Jan 2025 01:10:45 +0000 Subject: [PATCH 130/220] Apparently I got the logic of [abfe488ed67e2e35] confused, even backwards. Change it so that the SQLITE_USE_W32_FOR_CONSOLE_IO macro causes Win32 APIs to be used for console I/O and for stdio to be used otherwise. This is reported to be necessary for builds that use a C-language runtime other than the one provided by Microsoft. This changes if for Windows only. It is a bug fix, though we don't have a test case that will demonstrate a malfunction. FossilOrigin-Name: 925e97e6f4238f02259a0c95b1fc668ae32a95329242f8eeae236ef207aca112 --- ext/misc/sqlite3_stdio.c | 14 ++++++++++---- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/ext/misc/sqlite3_stdio.c b/ext/misc/sqlite3_stdio.c index be3acc665e..c9bceb1942 100644 --- a/ext/misc/sqlite3_stdio.c +++ b/ext/misc/sqlite3_stdio.c @@ -46,6 +46,11 @@ ** use O_U8TEXT when writing to the Windows console (or anything ** else for which _isatty() returns true) and to use O_BINARY or O_TEXT ** for all other output channels. +** +** The SQLITE_USE_W32_FOR_CONSOLE_IO macro is also available. If +** defined, it forces the use of Win32 APIs for all console I/O, both +** input and output. This is necessary for some non-Microsoft run-times +** that implement stdio differently from Microsoft/Visual-Studio. */ #if defined(SQLITE_U8TEXT_ONLY) # define UseWtextForOutput(fd) 1 @@ -148,7 +153,7 @@ char *sqlite3_fgets(char *buf, int sz, FILE *in){ */ wchar_t *b1 = sqlite3_malloc( sz*sizeof(wchar_t) ); if( b1==0 ) return 0; -#ifndef SQLITE_USE_STDIO_FOR_CONSOLE +#ifdef SQLITE_USE_W32_FOR_CONSOLE_IO DWORD nRead = 0; if( IsConsole(in) && ReadConsoleW(GetStdHandle(STD_INPUT_HANDLE), b1, sz-1, &nRead, 0) @@ -226,7 +231,7 @@ int sqlite3_fputs(const char *z, FILE *out){ sz = MultiByteToWideChar(CP_UTF8, 0, z, sz, b1, sz); b1[sz] = 0; -#ifndef SQLITE_STDIO_FOR_CONSOLE +#ifdef SQLITE_USE_W32_FOR_CONSOLE_IO DWORD nWr = 0; if( IsConsole(out) && WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE),b1,sz,&nWr,0) @@ -236,8 +241,9 @@ int sqlite3_fputs(const char *z, FILE *out){ }else #endif { - /* For non-console I/O, or if SQLITE_USE_STDIO_FOR_CONSOLE is defined - ** then write using the standard library. */ + /* As long as SQLITE_USE_W32_FOR_CONSOLE_IO is not defined, or for + ** non-console I/O even if that macro is defined, write using the + ** standard library. */ _setmode(_fileno(out), _O_U8TEXT); if( UseBinaryWText(out) ){ piecemealOutput(b1, sz, out); diff --git a/manifest b/manifest index 1d8c3e1f3e..359b597c81 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\san\sALWAYS()\sin\sthe\sstar-query\sheuristic\sthat\sis\ssometimes\sfalse\sif\syou\nhave\sa\scorrupt\sdatabase.\s\sdbsqlfuzz\sc37ba7728d79859b79c8341b59297e88fba017d3.\nTest\scase\sin\sTH3. -D 2025-01-28T00:48:01.787 +C Apparently\sI\sgot\sthe\slogic\sof\s[abfe488ed67e2e35]\sconfused,\seven\sbackwards.\nChange\sit\sso\sthat\sthe\sSQLITE_USE_W32_FOR_CONSOLE_IO\smacro\scauses\sWin32\sAPIs\nto\sbe\sused\sfor\sconsole\sI/O\sand\sfor\sstdio\sto\sbe\sused\sotherwise.\s\sThis\sis\nreported\sto\sbe\snecessary\sfor\sbuilds\sthat\suse\sa\sC-language\sruntime\sother\sthan\nthe\sone\sprovided\sby\sMicrosoft.\s\sThis\schanges\sif\sfor\sWindows\sonly.\s\sIt\sis\sa\nbug\sfix,\sthough\swe\sdon't\shave\sa\stest\scase\sthat\swill\sdemonstrate\sa\smalfunction. +D 2025-01-28T01:10:45.744 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -442,7 +442,7 @@ F ext/misc/shathree.c f3a778f27bf3e71b666a77f28e463a3b931c4dbe4219447e61bb678b4b F ext/misc/showauth.c 732578f0fe4ce42d577e1c86dc89dd14a006ab52 F ext/misc/spellfix.c bcc42ef3fd29429bc01a83e751332b8d4690e65d45008449bdffe7656371487f F ext/misc/sqlar.c a6175790482328171da47095f87608b48a476d4fac78d8a9ff18b03a2454f634 -F ext/misc/sqlite3_stdio.c 18160504b9348d0ebb9f5620fd61e64cd2d55fffde05ab3f7db03396add4840a +F ext/misc/sqlite3_stdio.c 0fe5a45bd332b30aef2b68c64edbe69e31e9c42365b0fa79ce95a034bca6fbb0 F ext/misc/sqlite3_stdio.h f05eaf5e0258f0573910324a789a9586fc360a57678c57a6d63cfaa2245b6176 F ext/misc/stmt.c b090086cd6bd6281c21271d38d576eeffe662f0e6b67536352ce32bbaa438321 F ext/misc/stmtrand.c 59cffa5d8e158943ff1ce078956d8e208e8c04e67307e8f249dece2436dcb7fc @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 8be956383e0344fb613ec2e56fce7b518f439ae34bf9ddb424de2bd9b31c9889 -R 77d3f24a906693f579bd3b508d5195e5 +P 6b9a339628eb8bfb6dfbee02000a6ac91cc8a9ae16bd990e62c4142b9f912c36 +R 85cb8890cc290d809a1a9ad2ffbbbd4c U drh -Z 249159a5b98132893f1e97c49e03bb71 +Z 5b8003927aa3346b085a7fb5e605a55b # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index a380877b99..2cf98d2e84 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6b9a339628eb8bfb6dfbee02000a6ac91cc8a9ae16bd990e62c4142b9f912c36 +925e97e6f4238f02259a0c95b1fc668ae32a95329242f8eeae236ef207aca112 From b0c8b08874b90bf3eaf05e3b87d0ad1cb05d46ee Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 28 Jan 2025 10:56:22 +0000 Subject: [PATCH 131/220] Fix typo in speedtest.md. FossilOrigin-Name: 984a9cc22c7c8492bf4fae482749663899b0e33a25c32e6ae5c5e98fc12bb83e --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/speedtest.md | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 359b597c81..88850f9ca3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Apparently\sI\sgot\sthe\slogic\sof\s[abfe488ed67e2e35]\sconfused,\seven\sbackwards.\nChange\sit\sso\sthat\sthe\sSQLITE_USE_W32_FOR_CONSOLE_IO\smacro\scauses\sWin32\sAPIs\nto\sbe\sused\sfor\sconsole\sI/O\sand\sfor\sstdio\sto\sbe\sused\sotherwise.\s\sThis\sis\nreported\sto\sbe\snecessary\sfor\sbuilds\sthat\suse\sa\sC-language\sruntime\sother\sthan\nthe\sone\sprovided\sby\sMicrosoft.\s\sThis\schanges\sif\sfor\sWindows\sonly.\s\sIt\sis\sa\nbug\sfix,\sthough\swe\sdon't\shave\sa\stest\scase\sthat\swill\sdemonstrate\sa\smalfunction. -D 2025-01-28T01:10:45.744 +C Fix\stypo\sin\sspeedtest.md. +D 2025-01-28T10:56:22.927 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -1678,7 +1678,7 @@ F test/speed3.test 694affeb9100526007436334cf7d08f3d74b85ef F test/speed4.test abc0ad3399dcf9703abed2fff8705e4f8e416715 F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa F test/speed4p.test 377a0c48e5a92e0b11c1c5ebb1bc9d83a7312c922bc0cb05970ef5d6a96d1f0c -F test/speedtest.md e4f467683acfdb2834ca1d6ce209c3d883dfecf73c41f77234b2368be9579de2 +F test/speedtest.md ee958457ae1b729d9715ae33c0320600000bf1d9ddea1a88dcf79f56729d6fad F test/speedtest.tcl 8a9362c1e429318e741b91d26888e7edcc326f98c3aea505ffd618cc5b9e7f0a x F test/speedtest1.c 323ce0956430a5aae56ea20f502da7bea3fb62b8ed02e9b0f12ab078b2b258f5 F test/spellfix.test 951a6405d49d1a23d6b78027d3877b4a33eeb8221dcab5704b499755bb4f552e @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 6b9a339628eb8bfb6dfbee02000a6ac91cc8a9ae16bd990e62c4142b9f912c36 -R 85cb8890cc290d809a1a9ad2ffbbbd4c +P 925e97e6f4238f02259a0c95b1fc668ae32a95329242f8eeae236ef207aca112 +R 40cdca5fbba192c17cd4fe2aa49c2ea4 U drh -Z 5b8003927aa3346b085a7fb5e605a55b +Z 200936ddd5ad4693d292c3f04fcfac09 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 2cf98d2e84..fffadee9e0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -925e97e6f4238f02259a0c95b1fc668ae32a95329242f8eeae236ef207aca112 +984a9cc22c7c8492bf4fae482749663899b0e33a25c32e6ae5c5e98fc12bb83e diff --git a/test/speedtest.md b/test/speedtest.md index 645742d756..135e562aed 100644 --- a/test/speedtest.md +++ b/test/speedtest.md @@ -9,7 +9,7 @@ You will need: * tclsh * A script or program named "open" that brings up *.txt files in an editor for viewing. (Macs provide this by default. You'll need to - come up with your own on Linxu and Windows.) + come up with your own on Linux and Windows.) * An SQLite source tree The procedure described in this document is not the only way to make From 8b62a82ae36f7d39c2a301389219e456759f9919 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 28 Jan 2025 12:50:17 +0000 Subject: [PATCH 132/220] Simplifh the IdList object to remove unnecessary fields. Performance increases by about 0.8%. FossilOrigin-Name: a4625bb995dd5582d1f3cf0c2e54eb3f01f1cc1405811dda86ebd38b2b858994 --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/build.c | 1 - src/expr.c | 3 --- src/insert.c | 23 ++++++++++++----------- src/sqliteInt.h | 5 ----- src/treeview.c | 16 +--------------- 7 files changed, 24 insertions(+), 46 deletions(-) diff --git a/manifest b/manifest index 88850f9ca3..ca6a8b11d7 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\stypo\sin\sspeedtest.md. -D 2025-01-28T10:56:22.927 +C Simplifh\sthe\sIdList\sobject\sto\sremove\sunnecessary\sfields.\s\sPerformance\nincreases\sby\sabout\s0.8%. +D 2025-01-28T12:50:17.902 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -721,7 +721,7 @@ F src/btmutex.c 79a43670447eacc651519a429f6ece9fd638563cf95b469d6891185ddae2b522 F src/btree.c 63ca6b647342e8cef643863cd0962a542f133e1069460725ba4461dcda92b03c F src/btree.h 18e5e7b2124c23426a283523e5f31a4bff029131b795bb82391f9d2f3136fc50 F src/btreeInt.h 98aadb6dcb77b012cab2574d6a728fad56b337fc946839b9898c4b4c969e30b6 -F src/build.c c6b09342d870a509529244ed8e19b4175a261f2e3163c199241d69e1d8a57607 +F src/build.c 357f98cdd9fe93f86e93ad3324fd224492480e48506c0c7db8ae3a94f3b5c5ee F src/callback.c acae8c8dddda41ee85cfdf19b926eefe830f371069f8aadca3aa39adf5b1c859 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c d35723024b963edce9c0fad5b3303e8bb9266083784844baed10a6dedfe26f3b @@ -729,7 +729,7 @@ F src/date.c 842c08ac143a56a627b05ac51d68624f2b7b03e3b4cba596205e735eed64ee57 F src/dbpage.c e90410e5d4c0217dfddc4184a81e38ec4903c25d4ec0f201060a0e54e7c2099f F src/dbstat.c 73362c0df0f40ad5523a6f5501224959d0976757b511299bf892313e79d14f5c F src/delete.c 03a77ba20e54f0f42ebd8eddf15411ed6bdb06a2c472ac4b6b336521bf7cea42 -F src/expr.c 30a407765d4e4b592f9f958085fb4e8336e54fa46a70ade7f5a67111bc191563 +F src/expr.c ce83e7361454a195f8393fa0baad694e2fee6c49a44c0d6db44d8a2b92534aeb F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 928ed2517e8732113d2b9821aa37af639688d752f4ea9ac6e0e393d713eeb76f F src/func.c 30051410d0379059e1e3642ffc0caae6963a2b01b3b6d9dd44c5e09b1a66d066 @@ -738,7 +738,7 @@ F src/hash.c 9ee4269fb1d6632a6fecfb9479c93a1f29271bddbbaf215dd60420bcb80c7220 F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51 F src/hwtime.h f9c2dfb84dce7acf95ce6d289e46f5f9d3d1afd328e53da8f8e9008e3b3caae6 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c ed2eeba6f0584b91dfe1fc0b68257162ffc003bec429f7f86515fc45a12a9f0e +F src/insert.c db8bfff30fd7f71812651df3ddf5d1624b9e19104b31e349cd9055bbc9d622c4 F src/json.c 68a98c020c22127f2d65f08855f7fc7460ff352a6ce0b543d8931dde83319c22 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 7432c944ff197046d67a1207790a1b13eec4548c85a9457eb0896bb3641dfb36 @@ -784,7 +784,7 @@ F src/shell.c.in 9ade75afa953c5c2ded38d076533eaa6c9b2ab1977ef6cce0bc773adac178c5 F src/sqlite.h.in f1362730549010733d30fff4de369f0e48b0857f71e874cca91ffcfecf587eba F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54 -F src/sqliteInt.h 5c859fc5b1b9fa489bc7a39d37606472b70f808f965eab11c24f14d8d7654330 +F src/sqliteInt.h 6f23e483be7810ea1854c8fbfbbbfae2a702529d1feb9a210a290abb4455414c F src/sqliteLimit.h 1bbdbf72bd0411d003267ffebc59a262f061df5653027a75627d03f48ca30523 F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -841,7 +841,7 @@ F src/test_window.c 6d80e11fba89a1796525e6f0048ff0c7789aa2c6b0b11c80827dc1437bd8 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c fe17e03175cae35b6694d0f879e7bc3d1ddea2fd4ab148cba9bbd025b7a7bb12 -F src/treeview.c d1f3003cb21846828f314a304cf9117f5e80ce0be259315a681d25147004d26d +F src/treeview.c d85ce76e6d1498d781957c07cb234da6d77ce0ed2d196480d516f54dabc62279 F src/trigger.c 247e2d712d5edc6021d52a169f6ac9a9c10d7144bc4ac7ea06c1ed2aa414659f F src/update.c 0e01aa6a3edf9ec112b33eb714b9016a81241497b1fb7c3e74332f4f71756508 F src/upsert.c 215328c3f91623c520ec8672c44323553f12caeb4f01b1090ebdca99fdf7b4f1 @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 925e97e6f4238f02259a0c95b1fc668ae32a95329242f8eeae236ef207aca112 -R 40cdca5fbba192c17cd4fe2aa49c2ea4 +P 984a9cc22c7c8492bf4fae482749663899b0e33a25c32e6ae5c5e98fc12bb83e +R 3ffeb05f71791678583efe8c7fde2e8f U drh -Z 200936ddd5ad4693d292c3f04fcfac09 +Z 039fb781952da1d6729d929a997aaf6e # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index fffadee9e0..0e2fd340b0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -984a9cc22c7c8492bf4fae482749663899b0e33a25c32e6ae5c5e98fc12bb83e +a4625bb995dd5582d1f3cf0c2e54eb3f01f1cc1405811dda86ebd38b2b858994 diff --git a/src/build.c b/src/build.c index a5deb54fc6..cc29610e0a 100644 --- a/src/build.c +++ b/src/build.c @@ -4691,7 +4691,6 @@ void sqlite3IdListDelete(sqlite3 *db, IdList *pList){ int i; assert( db!=0 ); if( pList==0 ) return; - assert( pList->eU4!=EU4_EXPR ); /* EU4_EXPR mode is not currently used */ for(i=0; inId; i++){ sqlite3DbFree(db, pList->a[i].zName); } diff --git a/src/expr.c b/src/expr.c index ca5b9092e7..fcd3da2138 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1932,16 +1932,13 @@ IdList *sqlite3IdListDup(sqlite3 *db, const IdList *p){ int i; assert( db!=0 ); if( p==0 ) return 0; - assert( p->eU4!=EU4_EXPR ); pNew = sqlite3DbMallocRawNN(db, sizeof(*pNew)+(p->nId-1)*sizeof(p->a[0]) ); if( pNew==0 ) return 0; pNew->nId = p->nId; - pNew->eU4 = p->eU4; for(i=0; inId; i++){ struct IdList_item *pNewItem = &pNew->a[i]; const struct IdList_item *pOldItem = &p->a[i]; pNewItem->zName = sqlite3DbStrDup(db, pOldItem->zName); - pNewItem->u4 = pOldItem->u4; } return pNew; } diff --git a/src/insert.c b/src/insert.c index a93a465570..83baeece64 100644 --- a/src/insert.c +++ b/src/insert.c @@ -927,6 +927,7 @@ void sqlite3Insert( int regRowid; /* registers holding insert rowid */ int regData; /* register holding first column to insert */ int *aRegIdx = 0; /* One register allocated to each index */ + int *aTabColMap = 0; /* Mapping from pTab columns to pCol entries */ #ifndef SQLITE_OMIT_TRIGGER int isView; /* True if attempting to insert into a view */ @@ -1071,18 +1072,15 @@ void sqlite3Insert( */ bIdListInOrder = (pTab->tabFlags & (TF_OOOHidden|TF_HasStored))==0; if( pColumn ){ - assert( pColumn->eU4!=EU4_EXPR ); - pColumn->eU4 = EU4_IDX; - for(i=0; inId; i++){ - pColumn->a[i].u4.idx = -1; - } + aTabColMap = sqlite3DbMallocZero(db, pTab->nCol*sizeof(int)); + if( aTabColMap==0 ) goto insert_cleanup; for(i=0; inId; i++){ const char *zCName = pColumn->a[i].zName; u8 hName = sqlite3StrIHash(zCName); for(j=0; jnCol; j++){ if( pTab->aCol[j].hName!=hName ) continue; if( sqlite3StrICmp(zCName, pTab->aCol[j].zCnName)==0 ){ - pColumn->a[i].u4.idx = j; + if( aTabColMap[j]==0 ) aTabColMap[j] = i+1; if( i!=j ) bIdListInOrder = 0; if( j==pTab->iPKey ){ ipkColumn = i; assert( !withoutRowid ); @@ -1404,9 +1402,9 @@ void sqlite3Insert( } } if( pColumn ){ - assert( pColumn->eU4==EU4_IDX ); - for(j=0; jnId && pColumn->a[j].u4.idx!=i; j++){} - if( j>=pColumn->nId ){ + j = aTabColMap[i]; + assert( j>=0 && j<=pColumn->nId ); + if( j==0 ){ /* A column not named in the insert column list gets its ** default value */ sqlite3ExprCodeFactorable(pParse, @@ -1414,7 +1412,7 @@ void sqlite3Insert( iRegStore); continue; } - k = j; + k = j - 1; }else if( nColumn==0 ){ /* This is INSERT INTO ... DEFAULT VALUES. Load the default value. */ sqlite3ExprCodeFactorable(pParse, @@ -1659,7 +1657,10 @@ insert_cleanup: sqlite3ExprListDelete(db, pList); sqlite3UpsertDelete(db, pUpsert); sqlite3SelectDelete(db, pSelect); - sqlite3IdListDelete(db, pColumn); + if( pColumn ){ + sqlite3IdListDelete(db, pColumn); + sqlite3DbFree(db, aTabColMap); + } if( aRegIdx ) sqlite3DbNNFreeNN(db, aRegIdx); } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 205f8f3e0e..6025d3f142 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3223,13 +3223,8 @@ struct ExprList { */ struct IdList { int nId; /* Number of identifiers on the list */ - u8 eU4; /* Which element of a.u4 is valid */ struct IdList_item { char *zName; /* Name of the identifier */ - union { - int idx; /* Index in some Table.aCol[] of a column named zName */ - Expr *pExpr; /* Expr to implement a USING variable -- NOT USED */ - } u4; } a[1]; }; diff --git a/src/treeview.c b/src/treeview.c index 2cfcfb69b0..8329659249 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -978,21 +978,7 @@ void sqlite3TreeViewBareIdList( if( zName==0 ) zName = "(null)"; sqlite3TreeViewPush(&pView, moreToFollow); sqlite3TreeViewLine(pView, 0); - if( pList->eU4==EU4_NONE ){ - fprintf(stdout, "%s\n", zName); - }else if( pList->eU4==EU4_IDX ){ - fprintf(stdout, "%s (%d)\n", zName, pList->a[i].u4.idx); - }else{ - assert( pList->eU4==EU4_EXPR ); - if( pList->a[i].u4.pExpr==0 ){ - fprintf(stdout, "%s (pExpr=NULL)\n", zName); - }else{ - fprintf(stdout, "%s\n", zName); - sqlite3TreeViewPush(&pView, inId-1); - sqlite3TreeViewExpr(pView, pList->a[i].u4.pExpr, 0); - sqlite3TreeViewPop(&pView); - } - } + fprintf(stdout, "%s\n", zName); sqlite3TreeViewPop(&pView); } } From 0424f255efb2aaa89e29a265683fd260da2b94c7 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 28 Jan 2025 18:03:22 +0000 Subject: [PATCH 133/220] Fix a copy/paste typo in the output of vfstrace for xDlClose(). FossilOrigin-Name: 1d57b57c85bb8cb9b8a1808b771bb91eeb8150efd14f9064a390e533e715bab7 --- ext/misc/vfstrace.c | 2 +- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/ext/misc/vfstrace.c b/ext/misc/vfstrace.c index fed87e88f3..c274558d17 100644 --- a/ext/misc/vfstrace.c +++ b/ext/misc/vfstrace.c @@ -1033,7 +1033,7 @@ static void vfstraceDlClose(sqlite3_vfs *pVfs, void *pHandle){ vfstrace_info *pInfo = (vfstrace_info*)pVfs->pAppData; sqlite3_vfs *pRoot = pInfo->pRootVfs; vfstraceOnOff(pInfo, VTR_DLCLOSE); - vfstrace_printf(pInfo, "%s.xDlOpen()\n", pInfo->zVfsName); + vfstrace_printf(pInfo, "%s.xDlClose()\n", pInfo->zVfsName); pRoot->xDlClose(pRoot, pHandle); } diff --git a/manifest b/manifest index ca6a8b11d7..c9dacfd70d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Simplifh\sthe\sIdList\sobject\sto\sremove\sunnecessary\sfields.\s\sPerformance\nincreases\sby\sabout\s0.8%. -D 2025-01-28T12:50:17.902 +C Fix\sa\scopy/paste\stypo\sin\sthe\soutput\sof\svfstrace\sfor\sxDlClose(). +D 2025-01-28T18:03:22.182 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -454,7 +454,7 @@ F ext/misc/urifuncs.c f71360d14fa9e7626b563f1f781c6148109462741c5235ac63ae0f8917 F ext/misc/uuid.c 5bb2264c1b64d163efa46509544fd7500cb8769cb7c16dd52052da8d961505cf F ext/misc/vfslog.c 3932ab932eeb2601dbc4447cb14d445aaa9fbe43b863ef5f014401c3420afd20 F ext/misc/vfsstat.c a85df08654743922a19410d7b1e3111de41bb7cd07d20dd16eda4e2b808d269d -F ext/misc/vfstrace.c 9c4abd2f67ae2760e7a241eca2e8517c64480ac2c3e66a499326e688a9bbee22 +F ext/misc/vfstrace.c a73386403c350b210dc788a2d23a0f5cc89c49b176109a66af11b5078c116331 F ext/misc/vtablog.c 1100250ce8782db37c833e3a9a5c9a3ecf1af5e15b8325572b82e6e0a138ffb5 F ext/misc/vtshim.c 1976e6dd68dd0d64508c91a6dfab8e75f8aaf6cd F ext/misc/wholenumber.c 0fa0c082676b7868bf2fa918e911133f2b349bcdceabd1198bba5f65b4fc0668 @@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 984a9cc22c7c8492bf4fae482749663899b0e33a25c32e6ae5c5e98fc12bb83e -R 3ffeb05f71791678583efe8c7fde2e8f +P a4625bb995dd5582d1f3cf0c2e54eb3f01f1cc1405811dda86ebd38b2b858994 +R ebabd9c2e4304b7712ae90388c7cdfcd U drh -Z 039fb781952da1d6729d929a997aaf6e +Z 15e8c8f9f0fdde9a0f1575293da7227a # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 0e2fd340b0..3e6b81e608 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a4625bb995dd5582d1f3cf0c2e54eb3f01f1cc1405811dda86ebd38b2b858994 +1d57b57c85bb8cb9b8a1808b771bb91eeb8150efd14f9064a390e533e715bab7 From 9dcf3d08c9edc0c30e07a6a06f9d0dd73bfad529 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 28 Jan 2025 19:03:37 +0000 Subject: [PATCH 134/220] Fix sessions module handling of tables with generated columns. FossilOrigin-Name: 437fb316389bc3c24c5cdb4d01edfc81e2c2e9f2b399fc2a95b05d279361d8ec --- ext/session/session_common.tcl | 8 +- ext/session/session_gen.test | 190 +++++++++++++++++++++++++++++++++ ext/session/sqlite3session.c | 130 +++++++++++++--------- manifest | 19 ++-- manifest.uuid | 2 +- src/vdbeapi.c | 31 +++--- 6 files changed, 308 insertions(+), 72 deletions(-) create mode 100644 ext/session/session_gen.test diff --git a/ext/session/session_common.tcl b/ext/session/session_common.tcl index 3ff84f1c5e..7c1273bb1a 100644 --- a/ext/session/session_common.tcl +++ b/ext/session/session_common.tcl @@ -201,12 +201,16 @@ proc compare_db {db1 db2} { foreach tbl $lot1 { set col1 [list] set col2 [list] + set quoted [list] $db1 eval "PRAGMA table_info = $tbl" { lappend col1 $name } - $db2 eval "PRAGMA table_info = $tbl" { lappend col2 $name } + $db2 eval "PRAGMA table_info = $tbl" { + lappend col2 $name + lappend quoted "\"[string map {\" \"\"} $name]\"" + } if {$col1 != $col2} { error "table $tbl schema mismatch" } - set sql "SELECT * FROM $tbl ORDER BY [join $col1 ,]" + set sql "SELECT * FROM $tbl ORDER BY [join $quoted ,]" set data1 [$db1 eval $sql] set data2 [$db2 eval $sql] if {$data1 != $data2} { diff --git a/ext/session/session_gen.test b/ext/session/session_gen.test new file mode 100644 index 0000000000..8d3c5887f3 --- /dev/null +++ b/ext/session/session_gen.test @@ -0,0 +1,190 @@ +# 2025 Jan 28 +# +# 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. +# + +if {![info exists testdir]} { + set testdir [file join [file dirname [info script]] .. .. test] +} +source [file join [file dirname [info script]] session_common.tcl] +source $testdir/tester.tcl +ifcapable !session {finish_test; return} + +set testprefix session_gen + + +foreach {otn sct} { + 1 VIRTUAL + 2 STORED +} { +eval [string map [list %TYPE% $sct] { + reset_db + set testprefix $testprefix-$otn + +do_execsql_test 1.0 { + CREATE TABLE t1(a INTEGER PRIMARY KEY, b); + + CREATE TABLE t2(a INTEGER PRIMARY KEY, b AS (c+1) %TYPE%, c); + + CREATE TABLE t3( + a, + b AS (a+10) %TYPE%, + c, + d AS (c+1) %TYPE%, + e, + PRIMARY KEY(c, e) + ) WITHOUT ROWID; + + CREATE TABLE t4(a AS (c*100) %TYPE%, b INTEGER PRIMARY KEY, c); + + CREATE TABLE t5(x, y); +} + +foreach {tn sql changeset} { + + 0.1 { + INSERT INTO t5 VALUES('abc', 'def'); + } { + {INSERT t5 0 X.. {} {i 1 t abc t def}} + } + 0.2 { + UPDATE t5 SET y='xyz' WHERE rowid=1; + } { + {UPDATE t5 0 X.. {i 1 {} {} t def} {{} {} {} {} t xyz}} + } + 0.3 { + DELETE FROM t5; + } { + {DELETE t5 0 X.. {i 1 t abc t xyz} {}} + } + + 1.1 { + INSERT INTO t2 VALUES(1, 2); + INSERT INTO t2 VALUES(2, 123); + } { + {INSERT t2 0 X. {} {i 1 i 2}} + {INSERT t2 0 X. {} {i 2 i 123}} + } + 1.2 { + UPDATE t2 SET c=456 WHERE a=1 + } { + {UPDATE t2 0 X. {i 1 i 2} {{} {} i 456}} + } + + 1.3 { + DELETE FROM t2 WHERE a=2 + } { + {DELETE t2 0 X. {i 2 i 123} {}} + } + + 1.4 { + UPDATE t2 SET a=15 + } { + {INSERT t2 0 X. {} {i 15 i 456}} + {DELETE t2 0 X. {i 1 i 456} {}} + } + + 2.1 { + INSERT INTO t3 VALUES(5, 6, 7); + INSERT INTO t3 VALUES(8, 9, 10); + } { + {INSERT t3 0 .XX {} {i 8 i 9 i 10}} + {INSERT t3 0 .XX {} {i 5 i 6 i 7}} + } + + 2.2 { + UPDATE t3 SET a = 505 WHERE (c, e) = (6, 7); + } { + {UPDATE t3 0 .XX {i 5 i 6 i 7} {i 505 {} {} {} {}}} + } + + 2.3 { + DELETE FROM t3 WHERE (c, e) = (9, 10); + } { + {DELETE t3 0 .XX {i 8 i 9 i 10} {}} + } + + 2.4 { + UPDATE t3 SET c=1000 + } { + {DELETE t3 0 .XX {i 505 i 6 i 7} {}} + {INSERT t3 0 .XX {} {i 505 i 1000 i 7}} + } + + 3.1 { + INSERT INTO t4 VALUES(100, 100); + } { + {INSERT t4 0 X. {} {i 100 i 100}} + } + +} { + do_test 1.$tn.1 { + sqlite3session S db main + S object_config rowid 1 + S attach * + execsql $sql + } {} + + do_changeset_test 1.$tn.2 S $changeset + + S delete +} +#------------------------------------------------------------------------- +reset_db + +forcedelete test.db2 +sqlite3 db2 test.db2 + +do_common_sql { + CREATE TABLE t0(x INTEGER PRIMARY KEY, y); + INSERT INTO t0 VALUES(1, 'one'); + INSERT INTO t0 VALUES(2, 'two'); + + CREATE TABLE t1(a AS (c*10) %TYPE%, b INTEGER PRIMARY KEY, c); + INSERT INTO t1 VALUES(1, 5); + INSERT INTO t1 VALUES(2, 10); + INSERT INTO t1 VALUES(3, 5); + + CREATE TABLE t2( + a, b, c AS (a*b) %TYPE%, + 'k 1', 'k 2', PRIMARY KEY('k 1', 'k 2') + ) WITHOUT ROWID; + INSERT INTO t2 VALUES('a', 'b', 1, 11); + INSERT INTO t2 VALUES('A', 'B', 2, 22); + INSERT INTO t2 VALUES('Aa', 'Bb', 3, 33); +} + +foreach {tn sql} { + 1.1 { INSERT INTO t0 VALUES(4, 15) } + 1.2 { INSERT INTO t1 VALUES(4, 15) } + 1.3 { INSERT INTO t2 VALUES(1, 2, 3, 4) } + + 2.1 { UPDATE t1 SET c=100 WHERE b=2 } + 2.2 { UPDATE t2 SET a=11 } + + 3.1 { DELETE FROM t2 WHERE (t2.'k 1') = 2 } + 3.2 { DELETE FROM t1 } +} { + do_test 2.$tn.1 { + # execsql { PRAGMA vdbe_listing = 1 } db2 + do_then_apply_sql $sql + } {} + do_test 2.$tn.2 { + compare_db db db2 + } {} +} + +}]} + + + + +finish_test diff --git a/ext/session/sqlite3session.c b/ext/session/sqlite3session.c index a3f132add8..d78dd9b064 100644 --- a/ext/session/sqlite3session.c +++ b/ext/session/sqlite3session.c @@ -139,11 +139,13 @@ struct sqlite3_changeset_iter { struct SessionTable { SessionTable *pNext; char *zName; /* Local name of table */ - int nCol; /* Number of columns in table zName */ + int nCol; /* Number of non-hidden columns */ + int nTotalCol; /* Number of columns including hidden */ int bStat1; /* True if this is sqlite_stat1 */ int bRowid; /* True if this table uses rowid for PK */ const char **azCol; /* Column names */ const char **azDflt; /* Default value expressions */ + int *aiIdx; /* Index to pass to xNew/xOld */ u8 *abPK; /* Array of primary key flags */ int nEntry; /* Total number of entries in hash table */ int nChange; /* Size of apChange[] array */ @@ -546,22 +548,22 @@ static int sessionPreupdateHash( unsigned int h = 0; /* Hash value to return */ int i; /* Used to iterate through columns */ + assert( pTab->nTotalCol==pSession->hook.xCount(pSession->hook.pCtx) ); if( pTab->bRowid ){ - assert( pTab->nCol-1==pSession->hook.xCount(pSession->hook.pCtx) ); h = sessionHashAppendI64(h, iRowid); }else{ assert( *pbNullPK==0 ); - assert( pTab->nCol==pSession->hook.xCount(pSession->hook.pCtx) ); for(i=0; inCol; i++){ if( pTab->abPK[i] ){ int rc; int eType; sqlite3_value *pVal; + int iIdx = pTab->aiIdx[i]; if( bNew ){ - rc = pSession->hook.xNew(pSession->hook.pCtx, i, &pVal); + rc = pSession->hook.xNew(pSession->hook.pCtx, iIdx, &pVal); }else{ - rc = pSession->hook.xOld(pSession->hook.pCtx, i, &pVal); + rc = pSession->hook.xOld(pSession->hook.pCtx, iIdx, &pVal); } if( rc!=SQLITE_OK ) return rc; @@ -898,6 +900,7 @@ static int sessionPreupdateEqual( sqlite3_value *pVal; /* Value returned by preupdate_new/old */ int rc; /* Error code from preupdate_new/old */ int eType = *a++; /* Type of value from change record */ + int iIdx = pTab->aiIdx[iCol]; /* The following calls to preupdate_new() and preupdate_old() can not ** fail. This is because they cache their return values, and by the @@ -906,10 +909,10 @@ static int sessionPreupdateEqual( ** this (that the method has already been called). */ if( op==SQLITE_INSERT ){ /* assert( db->pPreUpdate->pNewUnpacked || db->pPreUpdate->aNew ); */ - rc = pSession->hook.xNew(pSession->hook.pCtx, iCol, &pVal); + rc = pSession->hook.xNew(pSession->hook.pCtx, iIdx, &pVal); }else{ /* assert( db->pPreUpdate->pUnpacked ); */ - rc = pSession->hook.xOld(pSession->hook.pCtx, iCol, &pVal); + rc = pSession->hook.xOld(pSession->hook.pCtx, iIdx, &pVal); } assert( rc==SQLITE_OK ); (void)rc; /* Suppress warning about unused variable */ @@ -1034,9 +1037,11 @@ static int sessionTableInfo( const char *zDb, /* Name of attached database (e.g. "main") */ const char *zThis, /* Table name */ int *pnCol, /* OUT: number of columns */ + int *pnTotalCol, /* OUT: number of hidden columns */ const char **pzTab, /* OUT: Copy of zThis */ const char ***pazCol, /* OUT: Array of column names for table */ const char ***pazDflt, /* OUT: Array of default value expressions */ + int **paiIdx, /* OUT: Array of xNew/xOld indexes */ u8 **pabPK, /* OUT: Array of booleans - true for PK col */ int *pbRowid /* OUT: True if only PK is a rowid */ ){ @@ -1051,6 +1056,7 @@ static int sessionTableInfo( char **azCol = 0; char **azDflt = 0; u8 *abPK = 0; + int *aiIdx = 0; int bRowid = 0; /* Set to true to use rowid as PK */ assert( pazCol && pabPK ); @@ -1058,6 +1064,8 @@ static int sessionTableInfo( *pazCol = 0; *pabPK = 0; *pnCol = 0; + if( pnTotalCol ) *pnTotalCol = 0; + if( paiIdx ) *paiIdx = 0; if( pzTab ) *pzTab = 0; if( pazDflt ) *pazDflt = 0; @@ -1067,9 +1075,9 @@ static int sessionTableInfo( if( rc==SQLITE_OK ){ /* For sqlite_stat1, pretend that (tbl,idx) is the PRIMARY KEY. */ zPragma = sqlite3_mprintf( - "SELECT 0, 'tbl', '', 0, '', 1 UNION ALL " - "SELECT 1, 'idx', '', 0, '', 2 UNION ALL " - "SELECT 2, 'stat', '', 0, '', 0" + "SELECT 0, 'tbl', '', 0, '', 1, 0 UNION ALL " + "SELECT 1, 'idx', '', 0, '', 2, 0 UNION ALL " + "SELECT 2, 'stat', '', 0, '', 0, 0" ); }else if( rc==SQLITE_ERROR ){ zPragma = sqlite3_mprintf(""); @@ -1077,7 +1085,7 @@ static int sessionTableInfo( return rc; } }else{ - zPragma = sqlite3_mprintf("PRAGMA '%q'.table_info('%q')", zDb, zThis); + zPragma = sqlite3_mprintf("PRAGMA '%q'.table_xinfo('%q')", zDb, zThis); } if( !zPragma ){ return SQLITE_NOMEM; @@ -1094,7 +1102,9 @@ static int sessionTableInfo( while( SQLITE_ROW==sqlite3_step(pStmt) ){ nByte += sqlite3_column_bytes(pStmt, 1); /* name */ nByte += sqlite3_column_bytes(pStmt, 4); /* dflt_value */ - nDbCol++; + if( sqlite3_column_int(pStmt, 6)==0 ){ /* !hidden */ + nDbCol++; + } if( sqlite3_column_int(pStmt, 5) ) bRowid = 0; /* pk */ } if( nDbCol==0 ) bRowid = 0; @@ -1103,7 +1113,7 @@ static int sessionTableInfo( rc = sqlite3_reset(pStmt); if( rc==SQLITE_OK ){ - nByte += nDbCol * (sizeof(const char *)*2 + sizeof(u8) + 1 + 1); + nByte += nDbCol * (sizeof(const char *)*2 +sizeof(int)+sizeof(u8) + 1 + 1); pAlloc = sessionMalloc64(pSession, nByte); if( pAlloc==0 ){ rc = SQLITE_NOMEM; @@ -1114,8 +1124,8 @@ static int sessionTableInfo( if( rc==SQLITE_OK ){ azCol = (char **)pAlloc; azDflt = (char**)&azCol[nDbCol]; - pAlloc = (u8 *)&azDflt[nDbCol]; - abPK = (u8 *)pAlloc; + aiIdx = (int*)&azDflt[nDbCol]; + abPK = (u8 *)&aiIdx[nDbCol]; pAlloc = &abPK[nDbCol]; if( pzTab ){ memcpy(pAlloc, zThis, nThis+1); @@ -1130,27 +1140,32 @@ static int sessionTableInfo( azCol[i] = (char*)pAlloc; pAlloc += nName+1; abPK[i] = 1; + aiIdx[i] = -1; i++; } while( SQLITE_ROW==sqlite3_step(pStmt) ){ - int nName = sqlite3_column_bytes(pStmt, 1); - int nDflt = sqlite3_column_bytes(pStmt, 4); - const unsigned char *zName = sqlite3_column_text(pStmt, 1); - const unsigned char *zDflt = sqlite3_column_text(pStmt, 4); + if( sqlite3_column_int(pStmt, 6)==0 ){ /* !hidden */ + int nName = sqlite3_column_bytes(pStmt, 1); + int nDflt = sqlite3_column_bytes(pStmt, 4); + const unsigned char *zName = sqlite3_column_text(pStmt, 1); + const unsigned char *zDflt = sqlite3_column_text(pStmt, 4); - if( zName==0 ) break; - memcpy(pAlloc, zName, nName+1); - azCol[i] = (char *)pAlloc; - pAlloc += nName+1; - if( zDflt ){ - memcpy(pAlloc, zDflt, nDflt+1); - azDflt[i] = (char *)pAlloc; - pAlloc += nDflt+1; - }else{ - azDflt[i] = 0; + if( zName==0 ) break; + memcpy(pAlloc, zName, nName+1); + azCol[i] = (char *)pAlloc; + pAlloc += nName+1; + if( zDflt ){ + memcpy(pAlloc, zDflt, nDflt+1); + azDflt[i] = (char *)pAlloc; + pAlloc += nDflt+1; + }else{ + azDflt[i] = 0; + } + abPK[i] = sqlite3_column_int(pStmt, 5); + aiIdx[i] = sqlite3_column_int(pStmt, 0); + i++; } - abPK[i] = sqlite3_column_int(pStmt, 5); - i++; + if( pnTotalCol ) (*pnTotalCol)++; } rc = sqlite3_reset(pStmt); } @@ -1163,6 +1178,7 @@ static int sessionTableInfo( if( pazDflt ) *pazDflt = (const char**)azDflt; *pabPK = abPK; *pnCol = nDbCol; + if( paiIdx ) *paiIdx = aiIdx; }else{ sessionFree(pSession, azCol); } @@ -1194,7 +1210,8 @@ static int sessionInitTable( u8 *abPK; assert( pTab->azCol==0 || pTab->abPK==0 ); rc = sessionTableInfo(pSession, db, zDb, - pTab->zName, &pTab->nCol, 0, &pTab->azCol, &pTab->azDflt, &abPK, + pTab->zName, &pTab->nCol, &pTab->nTotalCol, 0, &pTab->azCol, + &pTab->azDflt, &pTab->aiIdx, &abPK, ((pSession==0 || pSession->bImplicitPK) ? &pTab->bRowid : 0) ); if( rc==SQLITE_OK ){ @@ -1229,15 +1246,17 @@ static int sessionInitTable( */ static int sessionReinitTable(sqlite3_session *pSession, SessionTable *pTab){ int nCol = 0; + int nTotalCol = 0; const char **azCol = 0; const char **azDflt = 0; + int *aiIdx = 0; u8 *abPK = 0; int bRowid = 0; assert( pSession->rc==SQLITE_OK ); pSession->rc = sessionTableInfo(pSession, pSession->db, pSession->zDb, - pTab->zName, &nCol, 0, &azCol, &azDflt, &abPK, + pTab->zName, &nCol, &nTotalCol, 0, &azCol, &azDflt, &aiIdx, &abPK, (pSession->bImplicitPK ? &bRowid : 0) ); if( pSession->rc==SQLITE_OK ){ @@ -1260,8 +1279,10 @@ static int sessionReinitTable(sqlite3_session *pSession, SessionTable *pTab){ const char **a = pTab->azCol; pTab->azCol = azCol; pTab->nCol = nCol; + pTab->nTotalCol = nTotalCol; pTab->azDflt = azDflt; pTab->abPK = abPK; + pTab->aiIdx = aiIdx; azCol = a; } if( pSession->bEnableSize ){ @@ -1579,7 +1600,7 @@ static int sessionUpdateMaxSize( int ii; for(ii=0; iinCol; ii++){ sqlite3_value *p = 0; - pSession->hook.xNew(pSession->hook.pCtx, ii, &p); + pSession->hook.xNew(pSession->hook.pCtx, pTab->aiIdx[ii], &p); sessionSerializeValue(0, p, &nNew); } } @@ -1599,8 +1620,9 @@ static int sessionUpdateMaxSize( int bChanged = 1; int nOld = 0; int eType; + int iIdx = pTab->aiIdx[ii]; sqlite3_value *p = 0; - pSession->hook.xNew(pSession->hook.pCtx, ii-pTab->bRowid, &p); + pSession->hook.xNew(pSession->hook.pCtx, iIdx, &p); if( p==0 ){ return SQLITE_NOMEM; } @@ -1697,11 +1719,11 @@ static void sessionPreupdateOneChange( /* Check the number of columns in this xPreUpdate call matches the ** number of columns in the table. */ nExpect = pSession->hook.xCount(pSession->hook.pCtx); - if( (pTab->nCol-pTab->bRowid)nTotalColnCol-pTab->bRowid)!=nExpect ){ + if( pTab->nTotalCol!=nExpect ){ pSession->rc = SQLITE_SCHEMA; return; } @@ -1758,14 +1780,15 @@ static void sessionPreupdateOneChange( /* Figure out how large an allocation is required */ nByte = sizeof(SessionChange); - for(i=0; i<(pTab->nCol-pTab->bRowid); i++){ + for(i=pTab->bRowid; inCol; i++){ + int iIdx = pTab->aiIdx[i]; sqlite3_value *p = 0; if( op!=SQLITE_INSERT ){ /* This may fail if the column has a non-NULL default and was added ** using ALTER TABLE ADD COLUMN after this record was created. */ - rc = pSession->hook.xOld(pSession->hook.pCtx, i, &p); + rc = pSession->hook.xOld(pSession->hook.pCtx, iIdx, &p); }else if( pTab->abPK[i] ){ - TESTONLY(int trc = ) pSession->hook.xNew(pSession->hook.pCtx, i, &p); + TESTONLY(int trc = ) pSession->hook.xNew(pSession->hook.pCtx,iIdx,&p); assert( trc==SQLITE_OK ); } @@ -1800,12 +1823,13 @@ static void sessionPreupdateOneChange( sessionPutI64(&pC->aRecord[1], iRowid); nByte = 9; } - for(i=0; i<(pTab->nCol-pTab->bRowid); i++){ + for(i=pTab->bRowid; inCol; i++){ sqlite3_value *p = 0; + int iIdx = pTab->aiIdx[i]; if( op!=SQLITE_INSERT ){ - pSession->hook.xOld(pSession->hook.pCtx, i, &p); + pSession->hook.xOld(pSession->hook.pCtx, iIdx, &p); }else if( pTab->abPK[i] ){ - pSession->hook.xNew(pSession->hook.pCtx, i, &p); + pSession->hook.xNew(pSession->hook.pCtx, iIdx, &p); } sessionSerializeValue(&pC->aRecord[nByte], p, &nByte); } @@ -2207,7 +2231,8 @@ int sqlite3session_diff( int bRowid = 0; u8 *abPK; const char **azCol = 0; - rc = sessionTableInfo(0, db, zFrom, zTbl, &nCol, 0, &azCol, 0, &abPK, + rc = sessionTableInfo(0, db, zFrom, zTbl, + &nCol, 0, 0, &azCol, 0, 0, &abPK, pSession->bImplicitPK ? &bRowid : 0 ); if( rc==SQLITE_OK ){ @@ -2784,10 +2809,10 @@ static int sessionSelectStmt( int rc = SQLITE_OK; char *zSql = 0; const char *zSep = ""; - const char *zCols = bRowid ? SESSIONS_ROWID ", *" : "*"; int nSql = -1; int i; + SessionBuffer cols = {0, 0, 0}; SessionBuffer nooptest = {0, 0, 0}; SessionBuffer pkfield = {0, 0, 0}; SessionBuffer pkvar = {0, 0, 0}; @@ -2800,9 +2825,16 @@ static int sessionSelectStmt( sessionAppendStr(&pkvar, "?1, (CASE WHEN ?2=X'' THEN NULL ELSE ?2 END)", &rc ); - zCols = "tbl, ?2, stat"; + sessionAppendStr(&cols, "tbl, ?2, stat", &rc); }else{ + #if 0 + if( bRowid ){ + sessionAppendStr(&cols, SESSIONS_ROWID, &rc); + } + #endif for(i=0; ipPk ){ - iIdx = sqlite3TableColumnToIndex(p->pPk, iIdx); + iStore = sqlite3TableColumnToIndex(p->pPk, iIdx); + }else{ + iStore = sqlite3TableColumnToStorage(p->pTab, iIdx); } - if( iIdx>=p->pCsr->nField || iIdx<0 ){ + if( iStore>=p->pCsr->nField || iStore<0 ){ rc = SQLITE_RANGE; goto preupdate_old_out; } @@ -2224,8 +2227,8 @@ int sqlite3_preupdate_old(sqlite3 *db, int iIdx, sqlite3_value **ppValue){ p->aRecord = aRec; } - pMem = *ppValue = &p->pUnpacked->aMem[iIdx]; - if( iIdx>=p->pUnpacked->nField ){ + pMem = *ppValue = &p->pUnpacked->aMem[iStore]; + if( iStore>=p->pUnpacked->nField ){ /* This occurs when the table has been extended using ALTER TABLE ** ADD COLUMN. The value to return is the default value of the column. */ Column *pCol = &p->pTab->aCol[iIdx]; @@ -2329,6 +2332,7 @@ int sqlite3_preupdate_new(sqlite3 *db, int iIdx, sqlite3_value **ppValue){ PreUpdate *p; int rc = SQLITE_OK; Mem *pMem; + int iStore = 0; #ifdef SQLITE_ENABLE_API_ARMOR if( db==0 || ppValue==0 ){ @@ -2341,9 +2345,12 @@ int sqlite3_preupdate_new(sqlite3 *db, int iIdx, sqlite3_value **ppValue){ goto preupdate_new_out; } if( p->pPk && p->op!=SQLITE_UPDATE ){ - iIdx = sqlite3TableColumnToIndex(p->pPk, iIdx); + iStore = sqlite3TableColumnToIndex(p->pPk, iIdx); + }else{ + iStore = sqlite3TableColumnToStorage(p->pTab, iIdx); } - if( iIdx>=p->pCsr->nField || iIdx<0 ){ + + if( iStore>=p->pCsr->nField || iStore<0 ){ rc = SQLITE_RANGE; goto preupdate_new_out; } @@ -2363,14 +2370,14 @@ int sqlite3_preupdate_new(sqlite3 *db, int iIdx, sqlite3_value **ppValue){ } p->pNewUnpacked = pUnpack; } - pMem = &pUnpack->aMem[iIdx]; + pMem = &pUnpack->aMem[iStore]; if( iIdx==p->pTab->iPKey ){ sqlite3VdbeMemSetInt64(pMem, p->iKey2); - }else if( iIdx>=pUnpack->nField ){ + }else if( iStore>=pUnpack->nField ){ pMem = (sqlite3_value *)columnNullValue(); } }else{ - /* For an UPDATE, memory cell (p->iNewReg+1+iIdx) contains the required + /* For an UPDATE, memory cell (p->iNewReg+1+iStore) contains the required ** value. Make a copy of the cell contents and return a pointer to it. ** It is not safe to return a pointer to the memory cell itself as the ** caller may modify the value text encoding. @@ -2383,13 +2390,13 @@ int sqlite3_preupdate_new(sqlite3 *db, int iIdx, sqlite3_value **ppValue){ goto preupdate_new_out; } } - assert( iIdx>=0 && iIdxpCsr->nField ); - pMem = &p->aNew[iIdx]; + assert( iStore>=0 && iStorepCsr->nField ); + pMem = &p->aNew[iStore]; if( pMem->flags==0 ){ if( iIdx==p->pTab->iPKey ){ sqlite3VdbeMemSetInt64(pMem, p->iKey2); }else{ - rc = sqlite3VdbeMemCopy(pMem, &p->v->aMem[p->iNewReg+1+iIdx]); + rc = sqlite3VdbeMemCopy(pMem, &p->v->aMem[p->iNewReg+1+iStore]); if( rc!=SQLITE_OK ) goto preupdate_new_out; } } From 36279c256b722ba00e7737b9f4050b264e0be0db Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 28 Jan 2025 20:32:48 +0000 Subject: [PATCH 135/220] Enhance the if() and iif() SQL functions so that they support any number of arguments greater than or equal to two. Suggested by [forum:/forumpost/40f7867f75f80|forum post 40f7867f75f80]. FossilOrigin-Name: fb76d184ee5afc41009c4023bb68b3ddd42c9235a79ec9695c26f5bbe9a1aa25 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/func.c | 6 ++---- 3 files changed, 10 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 1c1778f249..39bf2bf6db 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\ssessions\smodule\shandling\sof\stables\swith\sgenerated\scolumns. -D 2025-01-28T19:03:37.907 +C Enhance\sthe\sif()\sand\siif()\sSQL\sfunctions\sso\sthat\sthey\ssupport\sany\nnumber\sof\sarguments\sgreater\sthan\sor\sequal\sto\stwo.\nSuggested\sby\s[forum:/forumpost/40f7867f75f80|forum\spost\s40f7867f75f80]. +D 2025-01-28T20:32:48.256 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -733,7 +733,7 @@ F src/delete.c 03a77ba20e54f0f42ebd8eddf15411ed6bdb06a2c472ac4b6b336521bf7cea42 F src/expr.c ce83e7361454a195f8393fa0baad694e2fee6c49a44c0d6db44d8a2b92534aeb F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 928ed2517e8732113d2b9821aa37af639688d752f4ea9ac6e0e393d713eeb76f -F src/func.c 30051410d0379059e1e3642ffc0caae6963a2b01b3b6d9dd44c5e09b1a66d066 +F src/func.c f5b31c805679930cc5afcdfb1e657f9dd273053f52ff51133df5a448c519e5d9 F src/global.c a19e4b1ca1335f560e9560e590fc13081e21f670643367f99cb9e8f9dc7d615b F src/hash.c 9ee4269fb1d6632a6fecfb9479c93a1f29271bddbbaf215dd60420bcb80c7220 F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 1d57b57c85bb8cb9b8a1808b771bb91eeb8150efd14f9064a390e533e715bab7 -R 28bdb97771277a5a6a62f1ef55b562ac -U dan -Z 3453954a42c7f4fd97cc752d61f14e68 +P 437fb316389bc3c24c5cdb4d01edfc81e2c2e9f2b399fc2a95b05d279361d8ec +R 79d5061e2e3bbb1ea5ad89bea1a7b048 +U drh +Z 108486be1053ae42ce8d5fd32905dfdb # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index a854f9c995..ae82b8d99e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -437fb316389bc3c24c5cdb4d01edfc81e2c2e9f2b399fc2a95b05d279361d8ec +fb76d184ee5afc41009c4023bb68b3ddd42c9235a79ec9695c26f5bbe9a1aa25 diff --git a/src/func.c b/src/func.c index 2bd4be31ca..bd25a44d4a 100644 --- a/src/func.c +++ b/src/func.c @@ -2808,10 +2808,8 @@ void sqlite3RegisterBuiltinFunctions(void){ #endif /* SQLITE_ENABLE_MATH_FUNCTIONS */ FUNCTION(sign, 1, 0, 0, signFunc ), INLINE_FUNC(coalesce, -4, INLINEFUNC_coalesce, 0 ), - INLINE_FUNC(iif, 2, INLINEFUNC_iif, 0 ), - INLINE_FUNC(iif, 3, INLINEFUNC_iif, 0 ), - INLINE_FUNC(if, 2, INLINEFUNC_iif, 0 ), - INLINE_FUNC(if, 3, INLINEFUNC_iif, 0 ), + INLINE_FUNC(iif, -4, INLINEFUNC_iif, 0 ), + INLINE_FUNC(if, -4, INLINEFUNC_iif, 0 ), }; #ifndef SQLITE_OMIT_ALTERTABLE sqlite3AlterFunctions(); From 4f8f1965f77dece3c5a87fb95a3e350c5c9ae901 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 29 Jan 2025 18:53:19 +0000 Subject: [PATCH 136/220] Fix bug in sessions handling of FK constraints introduced by [e09a0c02] (released in 3.48.0). Bug was preventing a changeset containing FK violations from being applied even when the xConflict(CHANGESET_FOREIGN_KEY) returned OMIT. FossilOrigin-Name: d7c07581203a0a88456588e49e51b40a8341b0e7121809f75be0ee882d91650f --- ext/session/session1.test | 2 +- ext/session/session9.test | 4 +-- ext/session/sessionnoact.test | 66 ++++++++++++++++++++++++++++++++++- ext/session/sqlite3session.c | 5 +++ manifest | 20 +++++------ manifest.uuid | 2 +- 6 files changed, 84 insertions(+), 15 deletions(-) diff --git a/ext/session/session1.test b/ext/session/session1.test index dfc1aa8957..6da9051791 100644 --- a/ext/session/session1.test +++ b/ext/session/session1.test @@ -285,7 +285,7 @@ do_conflict_test $tn.3.2.3 -tables t2 -sql { {FOREIGN_KEY 1} } do_execsql_test $tn.3.2.4 "SELECT * FROM t2" {} -do_db2_test $tn.3.2.5 "SELECT * FROM t2" {1 one 2 two 4 five} +do_db2_test $tn.3.2.5 "SELECT * FROM t2" {4 five} # Test UPDATE changesets. # diff --git a/ext/session/session9.test b/ext/session/session9.test index 6b7d1648b2..5c406c344e 100644 --- a/ext/session/session9.test +++ b/ext/session/session9.test @@ -80,7 +80,7 @@ foreach {tn delrow trans conflictargs conflictret} { 8 3 1 {FOREIGN_KEY 1} ABORT } { - set A(OMIT,0) {1 SQLITE_CONSTRAINT} + set A(OMIT,0) {0 {}} set A(OMIT,1) {0 {}} set A(ABORT,0) {1 SQLITE_CONSTRAINT} set A(ABORT,1) {1 SQLITE_CONSTRAINT} @@ -95,7 +95,7 @@ foreach {tn delrow trans conflictargs conflictret} { do_test 1.2.$tn.2 { set ::xConflict } $conflictargs - set A(OMIT,0) {0 0} + set A(OMIT,0) {1 1} set A(OMIT,1) {1 1} set A(ABORT,0) {0 0} set A(ABORT,1) {0 0} diff --git a/ext/session/sessionnoact.test b/ext/session/sessionnoact.test index e447bc8a16..54e9a62151 100644 --- a/ext/session/sessionnoact.test +++ b/ext/session/sessionnoact.test @@ -59,7 +59,7 @@ do_execsql_test 1.2 { set ::nConflict 0 proc conflict {args} { incr ::nConflict - return "OMIT" + return "ABORT" } sqlite3changeset_apply_v2 db $C conflict @@ -111,6 +111,9 @@ do_execsql_test 1.8 { # Check that a changeset that causes an FK violation may not be applied, # even if SQLITE_CHANGESETAPPLY_FKNOACTION is specified. # +# UPDATE: Unless the conflict-handler returns OMIT. In that case it can +# be committed. See test cases 3.* in this file. +# reset_db do_execsql_test 2.0 { CREATE TABLE p1(a INTEGER PRIMARY KEY, b, c UNIQUE); @@ -164,5 +167,66 @@ do_execsql_test 2.8 { SELECT * FROM c1; } {two} +#------------------------------------------------------------------------- +# +reset_db +do_execsql_test 3.0 { + CREATE TABLE p1(a INTEGER PRIMARY KEY, b, c UNIQUE); + INSERT INTO p1 VALUES(1, 1, 'one'); + INSERT INTO p1 VALUES(2, 2, 'two'); + + CREATE TABLE c1(x REFERENCES p1(c) ON DELETE CASCADE); + INSERT INTO c1 VALUES('two'); +} + +set ::nConflict 0 +proc conflict {args} { + incr ::nConflict + return "OMIT" +} + +db_save + +set C [changeset_from_sql { + DELETE FROM p1 WHERE a=2; +}] + +db_restore_and_reopen + +do_test 3.1 { + sqlite3changeset_apply_v2 -noaction db $C conflict +} {} +do_execsql_test 3.2 { + SELECT * FROM p1 +} {1 1 one} + +db_restore_and_reopen +db eval { PRAGMA foreign_keys = 1 } + +do_test 3.3 { + list [catch { sqlite3changeset_apply_v2 -noaction db $C conflict } msg] $msg +} {0 {}} +do_execsql_test 3.4 { + SELECT * FROM p1; +} {1 1 one} +do_execsql_test 3.5 { + SELECT * FROM c1; +} {two} + +db_restore_and_reopen +db eval { PRAGMA foreign_keys = 1 } + +do_test 3.6 { + list [catch { + sqlite3changeset_apply_v2 -ignorenoop -noaction db $C conflict + } msg] $msg +} {0 {}} +do_execsql_test 3.7 { + SELECT * FROM p1; +} {1 1 one} +do_execsql_test 3.8 { + SELECT * FROM c1; +} {two} + finish_test diff --git a/ext/session/sqlite3session.c b/ext/session/sqlite3session.c index d78dd9b064..66b21d63ac 100644 --- a/ext/session/sqlite3session.c +++ b/ext/session/sqlite3session.c @@ -5318,6 +5318,11 @@ static int sessionChangesetApply( } } + { + int rc2 = sqlite3_exec(db, "PRAGMA defer_foreign_keys = 0", 0, 0, 0); + if( rc==SQLITE_OK ) rc = rc2; + } + if( (flags & SQLITE_CHANGESETAPPLY_NOSAVEPOINT)==0 ){ if( rc==SQLITE_OK ){ rc = sqlite3_exec(db, "RELEASE changeset_apply", 0, 0, 0); diff --git a/manifest b/manifest index 39bf2bf6db..eec067567d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sthe\sif()\sand\siif()\sSQL\sfunctions\sso\sthat\sthey\ssupport\sany\nnumber\sof\sarguments\sgreater\sthan\sor\sequal\sto\stwo.\nSuggested\sby\s[forum:/forumpost/40f7867f75f80|forum\spost\s40f7867f75f80]. -D 2025-01-28T20:32:48.256 +C Fix\sbug\sin\ssessions\shandling\sof\sFK\sconstraints\sintroduced\sby\s[e09a0c02]\s(released\sin\s3.48.0).\sBug\swas\spreventing\sa\schangeset\scontaining\sFK\sviolations\sfrom\sbeing\sapplied\seven\swhen\sthe\sxConflict(CHANGESET_FOREIGN_KEY)\sreturned\sOMIT. +D 2025-01-29T18:53:19.277 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -576,14 +576,14 @@ F ext/rtree/visual01.txt e9c2564083bcd30ec51b07f881bffbf0e12b50a3f6fced0c222c5c1 F ext/session/changeset.c 7a1e6a14c7e92d36ca177e92e88b5281acd709f3b726298dc34ec0fb58869cb5 F ext/session/changesetfuzz.c 227076ab0ae4447d742c01ee88a564da6478bbf26b65108bf8fac9cd8b0b24aa F ext/session/changesetfuzz1.test 15b629004e58d5ffcc852e6842a603775bb64b1ce51254831f3d12b113b616cd -F ext/session/session1.test 8d0509cd3fcfdee6a33422d5fe5c95a9770d62a0b8588adb0177ecdf79b2c345 +F ext/session/session1.test cc7e58976c2cc6263fb7ef0c5125a98eafc2f213c75929f986768d2dbc224725 F ext/session/session2.test ee83bb973b9ce17ccce4db931cdcdae65eb40bbb22089b2fe6aa4f6be3b9303f F ext/session/session3.test 2cc1629cfb880243aec1a7251145e07b78411d851b39b2aa1390704550db8e6a F ext/session/session4.test 823f6f018fcbb8dacf61e2960f8b3b848d492b094f8b495eae1d9407d9ab7219 F ext/session/session5.test 716bc6fafd625ce60dfa62ae128971628c1a1169 F ext/session/session6.test 35279f2ec45448cd2e24a61688219dc6cf7871757716063acf4a8b5455e1e926 F ext/session/session8.test 326f3273abf9d5d2d7d559eee8f5994c4ea74a5d935562454605e6607ee29904 -F ext/session/session9.test be090b1420f3824a573da9e56ff542b1e1c2a4f772118e9ab2f75774e66d25d0 +F ext/session/session9.test 4e3aff62d6b4294498ddbe309076de06f4fddffad4fe5f5a6c033358b01df083 F ext/session/sessionA.test 1feeab0b8e03527f08f2f1defb442da25480138f F ext/session/sessionB.test c4fb7f8a688787111606e123a555f18ee04f65bb9f2a4bb2aa71d55ce4e6d02c F ext/session/sessionC.test f8a5508bc059ae646e5ec9bdbca66ad24bc92fe99fda5790ac57e1f59fce2fdf @@ -607,7 +607,7 @@ F ext/session/sessionfault2.test b0d6a7c1d7398a7e800d84657404909c7d385965ea8576d F ext/session/sessionfault3.test ce0b5d182133935c224d72507dbf1c5be1a1febf7e85d0b0fbd6d2f724b32b96 F ext/session/sessioninvert.test 04075517a9497a80d39c495ba6b44f3982c7371129b89e2c52219819bc105a25 F ext/session/sessionmem.test f2a735db84a3e9e19f571033b725b0b2daf847f3f28b1da55a0c1a4e74f1de09 -F ext/session/sessionnoact.test 0f552bd318b764bbc5b2cd6f3518435254a1c830fdaa5aab9c688f507ebc301e +F ext/session/sessionnoact.test 4c7ae5c7d351cb5323bca62b6b095592ad24bd90a6713c178b62ab0063d23e19 F ext/session/sessionnoop.test a9366a36a95ef85f8a3687856ebef46983df399541174cb1ede2ee53b8011bc7 F ext/session/sessionnoop2.test de4672dce88464396ec9f30ed08c6c01643a69c53ae540fadbbf6d30642d64e8 F ext/session/sessionrebase.test 702378bdcb5062f1106e74457beca8797d09c113a81768734a58b197b5b334e2 @@ -615,7 +615,7 @@ F ext/session/sessionrowid.test 85187c2f1b38861a5844868126f69f9ec62223a03449a98a F ext/session/sessionsize.test 8fcf4685993c3dbaa46a24183940ab9f5aa9ed0d23e5fb63bfffbdb56134b795 F ext/session/sessionstat1.test 5e718d5888c0c49bbb33a7a4f816366db85f59f6a4f97544a806421b85dc2dec F ext/session/sessionwor.test 6fd9a2256442cebde5b2284936ae9e0d54bde692d0f5fd009ecef8511f4cf3fc -F ext/session/sqlite3session.c b2047d4b6c343f92d1c5cead3a7f529d074db01ceb4724f5ec4cd361379afb38 +F ext/session/sqlite3session.c 01e321269fe21982b79336c8b7a4b83ef0779f5c1644a04c8bb7c1174c8c71ae F ext/session/sqlite3session.h 683ccbf16e2c2521661fc4c1cf918ce57002039efbcabcd8097fa4bca569104b F ext/session/test_session.c 12e0a2c15fd60f92da4bb29c697c9177ff0c0dbcdc5129a54c47e999f147937a F ext/wasm/EXPORTED_FUNCTIONS.fiddle.in 27450c8b8c70875a260aca55435ec927068b34cef801a96205adb81bdcefc65c @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 437fb316389bc3c24c5cdb4d01edfc81e2c2e9f2b399fc2a95b05d279361d8ec -R 79d5061e2e3bbb1ea5ad89bea1a7b048 -U drh -Z 108486be1053ae42ce8d5fd32905dfdb +P fb76d184ee5afc41009c4023bb68b3ddd42c9235a79ec9695c26f5bbe9a1aa25 +R 7bb63bb81389e805cac068949f19d72e +U dan +Z ad8a1ab5c6c6b8d1277c1e707cdd7fec # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index ae82b8d99e..b65314c307 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fb76d184ee5afc41009c4023bb68b3ddd42c9235a79ec9695c26f5bbe9a1aa25 +d7c07581203a0a88456588e49e51b40a8341b0e7121809f75be0ee882d91650f From 00d6b7abfccfcf33c45bbb162dcc0fcadce6e5c3 Mon Sep 17 00:00:00 2001 From: stephan Date: Thu, 30 Jan 2025 11:19:16 +0000 Subject: [PATCH 137/220] Fix build regression, introduced in [d2fe6b05f38d9d] (3.48.0), in which SQLITE_OMIT and SQLITE_ENABLE flags passed to configure via CFLAGS were not propagated to the OPT_FEATURE_FLAGS list. Reported in [forum:9801e54665afd728|forum post 9801e54665afd728]. FossilOrigin-Name: ec71d9dcd582188d7fb4ab945187de1023eaaecffeeb2903a6fcc49650bd21e9 --- autosetup/sqlite-config.tcl | 14 ++++++++++++++ manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/autosetup/sqlite-config.tcl b/autosetup/sqlite-config.tcl index 40941687e4..90e4d7dbcc 100644 --- a/autosetup/sqlite-config.tcl +++ b/autosetup/sqlite-config.tcl @@ -226,6 +226,20 @@ proc sqlite-setup-default-cflags {} { define CFLAGS [proj-get-env CFLAGS $defaultCFlags] # BUILD_CFLAGS is the CFLAGS for CC_FOR_BUILD. define BUILD_CFLAGS [proj-get-env BUILD_CFLAGS {-g}] + + # Copy all CFLAGS entries matching -DSQLITE_OMIT* and + # -DSQLITE_ENABLE* to OPT_FEATURE_FLAGS. This behavior is derived + # from the legacy build and was missing the 3.48.0 release (the + # initial Autosetup port). + # https://sqlite.org/forum/forumpost/9801e54665afd728 + foreach cf [get-define CFLAGS ""] { + switch -glob -- $cf { + -DSQLITE_OMIT* - + -DSQLITE_ENABLE* { + sqlite-add-feature-flag $cf + } + } + } } ######################################################################## diff --git a/manifest b/manifest index eec067567d..b7e2d3655a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sbug\sin\ssessions\shandling\sof\sFK\sconstraints\sintroduced\sby\s[e09a0c02]\s(released\sin\s3.48.0).\sBug\swas\spreventing\sa\schangeset\scontaining\sFK\sviolations\sfrom\sbeing\sapplied\seven\swhen\sthe\sxConflict(CHANGESET_FOREIGN_KEY)\sreturned\sOMIT. -D 2025-01-29T18:53:19.277 +C Fix\sbuild\sregression,\sintroduced\sin\s[d2fe6b05f38d9d]\s(3.48.0),\sin\swhich\sSQLITE_OMIT\sand\sSQLITE_ENABLE\sflags\spassed\sto\sconfigure\svia\sCFLAGS\swere\snot\spropagated\sto\sthe\sOPT_FEATURE_FLAGS\slist.\sReported\sin\s[forum:9801e54665afd728|forum\spost\s9801e54665afd728]. +D 2025-01-30T11:19:16.519 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -50,7 +50,7 @@ F autosetup/cc.tcl c0fcc50ca91deff8741e449ddad05bcd08268bc31177e613a6343bbd1fd3e F autosetup/jimsh0.c d40e381ea4526a067590e7b91bd4b2efa6d4980d286f908054c647b3df4aee14 F autosetup/pkg-config.tcl 4e635bf39022ff65e0d5434339dd41503ea48fc53822c9c5bde88b02d3d952ba F autosetup/proj.tcl 9adf1539673cef15bff862d9360b479e6920cc2c0d85de707b0ba31c04ce4531 -F autosetup/sqlite-config.tcl f37f6961c8fb2454960f97a28011a29994f6c591b1da392a9ae28af96e0c15a2 +F autosetup/sqlite-config.tcl e5de87d000ef5fa4ed78663c74688bbdd989b59bf5bae2aabaff65a502b0ec80 F autosetup/system.tcl 51d4be76cd9a9074704b584e5c9cbba616202c8468cf9ba8a4f8294a7ab1dba9 F configure 9a00b21dfd13757bbfb8d89b30660a89ec1f8f3a79402b8f9f9b6fc475c3303a x F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P fb76d184ee5afc41009c4023bb68b3ddd42c9235a79ec9695c26f5bbe9a1aa25 -R 7bb63bb81389e805cac068949f19d72e -U dan -Z ad8a1ab5c6c6b8d1277c1e707cdd7fec +P d7c07581203a0a88456588e49e51b40a8341b0e7121809f75be0ee882d91650f +R 1c8a0d642354e8cc82e464f25cf69897 +U stephan +Z 9d44f698cd53e225ebbddcb3eac9dddd # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index b65314c307..9ef3858dd5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d7c07581203a0a88456588e49e51b40a8341b0e7121809f75be0ee882d91650f +ec71d9dcd582188d7fb4ab945187de1023eaaecffeeb2903a6fcc49650bd21e9 From 1392ff5533b467beb96f3780928d80f38305891a Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 30 Jan 2025 12:01:24 +0000 Subject: [PATCH 138/220] Disable a test case that (intentionally) does use-after-free, as it does occasionally cause problems even for non-sanitizer builds. FossilOrigin-Name: 23c7d5bea351c04785153ddb30e19c1236db9d11054ab8229893531026b53655 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/capi3.test | 4 +++- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index b7e2d3655a..736757ee45 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sbuild\sregression,\sintroduced\sin\s[d2fe6b05f38d9d]\s(3.48.0),\sin\swhich\sSQLITE_OMIT\sand\sSQLITE_ENABLE\sflags\spassed\sto\sconfigure\svia\sCFLAGS\swere\snot\spropagated\sto\sthe\sOPT_FEATURE_FLAGS\slist.\sReported\sin\s[forum:9801e54665afd728|forum\spost\s9801e54665afd728]. -D 2025-01-30T11:19:16.519 +C Disable\sa\stest\scase\sthat\s(intentionally)\sdoes\suse-after-free,\sas\sit\sdoes\noccasionally\scause\sproblems\seven\sfor\snon-sanitizer\sbuilds. +D 2025-01-30T12:01:24.848 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -990,7 +990,7 @@ F test/cache.test 13bc046b26210471ca6f2889aceb1ea52dc717de F test/cacheflush.test af25bb1509df04c1da10e38d8f322d66eceedf61 F test/cachespill.test 895997f84a25b323b166aecb69baab2d6380ea98f9e0bcc688c4493c535cfab9 F test/capi2.test 4ee545824adc3eb33bf57ef89f77440b28188ec3da72e5425ff0fcdba32e8d5a -F test/capi3.test 4892b5e53d2a6941edc9d204a0ab174dd66e8689282d9a15e4384561c3965945 +F test/capi3.test ab90c548969613315605c555a8623f6b56e00e28d451c46a17ef73683c422c70 F test/capi3b.test efb2b9cfd127efa84433cd7a2d72ce0454ae0dc4 F test/capi3c.test 31d3a6778f2d06f2d9222bd7660c41a516d1518a059b069e96ebbeadb5a490f7 F test/capi3d.test 8b778794af891b0dca3d900bd345fbc8ebd2aa2aae425a9dccdd10d5233dfbde @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P d7c07581203a0a88456588e49e51b40a8341b0e7121809f75be0ee882d91650f -R 1c8a0d642354e8cc82e464f25cf69897 -U stephan -Z 9d44f698cd53e225ebbddcb3eac9dddd +P ec71d9dcd582188d7fb4ab945187de1023eaaecffeeb2903a6fcc49650bd21e9 +R 7b8d1f95b47e47a5d559070e34819714 +U drh +Z 470d847ca31236034508764b46198386 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 9ef3858dd5..793cb84d2a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ec71d9dcd582188d7fb4ab945187de1023eaaecffeeb2903a6fcc49650bd21e9 +23c7d5bea351c04785153ddb30e19c1236db9d11054ab8229893531026b53655 diff --git a/test/capi3.test b/test/capi3.test index e65f90e3aa..6319d8284d 100644 --- a/test/capi3.test +++ b/test/capi3.test @@ -689,7 +689,9 @@ do_test capi3-6.3 { sqlite3_finalize $STMT } {SQLITE_OK} -if {[clang_sanitize_address]==0} { +if {0 && [clang_sanitize_address]==0} { + # This use-after-free occasionally causes segfaults during ordinary + # builds. Let's just disable it completely. do_test capi3-6.4-misuse { db cache flush sqlite3_close $DB From 73dcf45a3d9bcd7da13dffa59b090de3dcfd10bb Mon Sep 17 00:00:00 2001 From: stephan Date: Thu, 30 Jan 2025 12:19:30 +0000 Subject: [PATCH 139/220] Minor code de-duplication across the top-level auto.def and autoconf/auto.def. FossilOrigin-Name: 3c990d77cb83ab371d92c97e0528f790ab6126c60f48ff77e48bd166d7834cf0 --- auto.def | 2 -- autoconf/auto.def | 2 -- autosetup/sqlite-config.tcl | 22 +++++++++++++++++----- manifest | 18 +++++++++--------- manifest.uuid | 2 +- 5 files changed, 27 insertions(+), 19 deletions(-) diff --git a/auto.def b/auto.def index dade81613f..52c758850c 100644 --- a/auto.def +++ b/auto.def @@ -275,8 +275,6 @@ sqlite-handle-load-extension sqlite-handle-math sqlite-handle-icu sqlite-handle-emsdk -sqlite-handle-common-feature-flags -sqlite-show-feature-flags sqlite-process-dot-in-files sqlite-post-config-validation sqlite-dump-defines diff --git a/autoconf/auto.def b/autoconf/auto.def index 0f36e733ca..12eb3d75c3 100644 --- a/autoconf/auto.def +++ b/autoconf/auto.def @@ -90,8 +90,6 @@ sqlite-handle-line-editing sqlite-handle-load-extension sqlite-handle-math sqlite-handle-icu -sqlite-handle-common-feature-flags -sqlite-show-feature-flags define ENABLE_LIB_SHARED [opt-bool shared] define ENABLE_LIB_STATIC [opt-bool static] diff --git a/autosetup/sqlite-config.tcl b/autosetup/sqlite-config.tcl index 90e4d7dbcc..9f300e317d 100644 --- a/autosetup/sqlite-config.tcl +++ b/autosetup/sqlite-config.tcl @@ -232,6 +232,10 @@ proc sqlite-setup-default-cflags {} { # from the legacy build and was missing the 3.48.0 release (the # initial Autosetup port). # https://sqlite.org/forum/forumpost/9801e54665afd728 + # + # If any configure flags for features are in conflict with + # CFLAGS-specified feature flags, all bets are off. There are no + # guarantees about which one will take precedence. foreach cf [get-define CFLAGS ""] { switch -glob -- $cf { -DSQLITE_OMIT* - @@ -307,8 +311,9 @@ proc sqlite-handle-common-feature-flags {} { } ######################################################################### -# Show the final feature flag sets. -proc sqlite-show-feature-flags {} { +# Remove duplicates from the final feature flag sets and show them to +# the user. +proc sqlite-finalize-feature-flags {} { set oFF [get-define OPT_FEATURE_FLAGS] if {"" ne $oFF} { define OPT_FEATURE_FLAGS [lsort -unique $oFF] @@ -319,7 +324,6 @@ proc sqlite-show-feature-flags {} { define OPT_SHELL [lsort -unique $oFF] msg-result "Shell options: [get-define OPT_SHELL]" } - #parray ::sqliteConfig } ######################################################################## @@ -858,13 +862,21 @@ proc sqlite-handle-math {} { } ######################################################################## -# Generate the configure-process output file(s). +# Perform some late-stage work and generate the configure-process +# output file(s). proc sqlite-process-dot-in-files {} { ######################################################################## # When cross-compiling, we have to avoid using the -s flag to - # /usr/bin/install: https://sqlite.org/forum/forumpost/9a67df63eda9925c + # /usr/bin/install: + # https://sqlite.org/forum/forumpost/9a67df63eda9925c define IS_CROSS_COMPILING $::sqliteConfig(is-cross-compiling) + # Finish up handling of the various feature flags here because it's + # convenient for both the canonical build and autoconf bundles that + # it be done here. + sqlite-handle-common-feature-flags + sqlite-finalize-feature-flags + ######################################################################## # "Re-export" the autoconf-conventional --XYZdir flags into something # which is more easily overridable from a make invocation. See the docs diff --git a/manifest b/manifest index 736757ee45..ce04412697 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Disable\sa\stest\scase\sthat\s(intentionally)\sdoes\suse-after-free,\sas\sit\sdoes\noccasionally\scause\sproblems\seven\sfor\snon-sanitizer\sbuilds. -D 2025-01-30T12:01:24.848 +C Minor\scode\sde-duplication\sacross\sthe\stop-level\sauto.def\sand\sautoconf/auto.def. +D 2025-01-30T12:19:30.898 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -14,13 +14,13 @@ F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90 F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2 F art/sqlite370.svg 40b7e2fe8aac3add5d56dd86ab8d427a4eca5bcb3fe4f8946cb3794e1821d531 -F auto.def caf7cca9c235fc6a3d7639e00eb75972d9bf8527717498b9fa1d7112d50b5720 +F auto.def e7e92090c98aeb0174d29988c259834eb1b71ae1ea927015c3ef300f6f9b68ae F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac F autoconf/Makefile.in 56697ad25ecf23afa317148b06bdc14f85960b42e5ec434ac1ba87f63a3cb789 F autoconf/Makefile.msc ffff61fe851443015ddb6600ab69a9df503cfec25459b336be7ba8c9a9e473f8 F autoconf/README.first f1d3876e9a7852c22f275a6f06814e64934cecbc0b5b9617d64849094c1fd136 F autoconf/README.txt 7f01dc3915e2d68f329011073662369e62a0938a2c69398807823c57591cb288 -F autoconf/auto.def 623e0d2339cbccc86b1c5e58d65702dc91a9fec4843a4c6198139e248579858e +F autoconf/auto.def 23bc095a3890c0ca334abf7ef67d1c8af4c22c12832bcc738015e868d54fe9d7 F autoconf/tea/Makefile.in ba0556fee8da09c066bad85a4457904e46ee2c2eabaa309c0e83a78f2f151a8e F autoconf/tea/README.txt 61e62e519579e4a112791354d6d440f8b51ea6db3b0bab58d59f29df42d2dfe3 F autoconf/tea/aclocal.m4 52c47aac44ce0ddb1f918b6993e8beb8eee88f43 @@ -50,7 +50,7 @@ F autosetup/cc.tcl c0fcc50ca91deff8741e449ddad05bcd08268bc31177e613a6343bbd1fd3e F autosetup/jimsh0.c d40e381ea4526a067590e7b91bd4b2efa6d4980d286f908054c647b3df4aee14 F autosetup/pkg-config.tcl 4e635bf39022ff65e0d5434339dd41503ea48fc53822c9c5bde88b02d3d952ba F autosetup/proj.tcl 9adf1539673cef15bff862d9360b479e6920cc2c0d85de707b0ba31c04ce4531 -F autosetup/sqlite-config.tcl e5de87d000ef5fa4ed78663c74688bbdd989b59bf5bae2aabaff65a502b0ec80 +F autosetup/sqlite-config.tcl 00af5b9d94d580367bf01984b86397e8d35b74090427def9591a54ded0e1a287 F autosetup/system.tcl 51d4be76cd9a9074704b584e5c9cbba616202c8468cf9ba8a4f8294a7ab1dba9 F configure 9a00b21dfd13757bbfb8d89b30660a89ec1f8f3a79402b8f9f9b6fc475c3303a x F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P ec71d9dcd582188d7fb4ab945187de1023eaaecffeeb2903a6fcc49650bd21e9 -R 7b8d1f95b47e47a5d559070e34819714 -U drh -Z 470d847ca31236034508764b46198386 +P 23c7d5bea351c04785153ddb30e19c1236db9d11054ab8229893531026b53655 +R ba9c9d617d2000ba71d01bbdea8f462f +U stephan +Z 94fb984dd769f6092f86cd16435effad # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 793cb84d2a..dcfee8e9d0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -23c7d5bea351c04785153ddb30e19c1236db9d11054ab8229893531026b53655 +3c990d77cb83ab371d92c97e0528f790ab6126c60f48ff77e48bd166d7834cf0 From 8dacf71043d9ed61f32a5a643b89cea8460254a3 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 30 Jan 2025 13:54:32 +0000 Subject: [PATCH 140/220] Updates to the compile-for-windows.md document. FossilOrigin-Name: bcd22ed686954657ba820d53dec255d33797924f76e57b931016813581e04e06 --- doc/compile-for-windows.md | 9 +++++++-- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/doc/compile-for-windows.md b/doc/compile-for-windows.md index 717569dd78..2e62286339 100644 --- a/doc/compile-for-windows.md +++ b/doc/compile-for-windows.md @@ -43,8 +43,13 @@ systems, including MacOS. or .
        10. Untar or unzip the source archive. CD into the "win/" subfolder of the source tree. -
        11. Run: `nmake /f makefile.vc release` -
        12. Run: `nmake /f makefile.vc INSTALLDIR=c:\Tcl install` +
        13. Run: `nmake /f makefile.vc INSTALLDIR=c:\Tcl release` +
        14. Run: `nmake /f makefile.vc INSTALLDIR=c:\Tcl install`
          + Notes: +
            +
          1. The previous two `nmake` commands must be run separately. +
          2. Also, the INSTALLDIR=... argument is required on both. +
        15. Optional: CD to `c:\Tcl\bin` and make a copy of `tclsh90.exe` over into just `tclsh.exe`.
        16. Optional: diff --git a/manifest b/manifest index ce04412697..12685bd00c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\scode\sde-duplication\sacross\sthe\stop-level\sauto.def\sand\sautoconf/auto.def. -D 2025-01-30T12:19:30.898 +C Updates\sto\sthe\scompile-for-windows.md\sdocument. +D 2025-01-30T13:54:32.680 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -56,7 +56,7 @@ F configure 9a00b21dfd13757bbfb8d89b30660a89ec1f8f3a79402b8f9f9b6fc475c3303a x F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad F doc/F2FS.txt c1d4a0ae9711cfe0e1d8b019d154f1c29e0d3abfe820787ba1e9ed7691160fcd F doc/compile-for-unix.md c9dce1ddd4bf0d25efccc5c63eb047e78c01ce06a6ff29c73e0a8af4a0f4adbc -F doc/compile-for-windows.md 31cddda1d5f34027f1f2b7484d580e7558f22a9875884805b6fdc84d56cab848 +F doc/compile-for-windows.md 5141661e783c9ca9e3fd30e813345898712f5c311d71316f183db87038fa28a6 F doc/json-enhancements.md e356fc834781f1f1aa22ee300027a270b2c960122468499bf347bb123ce1ea4f F doc/jsonb.md 5fab4b8613aa9153fbeb6259297bd4697988af8b3d23900deba588fa7841456b F doc/lemon.html 8b266ff711d2ec7f867c3dca37634963f48a630329908cc282beebfa8c708706 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 23c7d5bea351c04785153ddb30e19c1236db9d11054ab8229893531026b53655 -R ba9c9d617d2000ba71d01bbdea8f462f -U stephan -Z 94fb984dd769f6092f86cd16435effad +P 3c990d77cb83ab371d92c97e0528f790ab6126c60f48ff77e48bd166d7834cf0 +R ee4011e86e18eda74626e7b7a4c214d1 +U drh +Z c0301aa5783297a36ea33255b63dc517 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index dcfee8e9d0..f3cfcb9994 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3c990d77cb83ab371d92c97e0528f790ab6126c60f48ff77e48bd166d7834cf0 +bcd22ed686954657ba820d53dec255d33797924f76e57b931016813581e04e06 From 000e39e9a891e2559c8194c2d2f0a30d99782f70 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 30 Jan 2025 16:00:28 +0000 Subject: [PATCH 141/220] Improvements to the TCL interface for Tcl9 as suggested by Jan Nijtmans. FossilOrigin-Name: d76c5db866de2732b68401a4c3e39acddc7a99bed965160c1796477c062b478a --- main.mk | 2 +- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/tclsqlite.c | 4 +++- tool/buildtclext.tcl | 2 +- 5 files changed, 14 insertions(+), 12 deletions(-) diff --git a/main.mk b/main.mk index 1def7d1d0d..f2212c4f11 100644 --- a/main.mk +++ b/main.mk @@ -1507,7 +1507,7 @@ install: install-headers # libtclsqlite3... # pkgIndex.tcl: - echo 'package ifneeded sqlite3 $(PACKAGE_VERSION) [list load [file join $$dir libtclsqlite3[info sharedlibextension]] sqlite3]' > $@ + echo 'package ifneeded sqlite3 $(PACKAGE_VERSION) [list load [file join $$dir libtclsqlite3[info sharedlibextension]] Sqlite3]' > $@ pkgIndex.tcl-1: pkgIndex.tcl pkgIndex.tcl-0 pkgIndex.tcl-: tcl: pkgIndex.tcl-$(HAVE_TCL) diff --git a/manifest b/manifest index 12685bd00c..3a78112986 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Updates\sto\sthe\scompile-for-windows.md\sdocument. -D 2025-01-30T13:54:32.680 +C Improvements\sto\sthe\sTCL\sinterface\sfor\sTcl9\sas\ssuggested\sby\sJan\sNijtmans. +D 2025-01-30T16:00:28.158 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -702,7 +702,7 @@ F ext/wasm/tests/opfs/concurrency/test.js d08889a5bb6e61937d0b8cbb78c9efbefbf65a F ext/wasm/tests/opfs/concurrency/worker.js 0a8c1a3e6ebb38aabbee24f122693f1fb29d599948915c76906681bb7da1d3d2 F ext/wasm/wasmfs.make 68999f5bd8c489239592d59a420f8c627c99169bbd6fa16a404751f757b9f702 F magic.txt 5ade0bc977aa135e79e3faaea894d5671b26107cc91e70783aa7dc83f22f3ba0 -F main.mk 18b859068a43818d29172b36d624a9bc8ce8204350ebd18a9f96994970081ab9 +F main.mk 043987843e8365dbaf74dce60c11683b62e2bcfcb3122574c14a0324d37a72f3 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 F mptest/crash01.test 61e61469e257df0850df4293d7d4d6c2af301421 @@ -789,7 +789,7 @@ F src/sqliteInt.h 6f23e483be7810ea1854c8fbfbbbfae2a702529d1feb9a210a290abb445541 F src/sqliteLimit.h 1bbdbf72bd0411d003267ffebc59a262f061df5653027a75627d03f48ca30523 F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 -F src/tclsqlite.c 6a7538560adc856faea295c0f09c33a57a1cfa5c59f85ab4e12aa50dba7ff2de +F src/tclsqlite.c 0eb2b419b89a59085ea175423c24bb771fc83784313cf164e8d61e6bbddd58f6 F src/tclsqlite.h 65e2c761446e1c9fa0342b7d2612a703483643c8b6a316d12a65b745a4727395 F src/test1.c 9d2da51b4c33633e7370e4068af6d16d2c52b22a5810ec012ac32e77f8397b64 F src/test2.c 7ebc518e6735939d8979273a6f7b1d9b5702babf059f6ad62499f7f60a9eb9a3 @@ -2114,7 +2114,7 @@ F tool/GetTclKit.bat d84033c6a93dfe735d247f48ba00292a1cc284dcf69963e5e672444e045 F tool/Replace.cs 02c67258801c2fb5f63231e0ac0f220b4b36ba91 F tool/build-all-msvc.bat c817b716e0edeecaf265a6775b63e5f45c34a6544f1d4114a222701ed5ac79ab x F tool/build-shell.sh 369c4b171cc877ad974fef691e4da782b4c1e99fe8f4361316c735f64d49280f -F tool/buildtclext.tcl e82120d672b34b507e1d9cb220ce18c5c36c3ee0ff0328e35f1806ce74ed2266 +F tool/buildtclext.tcl 20726b6b73c7911baa8519a9467b4062104339a5ce57947819884525c56d79e3 F tool/cg_anno.tcl c1f875f5a4c9caca3d59937b16aff716f8b1883935f1b4c9ae23124705bc8099 x F tool/checkSpacing.c 810e51703529a204fc4e1eb060e9ab663e3c06d2 F tool/cktclsh.sh 6075eef9c6b9ba4b38fef2ca2a66d25f2311bd3c610498d18a9b01f861629cca @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 3c990d77cb83ab371d92c97e0528f790ab6126c60f48ff77e48bd166d7834cf0 -R ee4011e86e18eda74626e7b7a4c214d1 +P bcd22ed686954657ba820d53dec255d33797924f76e57b931016813581e04e06 +R d309c684cafbcb8b827c550f3c1fa4b1 U drh -Z c0301aa5783297a36ea33255b63dc517 +Z a306e9e3591ef614e7789f7fb42dc8cb # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index f3cfcb9994..1e32c2b55f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bcd22ed686954657ba820d53dec255d33797924f76e57b931016813581e04e06 +d76c5db866de2732b68401a4c3e39acddc7a99bed965160c1796477c062b478a diff --git a/src/tclsqlite.c b/src/tclsqlite.c index 76c9ef75c1..2f12f7f671 100644 --- a/src/tclsqlite.c +++ b/src/tclsqlite.c @@ -4021,7 +4021,9 @@ EXTERN int Tclsqlite_Unload(Tcl_Interp *interp, int flags){ return TCL_OK; } EXTERN int Sqlite_SafeInit(Tcl_Interp *interp){ return TCL_ERROR; } EXTERN int Sqlite_SafeUnload(Tcl_Interp *interp, int flags){return TCL_ERROR;} -/* Also variants with a lowercase "s" */ +/* Also variants with a lowercase "s". I'm told that these are +** deprecated in Tcl9, but they continue to be included for backwards +** compatibility. */ EXTERN int sqlite3_Init(Tcl_Interp *interp){ return Sqlite3_Init(interp);} EXTERN int sqlite_Init(Tcl_Interp *interp){ return Sqlite3_Init(interp);} diff --git a/tool/buildtclext.tcl b/tool/buildtclext.tcl index 26f9b6dcc9..905087d1da 100644 --- a/tool/buildtclext.tcl +++ b/tool/buildtclext.tcl @@ -289,7 +289,7 @@ if {$build} { # Tcl package index file, version ??? # package ifneeded sqlite3 $VERSION \\ - [list load [file join \$dir $OUT] sqlite3] + [list load [file join \$dir $OUT] Sqlite3] }] close $fd From 8bffd498eaac9f208f925d771fdfadd3be1e41d1 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 30 Jan 2025 16:07:51 +0000 Subject: [PATCH 142/220] Remove an unused parameter from an internal-use subroutine in the TCL interface. FossilOrigin-Name: a700692b39e24f5ca9ea6f879d413e20c2ad2b85f62c867407dafe111f13d931 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/tclsqlite.c | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 3a78112986..40bab9c95f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improvements\sto\sthe\sTCL\sinterface\sfor\sTcl9\sas\ssuggested\sby\sJan\sNijtmans. -D 2025-01-30T16:00:28.158 +C Remove\san\sunused\sparameter\sfrom\san\sinternal-use\ssubroutine\sin\sthe\sTCL\sinterface. +D 2025-01-30T16:07:51.559 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -789,7 +789,7 @@ F src/sqliteInt.h 6f23e483be7810ea1854c8fbfbbbfae2a702529d1feb9a210a290abb445541 F src/sqliteLimit.h 1bbdbf72bd0411d003267ffebc59a262f061df5653027a75627d03f48ca30523 F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 -F src/tclsqlite.c 0eb2b419b89a59085ea175423c24bb771fc83784313cf164e8d61e6bbddd58f6 +F src/tclsqlite.c 5c1e367e26711044730c93d4b81312170918a8d1fe811f45be740ab48f7de8c1 F src/tclsqlite.h 65e2c761446e1c9fa0342b7d2612a703483643c8b6a316d12a65b745a4727395 F src/test1.c 9d2da51b4c33633e7370e4068af6d16d2c52b22a5810ec012ac32e77f8397b64 F src/test2.c 7ebc518e6735939d8979273a6f7b1d9b5702babf059f6ad62499f7f60a9eb9a3 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P bcd22ed686954657ba820d53dec255d33797924f76e57b931016813581e04e06 -R d309c684cafbcb8b827c550f3c1fa4b1 +P d76c5db866de2732b68401a4c3e39acddc7a99bed965160c1796477c062b478a +R e81adcf32270498fe2fdd74c590e8f70 U drh -Z a306e9e3591ef614e7789f7fb42dc8cb +Z baccdbeebeaa149b6573e44db1cfe14f # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 1e32c2b55f..6d745253d1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d76c5db866de2732b68401a4c3e39acddc7a99bed965160c1796477c062b478a +a700692b39e24f5ca9ea6f879d413e20c2ad2b85f62c867407dafe111f13d931 diff --git a/src/tclsqlite.c b/src/tclsqlite.c index 2f12f7f671..824e8c4d3c 100644 --- a/src/tclsqlite.c +++ b/src/tclsqlite.c @@ -510,7 +510,7 @@ static int createIncrblobChannel( ** or {...} or ; to be seen anywhere. Most callback scripts consist ** of just a single procedure name and they meet this requirement. */ -static int safeToUseEvalObjv(Tcl_Interp *interp, Tcl_Obj *pCmd){ +static int safeToUseEvalObjv(Tcl_Obj *pCmd){ /* We could try to do something with Tcl_Parse(). But we will instead ** just do a search for forbidden characters. If any of the forbidden ** characters appear in pCmd, we will report the string as unsafe. @@ -2993,7 +2993,7 @@ deserialize_error: } pFunc->pScript = pScript; Tcl_IncrRefCount(pScript); - pFunc->useEvalObjv = safeToUseEvalObjv(interp, pScript); + pFunc->useEvalObjv = safeToUseEvalObjv(pScript); pFunc->eType = eType; rc = sqlite3_create_function(pDb->db, zName, nArg, flags, pFunc, tclSqlFunc, 0, 0); From 49906e8e4bfbac201532e111b5f972129ce7bafe Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 30 Jan 2025 21:12:58 +0000 Subject: [PATCH 143/220] The reuse-subroutine optimization [c9a3498113074bbc] might have generated byte-code that loops forever. This check-in fixes the problem. FossilOrigin-Name: 0cc4ed8c6e53aca1f5e94c132bedbc7f561c04a77f1a30b965ffe7560634bfeb --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/expr.c | 5 ++++- src/vdbe.h | 1 + test/in7.test | 29 +++++++++++++++++++++++++++++ 5 files changed, 43 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 40bab9c95f..99247a99ee 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\san\sunused\sparameter\sfrom\san\sinternal-use\ssubroutine\sin\sthe\sTCL\sinterface. -D 2025-01-30T16:07:51.559 +C The\sreuse-subroutine\soptimization\s[c9a3498113074bbc]\smight\shave\sgenerated\nbyte-code\sthat\sloops\sforever.\s\sThis\scheck-in\sfixes\sthe\sproblem. +D 2025-01-30T21:12:58.438 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -730,7 +730,7 @@ F src/date.c 842c08ac143a56a627b05ac51d68624f2b7b03e3b4cba596205e735eed64ee57 F src/dbpage.c e90410e5d4c0217dfddc4184a81e38ec4903c25d4ec0f201060a0e54e7c2099f F src/dbstat.c 73362c0df0f40ad5523a6f5501224959d0976757b511299bf892313e79d14f5c F src/delete.c 03a77ba20e54f0f42ebd8eddf15411ed6bdb06a2c472ac4b6b336521bf7cea42 -F src/expr.c ce83e7361454a195f8393fa0baad694e2fee6c49a44c0d6db44d8a2b92534aeb +F src/expr.c 8705be31ee713aaa43c97d91399db09f16ee41b88250406eb99de6b47f550a98 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 928ed2517e8732113d2b9821aa37af639688d752f4ea9ac6e0e393d713eeb76f F src/func.c f5b31c805679930cc5afcdfb1e657f9dd273053f52ff51133df5a448c519e5d9 @@ -850,7 +850,7 @@ F src/utf.c 8b29d9a5956569ea2700f869669b8ef67a9662ee5e724ff77ab3c387e27094ba F src/util.c e5f6a5eeaa26b69054a43bbd0048cfe3d2851f6961052b35aed8f695df922850 F src/vacuum.c b763b6457bd058d2072ef9364832351fd8d11e8abf70cbb349657360f7d55c40 F src/vdbe.c b428a751953c0c2ff85e3e152ec16e29d488895cd541c8c20876ff9f3bf6978a -F src/vdbe.h 9676348d342bd04e21e384c63b57224171ce84fac77853357334ef94c4d33cf4 +F src/vdbe.h 3d26d5c7660c5c7bd33ffb0d8784615072d8b23c81f8110870efe2631136bc89 F src/vdbeInt.h 895b1ab7536f018d3d70d690f6c0adbd1062b6dddce1c2cad912927856d4033c F src/vdbeapi.c 08d0445b6066b04e5014d5d322b75736a61fe847ed88eb6e1a186c79dd9ed117 F src/vdbeaux.c 885e16100597507fbbe09d82cbb963bff3fd8a9c1e358dc4f463fc95feb18e8b @@ -1307,7 +1307,7 @@ F test/in3.test 3cbf58c87f4052cee3a58b37b6389777505aa0c0 F test/in4.test bb767ec1cfd1730256f0a83219f0acda36bc251b63f8b8bb7d8c7cff17875a4f F test/in5.test 4fd79c70dfa0681313e8cdca07f5ff0400bdc0e20f808a5c59eaef1e4b48082a F test/in6.test f5f40d6816a8bb7c784424b58a10ac38efb76ab29127a2c17399e0cbeeda0e4b -F test/in7.test 5050b648510d88bd27ff6b40991a45e1cc277c20e258162e81650e01069a56bb +F test/in7.test d9efdee00b074a60c6343993b2eda78bc369ab080dad864513c73f8aca89d566 F test/incrblob.test c9b96afc292aeff43d6687bcb09b0280aa599822 F test/incrblob2.test a494c9e848560039a23974b9119cfc2cf3ad3bd15cc2694ee6367ae537ef8f1f F test/incrblob3.test 67621a04b3084113bf38ce03797d70eca012d9d8f948193b8f655df577b0da6f @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P d76c5db866de2732b68401a4c3e39acddc7a99bed965160c1796477c062b478a -R e81adcf32270498fe2fdd74c590e8f70 +P a700692b39e24f5ca9ea6f879d413e20c2ad2b85f62c867407dafe111f13d931 +R ceeb6c1a37b1d6d8b66aa63af2b79d4d U drh -Z baccdbeebeaa149b6573e44db1cfe14f +Z d3c9eaae04d6f46273321f256c2b9c5c # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 6d745253d1..9a908b795b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a700692b39e24f5ca9ea6f879d413e20c2ad2b85f62c867407dafe111f13d931 +0cc4ed8c6e53aca1f5e94c132bedbc7f561c04a77f1a30b965ffe7560634bfeb diff --git a/src/expr.c b/src/expr.c index fcd3da2138..8f898a1e3b 100644 --- a/src/expr.c +++ b/src/expr.c @@ -3462,6 +3462,7 @@ static int findCompatibleInRhsSubrtn( assert( pOp->opcode==OP_BeginSubrtn ); pSig = pOp->p4.pSubrtnSig; assert( pSig!=0 ); + if( !pSig->bComplete ) continue; if( pNewSig->selId!=pSig->selId ) continue; if( strcmp(pNewSig->zAff,pSig->zAff)!=0 ) continue; pExpr->y.sub.iAddr = pSig->iAddr; @@ -3508,6 +3509,7 @@ void sqlite3CodeRhsOfIN( KeyInfo *pKeyInfo = 0; /* Key information */ int nVal; /* Size of vector pLeft */ Vdbe *v; /* The prepared statement under construction */ + SubrtnSig *pSig = 0; /* Signature for this subroutine */ v = pParse->pVdbe; assert( v!=0 ); @@ -3528,7 +3530,6 @@ void sqlite3CodeRhsOfIN( ** Compute a signature for the RHS of the IN operator to facility ** finding and reusing prior instances of the same IN operator. */ - SubrtnSig *pSig = 0; assert( !ExprUseXSelect(pExpr) || pExpr->x.pSelect!=0 ); if( ExprUseXSelect(pExpr) && (pExpr->x.pSelect->selFlags & SF_All)==0 ){ pSig = sqlite3DbMallocRawNN(pParse->db, sizeof(pSig[0])); @@ -3571,6 +3572,7 @@ void sqlite3CodeRhsOfIN( pExpr->y.sub.iAddr = sqlite3VdbeAddOp2(v, OP_BeginSubrtn, 0, pExpr->y.sub.regReturn) + 1; if( pSig ){ + pSig->bComplete = 0; pSig->iAddr = pExpr->y.sub.iAddr; pSig->regReturn = pExpr->y.sub.regReturn; pSig->iTable = iTab; @@ -3706,6 +3708,7 @@ void sqlite3CodeRhsOfIN( sqlite3ReleaseTempReg(pParse, r1); sqlite3ReleaseTempReg(pParse, r2); } + if( pSig ) pSig->bComplete = 1; if( pKeyInfo ){ sqlite3VdbeChangeP4(v, addr, (void *)pKeyInfo, P4_KEYINFO); } diff --git a/src/vdbe.h b/src/vdbe.h index 71aae29a08..476f1b4ea2 100644 --- a/src/vdbe.h +++ b/src/vdbe.h @@ -40,6 +40,7 @@ typedef struct SubrtnSig SubrtnSig; */ struct SubrtnSig { int selId; /* SELECT-id for the SELECT statement on the RHS */ + u8 bComplete; /* True if fully coded and available for reusable */ char *zAff; /* Affinity of the overall IN expression */ int iTable; /* Ephemeral table generated by the subroutine */ int iAddr; /* Subroutine entry address */ diff --git a/test/in7.test b/test/in7.test index 4dc0821d18..763396140a 100644 --- a/test/in7.test +++ b/test/in7.test @@ -219,4 +219,33 @@ do_execsql_test 3.8 { SELECT t1.a, t2.b FROM t1, t2 WHERE (t1.a, t2.b) IN ((1, 2)); } {1 2} +# 2025-01-30 Inifinite loop in byte-code discovered by dbsqlfuzz +# having to do with SubrtnSig logic. The code was using a Subroutine +# from within itself resulting in infinite recursion. +# +# This test will spin forever if the bug has not been fixed, or if +# it reappears. +# +reset_db +do_execsql_test 4.0 { + CREATE TABLE t1(a INTEGER PRIMARY KEY, b); + INSERT INTO t1 VALUES(1,x'1111'); + CREATE TABLE t2(c); + CREATE TABLE t3(d); + CREATE TRIGGER t1tr UPDATE ON t1 BEGIN + UPDATE t1 SET b=x'2222' FROM t2; + UPDATE t1 + SET b = (SELECT a IN (SELECT a + FROM t1 + WHERE (b,a) IN (SELECT rowid, d + FROM t3 + ) + ) + FROM t1 NATURAL RIGHT JOIN t1 + ); + END; + UPDATE t1 SET b=x'3333'; + SELECT quote(b) FROM t1; +} {X'3333'} + finish_test From e16b3452435dd03dbae8f355feeb33385780af3d Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 31 Jan 2025 01:34:19 +0000 Subject: [PATCH 144/220] Add the SQLITE_DBCONFIG_ENABLE_COMMENTS setting (default on) to enable or disable the ability to include comments in SQL input text. FossilOrigin-Name: 393749a2e22d5c8eba36e2106a35909420aa6316652d1ab4f18ef699247b6fba --- manifest | 26 +++++++++++++------------- manifest.uuid | 2 +- src/main.c | 2 ++ src/parse.y | 13 +++++++------ src/shell.c.in | 1 + src/sqlite.h.in | 16 +++++++++++++++- src/sqliteInt.h | 1 + src/tokenize.c | 11 +++++++---- src/vtab.c | 4 +++- 9 files changed, 50 insertions(+), 26 deletions(-) diff --git a/manifest b/manifest index b2f30124f4..a93ad027de 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\sall\sthe\slatest\strunk\schanges\sinto\sthe\sextra-security\sbranch. -D 2025-01-31T00:54:59.552 +C Add\sthe\sSQLITE_DBCONFIG_ENABLE_COMMENTS\ssetting\s(default\son)\sto\senable\sor\ndisable\sthe\sability\sto\sinclude\scomments\sin\sSQL\sinput\stext. +D 2025-01-31T01:34:19.160 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -16,7 +16,7 @@ F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2 F art/sqlite370.svg 40b7e2fe8aac3add5d56dd86ab8d427a4eca5bcb3fe4f8946cb3794e1821d531 F auto.def e7e92090c98aeb0174d29988c259834eb1b71ae1ea927015c3ef300f6f9b68ae F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac -F autoconf/Makefile.in 56697ad25ecf23afa317148b06bdc14f85960b42e5ec434ac1ba87f63a3cb789 w autoconf/Makefile.am +F autoconf/Makefile.in 56697ad25ecf23afa317148b06bdc14f85960b42e5ec434ac1ba87f63a3cb789 F autoconf/Makefile.msc ffff61fe851443015ddb6600ab69a9df503cfec25459b336be7ba8c9a9e473f8 F autoconf/README.first f1d3876e9a7852c22f275a6f06814e64934cecbc0b5b9617d64849094c1fd136 F autoconf/README.txt 7f01dc3915e2d68f329011073662369e62a0938a2c69398807823c57591cb288 @@ -743,7 +743,7 @@ F src/insert.c db8bfff30fd7f71812651df3ddf5d1624b9e19104b31e349cd9055bbc9d622c4 F src/json.c 68a98c020c22127f2d65f08855f7fc7460ff352a6ce0b543d8931dde83319c22 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 7432c944ff197046d67a1207790a1b13eec4548c85a9457eb0896bb3641dfb36 -F src/main.c 84239c53aaac3aa1734eaf33a41d575c1d2494313bd8af5e6d885f0dc0547cfd +F src/main.c 59bdd8d9bbdb3a746eaef14d611ddd5638aa18acef7c5e3271e815dbd215a1af F src/malloc.c 410e570b30c26cc36e3372577df50f7a96ee3eed5b2b161c6b6b48773c650c5e F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c 3bb59158c38e05f6270e761a9f435bf19827a264c13d1631c58b84bdc96d73b2 @@ -769,7 +769,7 @@ F src/os_win.c 49c7725b500f5867e8360e75eeb30f9d70b62fa1f05c8a101da627210578df32 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 3a1c4e7f69af482e33c8cba8a75afe0dda0ea6391240adac22b040ce1bdeef44 F src/pager.h 6137149346e6c8a3ddc1eeb40aee46381e9bc8b0fcc6dda8a1efde993c2275b8 -F src/parse.y dcf45a81b61223ac93e61fdfe9b22d635dd371c446e8222634d90aa37e25e5f6 +F src/parse.y 5dce477d23c6cd41da97ff9bc4ef93fba0e0a0aaa72a15ddb8a3f71618d76cac F src/pcache.c 588cc3c5ccaaadde689ed35ce5c5c891a1f7b1f4d1f56f6cf0143b74d8ee6484 F src/pcache.h 1497ce1b823cf00094bb0cf3bac37b345937e6f910890c626b16512316d3abf5 F src/pcache1.c 49516ad7718a3626f28f710fa7448ef1fce3c07fd169acbb4817341950264319 @@ -781,11 +781,11 @@ F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c F src/resolve.c c8a5372b97b2a2e972a280676f06ddb5b74e885d3b1f5ce383f839907b57ef68 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 F src/select.c 83e88fbb36f89b6703b348777491619554f0fd6f917c9fdf51e4c2e9cda6c04e -F src/shell.c.in 9915487b27e3169d59a4018c88d14246059c392c662d98fc516264267396b65e -F src/sqlite.h.in 584579ac930f5e0c55f40cf5f2c7e4caa93e0a3aa14c4dc078a18cec66f6fde3 +F src/shell.c.in b377a59822f207106424f08aead37e78b609222e98f86f04cc8a03563ccf3237 +F src/sqlite.h.in 30a16e4f6c337803ab0917bb98d94015783a993c970ba56f5deed1dd8684e38f F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54 -F src/sqliteInt.h 64b3af946f779e1c7b58a1cdd2ec747797fe9f76f6e23d5f7c7c5896b5ea3ada +F src/sqliteInt.h 7f1b070ea3b4ab3c192be553810684f686fdb03f62f90afa2da64d4d61d91ec3 F src/sqliteLimit.h 1bbdbf72bd0411d003267ffebc59a262f061df5653027a75627d03f48ca30523 F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -841,7 +841,7 @@ F src/test_windirent.h da2e5b73c32d09905fbdd00f27cd802212a32a58ead882736fe4f5eb7 F src/test_window.c 6d80e11fba89a1796525e6f0048ff0c7789aa2c6b0b11c80827dc1437bd8ea72 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c -F src/tokenize.c fe17e03175cae35b6694d0f879e7bc3d1ddea2fd4ab148cba9bbd025b7a7bb12 +F src/tokenize.c cedfe799fc73106302078388547040698c5c5a3950f4ea1e4344e1b736c7d568 F src/treeview.c d85ce76e6d1498d781957c07cb234da6d77ce0ed2d196480d516f54dabc62279 F src/trigger.c 247e2d712d5edc6021d52a169f6ac9a9c10d7144bc4ac7ea06c1ed2aa414659f F src/update.c 0e01aa6a3edf9ec112b33eb714b9016a81241497b1fb7c3e74332f4f71756508 @@ -859,7 +859,7 @@ F src/vdbemem.c 977438546df236c6a3e7d8b4fe86c0643c13b89b00235db1f11c3a91a4796d30 F src/vdbesort.c d0a3c7056c081703c8b6d91ad60f17da5e062a5c64bf568ed0fa1b5f4cae311f F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823 F src/vdbevtab.c fc46b9cbd759dc013f0b3724549cc0d71379183c667df3a5988f7e2f1bd485f3 -F src/vtab.c 316cd48e9320660db3047cd306cd056e4361180cebb4d0f10a39244e10c11422 +F src/vtab.c bd4ab699ac4d1ee6da7339d3fbbb5edf23d9737c1fd322ccd75984329d070472 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 4e6181d8780ab0af2e1388d0754cbe6f2f04593d2b1ab6c41699a89942fd8997 F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P fe0c58d00b491d1af7c0894f5c32542954aeea2e6510853b3bcbf13ac0bf5ce0 0cc4ed8c6e53aca1f5e94c132bedbc7f561c04a77f1a30b965ffe7560634bfeb -R 21110132d98b76250ca6d2606f60e660 +P 86ba57561a8d8c14e401c06b2345a9417053aa3a5f0c84e52460f23f5e6aa8d0 +R a8e75b45389fdcc75e19207c37dcdc78 U drh -Z a99c7811057635504d507854afc123c4 +Z 58903bc3f8cbb45b4d2beab95c7e825d # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 6b29b07123..604c9124fe 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -86ba57561a8d8c14e401c06b2345a9417053aa3a5f0c84e52460f23f5e6aa8d0 +393749a2e22d5c8eba36e2106a35909420aa6316652d1ab4f18ef699247b6fba diff --git a/src/main.c b/src/main.c index 943478d6da..6a9d03d87c 100644 --- a/src/main.c +++ b/src/main.c @@ -982,6 +982,7 @@ int sqlite3_db_config(sqlite3 *db, int op, ...){ { SQLITE_DBCONFIG_REVERSE_SCANORDER, SQLITE_ReverseOrder }, { SQLITE_DBCONFIG_ENABLE_ATTACH_CREATE, SQLITE_AttachCreate }, { SQLITE_DBCONFIG_ENABLE_ATTACH_WRITE, SQLITE_AttachWrite }, + { SQLITE_DBCONFIG_ENABLE_COMMENTS, SQLITE_Comments }, }; unsigned int i; rc = SQLITE_ERROR; /* IMP: R-42790-23372 */ @@ -3325,6 +3326,7 @@ static int openDatabase( | SQLITE_CacheSpill | SQLITE_AttachCreate | SQLITE_AttachWrite + | SQLITE_Comments #if !defined(SQLITE_TRUSTED_SCHEMA) || SQLITE_TRUSTED_SCHEMA+0!=0 | SQLITE_TrustedSchema #endif diff --git a/src/parse.y b/src/parse.y index b8d904d12c..e9e2c62e61 100644 --- a/src/parse.y +++ b/src/parse.y @@ -1882,7 +1882,8 @@ wqlist(A) ::= wqlist(A) COMMA wqitem(X). { // These must be at the end of this file. Specifically, the rules that // introduce tokens WINDOW, OVER and FILTER must appear last. This causes // the integer values assigned to these tokens to be larger than all other -// tokens that may be output by the tokenizer except TK_SPACE and TK_ILLEGAL. +// tokens that may be output by the tokenizer except TK_SPACE, TK_COMMENT, +// and TK_ILLEGAL. // %ifndef SQLITE_OMIT_WINDOWFUNC %type windowdefn_list {Window*} @@ -2059,9 +2060,9 @@ term(A) ::= QNUMBER(X). { } /* -** The TK_SPACE and TK_ILLEGAL tokens must be the last two tokens. The -** parser depends on this. Those tokens are not used in any grammar rule. -** They are only used by the tokenizer. Declare them last so that they -** are guaranteed to be the last two tokens +** The TK_SPACE, TK_COMMENT, and TK_ILLEGAL tokens must be the last three +** tokens. The parser depends on this. Those tokens are not used in any +** grammar rule. They are only used by the tokenizer. Declare them last +** so that they are guaranteed to be the last three. */ -%token SPACE ILLEGAL. +%token SPACE COMMENT ILLEGAL. diff --git a/src/shell.c.in b/src/shell.c.in index be6508fb1f..fcc9316b00 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -8727,6 +8727,7 @@ static int do_meta_command(char *zLine, ShellState *p){ } aDbConfig[] = { { "attach_create", SQLITE_DBCONFIG_ENABLE_ATTACH_CREATE }, { "attach_write", SQLITE_DBCONFIG_ENABLE_ATTACH_WRITE }, + { "comments", SQLITE_DBCONFIG_ENABLE_COMMENTS }, { "defensive", SQLITE_DBCONFIG_DEFENSIVE }, { "dqs_ddl", SQLITE_DBCONFIG_DQS_DDL }, { "dqs_dml", SQLITE_DBCONFIG_DQS_DML }, diff --git a/src/sqlite.h.in b/src/sqlite.h.in index b8f4ba3cbf..a17c2c5b5f 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -2558,6 +2558,19 @@ struct sqlite3_mem_methods { ** after processing the first argument. ** ** +** [[SQLITE_DBCONFIG_ENABLE_ATTACH_WRITE]] +**
          SQLITE_DBCONFIG_ENABLE_COMMENTS
          +**
          The SQLITE_DBCONFIG_ENABLE_COMMENTS option enables or disables the +** ability to include comments in SQL text. Comments are enabled by default, +** but can be disabled, using the current DBCONFIG option if desired. +** This option takes two arguments which are an integer and a pointer +** to an integer. The first argument is 1, 0, or -1 to enable, disable, or +** leave unchanged the ability to use comments in SQL text, +** respectively. If the second argument is not NULL, then 0 or 1 is written +** into the integer that the second argument points to depending on if +** comments are allowed in SQL text after processing the first argument. +**
          +** ** */ #define SQLITE_DBCONFIG_MAINDBNAME 1000 /* const char* */ @@ -2582,7 +2595,8 @@ struct sqlite3_mem_methods { #define SQLITE_DBCONFIG_REVERSE_SCANORDER 1019 /* int int* */ #define SQLITE_DBCONFIG_ENABLE_ATTACH_CREATE 1020 /* int int* */ #define SQLITE_DBCONFIG_ENABLE_ATTACH_WRITE 1021 /* int int* */ -#define SQLITE_DBCONFIG_MAX 1021 /* Largest DBCONFIG */ +#define SQLITE_DBCONFIG_ENABLE_COMMENTS 1022 /* int int* */ +#define SQLITE_DBCONFIG_MAX 1022 /* Largest DBCONFIG */ /* ** CAPI3REF: Enable Or Disable Extended Result Codes diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 8c1be72c11..a37e0523ad 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1836,6 +1836,7 @@ struct sqlite3 { #define SQLITE_FkNoAction HI(0x00008) /* Treat all FK as NO ACTION */ #define SQLITE_AttachCreate HI(0x00010) /* ATTACH allowed to create new dbs */ #define SQLITE_AttachWrite HI(0x00020) /* ATTACH allowed to open for write */ +#define SQLITE_Comments HI(0x00040) /* Enable SQL comments */ /* Flags used only if debugging */ #ifdef SQLITE_DEBUG diff --git a/src/tokenize.c b/src/tokenize.c index b49b2aa16e..901a4f0384 100644 --- a/src/tokenize.c +++ b/src/tokenize.c @@ -288,7 +288,7 @@ int sqlite3GetToken(const unsigned char *z, int *tokenType){ case CC_MINUS: { if( z[1]=='-' ){ for(i=2; (c=z[i])!=0 && c!='\n'; i++){} - *tokenType = TK_SPACE; /* IMP: R-22934-25134 */ + *tokenType = TK_COMMENT; return i; }else if( z[1]=='>' ){ *tokenType = TK_PTR; @@ -324,7 +324,7 @@ int sqlite3GetToken(const unsigned char *z, int *tokenType){ } for(i=3, c=z[2]; (c!='*' || z[i]!='/') && (c=z[i])!=0; i++){} if( c ) i++; - *tokenType = TK_SPACE; /* IMP: R-22934-25134 */ + *tokenType = TK_COMMENT; return i; } case CC_PERCENT: { @@ -653,12 +653,12 @@ int sqlite3RunParser(Parse *pParse, const char *zSql){ if( tokenType>=TK_WINDOW ){ assert( tokenType==TK_SPACE || tokenType==TK_OVER || tokenType==TK_FILTER || tokenType==TK_ILLEGAL || tokenType==TK_WINDOW - || tokenType==TK_QNUMBER + || tokenType==TK_QNUMBER || tokenType==TK_COMMENT ); #else if( tokenType>=TK_SPACE ){ assert( tokenType==TK_SPACE || tokenType==TK_ILLEGAL - || tokenType==TK_QNUMBER + || tokenType==TK_QNUMBER || tokenType==TK_COMMENT ); #endif /* SQLITE_OMIT_WINDOWFUNC */ if( AtomicLoad(&db->u1.isInterrupted) ){ @@ -692,6 +692,9 @@ int sqlite3RunParser(Parse *pParse, const char *zSql){ assert( n==6 ); tokenType = analyzeFilterKeyword((const u8*)&zSql[6], lastTokenParsed); #endif /* SQLITE_OMIT_WINDOWFUNC */ + }else if( tokenType==TK_COMMENT && (db->flags & SQLITE_Comments)!=0 ){ + zSql += n; + continue; }else if( tokenType!=TK_QNUMBER ){ Token x; x.z = zSql; diff --git a/src/vtab.c b/src/vtab.c index 76ad3613e8..09f0c2d7f1 100644 --- a/src/vtab.c +++ b/src/vtab.c @@ -830,7 +830,9 @@ int sqlite3_declare_vtab(sqlite3 *db, const char *zCreateTable){ z = (const unsigned char*)zCreateTable; for(i=0; aKeyword[i]; i++){ int tokenType = 0; - do{ z += sqlite3GetToken(z, &tokenType); }while( tokenType==TK_SPACE ); + do{ + z += sqlite3GetToken(z, &tokenType); + }while( tokenType==TK_SPACE || tokenType==TK_COMMENT ); if( tokenType!=aKeyword[i] ){ sqlite3ErrorWithMsg(db, SQLITE_ERROR, "syntax error"); return SQLITE_ERROR; From 80cf9fa00b48dc02167dc58e22cac0f864aa2a05 Mon Sep 17 00:00:00 2001 From: stephan Date: Fri, 31 Jan 2025 11:45:55 +0000 Subject: [PATCH 145/220] Correct a typo in tool/emcc.sh.in which could cause all of the configure-time work to locate the emcc binary to go unused. Reported in [forum:feb325cdde5b6f37|forum post feb325cdde5b6f37]. FossilOrigin-Name: f66efd5b531210407ee8f30cdf6684a7610479fd8810a609c54469f7424a0644 --- manifest | 14 +++++++------- manifest.uuid | 2 +- tool/emcc.sh.in | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 99247a99ee..8b4cea2463 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\sreuse-subroutine\soptimization\s[c9a3498113074bbc]\smight\shave\sgenerated\nbyte-code\sthat\sloops\sforever.\s\sThis\scheck-in\sfixes\sthe\sproblem. -D 2025-01-30T21:12:58.438 +C Correct\sa\stypo\sin\stool/emcc.sh.in\swhich\scould\scause\sall\sof\sthe\sconfigure-time\swork\sto\slocate\sthe\semcc\sbinary\sto\sgo\sunused.\sReported\sin\s[forum:feb325cdde5b6f37|forum\spost\sfeb325cdde5b6f37]. +D 2025-01-31T11:45:55.505 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -2123,7 +2123,7 @@ F tool/custom.txt 24ed55e71c5edae0067ba159bbf09240d58b160331f7716e95816cd3aa0ba5 F tool/dbhash.c 5da0c61032d23d74f2ab84ffc5740f0e8abec94f2c45c0b4306be7eb3ae96df0 F tool/dbtotxt.c ca48d34eaca6d6b6e4bd6a7be2b72caf34475869054240244c60fa7e69a518d6 F tool/dbtotxt.md c9a57af8739957ef36d2cfad5c4b1443ff3688ed33e4901ee200c8b651f43f3c -F tool/emcc.sh.in 1f3226166bad1765c0bf42fac3d29037704c2078eb22562f9ddfbe73bff023b0 +F tool/emcc.sh.in 41a049468c8155433e37e656ba5bae063a000768b1d627025f277732c4e7c4a4 F tool/enlargedb.c 3e8b2612b985cfa7e3e8800031ee191b43ae80de96abb5abbd5eada62651ee21 F tool/extract-sqlite3h.tcl 069ceab0cee26cba99952bfa08c0b23e35941c837acabe143f0c355d96c9e2eb x F tool/extract.c 054069d81b095fbdc189a6f5d4466e40380505e2 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P a700692b39e24f5ca9ea6f879d413e20c2ad2b85f62c867407dafe111f13d931 -R ceeb6c1a37b1d6d8b66aa63af2b79d4d -U drh -Z d3c9eaae04d6f46273321f256c2b9c5c +P 0cc4ed8c6e53aca1f5e94c132bedbc7f561c04a77f1a30b965ffe7560634bfeb +R 33175d85adee97e4106b94e4e3599ceb +U stephan +Z 85e214e0c7f56349a858ab72083d0810 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 9a908b795b..102a5265df 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0cc4ed8c6e53aca1f5e94c132bedbc7f561c04a77f1a30b965ffe7560634bfeb +f66efd5b531210407ee8f30cdf6684a7610479fd8810a609c54469f7424a0644 diff --git a/tool/emcc.sh.in b/tool/emcc.sh.in index 1263e1b0ea..1264df5376 100644 --- a/tool/emcc.sh.in +++ b/tool/emcc.sh.in @@ -63,4 +63,4 @@ if [ x = "x${emcc}" ]; then fi fi -exec emcc "$@" +exec $emcc "$@" From 824a5bfcf059cb35de6226484667a5677a8c9558 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 31 Jan 2025 12:09:36 +0000 Subject: [PATCH 146/220] Improvements to the SQLITE_DBCONFIG option documentation. FossilOrigin-Name: 59f0ba10062a6ccfd56061a16af3436b9e1b9d23378bff3302bcf33bb3137cb9 --- manifest | 12 +++--- manifest.uuid | 2 +- src/sqlite.h.in | 105 ++++++++++++++++++++++++++++++------------------ 3 files changed, 74 insertions(+), 45 deletions(-) diff --git a/manifest b/manifest index a93ad027de..2ee13706dc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\sSQLITE_DBCONFIG_ENABLE_COMMENTS\ssetting\s(default\son)\sto\senable\sor\ndisable\sthe\sability\sto\sinclude\scomments\sin\sSQL\sinput\stext. -D 2025-01-31T01:34:19.160 +C Improvements\sto\sthe\sSQLITE_DBCONFIG\soption\sdocumentation. +D 2025-01-31T12:09:36.393 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -782,7 +782,7 @@ F src/resolve.c c8a5372b97b2a2e972a280676f06ddb5b74e885d3b1f5ce383f839907b57ef68 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 F src/select.c 83e88fbb36f89b6703b348777491619554f0fd6f917c9fdf51e4c2e9cda6c04e F src/shell.c.in b377a59822f207106424f08aead37e78b609222e98f86f04cc8a03563ccf3237 -F src/sqlite.h.in 30a16e4f6c337803ab0917bb98d94015783a993c970ba56f5deed1dd8684e38f +F src/sqlite.h.in 6bdaf7c577fba45afef371ba69852de9965e23e8b13b9aa099d90281bf0c1e54 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54 F src/sqliteInt.h 7f1b070ea3b4ab3c192be553810684f686fdb03f62f90afa2da64d4d61d91ec3 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 86ba57561a8d8c14e401c06b2345a9417053aa3a5f0c84e52460f23f5e6aa8d0 -R a8e75b45389fdcc75e19207c37dcdc78 +P 393749a2e22d5c8eba36e2106a35909420aa6316652d1ab4f18ef699247b6fba +R 13662bcaa4e43096d085a0dc17072d0e U drh -Z 58903bc3f8cbb45b4d2beab95c7e825d +Z e7786de21407765a3ba181d8f27262b9 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 604c9124fe..6c5aac8ed5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -393749a2e22d5c8eba36e2106a35909420aa6316652d1ab4f18ef699247b6fba +59f0ba10062a6ccfd56061a16af3436b9e1b9d23378bff3302bcf33bb3137cb9 diff --git a/src/sqlite.h.in b/src/sqlite.h.in index a17c2c5b5f..58482f81cb 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -2223,8 +2223,12 @@ struct sqlite3_mem_methods { **
          ** [[SQLITE_DBCONFIG_LOOKASIDE]] **
          SQLITE_DBCONFIG_LOOKASIDE
          -**
          ^This option takes three additional arguments that determine the -** [lookaside memory allocator] configuration for the [database connection]. +**
          The SQLITE_DBCONFIG_LOOKASIDE option is used to adjust the +** configuration of the lookaside memory allocator within a database +** connection. +** The arguments to the SQLITE_DBCONFIG_LOOKASIDE option are not +** in the [DBCONFIG arguments|usual format]. +** The SQLITE_DBCONFIG_LOOKASIDE option takes three arguments, not two. ** ^The first argument (the third parameter to [sqlite3_db_config()] is a ** pointer to a memory buffer to use for lookaside memory. ** ^The first argument after the SQLITE_DBCONFIG_LOOKASIDE verb @@ -2247,7 +2251,8 @@ struct sqlite3_mem_methods { ** [[SQLITE_DBCONFIG_ENABLE_FKEY]] **
          SQLITE_DBCONFIG_ENABLE_FKEY
          **
          ^This option is used to enable or disable the enforcement of -** [foreign key constraints]. There should be two additional arguments. +** [foreign key constraints]. This is the same setting that is +** enabled or disabled by the [PRAGMA foreign_keys] statement. ** The first argument is an integer which is 0 to disable FK enforcement, ** positive to enable FK enforcement or negative to leave FK enforcement ** unchanged. The second parameter is a pointer to an integer into which @@ -2269,13 +2274,13 @@ struct sqlite3_mem_methods { **

          Originally this option disabled all triggers. ^(However, since ** SQLite version 3.35.0, TEMP triggers are still allowed even if ** this option is off. So, in other words, this option now only disables -** triggers in the main database schema or in the schemas of ATTACH-ed +** triggers in the main database schema or in the schemas of [ATTACH]-ed ** databases.)^

          ** ** [[SQLITE_DBCONFIG_ENABLE_VIEW]] **
          SQLITE_DBCONFIG_ENABLE_VIEW
          **
          ^This option is used to enable or disable [CREATE VIEW | views]. -** There should be two additional arguments. +** There must be two additional arguments. ** The first argument is an integer which is 0 to disable views, ** positive to enable views or negative to leave the setting unchanged. ** The second parameter is a pointer to an integer into which @@ -2294,7 +2299,7 @@ struct sqlite3_mem_methods { **
          ^This option is used to enable or disable the ** [fts3_tokenizer()] function which is part of the ** [FTS3] full-text search engine extension. -** There should be two additional arguments. +** There must be two additional arguments. ** The first argument is an integer which is 0 to disable fts3_tokenizer() or ** positive to enable fts3_tokenizer() or negative to leave the setting ** unchanged. @@ -2309,7 +2314,7 @@ struct sqlite3_mem_methods { ** interface independently of the [load_extension()] SQL function. ** The [sqlite3_enable_load_extension()] API enables or disables both the ** C-API [sqlite3_load_extension()] and the SQL function [load_extension()]. -** There should be two additional arguments. +** There must be two additional arguments. ** When the first argument to this interface is 1, then only the C-API is ** enabled and the SQL function remains disabled. If the first argument to ** this interface is 0, then both the C-API and the SQL function are disabled. @@ -2323,22 +2328,27 @@ struct sqlite3_mem_methods { ** ** [[SQLITE_DBCONFIG_MAINDBNAME]]
          SQLITE_DBCONFIG_MAINDBNAME
          **
          ^This option is used to change the name of the "main" database -** schema. ^The sole argument is a pointer to a constant UTF8 string -** which will become the new schema name in place of "main". ^SQLite -** does not make a copy of the new main schema name string, so the application -** must ensure that the argument passed into this DBCONFIG option is unchanged +** schema. This option does not follow the +** [DBCONFIG arguments|usual SQLITE_DBCONFIG argument format]. +** This option takes exactly one argument, which ust be a pointer +** to a constant UTF8 string which will become the new schema name +** in place of "main". ^SQLite does not make a copy of the new main +** schema name string, so the application must ensure that the argument +** passed into SQLITE_DBCONFIG MAINDBNAME is unchanged ** until after the database connection closes. **
          ** ** [[SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE]] **
          SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE
          -**
          Usually, when a database in wal mode is closed or detached from a -** database handle, SQLite checks if this will mean that there are now no -** connections at all to the database. If so, it performs a checkpoint -** operation before closing the connection. This option may be used to -** override this behavior. The first parameter passed to this operation -** is an integer - positive to disable checkpoints-on-close, or zero (the -** default) to enable them, and negative to leave the setting unchanged. +**
          Usually, when a database in [WAL mode] is closed or detached from a +** database handle, SQLite checks if if there are other connections to the +** same database, and if there are no other database connection (if the +** connection being closed is the last open connection to the database), +** then SQLite performs a [checkpoint] before closing the connection and +** deletes the WAL file. The SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE option can +** be used to override that behavior. The first parameter passed to this +** operation is an integer - positive to disable checkpoints-on-close, or +** zero (the default) to enable them, and negative to leave the setting unchanged. ** The second parameter is a pointer to an integer ** into which is written 0 or 1 to indicate whether checkpoints-on-close ** have been disabled - 0 if they are not disabled, 1 if they are. @@ -2500,7 +2510,7 @@ struct sqlite3_mem_methods { ** statistics. For statistics to be collected, the flag must be set on ** the database handle both when the SQL statement is prepared and when it ** is stepped. The flag is set (collection of statistics is enabled) -** by default. This option takes two arguments: an integer and a pointer to +** by default.

          This option takes two arguments: an integer and a pointer to ** an integer.. The first argument is 1, 0, or -1 to enable, disable, or ** leave unchanged the statement scanstatus option. If the second argument ** is not NULL, then the value of the statement scanstatus setting after @@ -2514,7 +2524,7 @@ struct sqlite3_mem_methods { ** in which tables and indexes are scanned so that the scans start at the end ** and work toward the beginning rather than starting at the beginning and ** working toward the end. Setting SQLITE_DBCONFIG_REVERSE_SCANORDER is the -** same as setting [PRAGMA reverse_unordered_selects]. This option takes +** same as setting [PRAGMA reverse_unordered_selects].

          This option takes ** two arguments which are an integer and a pointer to an integer. The first ** argument is 1, 0, or -1 to enable, disable, or leave unchanged the ** reverse scan order flag, respectively. If the second argument is not NULL, @@ -2525,11 +2535,12 @@ struct sqlite3_mem_methods { ** ** [[SQLITE_DBCONFIG_ENABLE_ATTACH_CREATE]] **

          SQLITE_DBCONFIG_ENABLE_ATTACH_CREATE
          -**
          The SQLITE_DBCONFIG_ENABLE_ATTACH_CREATE option enables the ability -** of the [ATTACH DATABASE] SQL command to create a new database if the -** database filed named by the SQL command does not already exist. This -** ability of [ATTACH] to create a new database is enabled by default, but -** can be disabled, using the current DBCONFIG option if desired. +**
          The SQLITE_DBCONFIG_ENABLE_ATTACH_CREATE option enables or disables +** the ability of the [ATTACH DATABASE] SQL command to create a new database +** file if the database filed named in the ATTACH command does not already +** exist. This ability of ATTACH to create a new database is enabled by +** default. Applications can disable or reenable the ability for ATTACH to +** create new database files using this DBCONFIG option.

          ** This option takes two arguments which are an integer and a pointer ** to an integer. The first argument is 1, 0, or -1 to enable, disable, or ** leave unchanged the attach-create flag, respectively. If the second @@ -2540,29 +2551,30 @@ struct sqlite3_mem_methods { ** ** [[SQLITE_DBCONFIG_ENABLE_ATTACH_WRITE]] **

          SQLITE_DBCONFIG_ENABLE_ATTACH_WRITE
          -**
          The SQLITE_DBCONFIG_ENABLE_ATTACH_WRITE option enables the ability -** of the [ATTACH DATABASE] SQL command to create a new database that is -** open for writing. This capability is enabled by default, but -** can be disabled, using the current DBCONFIG option if desired. If this -** capability is disabled, the [ATTACH] command will still work, but the -** database is opened read-only. If this option is disabled, then the -** ability to create a new database using [ATTACH] is also disabled, +**
          The SQLITE_DBCONFIG_ENABLE_ATTACH_WRITE option enables or disables the +** ability of the [ATTACH DATABASE] SQL command to open a database for writing. +** This capability is enabled by default. Applications can disable or +** reenable this capability using the current DBCONFIG option. If the +** the this capability is disabled, the [ATTACH] command will still work, +** but the database will be opened read-only. If this option is disabled, +** then the ability to create a new database using [ATTACH] is also disabled, ** regardless of the value of the [SQLITE_DBCONFIG_ENABLE_ATTACH_CREATE] -** option. +** option.

          ** This option takes two arguments which are an integer and a pointer ** to an integer. The first argument is 1, 0, or -1 to enable, disable, or ** leave unchanged the ability to ATTACH another database for writing, ** respectively. If the second argument is not NULL, then 0 or 1 is written -** into the integer that the second argument points to depending on if the -** ability to ATTACH a read/write database is set +** into the integer to which the second argument points, depending on whether +** the ability to ATTACH a read/write database is enabled or disabled ** after processing the first argument. **

          ** -** [[SQLITE_DBCONFIG_ENABLE_ATTACH_WRITE]] +** [[SQLITE_DBCONFIG_ENABLE_COMMENTS]] **
          SQLITE_DBCONFIG_ENABLE_COMMENTS
          **
          The SQLITE_DBCONFIG_ENABLE_COMMENTS option enables or disables the -** ability to include comments in SQL text. Comments are enabled by default, -** but can be disabled, using the current DBCONFIG option if desired. +** ability to include comments in SQL text. Comments are enabled by default. +** An application can disable or reenable comments in SQL text using this +** DBCONFIG option.

          ** This option takes two arguments which are an integer and a pointer ** to an integer. The first argument is 1, 0, or -1 to enable, disable, or ** leave unchanged the ability to use comments in SQL text, @@ -2572,6 +2584,23 @@ struct sqlite3_mem_methods { **

          ** **
          +** +** [[DBCONFIG arguments]]

          Arguments To SQLITE_DBCONFIG Options

          +** +**

          Most of the SQLITE_DBCONFIG options take two argument, an integer +** and a pointer to an integer. If the first integer argument is 1, then +** the option becomes enabled. If the first integer argument is 0, then the +** option is disabled. If the first argument is -1, then the option setting +** is unchanged. The second argument, the pointer to an integer, may be NULL. +** If the second argument is not NULL, then a value of 0 or 1 is written into +** the integer to which the second argument points, depending on whether the +** setting is disabled or enabled after applying any changes specified by +** the first argument. +** +**

          While most SQLITE_DBCONFIG options use the argument format +** described in the previous paragraph, the [SQLITE_DBCONFIG_MAINDBNAME] +** and [SQLITE_DBCONFIG_LOOKASIDE] options are different. See the +** documentation of those exceptional options for details. */ #define SQLITE_DBCONFIG_MAINDBNAME 1000 /* const char* */ #define SQLITE_DBCONFIG_LOOKASIDE 1001 /* void* int int */ From efbf4815411adc7c63f7caf49c5f60cb6cccaaca Mon Sep 17 00:00:00 2001 From: stephan Date: Fri, 31 Jan 2025 12:30:37 +0000 Subject: [PATCH 147/220] Minor wasm-specific doc touchups. FossilOrigin-Name: 56b618da9073db8b8d5dafa177a3c9e4c4d927bf512e14b0e6d23937f91ce4cf --- ext/wasm/README-dist.txt | 12 ++++++++---- ext/wasm/README.md | 9 +++++---- ext/wasm/api/README.md | 24 ++++++++++++++---------- manifest | 16 ++++++++-------- manifest.uuid | 2 +- 5 files changed, 36 insertions(+), 27 deletions(-) diff --git a/ext/wasm/README-dist.txt b/ext/wasm/README-dist.txt index 6656a2072a..4a527fc5ef 100644 --- a/ext/wasm/README-dist.txt +++ b/ext/wasm/README-dist.txt @@ -31,16 +31,20 @@ build: use of and is not demonstrated here. Browsers will not serve WASM files from file:// URLs, so the test and -demonstration apps require a web server and that server must include -the following headers in its response when serving the files: +demonstration apps require a web server and that server must, for the +OPFS[^1]-related features, include the following headers in its response +when serving the files: Cross-Origin-Opener-Policy: same-origin Cross-Origin-Embedder-Policy: require-corp -The core library will function without those headers but certain -features, most notably OPFS storage, will not be available. +Most functionality will work without those headers but the OPFS[^1] +storage capability will not be available without them. One simple way to get the demo apps up and running on Unix-style systems is to install althttpd (https://sqlite.org/althttpd) and run: althttpd --enable-sab --page index.html + + +[^1]: https://developer.mozilla.org/en-US/docs/Web/API/File_System_API/Origin_private_file_system diff --git a/ext/wasm/README.md b/ext/wasm/README.md index 21330f0eba..c41e54bd2a 100644 --- a/ext/wasm/README.md +++ b/ext/wasm/README.md @@ -35,7 +35,7 @@ after upgrading it! Our build process makes no guarantees about which Emscripten version(s) will or won't work, but it's important that production builds are built using a compatible version. During active development, the EMSDK is frequently updated, the goal being to keep -sqlite3.wasm working with "the latest" EMSDK.) +`sqlite3.wasm` working with "the latest" EMSDK.) The SQLite configure script will search for the EMSDK. One way to ensure that it finds it is: @@ -95,14 +95,14 @@ $ make httpd That will open the system's browser and visit the index page, from which (almost) all of the test and demo applications can be accessed. (`ext/wasm/SQLTester` is not listed in that page because it's only of -real utility when it's used in conjunction with the proprietary test -suite, which most users don't have access to.) +real utility when it's used in conjunction with the project's +proprietary test suite, which most users don't have access to.) Note that when serving this app via [althttpd][], it must be a version from 2022-09-26 or newer so that it recognizes the `--enable-sab` flag, which causes althttpd to emit two HTTP response headers which are required to enable JavaScript's `SharedArrayBuffer` and `Atomics` -APIs. Those APIs are required in order to enable the OPFS-related +APIs. Those APIs are required in order to enable the [OPFS][]-related features in the apps which use them. # Testing on a remote machine that is accessed via SSH @@ -129,3 +129,4 @@ be tunneled using SSH. [emscripten]: https://emscripten.org [althttpd]: https://sqlite.org/althttpd [SharedArrayBuffer]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer +[OPFS]: https://developer.mozilla.org/en-US/docs/Web/API/File_System_API/Origin_private_file_system diff --git a/ext/wasm/api/README.md b/ext/wasm/api/README.md index ebd4aaacb1..ce7e58ebed 100644 --- a/ext/wasm/api/README.md +++ b/ext/wasm/api/README.md @@ -85,17 +85,18 @@ browser client: Installs the `sqlite3.vtab` namespace, which contain helpers for use by downstream code which creates `sqlite3_module` implementations. - **`sqlite3-vfs-opfs.c-pp.js`**\ - is an sqlite3 VFS implementation which supports the Origin-Private - FileSystem (OPFS) as a storage layer to provide persistent storage - for database files in a browser. It requires... + is an sqlite3 VFS implementation which supports the [Origin-Private + FileSystem (OPFS)][OPFS] as a storage layer to provide persistent + storage for database files in a browser. It requires... - **`sqlite3-opfs-async-proxy.js`**\ - is the asynchronous backend part of the OPFS proxy. It speaks - directly to the (async) OPFS API and channels those results back - to its synchronous counterpart. This file, because it must be - started in its own Worker, is not part of the amalgamation. + is the asynchronous backend part of the [OPFS][] proxy. It + speaks directly to the (async) OPFS API and channels those + results back to its synchronous counterpart. This file, because + it must be started in its own Worker, is not part of the + amalgamation. - **`sqlite3-vfs-opfs-sahpool.c-pp.js`**\ - is another sqlite3 VFS supporting the OPFS, but uses a completely - different approach that the above-listed one. + is another sqlite3 VFS supporting the [OPFS][], but uses a + completely different approach that the above-listed one. - **`sqlite3-api-cleanup.js`**\ The previous files do not immediately extend the library. Instead they add callback functions to be called during its @@ -152,7 +153,7 @@ into the build-generated `sqlite3.js` along with `sqlite3-api.js`. flag. This file overwrites the Emscripten-installed `sqlite3InitModule()` function with one which, after the module is loaded, also initializes the asynchronous parts of the sqlite3 - module. For example, the OPFS VFS support. + module. For example, the [OPFS][] VFS support. Preprocessing of Source Files @@ -164,3 +165,6 @@ builds. The preprocessor application itself is in [`c-pp.c`](/file/ext/wasm/c-pp.c) and the complete technical details of such preprocessing are maintained in [`GNUMakefile`](/file/ext/wasm/GNUmakefile). + + +[OPFS]: https://developer.mozilla.org/en-US/docs/Web/API/File_System_API/Origin_private_file_system diff --git a/manifest b/manifest index 8b4cea2463..6fe6f41613 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Correct\sa\stypo\sin\stool/emcc.sh.in\swhich\scould\scause\sall\sof\sthe\sconfigure-time\swork\sto\slocate\sthe\semcc\sbinary\sto\sgo\sunused.\sReported\sin\s[forum:feb325cdde5b6f37|forum\spost\sfeb325cdde5b6f37]. -D 2025-01-31T11:45:55.505 +C Minor\swasm-specific\sdoc\stouchups. +D 2025-01-31T12:30:37.066 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -620,8 +620,8 @@ F ext/session/sqlite3session.h 683ccbf16e2c2521661fc4c1cf918ce57002039efbcabcd80 F ext/session/test_session.c 12e0a2c15fd60f92da4bb29c697c9177ff0c0dbcdc5129a54c47e999f147937a F ext/wasm/EXPORTED_FUNCTIONS.fiddle.in 27450c8b8c70875a260aca55435ec927068b34cef801a96205adb81bdcefc65c F ext/wasm/GNUmakefile 47f121d057c08ba49443c06c1c51ba2572e3d5d28a06c968cf0b2ccd5878c3d3 -F ext/wasm/README-dist.txt 6382cb9548076fca472fb3330bbdba3a55c1ea0b180ff9253f084f07ff383576 -F ext/wasm/README.md 6c1dd9e4448c672f4a072c56d3ce9164b3c7dc818ea8f18b49c6834bfd5efe24 +F ext/wasm/README-dist.txt f01081a850ce38a56706af6b481e3a7878e24e42b314cfcd4b129f0f8427066a +F ext/wasm/README.md b89605f65661cf35bf034ff6d43e448cc169b8017fc105d498e33b81218b482c F ext/wasm/SQLTester/GNUmakefile e0794f676d55819951bbfae45cc5e8d7818dc460492dc317ce7f0d2eca15caff F ext/wasm/SQLTester/SQLTester.mjs 66e1adc3d79467b68e3e40614fd42c1a577c7e219ec0985db966eded52a941e5 F ext/wasm/SQLTester/SQLTester.run.mjs 57f2adb33f43f2784abbf8026c1bfd049d8013af1998e7dcb8b50c89ffc332e0 @@ -631,7 +631,7 @@ F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-core 2bcbbfe3b95c043ed6037e2708a2ee078 F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-extras fe40d6d758646e38f8b15f709044951e10884214f5453d35502100179c388c13 F ext/wasm/api/EXPORTED_FUNCTIONS.sqlite3-see fb29e62082a658f0d81102488414d422c393c4b20cc2f685b216bc566237957b F ext/wasm/api/EXPORTED_RUNTIME_METHODS.sqlite3-api 1ec3c73e7d66e95529c3c64ac3de2470b0e9e7fbf7a5b41261c367cf4f1b7287 -F ext/wasm/api/README.md 34fe11466f9c1d81b10a0469e1114e5f1c5a6365c73d80a1a6ca639a1a358b73 +F ext/wasm/api/README.md c64ec8e84449c069e0217706d9d7d31b3bd53627228b2ba0c3cddbdc2350ca66 F ext/wasm/api/extern-post-js.c-pp.js 3fcd904f1204685dea84e5ae90d8b7e65a1dcebab1e838386d8328b74cce46c9 F ext/wasm/api/extern-pre-js.js cc61c09c7a24a07dbecb4c352453c3985170cec12b4e7e7e7a4d11d43c5c8f41 F ext/wasm/api/post-js-footer.js 365405929f41ca0e6d389ed8a8da3f3c93e11d3ef43a90ae151e37fa9f75bf41 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 0cc4ed8c6e53aca1f5e94c132bedbc7f561c04a77f1a30b965ffe7560634bfeb -R 33175d85adee97e4106b94e4e3599ceb +P f66efd5b531210407ee8f30cdf6684a7610479fd8810a609c54469f7424a0644 +R ee4ef9a21aa00ca447e26df7a5840479 U stephan -Z 85e214e0c7f56349a858ab72083d0810 +Z effbdee03a11b5ac430008ff904c3705 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 102a5265df..b55f345c59 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f66efd5b531210407ee8f30cdf6684a7610479fd8810a609c54469f7424a0644 +56b618da9073db8b8d5dafa177a3c9e4c4d927bf512e14b0e6d23937f91ce4cf From a0337903030a123f09eae41a5146993ff81d83e4 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 31 Jan 2025 14:52:05 +0000 Subject: [PATCH 148/220] If any errors occur while processing sqlite_dbpage changes, cancel pending truncate operations. FossilOrigin-Name: 6138e0dc4e0e4e19cb048fe0cd969156151fdc427eee21188d2a822642aad043 --- manifest | 13 ++++++------- manifest.uuid | 2 +- src/dbpage.c | 1 + 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 1e668b1a88..d8bb70d2ca 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Three\snew\soptions\sto\ssqlite3_db_config():\s\sATTACH_CREATE,\sATTACH_WRITE,\nand\sCOMMENTS. -D 2025-01-31T13:32:03.815 +C If\sany\serrors\soccur\swhile\sprocessing\ssqlite_dbpage\schanges,\scancel\npending\struncate\soperations. +D 2025-01-31T14:52:05.955 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -727,7 +727,7 @@ F src/callback.c acae8c8dddda41ee85cfdf19b926eefe830f371069f8aadca3aa39adf5b1c85 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c d35723024b963edce9c0fad5b3303e8bb9266083784844baed10a6dedfe26f3b F src/date.c 842c08ac143a56a627b05ac51d68624f2b7b03e3b4cba596205e735eed64ee57 -F src/dbpage.c e90410e5d4c0217dfddc4184a81e38ec4903c25d4ec0f201060a0e54e7c2099f +F src/dbpage.c 2e677acb658a29965e55398bbc61161cb7819da538057c8032adac7ab8e4a8c0 F src/dbstat.c 73362c0df0f40ad5523a6f5501224959d0976757b511299bf892313e79d14f5c F src/delete.c 03a77ba20e54f0f42ebd8eddf15411ed6bdb06a2c472ac4b6b336521bf7cea42 F src/expr.c 8705be31ee713aaa43c97d91399db09f16ee41b88250406eb99de6b47f550a98 @@ -2209,9 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 56b618da9073db8b8d5dafa177a3c9e4c4d927bf512e14b0e6d23937f91ce4cf 59f0ba10062a6ccfd56061a16af3436b9e1b9d23378bff3302bcf33bb3137cb9 -R 9c4677ef318fd9ecf4b5844727767716 -T +closed 59f0ba10062a6ccfd56061a16af3436b9e1b9d23378bff3302bcf33bb3137cb9 +P 325e547a2195571ece4bb22ca65d67d8c2cb42030618916d37930666cf221917 +R 3bd4da0aa5d426accdfc728b0601224c U drh -Z 0620756e82ee0b6bee5e8e012928d482 +Z d6c5c6307ddd02cca8c78f06a45a0bc2 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 9ec94fb69f..464282d7dd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -325e547a2195571ece4bb22ca65d67d8c2cb42030618916d37930666cf221917 +6138e0dc4e0e4e19cb048fe0cd969156151fdc427eee21188d2a822642aad043 diff --git a/src/dbpage.c b/src/dbpage.c index 40ebe4f14a..eb5ab33fe1 100644 --- a/src/dbpage.c +++ b/src/dbpage.c @@ -424,6 +424,7 @@ static int dbpageUpdate( return rc; update_fail: + pTab->pgnoTrunc = 0; sqlite3_free(pVtab->zErrMsg); pVtab->zErrMsg = sqlite3_mprintf("%s", zErr); return SQLITE_ERROR; From f6ca35d88cad6521ad06c6c9e1bfe0e3066d8cbb Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 31 Jan 2025 14:52:36 +0000 Subject: [PATCH 149/220] Fix a problem with LIKE and GLOB processing in utf-16be databases in cases where the utf-8 encoding of a character ends with the byte 0xBF. FossilOrigin-Name: 4b4f33d791fe4318c4597bee7d2f9e486ed223e731982af470f5cc0dbdc600fc --- manifest | 16 +++++----- manifest.uuid | 2 +- src/whereexpr.c | 32 ++++++++++++-------- test/like3.test | 80 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 109 insertions(+), 21 deletions(-) diff --git a/manifest b/manifest index d8bb70d2ca..1632def2a1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C If\sany\serrors\soccur\swhile\sprocessing\ssqlite_dbpage\schanges,\scancel\npending\struncate\soperations. -D 2025-01-31T14:52:05.955 +C Fix\sa\sproblem\swith\sLIKE\sand\sGLOB\sprocessing\sin\sutf-16be\sdatabases\sin\scases\swhere\sthe\sutf-8\sencoding\sof\sa\scharacter\sends\swith\sthe\sbyte\s0xBF. +D 2025-01-31T14:52:36.806 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -867,7 +867,7 @@ F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 F src/where.c 09dc313e7223ca1217c39c7026b00f16ff449a8323511a762fcba7863a00f4cd F src/whereInt.h d20cddddb1d61b18d5cb1fcfa9b77fbeebbc4afe44d996e603452a23b3009ee1 F src/wherecode.c 0c3d3199a2b769a5e2bb70feb5003dc85b3d86842ecaf903a47f2b4205ca5dab -F src/whereexpr.c 0f93a29cabd3a338d09a1f5c6770620a1ac51ec1157f3229502a7e7767c60b6f +F src/whereexpr.c fd80811331cebf37a96a1bbbe93a20425eb04a925baa7c2306d72e0797a47a4c F src/window.c 2bf01f9941a64fbcead61a0e3cb5db3fca5094b30d2ff0d23274c2a81d2e2385 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 @@ -1401,7 +1401,7 @@ F test/laststmtchanges.test ae613f53819206b3222771828d024154d51db200 F test/lemon-test01.y 70110eff607ab137ccc851edb2bc7e14a6d4f246b5d2d25f82a60b69d87a9ff2 F test/like.test b3ea2ba3558199aa8f25a42ddeb54772e234fab50868c9f066047acdbda8fc58 F test/like2.test d3be15fefee3e02fc88942a9b98f26c5339bbdef7783c90023c092c4955fe3d3 -F test/like3.test a76e5938fadbe6d32807284c796bafd869974a961057bc5fc5a28e06de98745c +F test/like3.test a9d78297426279c3db1206490444f3193f579890b3c4118a52960afe2b4863cd F test/limit.test 350f5d03c29e7dff9a2cde016f84f8d368d40bcd02fa2b2a52fa10c4bf3cbfaf F test/limit2.test 9409b033284642a859fafc95f29a5a6a557bd57c1f0d7c3f554bd64ed69df77e F test/literal.test a65dca9fef86e51b8e45544268e37abbd4bb94ba35fd65f6fdcab2f288cd8f79 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 325e547a2195571ece4bb22ca65d67d8c2cb42030618916d37930666cf221917 -R 3bd4da0aa5d426accdfc728b0601224c -U drh -Z d6c5c6307ddd02cca8c78f06a45a0bc2 +P 6138e0dc4e0e4e19cb048fe0cd969156151fdc427eee21188d2a822642aad043 +R 6c74985ff3e26b84d99b79b3d7d419a0 +U dan +Z f41b656617240d39be19007efc0ec242 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 464282d7dd..afbb673c85 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6138e0dc4e0e4e19cb048fe0cd969156151fdc427eee21188d2a822642aad043 +4b4f33d791fe4318c4597bee7d2f9e486ed223e731982af470f5cc0dbdc600fc diff --git a/src/whereexpr.c b/src/whereexpr.c index 2b6eb6a78d..0a963f4f92 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -219,12 +219,12 @@ static int isLikeOrGlob( z = (u8*)pRight->u.zToken; } if( z ){ - /* Count the number of prefix bytes prior to the first wildcard. - ** or U+fffd character. If the underlying database has a UTF16LE - ** encoding, then only consider ASCII characters. Note that the - ** encoding of z[] is UTF8 - we are dealing with only UTF8 here in - ** this code, but the database engine itself might be processing - ** content using a different encoding. */ + /* Count the number of prefix bytes prior to the first wildcard, + ** U+fffd character, or malformed utf-8. If the underlying database + ** has a UTF16LE encoding, then only consider ASCII characters. Note that + ** the encoding of z[] is UTF8 - we are dealing with only UTF8 here in this + ** code, but the database engine itself might be processing content using a + ** different encoding. */ cnt = 0; while( (c=z[cnt])!=0 && c!=wc[0] && c!=wc[1] && c!=wc[2] ){ cnt++; @@ -232,7 +232,9 @@ static int isLikeOrGlob( cnt++; }else if( c>=0x80 ){ const u8 *z2 = z+cnt-1; - if( sqlite3Utf8Read(&z2)==0xfffd || ENC(db)==SQLITE_UTF16LE ){ + if( sqlite3Utf8Read(&z2)==0xfffd || c==0xFF /* bad utf-8 */ + || ENC(db)==SQLITE_UTF16LE + ){ cnt--; break; }else{ @@ -1384,9 +1386,8 @@ static void exprAnalyze( } if( !db->mallocFailed ){ - u8 c, *pC; /* Last character before the first wildcard */ + u8 *pC; /* Last character before the first wildcard */ pC = (u8*)&pStr2->u.zToken[sqlite3Strlen30(pStr2->u.zToken)-1]; - c = *pC; if( noCase ){ /* The point is to increment the last character before the first ** wildcard. But if we increment '@', that will push it into the @@ -1394,10 +1395,17 @@ static void exprAnalyze( ** inequality. To avoid this, make sure to also run the full ** LIKE on all candidate expressions by clearing the isComplete flag */ - if( c=='A'-1 ) isComplete = 0; - c = sqlite3UpperToLower[c]; + if( *pC=='A'-1 ) isComplete = 0; + *pC = sqlite3UpperToLower[*pC]; } - *pC = c + 1; + + /* Increment the value of the last utf8 character in the prefix. */ + while( *pC==0xBF && pC>(u8*)pStr2->u.zToken ){ + *pC = 0x80; + pC--; + } + assert( *pC!=0xFF ); /* isLikeOrGlob() guarantees this */ + (*pC)++; } zCollSeqName = noCase ? "NOCASE" : sqlite3StrBINARY; pNewExpr1 = sqlite3ExprDup(db, pLeft, 0); diff --git a/test/like3.test b/test/like3.test index a93e113d62..2987e0e0e2 100644 --- a/test/like3.test +++ b/test/like3.test @@ -275,4 +275,84 @@ do_eqp_test like3-6.240 { } } +#------------------------------------------------------------------------- + +ifcapable utf16 { + reset_db + do_execsql_test like3-7.0 { + PRAGMA encoding = 'UTF-16be'; + + CREATE TABLE Example(word TEXT NOT NULL); + CREATE INDEX Example_word on Example(word); + + INSERT INTO Example VALUES(char(0x307F)); + } + + do_execsql_test like3-7.1 { + SELECT char(0x307F)=='み'; + } {1} + + do_execsql_test like3-7.1 { + SELECT * FROM Example WHERE word GLOB 'み*' + } {み} + + do_execsql_test like3-7.2 { + SELECT * FROM Example WHERE word >= char(0x307F) AND word < char(0x3080); + } {み} +} + +#------------------------------------------------------------------------- +reset_db + +foreach enc { + UTF-8 + UTF-16le + UTF-16be +} { + foreach {tn expr} { + 1 "CAST (X'FF' AS TEXT)" + 2 "CAST (X'FFBF' AS TEXT)" + 3 "CAST (X'FFBFBF' AS TEXT)" + 4 "CAST (X'FFBFBFBF' AS TEXT)" + + 5 "'abc' || CAST (X'FF' AS TEXT)" + 6 "'def' || CAST (X'FFBF' AS TEXT)" + 7 "'ghi' || CAST (X'FFBFBF' AS TEXT)" + 8 "'jkl' || CAST (X'FFBFBFBF' AS TEXT)" + } { + reset_db + execsql "PRAGMA encoding = '$enc'" + do_execsql_test like3-8.$tn.0 { + CREATE TABLE t1(x); + } + + do_execsql_test like3-8.$tn.1 { + PRAGMA encoding + } $enc + + do_execsql_test like3-8.$tn.1 " + INSERT INTO t1 VALUES( $expr ) + " + + do_execsql_test like3-8.$tn.2 { + SELECT typeof(x) FROM t1 + } {text} + + set x [db one {SELECT x || '%' FROM t1}] + + do_execsql_test like3-8.$tn.3 { + SELECT rowid FROM t1 WHERE x LIKE $x + } 1 + + do_execsql_test like3-8.$tn.4 { + CREATE INDEX i1 ON t1(x); + } + + do_execsql_test like3-8.$tn.5 { + SELECT rowid FROM t1 WHERE x LIKE $x + } 1 + } +} + finish_test + From 8fbf400bb0b6d094eaf8b7e17c02a6ad624f5708 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 31 Jan 2025 18:33:37 +0000 Subject: [PATCH 150/220] Remove an assert() that is not true if a trace-callback is deregistered while there are active statements. FossilOrigin-Name: 0ecfc4d0ebdb272a69f8f98ddb069c7e0735fb899804027eb16f241d83b3d046 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbeapi.c | 1 - test/trace3.test | 16 ++++++++++++++++ 4 files changed, 24 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 1632def2a1..c6be9deac2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\swith\sLIKE\sand\sGLOB\sprocessing\sin\sutf-16be\sdatabases\sin\scases\swhere\sthe\sutf-8\sencoding\sof\sa\scharacter\sends\swith\sthe\sbyte\s0xBF. -D 2025-01-31T14:52:36.806 +C Remove\san\sassert()\sthat\sis\snot\strue\sif\sa\strace-callback\sis\sderegistered\swhile\sthere\sare\sactive\sstatements. +D 2025-01-31T18:33:37.705 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -852,7 +852,7 @@ F src/vacuum.c b763b6457bd058d2072ef9364832351fd8d11e8abf70cbb349657360f7d55c40 F src/vdbe.c b428a751953c0c2ff85e3e152ec16e29d488895cd541c8c20876ff9f3bf6978a F src/vdbe.h 3d26d5c7660c5c7bd33ffb0d8784615072d8b23c81f8110870efe2631136bc89 F src/vdbeInt.h 895b1ab7536f018d3d70d690f6c0adbd1062b6dddce1c2cad912927856d4033c -F src/vdbeapi.c 08d0445b6066b04e5014d5d322b75736a61fe847ed88eb6e1a186c79dd9ed117 +F src/vdbeapi.c 82fe278a7c71b653235c6f9fb5de0b5de589908dfcb011ba2a782e8becf06f86 F src/vdbeaux.c 885e16100597507fbbe09d82cbb963bff3fd8a9c1e358dc4f463fc95feb18e8b F src/vdbeblob.c 255be187436da38b01f276c02e6a08103489bbe2a7c6c21537b7aecbe0e1f797 F src/vdbemem.c 977438546df236c6a3e7d8b4fe86c0643c13b89b00235db1f11c3a91a4796d30 @@ -1893,7 +1893,7 @@ F test/tokenize.test ce430a7aed48fc98301611429595883fdfcab5d7 F test/tpch01.test 4479008f85f6f8f25f7ab2cb305d665752b4727fa28a8df3d8e0ad46520c62ff F test/trace.test a659a9862957f4789e37a92b3bf6d2caf5c86b02cdeefc41e850ae53acf6992a F test/trace2.test f5cb67ad3bc09e0c58e8cca78dfd0b5639259983 -F test/trace3.test 4f418ed30d15d9d17dcf13a17f0bd99a92e3038e038798e35db7525f82f4c281 +F test/trace3.test 2deeac66359c9f007f0fc9fb6336994a5d68fc1a65129f322a9e9546fd537d0a F test/trans.test 45f6f9ab6f66a7b5744f1caac06b558f95da62501916906cf55586a896f9f439 F test/trans2.test 62bd045bfc7a1c14c5ba83ba64d21ade31583f76 F test/trans3.test 91a100e5412b488e22a655fe423a14c26403ab94 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 6138e0dc4e0e4e19cb048fe0cd969156151fdc427eee21188d2a822642aad043 -R 6c74985ff3e26b84d99b79b3d7d419a0 +P 4b4f33d791fe4318c4597bee7d2f9e486ed223e731982af470f5cc0dbdc600fc +R eb94bfac632b4e0afd83fa9877b4b4ff U dan -Z f41b656617240d39be19007efc0ec242 +Z 76e080bb074040fe3e81e0d36c896c38 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index afbb673c85..9707f1eb83 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4b4f33d791fe4318c4597bee7d2f9e486ed223e731982af470f5cc0dbdc600fc +0ecfc4d0ebdb272a69f8f98ddb069c7e0735fb899804027eb16f241d83b3d046 diff --git a/src/vdbeapi.c b/src/vdbeapi.c index aab7ac8a3c..0dc09d501e 100644 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@ -63,7 +63,6 @@ static SQLITE_NOINLINE void invokeProfileCallback(sqlite3 *db, Vdbe *p){ sqlite3_int64 iNow; sqlite3_int64 iElapse; assert( p->startTime>0 ); - assert( (db->mTrace & (SQLITE_TRACE_PROFILE|SQLITE_TRACE_XPROFILE))!=0 ); assert( db->init.busy==0 ); assert( p->zSql!=0 ); sqlite3OsCurrentTimeInt64(db->pVfs, &iNow); diff --git a/test/trace3.test b/test/trace3.test index 496cc2360a..639aefafa6 100644 --- a/test/trace3.test +++ b/test/trace3.test @@ -342,5 +342,21 @@ do_test 12.1.2 { sqlite3_finalize $STMT } {SQLITE_OK} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 13.0 { + CREATE TABLE T1(a, b); + INSERT INTO t1 VALUES(1, 2), (3, 4); +} + +proc trace_callback {args} {} +db trace_v2 trace_callback profile + +do_test 13.1 { + db eval { SELECT * FROM t1 } { + db trace_v2 "" "" + } + set {} {} +} {} finish_test From 82f3052e618f95b87717c4d926f2e9bd2965a233 Mon Sep 17 00:00:00 2001 From: stephan Date: Fri, 31 Jan 2025 18:45:03 +0000 Subject: [PATCH 151/220] Expose the new SQLITE_DBCONFIG_ENABLE_ATTACH_CREATE/WRITE and SQLITE_DBCONFIG_ENABLE_COMMENTS (from [325e547a21955]) to JS/WASM. FossilOrigin-Name: 8da1a9af66f905c683e9c3445d609b5c0e11ac912be192c468ddd79f237837f4 --- ext/wasm/api/sqlite3-api-prologue.js | 75 +++++++++++++++------------- ext/wasm/api/sqlite3-wasm.c | 7 ++- ext/wasm/tester1.c-pp.js | 39 ++++++++++++++- manifest | 18 +++---- manifest.uuid | 2 +- 5 files changed, 94 insertions(+), 47 deletions(-) diff --git a/ext/wasm/api/sqlite3-api-prologue.js b/ext/wasm/api/sqlite3-api-prologue.js index ee973990a3..277efa14ab 100644 --- a/ext/wasm/api/sqlite3-api-prologue.js +++ b/ext/wasm/api/sqlite3-api-prologue.js @@ -1712,41 +1712,48 @@ globalThis.sqlite3ApiBootstrap = function sqlite3ApiBootstrap( missing or falsy pointer argument as 0. */ capi.sqlite3_db_config = function(pDb, op, ...args){ - if(!this.s){ - this.s = wasm.xWrap('sqlite3__wasm_db_config_s','int', - ['sqlite3*', 'int', 'string:static'] - /* MAINDBNAME requires a static string */); - this.pii = wasm.xWrap('sqlite3__wasm_db_config_pii', 'int', - ['sqlite3*', 'int', '*','int', 'int']); - this.ip = wasm.xWrap('sqlite3__wasm_db_config_ip','int', - ['sqlite3*', 'int', 'int','*']); - } switch(op){ - case capi.SQLITE_DBCONFIG_ENABLE_FKEY: - case capi.SQLITE_DBCONFIG_ENABLE_TRIGGER: - case capi.SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER: - case capi.SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION: - case capi.SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE: - case capi.SQLITE_DBCONFIG_ENABLE_QPSG: - case capi.SQLITE_DBCONFIG_TRIGGER_EQP: - case capi.SQLITE_DBCONFIG_RESET_DATABASE: - case capi.SQLITE_DBCONFIG_DEFENSIVE: - case capi.SQLITE_DBCONFIG_WRITABLE_SCHEMA: - case capi.SQLITE_DBCONFIG_LEGACY_ALTER_TABLE: - case capi.SQLITE_DBCONFIG_DQS_DML: - case capi.SQLITE_DBCONFIG_DQS_DDL: - case capi.SQLITE_DBCONFIG_ENABLE_VIEW: - case capi.SQLITE_DBCONFIG_LEGACY_FILE_FORMAT: - case capi.SQLITE_DBCONFIG_TRUSTED_SCHEMA: - case capi.SQLITE_DBCONFIG_STMT_SCANSTATUS: - case capi.SQLITE_DBCONFIG_REVERSE_SCANORDER: - return this.ip(pDb, op, args[0], args[1] || 0); - case capi.SQLITE_DBCONFIG_LOOKASIDE: - return this.pii(pDb, op, args[0], args[1], args[2]); - case capi.SQLITE_DBCONFIG_MAINDBNAME: - return this.s(pDb, op, args[0]); - default: - return capi.SQLITE_MISUSE; + case capi.SQLITE_DBCONFIG_ENABLE_FKEY: + case capi.SQLITE_DBCONFIG_ENABLE_TRIGGER: + case capi.SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER: + case capi.SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION: + case capi.SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE: + case capi.SQLITE_DBCONFIG_ENABLE_QPSG: + case capi.SQLITE_DBCONFIG_TRIGGER_EQP: + case capi.SQLITE_DBCONFIG_RESET_DATABASE: + case capi.SQLITE_DBCONFIG_DEFENSIVE: + case capi.SQLITE_DBCONFIG_WRITABLE_SCHEMA: + case capi.SQLITE_DBCONFIG_LEGACY_ALTER_TABLE: + case capi.SQLITE_DBCONFIG_DQS_DML: + case capi.SQLITE_DBCONFIG_DQS_DDL: + case capi.SQLITE_DBCONFIG_ENABLE_VIEW: + case capi.SQLITE_DBCONFIG_LEGACY_FILE_FORMAT: + case capi.SQLITE_DBCONFIG_TRUSTED_SCHEMA: + case capi.SQLITE_DBCONFIG_STMT_SCANSTATUS: + case capi.SQLITE_DBCONFIG_REVERSE_SCANORDER: + case capi.SQLITE_DBCONFIG_ENABLE_ATTACH_CREATE: + case capi.SQLITE_DBCONFIG_ENABLE_ATTACH_WRITE: + case capi.SQLITE_DBCONFIG_ENABLE_COMMENTS: + if( !this.ip ){ + this.ip = wasm.xWrap('sqlite3__wasm_db_config_ip','int', + ['sqlite3*', 'int', 'int', '*']); + } + return this.ip(pDb, op, args[0], args[1] || 0); + case capi.SQLITE_DBCONFIG_LOOKASIDE: + if( !this.pii ){ + this.pii = wasm.xWrap('sqlite3__wasm_db_config_pii', 'int', + ['sqlite3*', 'int', '*', 'int', 'int']); + } + return this.pii(pDb, op, args[0], args[1], args[2]); + case capi.SQLITE_DBCONFIG_MAINDBNAME: + if(!this.s){ + this.s = wasm.xWrap('sqlite3__wasm_db_config_s','int', + ['sqlite3*', 'int', 'string:static'] + /* MAINDBNAME requires a static string */); + } + return this.s(pDb, op, args[0]); + default: + return capi.SQLITE_MISUSE; } }.bind(Object.create(null)); diff --git a/ext/wasm/api/sqlite3-wasm.c b/ext/wasm/api/sqlite3-wasm.c index c5dd495e54..461afe0663 100644 --- a/ext/wasm/api/sqlite3-wasm.c +++ b/ext/wasm/api/sqlite3-wasm.c @@ -331,7 +331,6 @@ SQLITE_WASM_EXPORT void sqlite3__wasm_pstack_restore(unsigned char * p){ */ SQLITE_WASM_EXPORT void * sqlite3__wasm_pstack_alloc(int n){ if( n<=0 ) return 0; - //if( n & 0x7 ) n += 8 - (n & 0x7) /* align to 8-byte boundary */; n = (n + 7) & ~7 /* align to 8-byte boundary */; if( PStack.pBegin + n > PStack.pPos /*not enough space left*/ || PStack.pBegin + n <= PStack.pBegin /*overflow*/ ) return 0; @@ -597,6 +596,9 @@ const char * sqlite3__wasm_enum_json(void){ DefInt(SQLITE_DBCONFIG_TRUSTED_SCHEMA); DefInt(SQLITE_DBCONFIG_STMT_SCANSTATUS); DefInt(SQLITE_DBCONFIG_REVERSE_SCANORDER); + DefInt(SQLITE_DBCONFIG_ENABLE_ATTACH_CREATE); + DefInt(SQLITE_DBCONFIG_ENABLE_ATTACH_WRITE); + DefInt(SQLITE_DBCONFIG_ENABLE_COMMENTS); DefInt(SQLITE_DBCONFIG_MAX); } _DefGroup; @@ -1630,6 +1632,9 @@ int sqlite3__wasm_db_config_ip(sqlite3 *pDb, int op, int arg1, int* pArg2){ case SQLITE_DBCONFIG_TRUSTED_SCHEMA: case SQLITE_DBCONFIG_STMT_SCANSTATUS: case SQLITE_DBCONFIG_REVERSE_SCANORDER: + case SQLITE_DBCONFIG_ENABLE_ATTACH_CREATE: + case SQLITE_DBCONFIG_ENABLE_ATTACH_WRITE: + case SQLITE_DBCONFIG_ENABLE_COMMENTS: return sqlite3_db_config(pDb, op, arg1, pArg2); default: return SQLITE_MISUSE; } diff --git a/ext/wasm/tester1.c-pp.js b/ext/wasm/tester1.c-pp.js index a21a1c330e..f83ecbd873 100644 --- a/ext/wasm/tester1.c-pp.js +++ b/ext/wasm/tester1.c-pp.js @@ -1241,6 +1241,12 @@ globalThis.sqlite3InitModule = sqlite3InitModule; }finally{ wasm.pstack.restore(stack); } + + capi.sqlite3_db_config(this.db, capi.SQLITE_DBCONFIG_ENABLE_COMMENTS, 0, null); + T.mustThrow(()=>this.db.exec("select 1 /* with comments */"), "SQL comments are disallowed"); + capi.sqlite3_db_config(this.db, capi.SQLITE_DBCONFIG_ENABLE_COMMENTS, 1, null); + this.db.exec("select 1 /* with comments */"); + /* SQLITE_DBCONFIG_ENABLE_ATTACH_... are in the ATTACH-specific tests */ }) //////////////////////////////////////////////////////////////////// @@ -1999,7 +2005,7 @@ globalThis.sqlite3InitModule = sqlite3InitModule; }/*window UDFs*/) //////////////////////////////////////////////////////////////////// - .t("ATTACH", function(){ + .t("ATTACH", function(sqlite3){ const db = this.db; const resultRows = []; db.exec({ @@ -2078,7 +2084,36 @@ globalThis.sqlite3InitModule = sqlite3InitModule; db.exec("detach foo"); T.mustThrow(()=>db.exec("select * from foo.bar"), "Because foo is no longer attached."); - }) + + /* SQLITE_DBCONFIG_ENABLE_ATTACH_CREATE/WRITE... */ + const db2 = new sqlite3.oo1.DB(); + try{ + capi.sqlite3_db_config(db2, capi.SQLITE_DBCONFIG_ENABLE_ATTACH_CREATE, 0, null); + T.mustThrow(()=>db2.exec("attach 'attached.db' as foo"), + "Cannot create a new db via ATTACH"); + capi.sqlite3_db_config(db2, capi.SQLITE_DBCONFIG_ENABLE_ATTACH_CREATE, 1, null); + db2.exec([ + "attach 'attached.db' as foo;", + "create table foo.t(a);", + "insert into foo.t(a) values(1);", + "detach foo;" + ]); + capi.sqlite3_db_config(db2, capi.SQLITE_DBCONFIG_ENABLE_ATTACH_WRITE, 0, null); + db2.exec("attach 'attached.db' as foo"); + T.mustThrow(()=>db2.exec("insert into foo.t(a) values(2)"), + "ATTACH_WRITE is false"); + capi.sqlite3_db_config(db2, capi.SQLITE_DBCONFIG_ENABLE_ATTACH_WRITE, 1, null); + db2.exec([ + "detach foo;", + "attach 'attached.db' as foo;", + "insert into foo.t(a) values(2);", + "drop table foo.t;", + "detach foo" + ]); + }finally{ + db2.close(); + } + })/*ATTACH tests*/ //////////////////////////////////////////////////////////////////// .t("Read-only", function(sqlite3){ diff --git a/manifest b/manifest index c6be9deac2..fde31f9ad0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\san\sassert()\sthat\sis\snot\strue\sif\sa\strace-callback\sis\sderegistered\swhile\sthere\sare\sactive\sstatements. -D 2025-01-31T18:33:37.705 +C Expose\sthe\snew\sSQLITE_DBCONFIG_ENABLE_ATTACH_CREATE/WRITE\sand\sSQLITE_DBCONFIG_ENABLE_COMMENTS\s(from\s[325e547a21955])\sto\sJS/WASM. +D 2025-01-31T18:45:03.025 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -640,7 +640,7 @@ F ext/wasm/api/pre-js.c-pp.js a614a2c82b12c4d96d8e3ba77330329efc53c4d56a8a7e60ad F ext/wasm/api/sqlite3-api-cleanup.js 3ac1786e461ada63033143be8c3b00b26b939540661f3e839515bb92f2e35359 F ext/wasm/api/sqlite3-api-glue.c-pp.js fb6dbfe692cc23000a65a4cd95a1a47ed5eb592dc9d8b55363b3c2952a787244 F ext/wasm/api/sqlite3-api-oo1.c-pp.js f3a8e2004c6625d17946c11f2fb32008be78bc5207bf746fc77d59848813225f -F ext/wasm/api/sqlite3-api-prologue.js 3caa0d1f46fe1bfbd1cce31b57b4446ca073ddb15f67476a9ff6c93456467712 +F ext/wasm/api/sqlite3-api-prologue.js 5ff913355b3144f1c9719d0406667fa6e13eb813c71ed7ce29440e2e65363e82 F ext/wasm/api/sqlite3-api-worker1.c-pp.js 5cc22a3c0d52828cb32aad8691488719f47d27567e63e8bc8b832d74371c352d F ext/wasm/api/sqlite3-license-version-header.js 0c807a421f0187e778dc1078f10d2994b915123c1223fe752b60afdcd1263f89 F ext/wasm/api/sqlite3-opfs-async-proxy.js 3774befd97cd1a5e2895c8225a894aad946848c6d9b4028acc988b5d123475af @@ -648,7 +648,7 @@ F ext/wasm/api/sqlite3-vfs-helper.c-pp.js 3f828cc66758acb40e9c5b4dcfd87fd478a14c F ext/wasm/api/sqlite3-vfs-opfs-sahpool.c-pp.js bb5e96cd0fd6e1e54538256433f1c60a4e3095063c4d1a79a8a022fc59be9571 F ext/wasm/api/sqlite3-vfs-opfs.c-pp.js 9b86ca2d8276cf919fbc9ba2a10e9786033b64f92c2db844d951804dee6c4b4e F ext/wasm/api/sqlite3-vtab-helper.c-pp.js e809739d71e8b35dfe1b55d24d91f02d04239e6aef7ca1ea92a15a29e704f616 -F ext/wasm/api/sqlite3-wasm.c 83f5e9f998e9fa4261eb84e9f092210e3ffe03895119f5ded0429eb34ab9d2be +F ext/wasm/api/sqlite3-wasm.c 6f9d8529072d072359cd22dc5dfb0572c524684686569cfbd0f9640d7619fc10 F ext/wasm/api/sqlite3-worker1-promiser.c-pp.js 46f303ba8ddd1b2f0a391798837beddfa72e8c897038c8047eda49ce7d5ed46b F ext/wasm/api/sqlite3-worker1.c-pp.js 5e8706c2c4af2a57fbcdc02f4e7ef79869971bc21bb8ede777687786ce1c92d5 F ext/wasm/batch-runner-sahpool.html e9a38fdeb36a13eac7b50241dfe7ae066fe3f51f5c0b0151e7baee5fce0d07a7 @@ -696,7 +696,7 @@ F ext/wasm/test-opfs-vfs.html 1f2d672f3f3fce810dfd48a8d56914aba22e45c6834e262555 F ext/wasm/test-opfs-vfs.js 1618670e466f424aa289859fe0ec8ded223e42e9e69b5c851f809baaaca1a00c F ext/wasm/tester1-worker.html ebc4b820a128963afce328ecf63ab200bd923309eb939f4110510ab449e9814c F ext/wasm/tester1.c-pp.html 1c1bc78b858af2019e663b1a31e76657b73dc24bede28ca92fbe917c3a972af2 -F ext/wasm/tester1.c-pp.js 228101c290003423f0bfb66a6ebbfc6904fa7b1b69466e700c135f74ee83d62a +F ext/wasm/tester1.c-pp.js 05df7cfd2cb8aa8728afb68c90a8af51fdf724c0e892f0f986a695584edae195 F ext/wasm/tests/opfs/concurrency/index.html 657578a6e9ce1e9b8be951549ed93a6a471f4520a99e5b545928668f4285fb5e F ext/wasm/tests/opfs/concurrency/test.js d08889a5bb6e61937d0b8cbb78c9efbefbf65ad09f510589c779b7cc6a803a88 F ext/wasm/tests/opfs/concurrency/worker.js 0a8c1a3e6ebb38aabbee24f122693f1fb29d599948915c76906681bb7da1d3d2 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 4b4f33d791fe4318c4597bee7d2f9e486ed223e731982af470f5cc0dbdc600fc -R eb94bfac632b4e0afd83fa9877b4b4ff -U dan -Z 76e080bb074040fe3e81e0d36c896c38 +P 0ecfc4d0ebdb272a69f8f98ddb069c7e0735fb899804027eb16f241d83b3d046 +R 17139128f5a15a8bba68ad5baf1b2013 +U stephan +Z 3fb4b52cbb9f7ac493f2fee0f2c8e021 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 9707f1eb83..9d3fb7ec88 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0ecfc4d0ebdb272a69f8f98ddb069c7e0735fb899804027eb16f241d83b3d046 +8da1a9af66f905c683e9c3445d609b5c0e11ac912be192c468ddd79f237837f4 From 45b2669ad363ad3eb0e3e75de1b18d9e5593f837 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 31 Jan 2025 18:56:58 +0000 Subject: [PATCH 152/220] Fix test case numbering in tests recently added to like3.test. FossilOrigin-Name: 6df2098c548b58c2910837726b666a628d5c712c560c0221a771e8181f71fae7 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/like3.test | 16 ++++++++-------- 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index fde31f9ad0..f8e251197c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Expose\sthe\snew\sSQLITE_DBCONFIG_ENABLE_ATTACH_CREATE/WRITE\sand\sSQLITE_DBCONFIG_ENABLE_COMMENTS\s(from\s[325e547a21955])\sto\sJS/WASM. -D 2025-01-31T18:45:03.025 +C Fix\stest\scase\snumbering\sin\stests\srecently\sadded\sto\slike3.test. +D 2025-01-31T18:56:58.478 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -1401,7 +1401,7 @@ F test/laststmtchanges.test ae613f53819206b3222771828d024154d51db200 F test/lemon-test01.y 70110eff607ab137ccc851edb2bc7e14a6d4f246b5d2d25f82a60b69d87a9ff2 F test/like.test b3ea2ba3558199aa8f25a42ddeb54772e234fab50868c9f066047acdbda8fc58 F test/like2.test d3be15fefee3e02fc88942a9b98f26c5339bbdef7783c90023c092c4955fe3d3 -F test/like3.test a9d78297426279c3db1206490444f3193f579890b3c4118a52960afe2b4863cd +F test/like3.test b21284df226d6028feeb4dcc56ad9d32673d82c14a63f15f25471292c36491e7 F test/limit.test 350f5d03c29e7dff9a2cde016f84f8d368d40bcd02fa2b2a52fa10c4bf3cbfaf F test/limit2.test 9409b033284642a859fafc95f29a5a6a557bd57c1f0d7c3f554bd64ed69df77e F test/literal.test a65dca9fef86e51b8e45544268e37abbd4bb94ba35fd65f6fdcab2f288cd8f79 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 0ecfc4d0ebdb272a69f8f98ddb069c7e0735fb899804027eb16f241d83b3d046 -R 17139128f5a15a8bba68ad5baf1b2013 -U stephan -Z 3fb4b52cbb9f7ac493f2fee0f2c8e021 +P 8da1a9af66f905c683e9c3445d609b5c0e11ac912be192c468ddd79f237837f4 +R 7c3dd7099324ee3f6570f3eda4b7c65a +U drh +Z f8d1c9b3f391a5065e5e11e0179528b8 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 9d3fb7ec88..dc09f5f03d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8da1a9af66f905c683e9c3445d609b5c0e11ac912be192c468ddd79f237837f4 +6df2098c548b58c2910837726b666a628d5c712c560c0221a771e8181f71fae7 diff --git a/test/like3.test b/test/like3.test index 2987e0e0e2..0b28574376 100644 --- a/test/like3.test +++ b/test/like3.test @@ -322,37 +322,37 @@ foreach enc { } { reset_db execsql "PRAGMA encoding = '$enc'" - do_execsql_test like3-8.$tn.0 { + set tn utf[string range $enc 4 end].$tn + do_execsql_test like3-8.$tn.1 { CREATE TABLE t1(x); } - do_execsql_test like3-8.$tn.1 { + do_execsql_test like3-8.$tn.2 { PRAGMA encoding } $enc - do_execsql_test like3-8.$tn.1 " + do_execsql_test like3-8.$tn.3 " INSERT INTO t1 VALUES( $expr ) " - do_execsql_test like3-8.$tn.2 { + do_execsql_test like3-8.$tn.4 { SELECT typeof(x) FROM t1 } {text} set x [db one {SELECT x || '%' FROM t1}] - do_execsql_test like3-8.$tn.3 { + do_execsql_test like3-8.$tn.5 { SELECT rowid FROM t1 WHERE x LIKE $x } 1 - do_execsql_test like3-8.$tn.4 { + do_execsql_test like3-8.$tn.6 { CREATE INDEX i1 ON t1(x); } - do_execsql_test like3-8.$tn.5 { + do_execsql_test like3-8.$tn.7 { SELECT rowid FROM t1 WHERE x LIKE $x } 1 } } finish_test - From 276d213b2aff1132a3fec04ae96b2273b70235de Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 31 Jan 2025 20:18:34 +0000 Subject: [PATCH 153/220] Tweaks to [4b4f33d791fe4318] to make it easier to test. FossilOrigin-Name: 2567298f4b0fdfeb42aa6bba7e0bec3bc8d0b89bf644a79b41893dd6a6c5774c --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/whereexpr.c | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index f8e251197c..c8b50bd721 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\stest\scase\snumbering\sin\stests\srecently\sadded\sto\slike3.test. -D 2025-01-31T18:56:58.478 +C Tweaks\sto\s[4b4f33d791fe4318]\sto\smake\sit\seasier\sto\stest. +D 2025-01-31T20:18:34.963 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -867,7 +867,7 @@ F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 F src/where.c 09dc313e7223ca1217c39c7026b00f16ff449a8323511a762fcba7863a00f4cd F src/whereInt.h d20cddddb1d61b18d5cb1fcfa9b77fbeebbc4afe44d996e603452a23b3009ee1 F src/wherecode.c 0c3d3199a2b769a5e2bb70feb5003dc85b3d86842ecaf903a47f2b4205ca5dab -F src/whereexpr.c fd80811331cebf37a96a1bbbe93a20425eb04a925baa7c2306d72e0797a47a4c +F src/whereexpr.c d304e3fec8309cddffd194a2d06c49de3aac1c32a7ef9f6bd78546abc7d77352 F src/window.c 2bf01f9941a64fbcead61a0e3cb5db3fca5094b30d2ff0d23274c2a81d2e2385 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 8da1a9af66f905c683e9c3445d609b5c0e11ac912be192c468ddd79f237837f4 -R 7c3dd7099324ee3f6570f3eda4b7c65a +P 6df2098c548b58c2910837726b666a628d5c712c560c0221a771e8181f71fae7 +R 135ac307112d80006ac833a8ae148e6e U drh -Z f8d1c9b3f391a5065e5e11e0179528b8 +Z 1e05e96ac0e79f8e8ee82c826159e60e # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index dc09f5f03d..79096bfae9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6df2098c548b58c2910837726b666a628d5c712c560c0221a771e8181f71fae7 +2567298f4b0fdfeb42aa6bba7e0bec3bc8d0b89bf644a79b41893dd6a6c5774c diff --git a/src/whereexpr.c b/src/whereexpr.c index 0a963f4f92..2c4d0fef0d 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -232,7 +232,7 @@ static int isLikeOrGlob( cnt++; }else if( c>=0x80 ){ const u8 *z2 = z+cnt-1; - if( sqlite3Utf8Read(&z2)==0xfffd || c==0xFF /* bad utf-8 */ + if( c==0xff || sqlite3Utf8Read(&z2)==0xfffd /* bad utf-8 */ || ENC(db)==SQLITE_UTF16LE ){ cnt--; @@ -1400,7 +1400,7 @@ static void exprAnalyze( } /* Increment the value of the last utf8 character in the prefix. */ - while( *pC==0xBF && pC>(u8*)pStr2->u.zToken ){ + while( *pC==0xBF && ALWAYS(pC>(u8*)pStr2->u.zToken) ){ *pC = 0x80; pC--; } From fdc17e0bc8f99ebece39a7668af0f40fa4fe6323 Mon Sep 17 00:00:00 2001 From: stephan Date: Sat, 1 Feb 2025 09:44:48 +0000 Subject: [PATCH 154/220] JS doc typo fixes. No functional changes. FossilOrigin-Name: e0d9c74c1cdddb2321131255b94f9cda6530be3f2a06aed4abb54dcda092481e --- ext/wasm/common/whwasmutil.js | 9 +++++---- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/ext/wasm/common/whwasmutil.js b/ext/wasm/common/whwasmutil.js index 8fe4a990b6..de0f667876 100644 --- a/ext/wasm/common/whwasmutil.js +++ b/ext/wasm/common/whwasmutil.js @@ -51,7 +51,7 @@ Its global-scope symbol is intended only to provide an easy way to make it available to 3rd-party scripts and "should" be deleted - after calling it. That symbols is _not_ used within the library. + after calling it. That symbol is _not_ used within the library. Forewarning: this API explicitly targets only browser environments. If a given non-browser environment has the @@ -69,7 +69,8 @@ - WASM-exported "indirect function table" access and manipulation. e.g. creating new WASM-side functions using JS functions, analog to Emscripten's addFunction() and - uninstallFunction() but slightly different. + uninstallFunction() but slightly different and with more useful + lifetime semantics. - Get/set specific heap memory values, analog to Emscripten's getValue() and setValue(). @@ -165,7 +166,7 @@ This code is developed and maintained in conjunction with the Jaccwabyt project: - https://fossil.wanderinghorse.net/r/jaccwabbyt + https://fossil.wanderinghorse.net/r/jaccwabyt More specifically: @@ -1627,7 +1628,7 @@ globalThis.WhWasmUtilInstaller = function(target){ need a level of hand-written wrappers around them, depending on how they're used, in order to provide the client with JS strings. Alternately, clients will need to perform such conversions - on their own, e.g. using cstrtojs(). Or maybe we can find a way + on their own, e.g. using cstrToJs(). Or maybe we can find a way to perform such conversions here, via addition of an xWrap()-style function signature to the options argument. */ diff --git a/manifest b/manifest index c8b50bd721..30514be215 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Tweaks\sto\s[4b4f33d791fe4318]\sto\smake\sit\seasier\sto\stest. -D 2025-01-31T20:18:34.963 +C JS\sdoc\stypo\sfixes.\sNo\sfunctional\schanges. +D 2025-02-01T09:44:48.567 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -659,7 +659,7 @@ F ext/wasm/c-pp.c 6d131069644964223305582a80973477fa8b06b57306781690d7874ebd3a4f F ext/wasm/common/SqliteTestUtil.js 7adaeffef757d8708418dc9190f72df22367b531831775804b31598b44f6aa51 F ext/wasm/common/emscripten.css 11bd104b6c0d597c67d40cc8ecc0a60dae2b965151e3b6a37fa5708bac3acd15 F ext/wasm/common/testing.css e97549bab24126c24e0daabfe2de9bb478fb0a69fdb2ddd0a73a992c091aad6f -F ext/wasm/common/whwasmutil.js d76c69617e95d85ffc9996f7d9d7481df6976dcbd860ecd82bd8c075e3a101ae +F ext/wasm/common/whwasmutil.js 8528ac79418ee7eafe7c8f634a08704e47d694d3fd8ea6368be27a5229733338 F ext/wasm/config.make.in 4bc43443f768a61efd43cf995a5e618f58ac9afc0936706014193537d82c41cb F ext/wasm/demo-123-worker.html a0b58d9caef098a626a1a1db567076fca4245e8d60ba94557ede8684350a81ed F ext/wasm/demo-123.html 8c70a412ce386bd3796534257935eb1e3ea5c581e5d5aea0490b8232e570a508 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 6df2098c548b58c2910837726b666a628d5c712c560c0221a771e8181f71fae7 -R 135ac307112d80006ac833a8ae148e6e -U drh -Z 1e05e96ac0e79f8e8ee82c826159e60e +P 2567298f4b0fdfeb42aa6bba7e0bec3bc8d0b89bf644a79b41893dd6a6c5774c +R eac70bc609a1618826ffd2d47e1f8359 +U stephan +Z d7bceb2ba8b79e070ba4dc11d65193f3 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 79096bfae9..0484fa7054 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2567298f4b0fdfeb42aa6bba7e0bec3bc8d0b89bf644a79b41893dd6a6c5774c +e0d9c74c1cdddb2321131255b94f9cda6530be3f2a06aed4abb54dcda092481e From de50617bcb1d3f5de83ef0a9b31d2b9e1d4d3c52 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 1 Feb 2025 20:53:17 +0000 Subject: [PATCH 155/220] Fix an issue with sqlite3_normalized_sql() caused by changes needed to support SQLITE_DBCONFIG_ENABLE_COMMENT. FossilOrigin-Name: 79d287a39443f2d098fcc24199627555a656b34aa5bf5d484f91cb513d83e143 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/tokenize.c | 1 + 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 30514be215..d242405d2d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C JS\sdoc\stypo\sfixes.\sNo\sfunctional\schanges. -D 2025-02-01T09:44:48.567 +C Fix\san\sissue\swith\ssqlite3_normalized_sql()\scaused\sby\schanges\sneeded\sto\nsupport\sSQLITE_DBCONFIG_ENABLE_COMMENT. +D 2025-02-01T20:53:17.603 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -841,7 +841,7 @@ F src/test_windirent.h da2e5b73c32d09905fbdd00f27cd802212a32a58ead882736fe4f5eb7 F src/test_window.c 6d80e11fba89a1796525e6f0048ff0c7789aa2c6b0b11c80827dc1437bd8ea72 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c -F src/tokenize.c cedfe799fc73106302078388547040698c5c5a3950f4ea1e4344e1b736c7d568 +F src/tokenize.c 375a772e2342274f4bf73605a70633237da09deed00a9bf4c4816a56777ea7c9 F src/treeview.c d85ce76e6d1498d781957c07cb234da6d77ce0ed2d196480d516f54dabc62279 F src/trigger.c 247e2d712d5edc6021d52a169f6ac9a9c10d7144bc4ac7ea06c1ed2aa414659f F src/update.c 0e01aa6a3edf9ec112b33eb714b9016a81241497b1fb7c3e74332f4f71756508 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 2567298f4b0fdfeb42aa6bba7e0bec3bc8d0b89bf644a79b41893dd6a6c5774c -R eac70bc609a1618826ffd2d47e1f8359 -U stephan -Z d7bceb2ba8b79e070ba4dc11d65193f3 +P e0d9c74c1cdddb2321131255b94f9cda6530be3f2a06aed4abb54dcda092481e +R 645350b0e058e36134a55fdb6b3f2eb5 +U drh +Z 9d4896add67bdd3bb69392ede8dfd087 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 0484fa7054..f1811e8ef6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e0d9c74c1cdddb2321131255b94f9cda6530be3f2a06aed4abb54dcda092481e +79d287a39443f2d098fcc24199627555a656b34aa5bf5d484f91cb513d83e143 diff --git a/src/tokenize.c b/src/tokenize.c index 901a4f0384..fe300ca529 100644 --- a/src/tokenize.c +++ b/src/tokenize.c @@ -801,6 +801,7 @@ char *sqlite3Normalize( n = sqlite3GetToken((unsigned char*)zSql+i, &tokenType); if( NEVER(n<=0) ) break; switch( tokenType ){ + case TK_COMMENT: case TK_SPACE: { break; } From 5c72a39cfbf461e66ce7482a17d9448f65108883 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 1 Feb 2025 21:06:49 +0000 Subject: [PATCH 156/220] Enable SQLITE_ENABLE_NORMALIZE for several test configurations. FossilOrigin-Name: b07c64077a3912ef7cdf23e9411df6387f38baa32f5a11fffec5ba4f93935e27 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/testrunner_data.tcl | 5 +++++ 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index d242405d2d..b39253660b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sissue\swith\ssqlite3_normalized_sql()\scaused\sby\schanges\sneeded\sto\nsupport\sSQLITE_DBCONFIG_ENABLE_COMMENT. -D 2025-02-01T20:53:17.603 +C Enable\sSQLITE_ENABLE_NORMALIZE\sfor\sseveral\stest\sconfigurations. +D 2025-02-01T21:06:49.292 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -1729,7 +1729,7 @@ F test/temptable3.test d11a0974e52b347e45ee54ef1923c91ed91e4637 F test/temptrigger.test 38f0ca479b1822d3117069e014daabcaacefffcc F test/tester.tcl 7b44f1a9b9a2de8112695b908afc21dd9a68cd2d44e84b73f1b27b53492c0d59 F test/testrunner.tcl 90ed8b6c2b26dc1f6af08aeb04670a5df86172f3d9828d8af000f972afa50061 x -F test/testrunner_data.tcl ba4aeea28aa03cfa6fe7e57782ddecb7a7b91c3a0b3251583cb4f0ee002de6a6 +F test/testrunner_data.tcl 63ff9eba1d11a3b0a6fc8446d5fa32da21aabda55b994e8fcbd4a8ce81f48378 F test/thread001.test a0985c117eab62c0c65526e9fa5d1360dd1cac5b03bde223902763274ce21899 F test/thread002.test c24c83408e35ba5a952a3638b7ac03ccdf1ce4409289c54a050ac4c5f1de7502 F test/thread003.test ee4c9efc3b86a6a2767516a37bd64251272560a7 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P e0d9c74c1cdddb2321131255b94f9cda6530be3f2a06aed4abb54dcda092481e -R 645350b0e058e36134a55fdb6b3f2eb5 +P 79d287a39443f2d098fcc24199627555a656b34aa5bf5d484f91cb513d83e143 +R 888619b059aabb68efc45862c1d541fe U drh -Z 9d4896add67bdd3bb69392ede8dfd087 +Z 9448395bcbe74c7bef7eba8e89fa76da # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index f1811e8ef6..30dffb89e1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -79d287a39443f2d098fcc24199627555a656b34aa5bf5d484f91cb513d83e143 +b07c64077a3912ef7cdf23e9411df6387f38baa32f5a11fffec5ba4f93935e27 diff --git a/test/testrunner_data.tcl b/test/testrunner_data.tcl index 9abfb242da..2cfa7f3b31 100644 --- a/test/testrunner_data.tcl +++ b/test/testrunner_data.tcl @@ -97,6 +97,7 @@ namespace eval trd { set build(All-Debug) { --with-debug --enable-all -DSQLITE_ENABLE_ORDERED_SET_AGGREGATES + -DSQLITE_ENABLE_NORMALIZE } set build(All-O0) { -O0 --enable-all @@ -110,6 +111,7 @@ namespace eval trd { CC=clang -fsanitize=address,undefined -fno-sanitize-recover=undefined -DSQLITE_ENABLE_STAT4 -DSQLITE_OMIT_LOOKASIDE=1 + -DSQLITE_ENABLE_NORMALIZE -DCONFIG_SLOWDOWN_FACTOR=5.0 -DSQLITE_ENABLE_RBU --with-debug @@ -168,6 +170,7 @@ namespace eval trd { -DSQLITE_SOUNDEX=1 -DSQLITE_ENABLE_ATOMIC_WRITE=1 -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1 + -DSQLITE_ENABLE_NORMALIZE -DSQLITE_ENABLE_OVERSIZE_CELL_CHECK=1 -DSQLITE_ENABLE_STAT4 -DSQLITE_ENABLE_STMT_SCANSTATUS @@ -183,6 +186,7 @@ namespace eval trd { -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_RTREE=1 -DSQLITE_ENABLE_MEMSYS5=1 + -DSQLITE_ENABLE_NORMALIZE -DSQLITE_ENABLE_COLUMN_METADATA=1 -DSQLITE_ENABLE_STAT4 -DSQLITE_ENABLE_HIDDEN_COLUMNS @@ -299,6 +303,7 @@ namespace eval trd { -DSQLITE_ENABLE_FTS3=1 -DSQLITE_ENABLE_FTS3_PARENTHESIS=1 -DSQLITE_ENABLE_FTS3_TOKENIZER=1 + -DSQLITE_ENABLE_NORMALIZE=1 -DSQLITE_ENABLE_PERSIST_WAL=1 -DSQLITE_ENABLE_PURGEABLE_PCACHE=1 -DSQLITE_ENABLE_RTREE=1 From 454a426e31f75e8f09973c7704b47e5df6c88dc7 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 1 Feb 2025 23:28:49 +0000 Subject: [PATCH 157/220] Remove an ALWAYS() added by [2567298f4b0fdfeb] because dbsqlfuzz found a way to reach it. The test case was added to TH3. FossilOrigin-Name: d08a7aa8987458a91fcb861d58289e622ba8722936c7874a284f9f2fd782e269 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/whereexpr.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index b39253660b..a1b8b7be69 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enable\sSQLITE_ENABLE_NORMALIZE\sfor\sseveral\stest\sconfigurations. -D 2025-02-01T21:06:49.292 +C Remove\san\sALWAYS()\sadded\sby\s[2567298f4b0fdfeb]\sbecause\sdbsqlfuzz\sfound\sa\sway\nto\sreach\sit.\s\sThe\stest\scase\swas\sadded\sto\sTH3. +D 2025-02-01T23:28:49.538 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -867,7 +867,7 @@ F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 F src/where.c 09dc313e7223ca1217c39c7026b00f16ff449a8323511a762fcba7863a00f4cd F src/whereInt.h d20cddddb1d61b18d5cb1fcfa9b77fbeebbc4afe44d996e603452a23b3009ee1 F src/wherecode.c 0c3d3199a2b769a5e2bb70feb5003dc85b3d86842ecaf903a47f2b4205ca5dab -F src/whereexpr.c d304e3fec8309cddffd194a2d06c49de3aac1c32a7ef9f6bd78546abc7d77352 +F src/whereexpr.c 2415c8eee5ff89a8b709d7d83d71c1ff986cd720d0520057e1d8a5371339012a F src/window.c 2bf01f9941a64fbcead61a0e3cb5db3fca5094b30d2ff0d23274c2a81d2e2385 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 79d287a39443f2d098fcc24199627555a656b34aa5bf5d484f91cb513d83e143 -R 888619b059aabb68efc45862c1d541fe +P b07c64077a3912ef7cdf23e9411df6387f38baa32f5a11fffec5ba4f93935e27 +R 1587f5175225e9073d51285cc57826f6 U drh -Z 9448395bcbe74c7bef7eba8e89fa76da +Z 785e2e3ea6ab6da1a366fb937ef1ab28 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 30dffb89e1..262be1b4aa 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b07c64077a3912ef7cdf23e9411df6387f38baa32f5a11fffec5ba4f93935e27 +d08a7aa8987458a91fcb861d58289e622ba8722936c7874a284f9f2fd782e269 diff --git a/src/whereexpr.c b/src/whereexpr.c index 2c4d0fef0d..4a24dadd23 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -1400,7 +1400,7 @@ static void exprAnalyze( } /* Increment the value of the last utf8 character in the prefix. */ - while( *pC==0xBF && ALWAYS(pC>(u8*)pStr2->u.zToken) ){ + while( *pC==0xBF && pC>(u8*)pStr2->u.zToken ){ *pC = 0x80; pC--; } From 4b99ec0b8c0dafa7d0949e2559bd0b231dcf2d13 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 1 Feb 2025 23:34:33 +0000 Subject: [PATCH 158/220] Fix a comment typo - in a comment used to generate documentation. FossilOrigin-Name: b8de75eeded79a8312218d7a543e7c7d11181c9f4004e875495608d11a81ff38 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqlite.h.in | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index a1b8b7be69..7159e8849a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\san\sALWAYS()\sadded\sby\s[2567298f4b0fdfeb]\sbecause\sdbsqlfuzz\sfound\sa\sway\nto\sreach\sit.\s\sThe\stest\scase\swas\sadded\sto\sTH3. -D 2025-02-01T23:28:49.538 +C Fix\sa\scomment\stypo\s-\sin\sa\scomment\sused\sto\sgenerate\sdocumentation. +D 2025-02-01T23:34:33.636 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -782,7 +782,7 @@ F src/resolve.c c8a5372b97b2a2e972a280676f06ddb5b74e885d3b1f5ce383f839907b57ef68 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 F src/select.c 83e88fbb36f89b6703b348777491619554f0fd6f917c9fdf51e4c2e9cda6c04e F src/shell.c.in b377a59822f207106424f08aead37e78b609222e98f86f04cc8a03563ccf3237 -F src/sqlite.h.in 6bdaf7c577fba45afef371ba69852de9965e23e8b13b9aa099d90281bf0c1e54 +F src/sqlite.h.in cc9a2d5a719b7434e2699ff7c28a56209b8aa459b7f80ff1d4d7d8ac6ebfd96e F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54 F src/sqliteInt.h 7f1b070ea3b4ab3c192be553810684f686fdb03f62f90afa2da64d4d61d91ec3 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P b07c64077a3912ef7cdf23e9411df6387f38baa32f5a11fffec5ba4f93935e27 -R 1587f5175225e9073d51285cc57826f6 +P d08a7aa8987458a91fcb861d58289e622ba8722936c7874a284f9f2fd782e269 +R e49065fa7e2398b7b6e928bf8f7bfc59 U drh -Z 785e2e3ea6ab6da1a366fb937ef1ab28 +Z 8691b65bebb646fe5d4e88f85d5d14cb # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 262be1b4aa..4cc6cbc2ef 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d08a7aa8987458a91fcb861d58289e622ba8722936c7874a284f9f2fd782e269 +b8de75eeded79a8312218d7a543e7c7d11181c9f4004e875495608d11a81ff38 diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 58482f81cb..885f187a43 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -2587,7 +2587,7 @@ struct sqlite3_mem_methods { ** ** [[DBCONFIG arguments]]

          Arguments To SQLITE_DBCONFIG Options

          ** -**

          Most of the SQLITE_DBCONFIG options take two argument, an integer +**

          Most of the SQLITE_DBCONFIG options take two arguments: an integer ** and a pointer to an integer. If the first integer argument is 1, then ** the option becomes enabled. If the first integer argument is 0, then the ** option is disabled. If the first argument is -1, then the option setting From c49bfdbbee49c6a877d585ec08da131e2814730f Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 1 Feb 2025 23:49:01 +0000 Subject: [PATCH 159/220] Add a missing "db2 close" to the ext/session/session_gen.test test module. FossilOrigin-Name: 4068f586ddadd3a818645574f7584fcee6d373dbf45805c545100883b495598a --- ext/session/session_gen.test | 1 + manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/ext/session/session_gen.test b/ext/session/session_gen.test index 8d3c5887f3..e9de4beaba 100644 --- a/ext/session/session_gen.test +++ b/ext/session/session_gen.test @@ -181,6 +181,7 @@ foreach {tn sql} { compare_db db db2 } {} } +db2 close }]} diff --git a/manifest b/manifest index 7159e8849a..7bc3347512 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\scomment\stypo\s-\sin\sa\scomment\sused\sto\sgenerate\sdocumentation. -D 2025-02-01T23:34:33.636 +C Add\sa\smissing\s"db2\sclose"\sto\sthe\sext/session/session_gen.test\stest\smodule. +D 2025-02-01T23:49:01.341 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -593,7 +593,7 @@ F ext/session/sessionF.test d37ed800881e742c208df443537bf29aa49fd56eac520d0f0c6d F ext/session/sessionG.test 3efe388282d641b65485b5462e67851002cd91a282dc95b685d085eb8efdad0a F ext/session/sessionH.test 71bbff6b1abb2c4ac62b84dee53273c37e0b21e5fde3aed80929403e091ef859 F ext/session/session_common.tcl a31f537a929a695a852d241c9434f2847cadf329856401921139fbb03a5a7697 -F ext/session/session_gen.test 3f2ff2bd71694b82bd17c5ab2002635c54affb909fca2ee749b2daf95ff86648 +F ext/session/session_gen.test 942a0002df10da53c45b40b581cc3ed25e7ff42bda1e7ba497273dc2887aa8e6 F ext/session/session_speed_test.c dcf0ef58d76b70c8fbd9eab3be77cf9deb8bc1638fed8be518b62d6cbdef88b3 F ext/session/sessionalter.test e852acb3d2357aac7d0b920a2109da758c4331bfdf85b41d39aa3a8c18914f65 F ext/session/sessionat.test 00c8badb35e43a2f12a716d2734a44d614ff62361979b6b85419035bc04b45ee @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P d08a7aa8987458a91fcb861d58289e622ba8722936c7874a284f9f2fd782e269 -R e49065fa7e2398b7b6e928bf8f7bfc59 +P b8de75eeded79a8312218d7a543e7c7d11181c9f4004e875495608d11a81ff38 +R 70de67d2731c96d5565daabba5a9f711 U drh -Z 8691b65bebb646fe5d4e88f85d5d14cb +Z 0c60cdc79cd4db383ea08f9fcd4c5692 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 4cc6cbc2ef..f6733e5fe5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b8de75eeded79a8312218d7a543e7c7d11181c9f4004e875495608d11a81ff38 +4068f586ddadd3a818645574f7584fcee6d373dbf45805c545100883b495598a From 14613b1b1d9ef977229a9b8279e54c569469d2a9 Mon Sep 17 00:00:00 2001 From: stephan Date: Sun, 2 Feb 2025 12:15:25 +0000 Subject: [PATCH 160/220] URL typo fix in code comments. No code changes. FossilOrigin-Name: 002a123094e4ef14eb5ec28033adca6083ba2717e1eaa23e80595e37a947e6c2 --- ext/wasm/common/whwasmutil.js | 2 +- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ext/wasm/common/whwasmutil.js b/ext/wasm/common/whwasmutil.js index de0f667876..509d33b371 100644 --- a/ext/wasm/common/whwasmutil.js +++ b/ext/wasm/common/whwasmutil.js @@ -170,7 +170,7 @@ More specifically: - https://fossil.wanderinghorse.net/r/jaccwabbyt/file/common/whwasmutil.js + https://fossil.wanderinghorse.net/r/jaccwabyt/file/common/whwasmutil.js */ globalThis.WhWasmUtilInstaller = function(target){ 'use strict'; diff --git a/manifest b/manifest index 7bc3347512..6b499b9e73 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\smissing\s"db2\sclose"\sto\sthe\sext/session/session_gen.test\stest\smodule. -D 2025-02-01T23:49:01.341 +C URL\stypo\sfix\sin\scode\scomments.\sNo\scode\schanges. +D 2025-02-02T12:15:25.699 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -659,7 +659,7 @@ F ext/wasm/c-pp.c 6d131069644964223305582a80973477fa8b06b57306781690d7874ebd3a4f F ext/wasm/common/SqliteTestUtil.js 7adaeffef757d8708418dc9190f72df22367b531831775804b31598b44f6aa51 F ext/wasm/common/emscripten.css 11bd104b6c0d597c67d40cc8ecc0a60dae2b965151e3b6a37fa5708bac3acd15 F ext/wasm/common/testing.css e97549bab24126c24e0daabfe2de9bb478fb0a69fdb2ddd0a73a992c091aad6f -F ext/wasm/common/whwasmutil.js 8528ac79418ee7eafe7c8f634a08704e47d694d3fd8ea6368be27a5229733338 +F ext/wasm/common/whwasmutil.js c2e459286c1ada789cda6b17761bb1eea6034be572468eed78c049354f1051ba F ext/wasm/config.make.in 4bc43443f768a61efd43cf995a5e618f58ac9afc0936706014193537d82c41cb F ext/wasm/demo-123-worker.html a0b58d9caef098a626a1a1db567076fca4245e8d60ba94557ede8684350a81ed F ext/wasm/demo-123.html 8c70a412ce386bd3796534257935eb1e3ea5c581e5d5aea0490b8232e570a508 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P b8de75eeded79a8312218d7a543e7c7d11181c9f4004e875495608d11a81ff38 -R 70de67d2731c96d5565daabba5a9f711 -U drh -Z 0c60cdc79cd4db383ea08f9fcd4c5692 +P 4068f586ddadd3a818645574f7584fcee6d373dbf45805c545100883b495598a +R bd36ece0544440b71f6e303d972a7e2f +U stephan +Z 78f6520da2cf6d27938a2b853e051a64 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index f6733e5fe5..3c1ca149ca 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4068f586ddadd3a818645574f7584fcee6d373dbf45805c545100883b495598a +002a123094e4ef14eb5ec28033adca6083ba2717e1eaa23e80595e37a947e6c2 From c229f1181790894dd60262b46357def1e2f3d932 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sun, 2 Feb 2025 16:52:21 +0000 Subject: [PATCH 161/220] Update to the "--help" output from speedtest1. FossilOrigin-Name: 5216452047eecdd6c0f6ab85b304f975ed05a394a4ad9ae793fb65d645502b12 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/speedtest1.c | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 6b499b9e73..c251f9984c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C URL\stypo\sfix\sin\scode\scomments.\sNo\scode\schanges. -D 2025-02-02T12:15:25.699 +C Update\sto\sthe\s"--help"\soutput\sfrom\sspeedtest1. +D 2025-02-02T16:52:21.308 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -1681,7 +1681,7 @@ F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa F test/speed4p.test 377a0c48e5a92e0b11c1c5ebb1bc9d83a7312c922bc0cb05970ef5d6a96d1f0c F test/speedtest.md ee958457ae1b729d9715ae33c0320600000bf1d9ddea1a88dcf79f56729d6fad F test/speedtest.tcl 8a9362c1e429318e741b91d26888e7edcc326f98c3aea505ffd618cc5b9e7f0a x -F test/speedtest1.c 323ce0956430a5aae56ea20f502da7bea3fb62b8ed02e9b0f12ab078b2b258f5 +F test/speedtest1.c f17c04829e6e9ccd60f23c38f1a6cc640e3ae807ce54192f062eb22dece40e61 F test/spellfix.test 951a6405d49d1a23d6b78027d3877b4a33eeb8221dcab5704b499755bb4f552e F test/spellfix2.test dfc8f519a3fc204cb2dfa8b4f29821ae90f6f8c3 F test/spellfix3.test 0f9efaaa502a0e0a09848028518a6fb096c8ad33 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 4068f586ddadd3a818645574f7584fcee6d373dbf45805c545100883b495598a -R bd36ece0544440b71f6e303d972a7e2f -U stephan -Z 78f6520da2cf6d27938a2b853e051a64 +P 002a123094e4ef14eb5ec28033adca6083ba2717e1eaa23e80595e37a947e6c2 +R 0dfb19693dad143344d481eff7a8c7a1 +U drh +Z eab3264d2412f89567991828cb35b655 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 3c1ca149ca..4f45593820 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -002a123094e4ef14eb5ec28033adca6083ba2717e1eaa23e80595e37a947e6c2 +5216452047eecdd6c0f6ab85b304f975ed05a394a4ad9ae793fb65d645502b12 diff --git a/test/speedtest1.c b/test/speedtest1.c index 8847ed04bf..7bceae8512 100644 --- a/test/speedtest1.c +++ b/test/speedtest1.c @@ -43,8 +43,8 @@ static const char zHelp[] = " --stmtscanstatus Activate SQLITE_DBCONFIG_STMT_SCANSTATUS\n" " --temp N N from 0 to 9. 0: no temp table. 9: all temp tables\n" " --testset T Run test-set T (main, cte, rtree, orm, fp, json, debug)\n" - " Can be a comma-separated list of values, with /SCALE suffixes\n" - " or macro \"mix1\"\n" + " Can be a comma-separated list of values, with /SCALE\n" + " suffixes or macro \"mix1\"\n" " --trace Turn on SQL tracing\n" " --threads N Use up to N threads for sorting\n" " --utf16be Set text encoding to UTF-16BE\n" From f306ca52861de23de08b2247e8f30ce426fa8fcb Mon Sep 17 00:00:00 2001 From: drh <> Date: Sun, 2 Feb 2025 18:01:32 +0000 Subject: [PATCH 162/220] Add a header comment to test/speedtest1.c that outlines how to compile the program using historical amalgamation sources, for comparison testing. FossilOrigin-Name: 602d4dd69ec9a724c69cb41ab15376ec731bfd4894fac0a2b25076b857786c6d --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/speedtest1.c | 25 ++++++++++++++++++++++++- 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index c251f9984c..4c732ac4a4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sto\sthe\s"--help"\soutput\sfrom\sspeedtest1. -D 2025-02-02T16:52:21.308 +C Add\sa\sheader\scomment\sto\stest/speedtest1.c\sthat\soutlines\show\sto\scompile\sthe\nprogram\susing\shistorical\samalgamation\ssources,\sfor\scomparison\stesting. +D 2025-02-02T18:01:32.649 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -1681,7 +1681,7 @@ F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa F test/speed4p.test 377a0c48e5a92e0b11c1c5ebb1bc9d83a7312c922bc0cb05970ef5d6a96d1f0c F test/speedtest.md ee958457ae1b729d9715ae33c0320600000bf1d9ddea1a88dcf79f56729d6fad F test/speedtest.tcl 8a9362c1e429318e741b91d26888e7edcc326f98c3aea505ffd618cc5b9e7f0a x -F test/speedtest1.c f17c04829e6e9ccd60f23c38f1a6cc640e3ae807ce54192f062eb22dece40e61 +F test/speedtest1.c 204acd8af326bbca2c28f68166635d4574381f4cabbac1bc243663f5dcc5051d F test/spellfix.test 951a6405d49d1a23d6b78027d3877b4a33eeb8221dcab5704b499755bb4f552e F test/spellfix2.test dfc8f519a3fc204cb2dfa8b4f29821ae90f6f8c3 F test/spellfix3.test 0f9efaaa502a0e0a09848028518a6fb096c8ad33 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 002a123094e4ef14eb5ec28033adca6083ba2717e1eaa23e80595e37a947e6c2 -R 0dfb19693dad143344d481eff7a8c7a1 +P 5216452047eecdd6c0f6ab85b304f975ed05a394a4ad9ae793fb65d645502b12 +R e5e73e420449b95dfe1df31fa75f6670 U drh -Z eab3264d2412f89567991828cb35b655 +Z c88ad2ace3864df1c4b3b50fb44cd819 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 4f45593820..e6c8d08022 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5216452047eecdd6c0f6ab85b304f975ed05a394a4ad9ae793fb65d645502b12 +602d4dd69ec9a724c69cb41ab15376ec731bfd4894fac0a2b25076b857786c6d diff --git a/test/speedtest1.c b/test/speedtest1.c index 7bceae8512..9d8ddc4545 100644 --- a/test/speedtest1.c +++ b/test/speedtest1.c @@ -1,6 +1,28 @@ /* ** A program for performance testing. ** +** To build this program against an historical version of SQLite for comparison +** testing: +** +** Unix: +** +** ./configure --all +** make clean speedtest1 +** mv speedtest1 speedtest1-current +** cp $HISTORICAL_SQLITE3_C_H . +** touch sqlite3.c sqlite3.h .target_source +** make speedtest1 +** mv speedtest1 speedtest1-baseline +** +** Windows: +** +** nmake /f Makefile.msc clean speedtest1.exe +** mv speedtest1.exe speedtest1-current.exe +** cp $HISTORICAL_SQLITE_C_H . +** touch sqlite3.c sqlite3.h .target_source +** nmake /f Makefile.msc speedtest1.exe +** mv speedtest1.exe speedtest1-baseline.exe +** ** The available command-line options are described below: */ static const char zHelp[] = @@ -42,7 +64,8 @@ static const char zHelp[] = " --stats Show statistics at the end\n" " --stmtscanstatus Activate SQLITE_DBCONFIG_STMT_SCANSTATUS\n" " --temp N N from 0 to 9. 0: no temp table. 9: all temp tables\n" - " --testset T Run test-set T (main, cte, rtree, orm, fp, json, debug)\n" + " --testset T Run test-set T (main, cte, rtree, orm, fp, json," + " debug)\n" " Can be a comma-separated list of values, with /SCALE\n" " suffixes or macro \"mix1\"\n" " --trace Turn on SQL tracing\n" From 4170780a82421bf723a95838d8e3e04d157de823 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 3 Feb 2025 12:42:03 +0000 Subject: [PATCH 163/220] The "clean" target on Makefile.msc should not delete the auto.def file. FossilOrigin-Name: 72fbcedfb09febb72fa325cb21d160cd33dca7fe5579817143f47d90a20ec2ef --- Makefile.msc | 3 ++- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/Makefile.msc b/Makefile.msc index 33c5ef107e..f5a1a9164d 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -2811,7 +2811,8 @@ moreclean: clean clean: del /Q *.exp *.lo *.ilk *.lib *.obj *.ncb *.pdb *.sdf *.suo 2>NUL - del /Q *.bsc *.def *.cod *.da *.bb *.bbg *.vc gmon.out 2>NUL + del /Q *.bsc *.cod *.da *.bb *.bbg *.vc gmon.out 2>NUL + del /Q sqlite3.def tclsqlite3.def 2>NUL del /Q $(SQLITE3EXE) $(SQLITE3DLL) Replace.exe 2>NUL # <> del /Q $(SQLITE3TCLDLL) pkgIndex.tcl 2>NUL diff --git a/manifest b/manifest index 4c732ac4a4..604113d5d4 100644 --- a/manifest +++ b/manifest @@ -1,11 +1,11 @@ -C Add\sa\sheader\scomment\sto\stest/speedtest1.c\sthat\soutlines\show\sto\scompile\sthe\nprogram\susing\shistorical\samalgamation\ssources,\sfor\scomparison\stesting. -D 2025-02-02T18:01:32.649 +C The\s"clean"\starget\son\sMakefile.msc\sshould\snot\sdelete\sthe\sauto.def\sfile. +D 2025-02-03T12:42:03.773 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d F Makefile.in 38485d15d9190cdad0d7bee25af7b442028865964025dcc61f40fd8d6e369cfc F Makefile.linux-generic bd3e3cacd369821a6241d4ea1967395c962dfe3057e38cb0a435cee0e8b789d0 -F Makefile.msc 39785ec45f9ae0311e49094eff2ee079562246fed6be3b9f632a99d4df20056a +F Makefile.msc b335ae09e0396f6fb1ff3cc477b5d42f7b19f5b657b9deb8761c02fb9ec93df9 F README.md c3c0f19532ce28f6297a71870f3c7b424729f0e6d9ab889616d3587dd2332159 F VERSION 01f7606130e48fd58a74d1e45e565f2674819d6eadbc219d328d94bb3362b818 F art/icon-243x273.gif 9750b734f82fdb3dc43127753d5e6fbf3b62c9f4e136c2fbf573b2f57ea87af5 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 5216452047eecdd6c0f6ab85b304f975ed05a394a4ad9ae793fb65d645502b12 -R e5e73e420449b95dfe1df31fa75f6670 +P 602d4dd69ec9a724c69cb41ab15376ec731bfd4894fac0a2b25076b857786c6d +R 24aae7cdfe868af0a232714dd29906e1 U drh -Z c88ad2ace3864df1c4b3b50fb44cd819 +Z 6573e99f3b8fb91d202a158e322a8831 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index e6c8d08022..e76b7795a9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -602d4dd69ec9a724c69cb41ab15376ec731bfd4894fac0a2b25076b857786c6d +72fbcedfb09febb72fa325cb21d160cd33dca7fe5579817143f47d90a20ec2ef From 3cf467a3ec3f5311cb70e229f9f675d567fabeea Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 3 Feb 2025 13:20:11 +0000 Subject: [PATCH 164/220] Adjust the build process to avoid extra CR characters inserted by jimsh on Windows. FossilOrigin-Name: 1f54853932cec9ba20e9be48a59f1817b8b45e4c4d6ef8a06d34f86dd688e28e --- Makefile.msc | 4 ++-- main.mk | 6 +++--- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- tool/mkshellc.tcl | 3 +++ tool/mksqlite3c.tcl | 2 +- tool/mksqlite3h.tcl | 31 +++++++++++++++++++++++++------ 7 files changed, 45 insertions(+), 23 deletions(-) diff --git a/Makefile.msc b/Makefile.msc index f5a1a9164d..c1a8f88b6e 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -2334,7 +2334,7 @@ parse.c: $(TOP)\src\parse.y lemon.exe .\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 $(JIM_TCLSH) - $(JIM_TCLSH) $(TOP)\tool\mksqlite3h.tcl "$(TOP:\=/)" > $(SQLITE3H) $(MKSQLITE3H_ARGS) + $(JIM_TCLSH) $(TOP)\tool\mksqlite3h.tcl "$(TOP:\=/)" -o $(SQLITE3H) $(MKSQLITE3H_ARGS) sqlite3ext.h: .target_source !IF $(USE_STDCALL)!=0 || $(FOR_WIN10)!=0 @@ -2398,7 +2398,7 @@ SHELL_DEP = $(SHELL_DEP) $(TOP)\ext\misc\zipfile.c !ENDIF shell.c: $(SHELL_DEP) $(TOP)\tool\mkshellc.tcl $(JIM_TCLSH) - $(JIM_TCLSH) $(TOP)\tool\mkshellc.tcl > shell.c + $(JIM_TCLSH) $(TOP)\tool\mkshellc.tcl shell.c zlib: pushd $(ZLIBDIR) && $(MAKE) /f win32\Makefile.msc clean $(ZLIBLIB) && popd diff --git a/main.mk b/main.mk index f2212c4f11..00632a5d5c 100644 --- a/main.mk +++ b/main.mk @@ -1066,7 +1066,7 @@ mksourceid$(B.exe): $(MAKE_SANITY_CHECK) $(TOP)/tool/mksourceid.c sqlite3.h: $(MAKE_SANITY_CHECK) $(TOP)/src/sqlite.h.in \ $(TOP)/manifest mksourceid$(B.exe) \ $(TOP)/VERSION $(B.tclsh) - $(B.tclsh) $(TOP)/tool/mksqlite3h.tcl $(TOP) >sqlite3.h + $(B.tclsh) $(TOP)/tool/mksqlite3h.tcl $(TOP) -o sqlite3.h sqlite3.c: .target_source sqlite3.h $(TOP)/tool/mksqlite3c.tcl src-verify$(B.exe) \ $(B.tclsh) @@ -1075,7 +1075,7 @@ sqlite3.c: .target_source sqlite3.h $(TOP)/tool/mksqlite3c.tcl src-verify$(B.exe cp $(TOP)/ext/session/sqlite3session.h . sqlite3r.h: sqlite3.h $(B.tclsh) - $(B.tclsh) $(TOP)/tool/mksqlite3h.tcl $(TOP) --enable-recover >sqlite3r.h + $(B.tclsh) $(TOP)/tool/mksqlite3h.tcl $(TOP) --enable-recover -o sqlite3r.h sqlite3r.c: sqlite3.c sqlite3r.h $(B.tclsh) cp $(TOP)/ext/recover/sqlite3recover.c tsrc/ @@ -2210,7 +2210,7 @@ SHELL_DEP = \ $(TOP)/src/test_windirent.h shell.c: $(SHELL_DEP) $(TOP)/tool/mkshellc.tcl $(B.tclsh) - $(B.tclsh) $(TOP)/tool/mkshellc.tcl >shell.c + $(B.tclsh) $(TOP)/tool/mkshellc.tcl shell.c # # Rules to build the extension objects. diff --git a/manifest b/manifest index 604113d5d4..ae3fd789be 100644 --- a/manifest +++ b/manifest @@ -1,11 +1,11 @@ -C The\s"clean"\starget\son\sMakefile.msc\sshould\snot\sdelete\sthe\sauto.def\sfile. -D 2025-02-03T12:42:03.773 +C Adjust\sthe\sbuild\sprocess\sto\savoid\sextra\sCR\scharacters\sinserted\sby\sjimsh\non\sWindows. +D 2025-02-03T13:20:11.678 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d F Makefile.in 38485d15d9190cdad0d7bee25af7b442028865964025dcc61f40fd8d6e369cfc F Makefile.linux-generic bd3e3cacd369821a6241d4ea1967395c962dfe3057e38cb0a435cee0e8b789d0 -F Makefile.msc b335ae09e0396f6fb1ff3cc477b5d42f7b19f5b657b9deb8761c02fb9ec93df9 +F Makefile.msc a9b95ae9807e17f9b0734ebe97d68032141c3f95286bb64593cb73b206f043cf F README.md c3c0f19532ce28f6297a71870f3c7b424729f0e6d9ab889616d3587dd2332159 F VERSION 01f7606130e48fd58a74d1e45e565f2674819d6eadbc219d328d94bb3362b818 F art/icon-243x273.gif 9750b734f82fdb3dc43127753d5e6fbf3b62c9f4e136c2fbf573b2f57ea87af5 @@ -702,7 +702,7 @@ F ext/wasm/tests/opfs/concurrency/test.js d08889a5bb6e61937d0b8cbb78c9efbefbf65a F ext/wasm/tests/opfs/concurrency/worker.js 0a8c1a3e6ebb38aabbee24f122693f1fb29d599948915c76906681bb7da1d3d2 F ext/wasm/wasmfs.make 68999f5bd8c489239592d59a420f8c627c99169bbd6fa16a404751f757b9f702 F magic.txt 5ade0bc977aa135e79e3faaea894d5671b26107cc91e70783aa7dc83f22f3ba0 -F main.mk 043987843e8365dbaf74dce60c11683b62e2bcfcb3122574c14a0324d37a72f3 +F main.mk 8cfe182232ac7bbc87530792db6f31c09f2a2f35e9887d0412978746efe42ea9 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 F mptest/crash01.test 61e61469e257df0850df4293d7d4d6c2af301421 @@ -2153,12 +2153,12 @@ F tool/mkopcodec.tcl 33d20791e191df43209b77d37f0ff0904620b28465cca6990cf8d60da61 F tool/mkopcodeh.tcl 2b4e6967a670ef21bf53a164964c35c6163277d002a4c6f56fa231d68c88d023 F tool/mkopts.tcl 680f785fdb09729fd9ac50632413da4eadbdf9071535e3f26d03795828ab07fa F tool/mkpragmatab.tcl 32e359ccb21011958a821955254bd7a5fa7915d01a8c16fed91ffc8b40cb4adf -F tool/mkshellc.tcl 2bc29c201933ae72a16a79070fe80aded80c24ea487ecd2f8df20c2973c87bfc +F tool/mkshellc.tcl 9ce74de0fa904a2c56a96f8d8b5261246bacb0eaa8d7e184f9e18ff94145ebbc F tool/mksourceid.c 36aa8020014aed0836fd13c51d6dc9219b0df1761d6b5f58ff5b616211b079b9 F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 F tool/mksqlite3c-noext.tcl 4f7cfef5152b0c91920355cbfc1d608a4ad242cb819f1aea07f6d0274f584a7f -F tool/mksqlite3c.tcl 9e88a30981280e33489fe4782f4ab1e5349ba1866603fba7f1a948d5599b9124 -F tool/mksqlite3h.tcl 5a8d23f35462bfcf74324a19465abd0ad6717b92a404d177160963c292df5d04 +F tool/mksqlite3c.tcl 1b24a4388f544a7f42fc2d03f34422182d3b2263453f65f642890259566369c1 +F tool/mksqlite3h.tcl 3cc8f3fbb3eca38c899549385622637667254067d865a70ad16e0996c2fd3214 F tool/mksqlite3internalh.tcl eb994013e833359137eb53a55acdad0b5ae1049b F tool/mksrczip.tcl 81efd9974dbb36005383f2cd655520057a2ae5aa85ac2441a80c7c28f803ac52 F tool/mktoolzip.tcl 34b4e92be544f820e2cc26f143f7d5aec511e826ec394cc82969a5dcf7c7a27c @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 602d4dd69ec9a724c69cb41ab15376ec731bfd4894fac0a2b25076b857786c6d -R 24aae7cdfe868af0a232714dd29906e1 +P 72fbcedfb09febb72fa325cb21d160cd33dca7fe5579817143f47d90a20ec2ef +R 4d732beb3e0a16061f12827a776553c4 U drh -Z 6573e99f3b8fb91d202a158e322a8831 +Z 6e6db52bccac51a05d3eab6549c06d4c # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index e76b7795a9..5ca1ca5a2b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -72fbcedfb09febb72fa325cb21d160cd33dca7fe5579817143f47d90a20ec2ef +1f54853932cec9ba20e9be48a59f1817b8b45e4c4d6ef8a06d34f86dd688e28e diff --git a/tool/mkshellc.tcl b/tool/mkshellc.tcl index af9804e4fa..85e14f8498 100644 --- a/tool/mkshellc.tcl +++ b/tool/mkshellc.tcl @@ -12,6 +12,9 @@ set topdir [file dir [file dir [file normal $argv0]]] set out stdout fconfigure stdout -translation binary +if {[lindex $argv 0]!=""} { + set out [open [lindex $argv 0] wb] +} puts $out {/* DO NOT EDIT! ** This file is automatically generated by the script in the canonical ** SQLite source tree at tool/mkshellc.tcl. That script combines source diff --git a/tool/mksqlite3c.tcl b/tool/mksqlite3c.tcl index 1b3958f460..ddc1e58776 100644 --- a/tool/mksqlite3c.tcl +++ b/tool/mksqlite3c.tcl @@ -130,7 +130,7 @@ if {[file executable $vsrcprog] && [file readable $srcroot/manifest]} { } else { puts $out " with changes in files:\n**" foreach f [lrange $res 1 end] { - puts $out "** $f" + puts $out "** [string trim $f]" } } } else { diff --git a/tool/mksqlite3h.tcl b/tool/mksqlite3h.tcl index b409d306b2..8ef123bc72 100644 --- a/tool/mksqlite3h.tcl +++ b/tool/mksqlite3h.tcl @@ -24,18 +24,36 @@ # 6) Adds the SQLITE_CALLBACK calling convention macro in front of all # callback declarations. # -# This script outputs to stdout. +# This script outputs to stdout unless the -o FILENAME option is used. # # Example usage: # -# tclsh mksqlite3h.tcl ../sqlite >sqlite3.h +# tclsh mksqlite3h.tcl ../sqlite [OPTIONS] +# ^^^^^^^^^ +# Root of source tree +# +# Where options are: +# +# --enable-recover Include the sqlite3recover extension +# -o FILENAME Write results to FILENAME instead of stdout +# --useapicall SQLITE_APICALL instead of SQLITE_CDECL # +# Default output stream +set out stdout # Get the source tree root directory from the command-line # set TOP [lindex $argv 0] +# If the -o FILENAME option is present, use FILENAME for output. +# +set x [lsearch $argv -o] +if {$x>0} { + incr x + set out [open [lindex $argv $x] wb] +} + # Enable use of SQLITE_APICALL macros at the right points? # set useapicall 0 @@ -44,6 +62,7 @@ set useapicall 0 # set enable_recover 0 +# Process command-line arguments if {[lsearch -regexp [lrange $argv 1 end] {^-+useapicall}] != -1} { set useapicall 1 } @@ -118,7 +137,7 @@ set cdecllist { foreach file $filelist { set in [open $file rb] if {![regexp {sqlite\.h\.in} $file]} { - puts "/******** Begin file [file tail $file] *********/" + puts $out "/******** Begin file [file tail $file] *********/" } while {![eof $in]} { @@ -161,11 +180,11 @@ foreach file $filelist { "(SQLITE_SYSAPI *sqlite3_syscall_ptr)"] $line] regsub {\(\*} $line {(SQLITE_CALLBACK *} line } - puts $line + puts $out $line } close $in if {![regexp {sqlite\.h\.in} $file]} { - puts "/******** End of [file tail $file] *********/" + puts $out "/******** End of [file tail $file] *********/" } } -puts "#endif /* SQLITE3_H */" +puts $out "#endif /* SQLITE3_H */" From d256b568806e32efd063f280a55830dbbf21ddff Mon Sep 17 00:00:00 2001 From: stephan Date: Mon, 3 Feb 2025 14:04:27 +0000 Subject: [PATCH 165/220] Correct the FuncPtrAdapter signature for the JS binding of sqlite3_set_auxdata(). Reported in [https://github.com/sqlite/sqlite-wasm/issues/92|the npm subproject, ticket #92]. FossilOrigin-Name: 76c8435a5f390001038b8ee94322ff478c9d5f29501ed1c5891c952a41e377aa --- ext/wasm/api/sqlite3-api-glue.c-pp.js | 2 +- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ext/wasm/api/sqlite3-api-glue.c-pp.js b/ext/wasm/api/sqlite3-api-glue.c-pp.js index 680218370a..ddcf2535fd 100644 --- a/ext/wasm/api/sqlite3-api-glue.c-pp.js +++ b/ext/wasm/api/sqlite3-api-glue.c-pp.js @@ -232,7 +232,7 @@ globalThis.sqlite3ApiBootstrap.initializers.push(function(sqlite3){ "sqlite3_context*", "int", "*", new wasm.xWrap.FuncPtrAdapter({ name: 'xDestroyAuxData', - signature: 'v(*)', + signature: 'v(p)', contextKey: (argv, argIndex)=>argv[0/* sqlite3_context* */] }) ]], diff --git a/manifest b/manifest index ae3fd789be..7030dfa0ff 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Adjust\sthe\sbuild\sprocess\sto\savoid\sextra\sCR\scharacters\sinserted\sby\sjimsh\non\sWindows. -D 2025-02-03T13:20:11.678 +C Correct\sthe\sFuncPtrAdapter\ssignature\sfor\sthe\sJS\sbinding\sof\ssqlite3_set_auxdata().\sReported\sin\s[https://github.com/sqlite/sqlite-wasm/issues/92|the\snpm\ssubproject,\sticket\s#92]. +D 2025-02-03T14:04:27.614 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -638,7 +638,7 @@ F ext/wasm/api/post-js-footer.js 365405929f41ca0e6d389ed8a8da3f3c93e11d3ef43a90a F ext/wasm/api/post-js-header.js 54b2b4294501b3866245cc94315a16f5424c0e87729d0fb610fba151593c6d26 F ext/wasm/api/pre-js.c-pp.js a614a2c82b12c4d96d8e3ba77330329efc53c4d56a8a7e60ade900f341866cfb F ext/wasm/api/sqlite3-api-cleanup.js 3ac1786e461ada63033143be8c3b00b26b939540661f3e839515bb92f2e35359 -F ext/wasm/api/sqlite3-api-glue.c-pp.js fb6dbfe692cc23000a65a4cd95a1a47ed5eb592dc9d8b55363b3c2952a787244 +F ext/wasm/api/sqlite3-api-glue.c-pp.js 0fc6a377907a5101ee426fda7e91def6a310785b23b7a39dd8b2c5e47ee36b4b F ext/wasm/api/sqlite3-api-oo1.c-pp.js f3a8e2004c6625d17946c11f2fb32008be78bc5207bf746fc77d59848813225f F ext/wasm/api/sqlite3-api-prologue.js 5ff913355b3144f1c9719d0406667fa6e13eb813c71ed7ce29440e2e65363e82 F ext/wasm/api/sqlite3-api-worker1.c-pp.js 5cc22a3c0d52828cb32aad8691488719f47d27567e63e8bc8b832d74371c352d @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 72fbcedfb09febb72fa325cb21d160cd33dca7fe5579817143f47d90a20ec2ef -R 4d732beb3e0a16061f12827a776553c4 -U drh -Z 6e6db52bccac51a05d3eab6549c06d4c +P 1f54853932cec9ba20e9be48a59f1817b8b45e4c4d6ef8a06d34f86dd688e28e +R d1320d9ef5942af95a84d7f496345d0f +U stephan +Z 691559c7ab028b93ffa7b33fa4caf5f0 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 5ca1ca5a2b..e59ab15d96 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1f54853932cec9ba20e9be48a59f1817b8b45e4c4d6ef8a06d34f86dd688e28e +76c8435a5f390001038b8ee94322ff478c9d5f29501ed1c5891c952a41e377aa From 77586831edf2f93cd8a74c1845aa6ed609cdfc1f Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 3 Feb 2025 14:40:05 +0000 Subject: [PATCH 166/220] Bring the autoconf-tarball Makefile.msc into alignment with the main Makefile.msc. FossilOrigin-Name: 52a7a162d131532de8f4403b099fa122fc72c80f71494fb561afc4e0ff8e6bf4 --- autoconf/Makefile.msc | 3 ++- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/autoconf/Makefile.msc b/autoconf/Makefile.msc index 1f0e42db4b..47e0a83af8 100644 --- a/autoconf/Makefile.msc +++ b/autoconf/Makefile.msc @@ -1087,5 +1087,6 @@ $(LIBRESOBJS): $(TOP)\sqlite3.rc rcver.vc $(SQLITE3H) clean: del /Q *.exp *.lo *.ilk *.lib *.obj *.ncb *.pdb *.sdf *.suo 2>NUL - del /Q *.bsc *.def *.cod *.da *.bb *.bbg *.vc gmon.out 2>NUL + del /Q *.bsc *.cod *.da *.bb *.bbg *.vc gmon.out 2>NUL + del /Q sqlite3.def tclsqlite3.def 2>NUL del /Q $(SQLITE3EXE) $(SQLITE3DLL) Replace.exe 2>NUL diff --git a/manifest b/manifest index 7030dfa0ff..1335b4ed07 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Correct\sthe\sFuncPtrAdapter\ssignature\sfor\sthe\sJS\sbinding\sof\ssqlite3_set_auxdata().\sReported\sin\s[https://github.com/sqlite/sqlite-wasm/issues/92|the\snpm\ssubproject,\sticket\s#92]. -D 2025-02-03T14:04:27.614 +C Bring\sthe\sautoconf-tarball\sMakefile.msc\sinto\salignment\swith\sthe\smain\nMakefile.msc. +D 2025-02-03T14:40:05.237 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -17,7 +17,7 @@ F art/sqlite370.svg 40b7e2fe8aac3add5d56dd86ab8d427a4eca5bcb3fe4f8946cb3794e1821 F auto.def e7e92090c98aeb0174d29988c259834eb1b71ae1ea927015c3ef300f6f9b68ae F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac F autoconf/Makefile.in 56697ad25ecf23afa317148b06bdc14f85960b42e5ec434ac1ba87f63a3cb789 -F autoconf/Makefile.msc ffff61fe851443015ddb6600ab69a9df503cfec25459b336be7ba8c9a9e473f8 +F autoconf/Makefile.msc 0a071367537dc395285a5d624ac4f99f3a387b27cc5e89752423c0499e15aec4 F autoconf/README.first f1d3876e9a7852c22f275a6f06814e64934cecbc0b5b9617d64849094c1fd136 F autoconf/README.txt 7f01dc3915e2d68f329011073662369e62a0938a2c69398807823c57591cb288 F autoconf/auto.def 23bc095a3890c0ca334abf7ef67d1c8af4c22c12832bcc738015e868d54fe9d7 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 1f54853932cec9ba20e9be48a59f1817b8b45e4c4d6ef8a06d34f86dd688e28e -R d1320d9ef5942af95a84d7f496345d0f -U stephan -Z 691559c7ab028b93ffa7b33fa4caf5f0 +P 76c8435a5f390001038b8ee94322ff478c9d5f29501ed1c5891c952a41e377aa +R ffc4ba900908f24af2ec6f8d798eed37 +U drh +Z bc5ceaf13617b69dbeab721c1380d466 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index e59ab15d96..a166adab6f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -76c8435a5f390001038b8ee94322ff478c9d5f29501ed1c5891c952a41e377aa +52a7a162d131532de8f4403b099fa122fc72c80f71494fb561afc4e0ff8e6bf4 From d98689f4d39c4729ef95a93317eaa7892a6aaed6 Mon Sep 17 00:00:00 2001 From: stephan Date: Mon, 3 Feb 2025 14:55:56 +0000 Subject: [PATCH 167/220] Add a more complete test for [76c8435a] and add some commentary about (A) the inability to automatically clean up automatically-generated WASM proxy functions for sqlite3_set_auxdata() destructors and (B) how to deal with (A) to avoid leaking WASM proxy functions. FossilOrigin-Name: d693c2dddbd10a2e0b77893b04b11502e30b768f1b06814105f7f35172845fb9 --- ext/wasm/api/sqlite3-api-glue.c-pp.js | 29 ++++++++++++ ext/wasm/tester1.c-pp.js | 67 +++++++++++++++++++++++++++ manifest | 17 ++++--- manifest.uuid | 2 +- 4 files changed, 105 insertions(+), 10 deletions(-) diff --git a/ext/wasm/api/sqlite3-api-glue.c-pp.js b/ext/wasm/api/sqlite3-api-glue.c-pp.js index ddcf2535fd..bcaff7243d 100644 --- a/ext/wasm/api/sqlite3-api-glue.c-pp.js +++ b/ext/wasm/api/sqlite3-api-glue.c-pp.js @@ -228,6 +228,31 @@ globalThis.sqlite3ApiBootstrap.initializers.push(function(sqlite3){ }), '*' ]], + /** + 2025-02-03: We do not have a way to automatically clean up + destructors which are automatically converted from JS functions + via the final argument to sqlite3_set_auxdata(). Because of + that, it is strongly recommended that clients use + wasm.installFunction() to create such callbacks, then pass that + pointer to sqlite3_set_auxdata(). Relying on automated + conversions here will lead to leaks of JS/WASM proxy functions + because sqlite3_set_auxdata() is frequently called in UDFs. + + The sqlite3.oo1.DB class's onclose handlers can be used for this + purpose. For example: + + const pAuxDtor = wasm.installFunction('v(p)', function(ptr){ + //free ptr + }); + myDb.onclose = { + after: ()=>{ + wasm.uninstallFunction(pAuxDtor); + } + }; + + Then pass pAuxDtor as the final argument to appropriate + sqlite3_set_auxdata() calls. + */ ["sqlite3_set_auxdata", undefined, [ "sqlite3_context*", "int", "*", new wasm.xWrap.FuncPtrAdapter({ @@ -1047,6 +1072,10 @@ globalThis.sqlite3ApiBootstrap.initializers.push(function(sqlite3){ 'sqlite3_set_authorizer', 'sqlite3_trace_v2', 'sqlite3_update_hook' + /* + We do not yet have a way to clean up automatically-converted + sqlite3_set_auxdata() finalizers. + */ ]) { const x = wasm.exports[name]; if( !x ){ diff --git a/ext/wasm/tester1.c-pp.js b/ext/wasm/tester1.c-pp.js index f83ecbd873..880edcec1d 100644 --- a/ext/wasm/tester1.c-pp.js +++ b/ext/wasm/tester1.c-pp.js @@ -3437,6 +3437,73 @@ globalThis.sqlite3InitModule = sqlite3InitModule; } } }) + .t({ + /* https://github.com/sqlite/sqlite-wasm/issues/92 */ + name: 'sqlite3_set_auxdata() binding signature', + test: function(sqlite3){ + const db = new sqlite3.oo1.DB(); + const stack = wasm.pstack.pointer; + const pAux = wasm.pstack.alloc(4); + let pAuxDestructed = 0; + const args = []; + const pAuxDtor = wasm.installFunction('v(p)', function(ptr){ + //log("freeing auxdata"); + ++pAuxDestructed; + }); + let pAuxDtorDestructed = false; + db.onclose = { + after: ()=>{ + pAuxDtorDestructed = true; + wasm.uninstallFunction(pAuxDtor); + } + }; + try{ + db.createFunction("auxtest",{ + xFunc: function(pCx, x, y){ + args.push(x); + T.assert(wasm.isPtr(pCx)); + const localAux = capi.sqlite3_get_auxdata(pCx, 0); + if( !localAux ){ + //log("setting auxdata"); + /** + We do not currently an automated way to clean up + auxdata finalizer functions (the 4th argument to + sqlite3_set_auxdata()) which get automatically + converted from JS to WASM. Because of that, relying + on automated conversions for those is not + recommended. Instead, follow the pattern show in + this function: use wasm.installFunction() to create + the function, then pass the resulting function + pointer this function, and cleanup (at some point) + using wasm.uninstallFunction(). + */ + capi.sqlite3_set_auxdata(pCx, 0, pAux, pAuxDtor); + }else{ + /* This is never actually hit in this example and it's + not entirely clear how to cause it to. The point of + this test, however, is to demonstrate that the + finalizer impl gets triggered, so we're not going to + fret over this at the moment. */ + //log("seen auxdata",localAux); + T.assert(pAux===localAux); + } + return x; + } + }); + db.exec([ + "create table t(a);", + "insert into t(a) values(1),(2),(3);", + "select auxtest(a,a), auxtest(a,a) from t order by a" + ]); + }finally{ + db.close(); + wasm.pstack.restore(stack); + } + T.assert(6===args.length); + T.assert(pAuxDestructed>0); + T.assert(pAuxDtorDestructed); + } + }) ;/*end of Bug Reports group*/; //////////////////////////////////////////////////////////////////////// diff --git a/manifest b/manifest index c36f2724d2..54fc8aa8ae 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sbuild\sprocess\son\sWindows\sso\sthat\sit\sgenerates\sidentical\ssqlite3.c,\nsqlite3.h,\sand\sshell.c\sfiles\son\sWindows\sand\sUnix.\s\sThis\spatch\salso\sincludes\na\schange\sto\sJS\sbindings\sthat\sgot\scaught\sup\sin\sthe\sbranch. -D 2025-02-03T14:44:16.557 +C Add\sa\smore\scomplete\stest\sfor\s[76c8435a]\sand\sadd\ssome\scommentary\sabout\s(A)\sthe\sinability\sto\sautomatically\sclean\sup\sautomatically-generated\sWASM\sproxy\sfunctions\sfor\ssqlite3_set_auxdata()\sdestructors\sand\s(B)\show\sto\sdeal\swith\s(A)\sto\savoid\sleaking\sWASM\sproxy\sfunctions. +D 2025-02-03T14:55:56.185 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -638,7 +638,7 @@ F ext/wasm/api/post-js-footer.js 365405929f41ca0e6d389ed8a8da3f3c93e11d3ef43a90a F ext/wasm/api/post-js-header.js 54b2b4294501b3866245cc94315a16f5424c0e87729d0fb610fba151593c6d26 F ext/wasm/api/pre-js.c-pp.js a614a2c82b12c4d96d8e3ba77330329efc53c4d56a8a7e60ade900f341866cfb F ext/wasm/api/sqlite3-api-cleanup.js 3ac1786e461ada63033143be8c3b00b26b939540661f3e839515bb92f2e35359 -F ext/wasm/api/sqlite3-api-glue.c-pp.js 0fc6a377907a5101ee426fda7e91def6a310785b23b7a39dd8b2c5e47ee36b4b +F ext/wasm/api/sqlite3-api-glue.c-pp.js 6e2f2eaf681e342fcb047fcdd01d6e3c1b466fb9b45c1acc38676164a8b60f45 F ext/wasm/api/sqlite3-api-oo1.c-pp.js f3a8e2004c6625d17946c11f2fb32008be78bc5207bf746fc77d59848813225f F ext/wasm/api/sqlite3-api-prologue.js 5ff913355b3144f1c9719d0406667fa6e13eb813c71ed7ce29440e2e65363e82 F ext/wasm/api/sqlite3-api-worker1.c-pp.js 5cc22a3c0d52828cb32aad8691488719f47d27567e63e8bc8b832d74371c352d @@ -696,7 +696,7 @@ F ext/wasm/test-opfs-vfs.html 1f2d672f3f3fce810dfd48a8d56914aba22e45c6834e262555 F ext/wasm/test-opfs-vfs.js 1618670e466f424aa289859fe0ec8ded223e42e9e69b5c851f809baaaca1a00c F ext/wasm/tester1-worker.html ebc4b820a128963afce328ecf63ab200bd923309eb939f4110510ab449e9814c F ext/wasm/tester1.c-pp.html 1c1bc78b858af2019e663b1a31e76657b73dc24bede28ca92fbe917c3a972af2 -F ext/wasm/tester1.c-pp.js 05df7cfd2cb8aa8728afb68c90a8af51fdf724c0e892f0f986a695584edae195 +F ext/wasm/tester1.c-pp.js fb8d0761daaa69bd40c8253cc2d6c8c37ada97e1751b7f07af7369842ba2aeae F ext/wasm/tests/opfs/concurrency/index.html 657578a6e9ce1e9b8be951549ed93a6a471f4520a99e5b545928668f4285fb5e F ext/wasm/tests/opfs/concurrency/test.js d08889a5bb6e61937d0b8cbb78c9efbefbf65ad09f510589c779b7cc6a803a88 F ext/wasm/tests/opfs/concurrency/worker.js 0a8c1a3e6ebb38aabbee24f122693f1fb29d599948915c76906681bb7da1d3d2 @@ -2209,9 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 602d4dd69ec9a724c69cb41ab15376ec731bfd4894fac0a2b25076b857786c6d 52a7a162d131532de8f4403b099fa122fc72c80f71494fb561afc4e0ff8e6bf4 -R ffc4ba900908f24af2ec6f8d798eed37 -T +closed 52a7a162d131532de8f4403b099fa122fc72c80f71494fb561afc4e0ff8e6bf4 -U drh -Z 167889892c0bdca97b0a614e610568d1 +P 91ef45fc2902e46813366ec6b8317209f39f10e4a23c3808e33aceedab9da6c7 +R f2c90877762eddda2efda339cfb2ee34 +U stephan +Z 6cfffa02c18a4e52a298c977368cc8d7 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 367348a3ff..c7225ebda1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -91ef45fc2902e46813366ec6b8317209f39f10e4a23c3808e33aceedab9da6c7 +d693c2dddbd10a2e0b77893b04b11502e30b768f1b06814105f7f35172845fb9 From 3cd34ab981ebed34bce66c19bb9144e40c6e9204 Mon Sep 17 00:00:00 2001 From: stephan Date: Mon, 3 Feb 2025 17:34:12 +0000 Subject: [PATCH 168/220] Rework [76c8435a] to eliminate automatic JS-to-WASM function conversions of sqlite3_set_auxdata() destructors because it can leads to leaks on every call of a UDF. This feature never worked before [76c8435a] but fixing it was ill-conceived because of the memory leakage it introduces. WASM function pointers can still be used as destructors in this context. FossilOrigin-Name: 3fb993af0caf041da934cea29c039b27c468be0b75bce1537a6425767cf9bf8d --- ext/wasm/api/sqlite3-api-glue.c-pp.js | 37 +++++++++++++++++---------- ext/wasm/tester1.c-pp.js | 6 ++--- manifest | 14 +++++----- manifest.uuid | 2 +- 4 files changed, 35 insertions(+), 24 deletions(-) diff --git a/ext/wasm/api/sqlite3-api-glue.c-pp.js b/ext/wasm/api/sqlite3-api-glue.c-pp.js index bcaff7243d..a40b832824 100644 --- a/ext/wasm/api/sqlite3-api-glue.c-pp.js +++ b/ext/wasm/api/sqlite3-api-glue.c-pp.js @@ -229,14 +229,15 @@ globalThis.sqlite3ApiBootstrap.initializers.push(function(sqlite3){ '*' ]], /** - 2025-02-03: We do not have a way to automatically clean up - destructors which are automatically converted from JS functions - via the final argument to sqlite3_set_auxdata(). Because of - that, it is strongly recommended that clients use - wasm.installFunction() to create such callbacks, then pass that - pointer to sqlite3_set_auxdata(). Relying on automated - conversions here will lead to leaks of JS/WASM proxy functions - because sqlite3_set_auxdata() is frequently called in UDFs. + We do not have a way to automatically clean up destructors + which are automatically converted from JS functions via the + final argument to sqlite3_set_auxdata(). Because of that, + automatic function conversion is not supported for this + function. Clients should use wasm.installFunction() to create + such callbacks, then pass that pointer to + sqlite3_set_auxdata(). Relying on automated conversions here + would lead to leaks of JS/WASM proxy functions because + sqlite3_set_auxdata() is frequently called in UDFs. The sqlite3.oo1.DB class's onclose handlers can be used for this purpose. For example: @@ -252,14 +253,24 @@ globalThis.sqlite3ApiBootstrap.initializers.push(function(sqlite3){ Then pass pAuxDtor as the final argument to appropriate sqlite3_set_auxdata() calls. + + Note that versions prior to 3.49.0 ostensibly had automatic + function conversion here but a typo prevented it from + working. Rather than fix it, it was removed because testing the + fix brought the huge potential for memory leaks to the + forefront. */ ["sqlite3_set_auxdata", undefined, [ "sqlite3_context*", "int", "*", - new wasm.xWrap.FuncPtrAdapter({ - name: 'xDestroyAuxData', - signature: 'v(p)', - contextKey: (argv, argIndex)=>argv[0/* sqlite3_context* */] - }) + true + ? "*" + : new wasm.xWrap.FuncPtrAdapter({ + /* If we can find a way to automate their cleanup, JS functions can + be auto-converted with this. */ + name: 'xDestroyAuxData', + signature: 'v(p)', + contextKey: (argv, argIndex)=>argv[0/* sqlite3_context* */] + }) ]], ["sqlite3_shutdown", undefined], ["sqlite3_sourceid", "string"], diff --git a/ext/wasm/tester1.c-pp.js b/ext/wasm/tester1.c-pp.js index 880edcec1d..9038d68328 100644 --- a/ext/wasm/tester1.c-pp.js +++ b/ext/wasm/tester1.c-pp.js @@ -3469,9 +3469,9 @@ globalThis.sqlite3InitModule = sqlite3InitModule; We do not currently an automated way to clean up auxdata finalizer functions (the 4th argument to sqlite3_set_auxdata()) which get automatically - converted from JS to WASM. Because of that, relying - on automated conversions for those is not - recommended. Instead, follow the pattern show in + converted from JS to WASM. Because of that, enabling + automated conversions here would lead to leaks more + often than not. Instead, follow the pattern show in this function: use wasm.installFunction() to create the function, then pass the resulting function pointer this function, and cleanup (at some point) diff --git a/manifest b/manifest index 54fc8aa8ae..a55702d8dd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\smore\scomplete\stest\sfor\s[76c8435a]\sand\sadd\ssome\scommentary\sabout\s(A)\sthe\sinability\sto\sautomatically\sclean\sup\sautomatically-generated\sWASM\sproxy\sfunctions\sfor\ssqlite3_set_auxdata()\sdestructors\sand\s(B)\show\sto\sdeal\swith\s(A)\sto\savoid\sleaking\sWASM\sproxy\sfunctions. -D 2025-02-03T14:55:56.185 +C Rework\s[76c8435a]\sto\seliminate\sautomatic\sJS-to-WASM\sfunction\sconversions\sof\ssqlite3_set_auxdata()\sdestructors\sbecause\sit\scan\sleads\sto\sleaks\son\severy\scall\sof\sa\sUDF.\sThis\sfeature\snever\sworked\sbefore\s[76c8435a]\sbut\sfixing\sit\swas\sill-conceived\sbecause\sof\sthe\smemory\sleakage\sit\sintroduces.\sWASM\sfunction\spointers\scan\sstill\sbe\sused\sas\sdestructors\sin\sthis\scontext. +D 2025-02-03T17:34:12.962 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -638,7 +638,7 @@ F ext/wasm/api/post-js-footer.js 365405929f41ca0e6d389ed8a8da3f3c93e11d3ef43a90a F ext/wasm/api/post-js-header.js 54b2b4294501b3866245cc94315a16f5424c0e87729d0fb610fba151593c6d26 F ext/wasm/api/pre-js.c-pp.js a614a2c82b12c4d96d8e3ba77330329efc53c4d56a8a7e60ade900f341866cfb F ext/wasm/api/sqlite3-api-cleanup.js 3ac1786e461ada63033143be8c3b00b26b939540661f3e839515bb92f2e35359 -F ext/wasm/api/sqlite3-api-glue.c-pp.js 6e2f2eaf681e342fcb047fcdd01d6e3c1b466fb9b45c1acc38676164a8b60f45 +F ext/wasm/api/sqlite3-api-glue.c-pp.js 5c0209e6a28164b4c2c1a34b0bb4aee3b7b1a264988d7e71fac08b8ede5b7ae3 F ext/wasm/api/sqlite3-api-oo1.c-pp.js f3a8e2004c6625d17946c11f2fb32008be78bc5207bf746fc77d59848813225f F ext/wasm/api/sqlite3-api-prologue.js 5ff913355b3144f1c9719d0406667fa6e13eb813c71ed7ce29440e2e65363e82 F ext/wasm/api/sqlite3-api-worker1.c-pp.js 5cc22a3c0d52828cb32aad8691488719f47d27567e63e8bc8b832d74371c352d @@ -696,7 +696,7 @@ F ext/wasm/test-opfs-vfs.html 1f2d672f3f3fce810dfd48a8d56914aba22e45c6834e262555 F ext/wasm/test-opfs-vfs.js 1618670e466f424aa289859fe0ec8ded223e42e9e69b5c851f809baaaca1a00c F ext/wasm/tester1-worker.html ebc4b820a128963afce328ecf63ab200bd923309eb939f4110510ab449e9814c F ext/wasm/tester1.c-pp.html 1c1bc78b858af2019e663b1a31e76657b73dc24bede28ca92fbe917c3a972af2 -F ext/wasm/tester1.c-pp.js fb8d0761daaa69bd40c8253cc2d6c8c37ada97e1751b7f07af7369842ba2aeae +F ext/wasm/tester1.c-pp.js 45000532cf83f23a52b31581c1db44bfb82e383b1b68703ae4d3d838de3a833e F ext/wasm/tests/opfs/concurrency/index.html 657578a6e9ce1e9b8be951549ed93a6a471f4520a99e5b545928668f4285fb5e F ext/wasm/tests/opfs/concurrency/test.js d08889a5bb6e61937d0b8cbb78c9efbefbf65ad09f510589c779b7cc6a803a88 F ext/wasm/tests/opfs/concurrency/worker.js 0a8c1a3e6ebb38aabbee24f122693f1fb29d599948915c76906681bb7da1d3d2 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 91ef45fc2902e46813366ec6b8317209f39f10e4a23c3808e33aceedab9da6c7 -R f2c90877762eddda2efda339cfb2ee34 +P d693c2dddbd10a2e0b77893b04b11502e30b768f1b06814105f7f35172845fb9 +R bdcc5096cc30e3d83fdf5d66602909e7 U stephan -Z 6cfffa02c18a4e52a298c977368cc8d7 +Z fd720e9f1383b7c5da4643ab36634ed7 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index c7225ebda1..01d5aa1d3c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d693c2dddbd10a2e0b77893b04b11502e30b768f1b06814105f7f35172845fb9 +3fb993af0caf041da934cea29c039b27c468be0b75bce1537a6425767cf9bf8d From c6281e48933587fe9dcc6e023babea4b7d4bf13c Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 3 Feb 2025 17:45:41 +0000 Subject: [PATCH 169/220] New test case for test/fuzzdata8.db FossilOrigin-Name: 8a882f976e22100b91c7ca4119123f16ad5f03311f0a6dc17449bcdcff29618c --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- test/fuzzdata8.db | Bin 4239360 -> 4241408 bytes 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 809b43bc20..4d31836afa 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Version\s3.48.0 -D 2025-01-14T11:05:00.186 +C New\stest\scase\sfor\stest/fuzzdata8.db +D 2025-02-03T17:45:41.279 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -1283,7 +1283,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db b8725a5f5cf7a3b7241a9038e57ca7e7cc8c3f4d86b44bd770617bda245ab2b0 F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db 4a53b6d077c6a5c23b609d8d3ac66996fa55ba3f8d02f9b6efdd0214a767a35a +F test/fuzzdata8.db deb6533e6dfdb5841eb6a56607bdb74986a57f5739f3975ea542a1f7e7e24d97 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc @@ -2205,11 +2205,11 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 315079b150b47e013e2cde4985bc39d24e0f6f6c6e60f9383fb8ea4ea897c67a -R 0ed0cfcc7f2bc831da5d62a3490571ed -T +sym-major-relase * -T +sym-relase * -T +sym-version-3.48.0 * +P d2fe6b05f38d9d7cd78c5d252e99ac59f1aea071d669830c1ffe4e8966e84010 +R 02fce09966e6e21a0a59cdeb994f84e8 +T *branch * fuzz-data +T *sym-fuzz-data * +T -sym-trunk * U drh -Z cc77aac977f98c5521d75f4212754ff8 +Z b5d75fe3951f12b9fb4038728f5d0116 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 582262f689..8024622a5d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d2fe6b05f38d9d7cd78c5d252e99ac59f1aea071d669830c1ffe4e8966e84010 +8a882f976e22100b91c7ca4119123f16ad5f03311f0a6dc17449bcdcff29618c diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index 3e34180071ede5e023878d8528fe65a8fd9d24b9..f03f3f27191ee07a1014d1babeca93242543de8f 100644 GIT binary patch delta 63340 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 S!o|JP9 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

          vX^Pl|nvH{K=>1TOBe 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 From 9e639d249062d99788b6b10e022d79acc066c78a Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 3 Feb 2025 17:54:55 +0000 Subject: [PATCH 170/220] Fix a use-after-free case in fts5 provoked by fuzzdata8.db. Tcl test case pending. FossilOrigin-Name: a4962df665084e423e020be9a2834b6886a8e3feb461cff5358b61398a2a20d2 --- ext/fts5/fts5_index.c | 16 +++++++++++----- manifest | 17 +++++++---------- manifest.uuid | 2 +- 3 files changed, 19 insertions(+), 16 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index a8ac98b699..0b2d399f82 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -5466,8 +5466,11 @@ static void fts5DoSecureDelete( ** This is called as part of flushing a delete to disk in 'secure-delete' ** mode. It edits the segments within the database described by argument ** pStruct to remove the entries for term zTerm, rowid iRowid. +** +** Return SQLITE_OK if successful, or an SQLite error code if an error +** has occurred. Any error code is also stored in the Fts5Index handle. */ -static void fts5FlushSecureDelete( +static int fts5FlushSecureDelete( Fts5Index *p, Fts5Structure *pStruct, const char *zTerm, @@ -5512,6 +5515,7 @@ static void fts5FlushSecureDelete( } fts5MultiIterFree(pIter); + return p->rc; } @@ -5595,8 +5599,9 @@ static void fts5FlushOneHash(Fts5Index *p){ ** using fts5FlushSecureDelete(). */ if( bSecureDelete ){ if( eDetail==FTS5_DETAIL_NONE ){ - if( iOffrc!=SQLITE_OK || pDoclist[iOff]==0x01 ){ iOff++; continue; diff --git a/manifest b/manifest index 4d31836afa..427775cda2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C New\stest\scase\sfor\stest/fuzzdata8.db -D 2025-02-03T17:45:41.279 +C Fix\sa\suse-after-free\scase\sin\sfts5\sprovoked\sby\sfuzzdata8.db.\sTcl\stest\scase\spending. +D 2025-02-03T17:54:55.366 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -112,7 +112,7 @@ F ext/fts5/fts5_buffer.c 0eec58bff585f1a44ea9147eae5da2447292080ea435957f7488c70 F ext/fts5/fts5_config.c e7d8dd062b44a66cd77e5a0f74f23a2354cd1f3f8575afb967b2773c3384f7f8 F ext/fts5/fts5_expr.c 69b8d976058512c07dfe86e229521b7a871768157bd1607cedf1a5038dfd72c9 F ext/fts5/fts5_hash.c adda4272be401566a6e0ba1acbe70ee5cb97fce944bc2e04dc707152a0ec91b1 -F ext/fts5/fts5_index.c f1f6da5938af616e0a5e54f0423a3134df95b9f17ac1c6ebf2e2e8132bbc75b9 +F ext/fts5/fts5_index.c 3f04b9bbcb211ad52c466396eb8de4a76506d08db31eb017df1eb69c02b6c5b3 F ext/fts5/fts5_main.c 9a1daef7247f9b8a50b4159323e340efa6b0e4bea4fcd83580480f94d4f2c888 F ext/fts5/fts5_storage.c 1ad05dab4830a4e2eaf2900bb143477f93bc17437093582f36f4b818809e88d8 F ext/fts5/fts5_tcl.c 7fb5a3d3404099075aaa2457307cb459bbc257c0de3dbd52b1e80a5b503e0329 @@ -2205,11 +2205,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P d2fe6b05f38d9d7cd78c5d252e99ac59f1aea071d669830c1ffe4e8966e84010 -R 02fce09966e6e21a0a59cdeb994f84e8 -T *branch * fuzz-data -T *sym-fuzz-data * -T -sym-trunk * -U drh -Z b5d75fe3951f12b9fb4038728f5d0116 +P 8a882f976e22100b91c7ca4119123f16ad5f03311f0a6dc17449bcdcff29618c +R 31351815235c0913d39613cb0514c8c6 +U dan +Z cc507b6dc0a3473a2a3bc1fa7ec940f9 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 8024622a5d..a6434c556d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8a882f976e22100b91c7ca4119123f16ad5f03311f0a6dc17449bcdcff29618c +a4962df665084e423e020be9a2834b6886a8e3feb461cff5358b61398a2a20d2 From 6e5802fc744d3345b03fa4bbce98c1889c8bcc54 Mon Sep 17 00:00:00 2001 From: stephan Date: Mon, 3 Feb 2025 18:01:42 +0000 Subject: [PATCH 171/220] Improve the JS-side sqlite3_set_auxdata() test to also trigger the case that the aux data actually gets reused. Test changes only, no library code. FossilOrigin-Name: 9f27379d860518e6e097a2c999da04176812260a61bf11fe495c3efd76971806 --- ext/wasm/tester1.c-pp.js | 18 ++++++++---------- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/ext/wasm/tester1.c-pp.js b/ext/wasm/tester1.c-pp.js index 9038d68328..28d61de071 100644 --- a/ext/wasm/tester1.c-pp.js +++ b/ext/wasm/tester1.c-pp.js @@ -3445,7 +3445,6 @@ globalThis.sqlite3InitModule = sqlite3InitModule; const stack = wasm.pstack.pointer; const pAux = wasm.pstack.alloc(4); let pAuxDestructed = 0; - const args = []; const pAuxDtor = wasm.installFunction('v(p)', function(ptr){ //log("freeing auxdata"); ++pAuxDestructed; @@ -3457,10 +3456,11 @@ globalThis.sqlite3InitModule = sqlite3InitModule; wasm.uninstallFunction(pAuxDtor); } }; + let nAuxSet = 0 /* how many times we set aux data */; + let nAuxReused = 0 /* how many times we reused aux data */; try{ db.createFunction("auxtest",{ xFunc: function(pCx, x, y){ - args.push(x); T.assert(wasm.isPtr(pCx)); const localAux = capi.sqlite3_get_auxdata(pCx, 0); if( !localAux ){ @@ -3477,15 +3477,12 @@ globalThis.sqlite3InitModule = sqlite3InitModule; pointer this function, and cleanup (at some point) using wasm.uninstallFunction(). */ + ++nAuxSet; capi.sqlite3_set_auxdata(pCx, 0, pAux, pAuxDtor); }else{ - /* This is never actually hit in this example and it's - not entirely clear how to cause it to. The point of - this test, however, is to demonstrate that the - finalizer impl gets triggered, so we're not going to - fret over this at the moment. */ - //log("seen auxdata",localAux); + //log("reusing auxdata",localAux); T.assert(pAux===localAux); + ++nAuxReused; } return x; } @@ -3493,13 +3490,14 @@ globalThis.sqlite3InitModule = sqlite3InitModule; db.exec([ "create table t(a);", "insert into t(a) values(1),(2),(3);", - "select auxtest(a,a), auxtest(a,a) from t order by a" + "select auxtest(1,a), auxtest(1,a) from t order by a" ]); }finally{ db.close(); wasm.pstack.restore(stack); } - T.assert(6===args.length); + T.assert(nAuxSet>0).assert(nAuxReused>0) + .assert(6===nAuxReused+nAuxSet); T.assert(pAuxDestructed>0); T.assert(pAuxDtorDestructed); } diff --git a/manifest b/manifest index a55702d8dd..112bf1a5df 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Rework\s[76c8435a]\sto\seliminate\sautomatic\sJS-to-WASM\sfunction\sconversions\sof\ssqlite3_set_auxdata()\sdestructors\sbecause\sit\scan\sleads\sto\sleaks\son\severy\scall\sof\sa\sUDF.\sThis\sfeature\snever\sworked\sbefore\s[76c8435a]\sbut\sfixing\sit\swas\sill-conceived\sbecause\sof\sthe\smemory\sleakage\sit\sintroduces.\sWASM\sfunction\spointers\scan\sstill\sbe\sused\sas\sdestructors\sin\sthis\scontext. -D 2025-02-03T17:34:12.962 +C Improve\sthe\sJS-side\ssqlite3_set_auxdata()\stest\sto\salso\strigger\sthe\scase\sthat\sthe\saux\sdata\sactually\sgets\sreused.\sTest\schanges\sonly,\sno\slibrary\scode. +D 2025-02-03T18:01:42.876 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -696,7 +696,7 @@ F ext/wasm/test-opfs-vfs.html 1f2d672f3f3fce810dfd48a8d56914aba22e45c6834e262555 F ext/wasm/test-opfs-vfs.js 1618670e466f424aa289859fe0ec8ded223e42e9e69b5c851f809baaaca1a00c F ext/wasm/tester1-worker.html ebc4b820a128963afce328ecf63ab200bd923309eb939f4110510ab449e9814c F ext/wasm/tester1.c-pp.html 1c1bc78b858af2019e663b1a31e76657b73dc24bede28ca92fbe917c3a972af2 -F ext/wasm/tester1.c-pp.js 45000532cf83f23a52b31581c1db44bfb82e383b1b68703ae4d3d838de3a833e +F ext/wasm/tester1.c-pp.js 05a0143c44a4114aad0ed40ce73c528febc3e0d6b69f48a51c895d7030015b74 F ext/wasm/tests/opfs/concurrency/index.html 657578a6e9ce1e9b8be951549ed93a6a471f4520a99e5b545928668f4285fb5e F ext/wasm/tests/opfs/concurrency/test.js d08889a5bb6e61937d0b8cbb78c9efbefbf65ad09f510589c779b7cc6a803a88 F ext/wasm/tests/opfs/concurrency/worker.js 0a8c1a3e6ebb38aabbee24f122693f1fb29d599948915c76906681bb7da1d3d2 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P d693c2dddbd10a2e0b77893b04b11502e30b768f1b06814105f7f35172845fb9 -R bdcc5096cc30e3d83fdf5d66602909e7 +P 3fb993af0caf041da934cea29c039b27c468be0b75bce1537a6425767cf9bf8d +R b579198e5351884de756285222a8e6ad U stephan -Z fd720e9f1383b7c5da4643ab36634ed7 +Z a4679fe65a08b67080b3faca6c413001 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 01d5aa1d3c..9f939bf3fd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3fb993af0caf041da934cea29c039b27c468be0b75bce1537a6425767cf9bf8d +9f27379d860518e6e097a2c999da04176812260a61bf11fe495c3efd76971806 From dbe48d3c8d5b8278b289d2f76066dacb29e2efd6 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 3 Feb 2025 18:36:05 +0000 Subject: [PATCH 172/220] Enhance fuzzcheck so that the --sqlid and --dbid options can specify a range of tests to be run. FossilOrigin-Name: cdd0af6f86e49ade1339ad5a3cc444400a9722a9efdf84a30b3ff9428b7ac36d --- manifest | 13 +++++------ manifest.uuid | 2 +- test/fuzzcheck.c | 57 +++++++++++++++++++++++++++++++++++------------- 3 files changed, 49 insertions(+), 23 deletions(-) diff --git a/manifest b/manifest index 6bc22b6c72..747c094a70 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sfor\sa\spotential\sUAF\sin\sFTS5. -D 2025-02-03T18:05:54.347 +C Enhance\sfuzzcheck\sso\sthat\sthe\s--sqlid\sand\s--dbid\soptions\scan\sspecify\sa\nrange\sof\stests\sto\sbe\srun. +D 2025-02-03T18:36:05.574 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -1277,7 +1277,7 @@ F test/fuzz3.test 70ba57260364b83e964707b9d4b5625284239768ab907dd387c740c0370ce3 F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c 1671559091b3e134ec807490f624d306b24bd9a8f03b12aa97e292f4b31e5d96 +F test/fuzzcheck.c 5445da3b9b509759dc91c7a3c8d660f4056e25ae85274d6fe40c372263ad0bd7 F test/fuzzdata1.db 3e86d9cf5aea68ddb8e27c02d7dfdaa226347426c7eb814918e4d95475bf8517 F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -2209,9 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 9f27379d860518e6e097a2c999da04176812260a61bf11fe495c3efd76971806 a4962df665084e423e020be9a2834b6886a8e3feb461cff5358b61398a2a20d2 -R 0c55f60057cb31a548300850eb056c7d -T +closed a4962df665084e423e020be9a2834b6886a8e3feb461cff5358b61398a2a20d2 +P e33f2fedda17b4f3678fc23c438093c256b0c125da5f1ac42ecaf3d604d54b6a +R bf3f5a9cd383f24f2f19fa2e86a993c0 U drh -Z ecbc0f1712cef7fa05faf26775dcb9fc +Z ca078f36d189947e36e0ecf82c334d57 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 2be9591865..7e3b1689f6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e33f2fedda17b4f3678fc23c438093c256b0c125da5f1ac42ecaf3d604d54b6a +cdd0af6f86e49ade1339ad5a3cc444400a9722a9efdf84a30b3ff9428b7ac36d diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index 390d804df1..e6b9ed3bb7 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -507,7 +507,8 @@ static void writefileFunc( static void blobListLoadFromDb( sqlite3 *db, /* Read from this database */ const char *zSql, /* Query used to extract the blobs */ - int onlyId, /* Only load where id is this value */ + int firstId, /* First sqlid to load */ + int lastId, /* Last sqlid to load */ int *pN, /* OUT: Write number of blobs loaded here */ Blob **ppList /* OUT: Write the head of the blob list here */ ){ @@ -518,8 +519,9 @@ static void blobListLoadFromDb( int rc; char *z2; - if( onlyId>0 ){ - z2 = sqlite3_mprintf("%s WHERE rowid=%d", zSql, onlyId); + if( firstId>0 ){ + z2 = sqlite3_mprintf("%s WHERE rowid BETWEEN %d AND %d", zSql, + firstId, lastId); }else{ z2 = sqlite3_mprintf("%s", zSql); } @@ -1883,8 +1885,10 @@ int main(int argc, char **argv){ Blob *pDb; /* For looping over template databases */ int i; /* Loop index for the argv[] loop */ int dbSqlOnly = 0; /* Only use scripts that are dbsqlfuzz */ - int onlySqlid = -1; /* --sqlid */ - int onlyDbid = -1; /* --dbid */ + int firstSqlid = -1; /* First --sqlid range */ + int lastSqlid = 0x7fffffff; /* Last --sqlid range */ + int firstDbid = -1; /* --dbid */ + int lastDbid = 0x7fffffff; /* --dbid end */ int nativeFlag = 0; /* --native-vfs */ int rebuildFlag = 0; /* --rebuild */ int vdbeLimitFlag = 0; /* --limit-vdbe */ @@ -1942,8 +1946,18 @@ int main(int argc, char **argv){ cellSzCkFlag = 1; }else if( strcmp(z,"dbid")==0 ){ + const char *zDotDot; if( i>=argc-1 ) fatalError("missing arguments on %s", argv[i]); - onlyDbid = integerValue(argv[++i]); + i++; + zDotDot = strstr(argv[i], ".."); + if( zDotDot ){ + firstDbid = atoi(argv[i]); + if( zDotDot[2] ){ + lastDbid = atoi(&zDotDot[2]); + } + }else{ + lastDbid = firstDbid = integerValue(argv[++i]); + } }else if( strcmp(z,"export-db")==0 ){ if( i>=argc-1 ) fatalError("missing arguments on %s", argv[i]); @@ -2043,8 +2057,19 @@ int main(int argc, char **argv){ bTimer = 1; }else if( strcmp(z,"sqlid")==0 ){ + const char *zDotDot; if( i>=argc-1 ) fatalError("missing arguments on %s", argv[i]); - onlySqlid = integerValue(argv[++i]); + i++; + zDotDot = strstr(argv[i], ".."); + if( zDotDot ){ + firstSqlid = atoi(argv[i]); + if( zDotDot[2] ){ + lastSqlid = atoi(&zDotDot[2]); + } + }else{ + firstSqlid = integerValue(argv[++i]); + lastSqlid = firstSqlid; + } }else if( strcmp(z,"timeout")==0 ){ if( i>=argc-1 ) fatalError("missing arguments on %s", argv[i]); @@ -2292,13 +2317,14 @@ int main(int argc, char **argv){ const char *zExDb = "SELECT writefile(printf('%s/db%06d.db',?1,dbid),dbcontent)," " dbid, printf('%s/db%06d.db',?1,dbid), length(dbcontent)" - " FROM db WHERE ?2<0 OR dbid=?2;"; + " FROM db WHERE dbid BETWEEN ?2 AND ?3;"; rc = sqlite3_prepare_v2(db, zExDb, -1, &pStmt, 0); if( rc ) fatalError("cannot prepare statement [%s]: %s", zExDb, sqlite3_errmsg(db)); sqlite3_bind_text64(pStmt, 1, zExpDb, strlen(zExpDb), SQLITE_STATIC, SQLITE_UTF8); - sqlite3_bind_int(pStmt, 2, onlyDbid); + sqlite3_bind_int(pStmt, 2, firstDbid); + sqlite3_bind_int(pStmt, 3, lastDbid); while( sqlite3_step(pStmt)==SQLITE_ROW ){ printf("write db-%d (%d bytes) into %s\n", sqlite3_column_int(pStmt,1), @@ -2311,13 +2337,14 @@ int main(int argc, char **argv){ const char *zExSql = "SELECT writefile(printf('%s/sql%06d.txt',?1,sqlid),sqltext)," " sqlid, printf('%s/sql%06d.txt',?1,sqlid), length(sqltext)" - " FROM xsql WHERE ?2<0 OR sqlid=?2;"; + " FROM xsql WHERE sqlid BETWEEN ?2 AND ?3;"; rc = sqlite3_prepare_v2(db, zExSql, -1, &pStmt, 0); if( rc ) fatalError("cannot prepare statement [%s]: %s", zExSql, sqlite3_errmsg(db)); sqlite3_bind_text64(pStmt, 1, zExpSql, strlen(zExpSql), SQLITE_STATIC, SQLITE_UTF8); - sqlite3_bind_int(pStmt, 2, onlySqlid); + sqlite3_bind_int(pStmt, 2, firstSqlid); + sqlite3_bind_int(pStmt, 3, lastSqlid); while( sqlite3_step(pStmt)==SQLITE_ROW ){ printf("write sql-%d (%d bytes) into %s\n", sqlite3_column_int(pStmt,1), @@ -2333,11 +2360,11 @@ int main(int argc, char **argv){ /* Load all SQL script content and all initial database images from the ** source db */ - blobListLoadFromDb(db, "SELECT sqlid, sqltext FROM xsql", onlySqlid, - &g.nSql, &g.pFirstSql); + blobListLoadFromDb(db, "SELECT sqlid, sqltext FROM xsql", firstSqlid, + lastSqlid, &g.nSql, &g.pFirstSql); if( g.nSql==0 ) fatalError("need at least one SQL script"); - blobListLoadFromDb(db, "SELECT dbid, dbcontent FROM db", onlyDbid, - &g.nDb, &g.pFirstDb); + blobListLoadFromDb(db, "SELECT dbid, dbcontent FROM db", firstDbid, + lastDbid, &g.nDb, &g.pFirstDb); if( g.nDb==0 ){ g.pFirstDb = safe_realloc(0, sizeof(Blob)); memset(g.pFirstDb, 0, sizeof(Blob)); From 589796cd890c8be02a92dcbb3e2a0bcb248b6a75 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 3 Feb 2025 18:49:06 +0000 Subject: [PATCH 173/220] Fixes and improved documentation to the new --sqlid and --dbid range options in fuzzcheck. FossilOrigin-Name: 59e26632449163a36b803cc7027ed99c1f6b675dda6f0b2b12bbe55884923f08 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzcheck.c | 10 ++++++---- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 747c094a70..5abab47021 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sfuzzcheck\sso\sthat\sthe\s--sqlid\sand\s--dbid\soptions\scan\sspecify\sa\nrange\sof\stests\sto\sbe\srun. -D 2025-02-03T18:36:05.574 +C Fixes\sand\simproved\sdocumentation\sto\sthe\snew\s--sqlid\sand\s--dbid\srange\noptions\sin\sfuzzcheck. +D 2025-02-03T18:49:06.094 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -1277,7 +1277,7 @@ F test/fuzz3.test 70ba57260364b83e964707b9d4b5625284239768ab907dd387c740c0370ce3 F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl b7197de6ed1ee8250a4f82d67876f4561b42ee8cbbfc6160dcb66331bad3f830 F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c 5445da3b9b509759dc91c7a3c8d660f4056e25ae85274d6fe40c372263ad0bd7 +F test/fuzzcheck.c 6fc952750a69168dd5fea38b9d35cb38475bfda15c8acfd156ac09cd03ddbd3e F test/fuzzdata1.db 3e86d9cf5aea68ddb8e27c02d7dfdaa226347426c7eb814918e4d95475bf8517 F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P e33f2fedda17b4f3678fc23c438093c256b0c125da5f1ac42ecaf3d604d54b6a -R bf3f5a9cd383f24f2f19fa2e86a993c0 +P cdd0af6f86e49ade1339ad5a3cc444400a9722a9efdf84a30b3ff9428b7ac36d +R 97da3e589df10edb12f045b63fd334d3 U drh -Z ca078f36d189947e36e0ecf82c334d57 +Z 5f22e1474f8086565da475538650b809 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 7e3b1689f6..a080a639ab 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -cdd0af6f86e49ade1339ad5a3cc444400a9722a9efdf84a30b3ff9428b7ac36d +59e26632449163a36b803cc7027ed99c1f6b675dda6f0b2b12bbe55884923f08 diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index e6b9ed3bb7..84e3f32895 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -1838,7 +1838,8 @@ static void showHelp(void){ "each database, checking for crashes and memory leaks.\n" "Options:\n" " --cell-size-check Set the PRAGMA cell_size_check=ON\n" -" --dbid N Use only the database where dbid=N\n" +" --dbid M..N Use only the databases where dbid between M and N\n" +" \"M..\" for M and afterwards. Just \"M\" for M only\n" " --export-db DIR Write databases to files(s) in DIR. Works with --dbid\n" " --export-sql DIR Write SQL to file(s) in DIR. Also works with --sqlid\n" " --help Show this help text\n" @@ -1863,7 +1864,8 @@ static void showHelp(void){ " --script Output CLI script instead of running tests\n" " --skip N Skip the first N test cases\n" " --spinner Use a spinner to show progress\n" -" --sqlid N Use only SQL where sqlid=N\n" +" --sqlid M..N Use only SQL where sqlid between M..N\n" +" \"M..\" for M and afterwards. Just \"M\" for M only\n" " --timeout N Maximum time for any one test in N millseconds\n" " -v|--verbose Increased output. Repeat for more output.\n" " --vdbe-debug Activate VDBE debugging.\n" @@ -1956,7 +1958,7 @@ int main(int argc, char **argv){ lastDbid = atoi(&zDotDot[2]); } }else{ - lastDbid = firstDbid = integerValue(argv[++i]); + lastDbid = firstDbid = integerValue(argv[i]); } }else if( strcmp(z,"export-db")==0 ){ @@ -2067,7 +2069,7 @@ int main(int argc, char **argv){ lastSqlid = atoi(&zDotDot[2]); } }else{ - firstSqlid = integerValue(argv[++i]); + firstSqlid = integerValue(argv[i]); lastSqlid = firstSqlid; } }else From 0d9f2a15f236dd87b05d33c8c1e09df1f4612b75 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 3 Feb 2025 21:04:21 +0000 Subject: [PATCH 174/220] The Parse.addrExplain field is never even if SQLITE_OMIT_EXPLAIN is defined. FossilOrigin-Name: 5d81a984c6aabb9fa9180efde8ca942b40f1ec18ff5a89f2fbb1252734f051d3 --- manifest | 13 ++++++------- manifest.uuid | 2 +- src/sqliteInt.h | 2 -- 3 files changed, 7 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 6b13e86cc7..678cea2b49 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sfuzzcheck\sso\sthat\sthe\s--sqlid\sand\s--dbid\soptions\scan\stake\sa\srange\nof\sIDs\sto\srun. -D 2025-02-03T18:53:02.874 +C The\sParse.addrExplain\sfield\sis\snever\seven\sif\sSQLITE_OMIT_EXPLAIN\sis\sdefined. +D 2025-02-03T21:04:21.029 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -785,7 +785,7 @@ F src/shell.c.in b377a59822f207106424f08aead37e78b609222e98f86f04cc8a03563ccf323 F src/sqlite.h.in cc9a2d5a719b7434e2699ff7c28a56209b8aa459b7f80ff1d4d7d8ac6ebfd96e F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54 -F src/sqliteInt.h 7f1b070ea3b4ab3c192be553810684f686fdb03f62f90afa2da64d4d61d91ec3 +F src/sqliteInt.h 9d7052c71f46ca3a1a4880ba4a62590da334651139a38327d488894d9c883f3b F src/sqliteLimit.h 1bbdbf72bd0411d003267ffebc59a262f061df5653027a75627d03f48ca30523 F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -2209,9 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P e33f2fedda17b4f3678fc23c438093c256b0c125da5f1ac42ecaf3d604d54b6a 59e26632449163a36b803cc7027ed99c1f6b675dda6f0b2b12bbe55884923f08 -R 97da3e589df10edb12f045b63fd334d3 -T +closed 59e26632449163a36b803cc7027ed99c1f6b675dda6f0b2b12bbe55884923f08 +P 408fa57f048e05a261fb62b45ae44b8a97c97fc01e3776124cbef6595df579d4 +R 19f75289781fc56c637c4500001f3f36 U drh -Z c70a3622de374067746199fda23d1690 +Z 6ac8bc953e7e25c0d28f52d6abec8109 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 486d200235..3958477534 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -408fa57f048e05a261fb62b45ae44b8a97c97fc01e3776124cbef6595df579d4 +5d81a984c6aabb9fa9180efde8ca942b40f1ec18ff5a89f2fbb1252734f051d3 diff --git a/src/sqliteInt.h b/src/sqliteInt.h index a37e0523ad..f47009c158 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3914,9 +3914,7 @@ struct Parse { int nVtabLock; /* Number of virtual tables to lock */ #endif int nHeight; /* Expression tree height of current sub-select */ -#ifndef SQLITE_OMIT_EXPLAIN int addrExplain; /* Address of current OP_Explain opcode */ -#endif VList *pVList; /* Mapping between variable names and numbers */ Vdbe *pReprepare; /* VM being reprepared (sqlite3Reprepare()) */ const char *zTail; /* All SQL text past the last semicolon parsed */ From 31615637f39f2f31492aa3a0ccd658609b43409b Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 3 Feb 2025 21:24:40 +0000 Subject: [PATCH 175/220] New dbsqlfuzz case added to fuzzdata8.db. FossilOrigin-Name: 7ee20cfc237229dbea7116149c0c35883f7b8087b9ccdce6dca16b6da1c6caf8 --- manifest | 15 +++++++++------ manifest.uuid | 2 +- test/fuzzdata8.db | Bin 4241408 -> 4248576 bytes 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 678cea2b49..068fb48754 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\sParse.addrExplain\sfield\sis\snever\seven\sif\sSQLITE_OMIT_EXPLAIN\sis\sdefined. -D 2025-02-03T21:04:21.029 +C New\sdbsqlfuzz\scase\sadded\sto\sfuzzdata8.db. +D 2025-02-03T21:24:40.271 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -1285,7 +1285,7 @@ F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e4 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db b8725a5f5cf7a3b7241a9038e57ca7e7cc8c3f4d86b44bd770617bda245ab2b0 F test/fuzzdata7.db 0166b56fd7a6b9636a1d60ef0a060f86ddaecf99400a666bb6e5bbd7199ad1f2 -F test/fuzzdata8.db deb6533e6dfdb5841eb6a56607bdb74986a57f5739f3975ea542a1f7e7e24d97 +F test/fuzzdata8.db c6f9cb7d2b808fb10894afe53ef00f51e73e43baa7aabdba7e9af4713fc5b186 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc @@ -2209,8 +2209,11 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 408fa57f048e05a261fb62b45ae44b8a97c97fc01e3776124cbef6595df579d4 -R 19f75289781fc56c637c4500001f3f36 +P 5d81a984c6aabb9fa9180efde8ca942b40f1ec18ff5a89f2fbb1252734f051d3 +R e9d4a9b352c2eeead9d5e811b3c4d6de +T *branch * fuzzer-20250203 +T *sym-fuzzer-20250203 * +T -sym-trunk * U drh -Z 6ac8bc953e7e25c0d28f52d6abec8109 +Z 0c1224a47cf0d41d32dbe16a001a72b0 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 3958477534..a93fba674f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5d81a984c6aabb9fa9180efde8ca942b40f1ec18ff5a89f2fbb1252734f051d3 +7ee20cfc237229dbea7116149c0c35883f7b8087b9ccdce6dca16b6da1c6caf8 diff --git a/test/fuzzdata8.db b/test/fuzzdata8.db index f03f3f27191ee07a1014d1babeca93242543de8f..469df2c681a13064074d0a6e2fac0cf5939dbbcc 100644 GIT binary patch delta 40899 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 Date: Mon, 3 Feb 2025 23:19:42 +0000 Subject: [PATCH 176/220] Fix a potential UAF in FTS3. FossilOrigin-Name: 75f3d87448793fc7fd68d817874d561842e029a2d6c1ea4abcec39764cd38469 --- ext/fts3/fts3.c | 18 ++++++++++++++++++ ext/fts3/fts3Int.h | 1 + ext/fts3/fts3_snippet.c | 21 +++++++++++++++++++++ manifest | 16 ++++++++-------- manifest.uuid | 2 +- 5 files changed, 49 insertions(+), 9 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index e58f256a48..2b2c3b8d26 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -5787,6 +5787,24 @@ static void fts3EvalRestart( } } +/* +** Expression node pExpr is an MSR phrase. This function restarts pExpr +** so that it is a regular phrase query, not an MSR. SQLITE_OK is returned +** if successful, or an SQLite error code otherwise. +*/ +int sqlite3Fts3MsrCancel(Fts3Cursor *pCsr, Fts3Expr *pExpr){ + int rc = SQLITE_OK; + if( pExpr->bEof==0 ){ + i64 iDocid = pExpr->iDocid; + fts3EvalRestart(pCsr, pExpr, &rc); + while( rc==SQLITE_OK && pExpr->iDocid!=iDocid ){ + fts3EvalNextRow(pCsr, pExpr, &rc); + if( pExpr->bEof ) rc = FTS_CORRUPT_VTAB; + } + } + return rc; +} + /* ** After allocating the Fts3Expr.aMI[] array for each phrase in the ** expression rooted at pExpr, the cursor iterates through all rows matched diff --git a/ext/fts3/fts3Int.h b/ext/fts3/fts3Int.h index 3b236faf49..77e6737af4 100644 --- a/ext/fts3/fts3Int.h +++ b/ext/fts3/fts3Int.h @@ -640,6 +640,7 @@ int sqlite3Fts3MsrIncrNext( int sqlite3Fts3EvalPhrasePoslist(Fts3Cursor *, Fts3Expr *, int iCol, char **); int sqlite3Fts3MsrOvfl(Fts3Cursor *, Fts3MultiSegReader *, int *); int sqlite3Fts3MsrIncrRestart(Fts3MultiSegReader *pCsr); +int sqlite3Fts3MsrCancel(Fts3Cursor*, Fts3Expr*); /* fts3_tokenize_vtab.c */ int sqlite3Fts3InitTok(sqlite3*, Fts3Hash *, void(*xDestroy)(void*)); diff --git a/ext/fts3/fts3_snippet.c b/ext/fts3/fts3_snippet.c index 80f62eb3bb..c79cca4a6d 100644 --- a/ext/fts3/fts3_snippet.c +++ b/ext/fts3/fts3_snippet.c @@ -1586,6 +1586,21 @@ static int fts3ExprTermOffsetInit(Fts3Expr *pExpr, int iPhrase, void *ctx){ return rc; } +/* +** If expression pExpr is a phrase expression that uses an MSR query, +** restart it as a regular, non-incremental query. Return SQLITE_OK +** if successful, or an SQLite error code otherwise. +*/ +static int fts3ExprRestartIfCb(Fts3Expr *pExpr, int iPhrase, void *ctx){ + TermOffsetCtx *p = (TermOffsetCtx*)ctx; + int rc = SQLITE_OK; + if( pExpr->pPhrase && pExpr->pPhrase->bIncr ){ + rc = sqlite3Fts3MsrCancel(p->pCsr, pExpr); + pExpr->pPhrase->bIncr = 0; + } + return rc; +} + /* ** Implementation of offsets() function. */ @@ -1622,6 +1637,12 @@ void sqlite3Fts3Offsets( sCtx.iDocid = pCsr->iPrevId; sCtx.pCsr = pCsr; + /* If a query restart will be required, do it here, rather than later of + ** after pointers to poslist buffers that may be invalidated by a restart + ** have been saved. */ + rc = sqlite3Fts3ExprIterate(pCsr->pExpr, fts3ExprRestartIfCb, (void*)&sCtx); + if( rc!=SQLITE_OK ) goto offsets_out; + /* Loop through the table columns, appending offset information to ** string-buffer res for each column. */ diff --git a/manifest b/manifest index 678cea2b49..abc313c536 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\sParse.addrExplain\sfield\sis\snever\seven\sif\sSQLITE_OMIT_EXPLAIN\sis\sdefined. -D 2025-02-03T21:04:21.029 +C Fix\sa\spotential\sUAF\sin\sFTS3. +D 2025-02-03T23:19:42.890 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -78,16 +78,16 @@ F ext/fts3/README.content b9078d0843a094d86af0d48dffbff13c906702b4c3558012e67b9c F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers b92bdeb8b46503f0dd301d364efc5ef59ef9fa8e2758b8e742f39fa93a2e422d F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c 9f8ce82bbf4ec0636e6170e58f17b04817fa4c39b2d5126ac06f005d485f6d5e +F ext/fts3/fts3.c b840ee915a6fb36571e3fe3c096e8a481a4a9cd8a35199a1b976b132b9f84ad3 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe -F ext/fts3/fts3Int.h 968f7d7cae541a6926146e9fd3fb2b2ccbd3845b7890a8ed03de0c06ac776682 +F ext/fts3/fts3Int.h 2fe7c76dfd7d46dff964d17d3f4c53bca2116cf5d6252552ebbc22e38afdf4e0 F ext/fts3/fts3_aux.c 7eab82a9cf0830f6551ba3abfdbe73ed39e322a4d3940ee82fbf723674ecd9f3 F ext/fts3/fts3_expr.c 365849a2a1185e19028a9db2d9f1ea63efe909a3a6aca7ec86fc26a13a60bd58 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 e19807ce0ae31c1c6e9898e89ecc93183d7ec224ea101af039722a4f49e5f2b8 -F ext/fts3/fts3_snippet.c c38117a2e4dcc9485a170a57a6134423955247b230fef7073c46fa9c51239540 +F ext/fts3/fts3_snippet.c 92196bd5941be0455f2c7e51c2f8280df49c7feb0615a0d1d4d045f2dcf60713 F ext/fts3/fts3_term.c 6a96027ad364001432545fe43322b6af04ed28bb5619ec51af1f59d0710d6d69 F ext/fts3/fts3_test.c 7a9cb3d61774134211bf4bfdf1adcb581a1a0377f2d050a121ae7ab44baef0e3 F ext/fts3/fts3_tokenize_vtab.c 7fd9ef364f257b97218b9c331f2378e307375c592f70fd541f714e747d944962 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 408fa57f048e05a261fb62b45ae44b8a97c97fc01e3776124cbef6595df579d4 -R 19f75289781fc56c637c4500001f3f36 +P 5d81a984c6aabb9fa9180efde8ca942b40f1ec18ff5a89f2fbb1252734f051d3 +R f1017abf167769f99bdff3069bfe9e53 U drh -Z 6ac8bc953e7e25c0d28f52d6abec8109 +Z dd1d75c4a0f7bb799c129e975f1e95da # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 3958477534..f7f780615a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5d81a984c6aabb9fa9180efde8ca942b40f1ec18ff5a89f2fbb1252734f051d3 +75f3d87448793fc7fd68d817874d561842e029a2d6c1ea4abcec39764cd38469 From 802b042f6ef89285bc0e72abc6866750757ce1b1 Mon Sep 17 00:00:00 2001 From: drh <> Date: Tue, 4 Feb 2025 02:38:23 +0000 Subject: [PATCH 177/220] Detect and report signed integer overflow in the sumInverse() routine, used by window functions. FossilOrigin-Name: 317e9a470fba2a4b717b9cb66488b8fccb44810a80f3a7deaf1ea81906e2b8d2 --- manifest | 13 ++++++------- manifest.uuid | 2 +- src/func.c | 5 ++++- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 19b66ba7a9..172ff7b118 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Test\scase\sfor\sthe\sFTS3\sfix\sin\sthe\sprevious\scheck-in. -D 2025-02-03T23:27:27.194 +C Detect\sand\sreport\ssigned\sinteger\soverflow\sin\sthe\ssumInverse()\sroutine,\nused\sby\swindow\sfunctions. +D 2025-02-04T02:38:23.009 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -733,7 +733,7 @@ F src/delete.c 03a77ba20e54f0f42ebd8eddf15411ed6bdb06a2c472ac4b6b336521bf7cea42 F src/expr.c 8705be31ee713aaa43c97d91399db09f16ee41b88250406eb99de6b47f550a98 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 928ed2517e8732113d2b9821aa37af639688d752f4ea9ac6e0e393d713eeb76f -F src/func.c f5b31c805679930cc5afcdfb1e657f9dd273053f52ff51133df5a448c519e5d9 +F src/func.c 0712a5b03fdfc8af0cda6d076bfe231b66388d3d5a28b46dc1a94b90d41cac6a F src/global.c a19e4b1ca1335f560e9560e590fc13081e21f670643367f99cb9e8f9dc7d615b F src/hash.c 9ee4269fb1d6632a6fecfb9479c93a1f29271bddbbaf215dd60420bcb80c7220 F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51 @@ -2209,9 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 75f3d87448793fc7fd68d817874d561842e029a2d6c1ea4abcec39764cd38469 7ee20cfc237229dbea7116149c0c35883f7b8087b9ccdce6dca16b6da1c6caf8 -R b61fd031db99a855bc246d2ed8051e3b -T +closed 7ee20cfc237229dbea7116149c0c35883f7b8087b9ccdce6dca16b6da1c6caf8 +P 459d8f695ef868d0ec09920ab2035eebd36a66051f9905e2605f4600623faa47 +R 8b24f7285c9d92ca8cf04f526f040713 U drh -Z 68ed204a1a39b8731f0970e5a1459325 +Z fc7af611ca9f7a31dcf33650d3dd0378 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 8030ef34fe..f9f95d23cb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -459d8f695ef868d0ec09920ab2035eebd36a66051f9905e2605f4600623faa47 +317e9a470fba2a4b717b9cb66488b8fccb44810a80f3a7deaf1ea81906e2b8d2 diff --git a/src/func.c b/src/func.c index bd25a44d4a..e8cd174e42 100644 --- a/src/func.c +++ b/src/func.c @@ -1869,7 +1869,10 @@ static void sumInverse(sqlite3_context *context, int argc, sqlite3_value**argv){ assert( p->cnt>0 ); p->cnt--; if( !p->approx ){ - p->iSum -= sqlite3_value_int64(argv[0]); + if( sqlite3SubInt64(&p->iSum, sqlite3_value_int64(argv[0])) ){ + p->ovrfl = 1; + p->approx = 1; + } }else if( type==SQLITE_INTEGER ){ i64 iVal = sqlite3_value_int64(argv[0]); if( iVal!=SMALLEST_INT64 ){ From b6859b6f2c3eedab12fb46b7295194c818420460 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 5 Feb 2025 12:02:43 +0000 Subject: [PATCH 178/220] Attempted improvements to the SQLITE_DBCONFIG_... documentation. FossilOrigin-Name: baac853871ad307b67b4d624b9ee47fc1313f1aa62c9f8072fb49e97aa33db94 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqlite.h.in | 44 +++++++++++++++++++++++++++++--------------- 3 files changed, 36 insertions(+), 22 deletions(-) diff --git a/manifest b/manifest index 172ff7b118..f5d136df4a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Detect\sand\sreport\ssigned\sinteger\soverflow\sin\sthe\ssumInverse()\sroutine,\nused\sby\swindow\sfunctions. -D 2025-02-04T02:38:23.009 +C Attempted\simprovements\sto\sthe\sSQLITE_DBCONFIG_...\sdocumentation. +D 2025-02-05T12:02:43.871 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -782,7 +782,7 @@ F src/resolve.c c8a5372b97b2a2e972a280676f06ddb5b74e885d3b1f5ce383f839907b57ef68 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 F src/select.c 83e88fbb36f89b6703b348777491619554f0fd6f917c9fdf51e4c2e9cda6c04e F src/shell.c.in b377a59822f207106424f08aead37e78b609222e98f86f04cc8a03563ccf3237 -F src/sqlite.h.in cc9a2d5a719b7434e2699ff7c28a56209b8aa459b7f80ff1d4d7d8ac6ebfd96e +F src/sqlite.h.in d2902f13ace94d3d3609646bd6d12a2d7a4f6cbdf6a5a4097580ac305f54c3f0 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54 F src/sqliteInt.h 9d7052c71f46ca3a1a4880ba4a62590da334651139a38327d488894d9c883f3b @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 459d8f695ef868d0ec09920ab2035eebd36a66051f9905e2605f4600623faa47 -R 8b24f7285c9d92ca8cf04f526f040713 +P 317e9a470fba2a4b717b9cb66488b8fccb44810a80f3a7deaf1ea81906e2b8d2 +R 70f9a2f7e68a73caf1fe72ecdb3d41d3 U drh -Z fc7af611ca9f7a31dcf33650d3dd0378 +Z 5ee06f9c240d54c68e35a361db8f0493 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index f9f95d23cb..af4c4d49c4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -317e9a470fba2a4b717b9cb66488b8fccb44810a80f3a7deaf1ea81906e2b8d2 +baac853871ad307b67b4d624b9ee47fc1313f1aa62c9f8072fb49e97aa33db94 diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 885f187a43..a9eb5fed72 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -2211,7 +2211,15 @@ struct sqlite3_mem_methods { ** CAPI3REF: Database Connection Configuration Options ** ** These constants are the available integer configuration options that -** can be passed as the second argument to the [sqlite3_db_config()] interface. +** can be passed as the second parameter to the [sqlite3_db_config()] interface. +** +** The [sqlite3_db_config()] interface is a var-args functions. It takes a +** variable number of parameters, though always at least two. The number of +** parameters passed into sqlite3_db_config() depends on which of these +** constants is given as the second parameter. This documentation page +** refers to parameters beyond the second as "arguments". Thus, when this +** page says "the N-th argument" it means "the N-th parameter past the +** configuration option" or "the (N+2)-th parameter to sqlite3_db_config()". ** ** New configuration options may be added in future releases of SQLite. ** Existing configuration options might be discontinued. Applications @@ -2228,7 +2236,9 @@ struct sqlite3_mem_methods { ** connection. ** The arguments to the SQLITE_DBCONFIG_LOOKASIDE option are not ** in the [DBCONFIG arguments|usual format]. -** The SQLITE_DBCONFIG_LOOKASIDE option takes three arguments, not two. +** The SQLITE_DBCONFIG_LOOKASIDE option takes three arguments, not two, +** so that a call to [sqlite3_db_config()] that uses SQLITE_DBCONFIG_LOOKASIDE +** should have a total of five parameters. ** ^The first argument (the third parameter to [sqlite3_db_config()] is a ** pointer to a memory buffer to use for lookaside memory. ** ^The first argument after the SQLITE_DBCONFIG_LOOKASIDE verb @@ -2330,12 +2340,13 @@ struct sqlite3_mem_methods { **

          ^This option is used to change the name of the "main" database ** schema. This option does not follow the ** [DBCONFIG arguments|usual SQLITE_DBCONFIG argument format]. -** This option takes exactly one argument, which ust be a pointer -** to a constant UTF8 string which will become the new schema name -** in place of "main". ^SQLite does not make a copy of the new main -** schema name string, so the application must ensure that the argument -** passed into SQLITE_DBCONFIG MAINDBNAME is unchanged -** until after the database connection closes. +** This option takes exactly one additional argument so that the +** [sqlite3_db_config()] call has a total of three parameters. The +** extra argument must be a pointer to a constant UTF8 string which +** will become the new schema name in place of "main". ^SQLite does +** not make a copy of the new main schema name string, so the application +** must ensure that the argument passed into SQLITE_DBCONFIG MAINDBNAME +** is unchanged until after the database connection closes. **
          ** ** [[SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE]] @@ -2346,10 +2357,11 @@ struct sqlite3_mem_methods { ** connection being closed is the last open connection to the database), ** then SQLite performs a [checkpoint] before closing the connection and ** deletes the WAL file. The SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE option can -** be used to override that behavior. The first parameter passed to this -** operation is an integer - positive to disable checkpoints-on-close, or -** zero (the default) to enable them, and negative to leave the setting unchanged. -** The second parameter is a pointer to an integer +** be used to override that behavior. The first argument passed to this +** operation (the third parameter to [sqlite3_db_config()]) is an integer +** which is positive to disable checkpoints-on-close, or zero (the default) +** to enable them, and negative to leave the setting unchanged. +** The second argument (the fourth parameter) is a pointer to an integer ** into which is written 0 or 1 to indicate whether checkpoints-on-close ** have been disabled - 0 if they are not disabled, 1 if they are. ** @@ -2587,9 +2599,11 @@ struct sqlite3_mem_methods { ** ** [[DBCONFIG arguments]]

          Arguments To SQLITE_DBCONFIG Options

          ** -**

          Most of the SQLITE_DBCONFIG options take two arguments: an integer -** and a pointer to an integer. If the first integer argument is 1, then -** the option becomes enabled. If the first integer argument is 0, then the +**

          Most of the SQLITE_DBCONFIG options take two arguments, so that the +** overall call to [sqlite3_db_config()] has a total of four parameters. +** The first argument (the third parameter to sqlite3_db_config()) is a integer. +** The second argument is a pointer to an integer. If the first argument is 1, +** then the option becomes enabled. If the first integer argument is 0, then the ** option is disabled. If the first argument is -1, then the option setting ** is unchanged. The second argument, the pointer to an integer, may be NULL. ** If the second argument is not NULL, then a value of 0 or 1 is written into From 97af1346f05ec5164751cbe69628636b1655bca3 Mon Sep 17 00:00:00 2001 From: stephan Date: Wed, 5 Feb 2025 12:49:15 +0000 Subject: [PATCH 179/220] Upstream JimTCL patch and minor tcl script tweaks to support (fconfigure -translation binary) for better cross-platform build portability. FossilOrigin-Name: 0974a17c4565f202777fc6203df20dca19acc1e8740ede15334783f41e3e5054 --- autosetup/jimsh0.c | 43 ++++++++++++++++++++++++++++++++++++++- manifest | 23 +++++++++++---------- manifest.uuid | 2 +- tool/mksqlite3c-noext.tcl | 2 +- tool/mksqlite3c.tcl | 2 +- tool/mksqlite3h.tcl | 2 +- tool/split-sqlite3c.tcl | 2 +- 7 files changed, 59 insertions(+), 17 deletions(-) diff --git a/autosetup/jimsh0.c b/autosetup/jimsh0.c index 84db85a207..4b9cf3eebf 100644 --- a/autosetup/jimsh0.c +++ b/autosetup/jimsh0.c @@ -75,6 +75,9 @@ extern "C" { #if defined(_WIN32) || defined(WIN32) +#ifndef STDIN_FILENO +#define STDIN_FILENO 0 +#endif #define HAVE_DLOPEN void *dlopen(const char *path, int mode); int dlclose(void *handle); @@ -1864,7 +1867,7 @@ int Jim_tclcompatInit(Jim_Interp *interp) " $f buffering $v\n" " }\n" " -tr* {\n" -"\n" +" $f translation $v\n" " }\n" " default {\n" " return -code error \"fconfigure: unknown option $n\"\n" @@ -2936,6 +2939,28 @@ static int aio_cmd_buffering(Jim_Interp *interp, int argc, Jim_Obj *const *argv) return JIM_OK; } +static int aio_cmd_translation(Jim_Interp *interp, int argc, Jim_Obj *const *argv) +{ + enum {OPT_BINARY, OPT_TEXT}; + static const char * const options[] = { + "binary", + "text", + NULL + }; + int opt; + + if (Jim_GetEnum(interp, argv[0], options, &opt, NULL, JIM_ERRMSG) != JIM_OK) { + return JIM_ERR; + } +#if defined(_setmode) && defined(O_BINARY) + else { + AioFile *af = Jim_CmdPrivData(interp); + _setmode(af->fh, opt == OPT_BINARY ? O_BINARY : O_TEXT); + } +#endif + return JIM_OK; +} + static int aio_cmd_readsize(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { AioFile *af = Jim_CmdPrivData(interp); @@ -3145,6 +3170,13 @@ static const jim_subcmd_type aio_command_table[] = { 0, 2, + }, + { "translation", + "binary|text", + aio_cmd_translation, + 1, + 1, + }, { "readsize", "?size?", @@ -24342,6 +24374,10 @@ int Jim_InteractivePrompt(Jim_Interp *interp) #include +#ifdef HAVE_UNISTD_H +#include +#endif + extern int Jim_initjimshInit(Jim_Interp *interp); @@ -24425,6 +24461,10 @@ int main(int argc, char *const argv[]) } if (retcode != JIM_EXIT) { JimSetArgv(interp, 0, NULL); + if (!isatty(STDIN_FILENO)) { + + goto eval_stdin; + } retcode = Jim_InteractivePrompt(interp); } } @@ -24447,6 +24487,7 @@ int main(int argc, char *const argv[]) Jim_SetVariableStr(interp, "argv0", Jim_NewStringObj(interp, argv[1], -1)); JimSetArgv(interp, argc - 2, argv + 2); if (strcmp(argv[1], "-") == 0) { +eval_stdin: retcode = Jim_Eval(interp, "eval [info source [stdin read] stdin 1]"); } else { retcode = Jim_EvalFile(interp, argv[1]); diff --git a/manifest b/manifest index f5d136df4a..0f78ec938a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Attempted\simprovements\sto\sthe\sSQLITE_DBCONFIG_...\sdocumentation. -D 2025-02-05T12:02:43.871 +C Upstream\sJimTCL\spatch\sand\sminor\stcl\sscript\stweaks\sto\ssupport\s(fconfigure\s-translation\sbinary)\sfor\sbetter\scross-platform\sbuild\sportability. +D 2025-02-05T12:49:15.023 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -47,7 +47,7 @@ F autosetup/cc-db.tcl 6e0ed90146197a5a05b245e649975c07c548e30926b218ca3e1d4dc034 F autosetup/cc-lib.tcl 493c5935b5dd3bf9bd4eca89b07c8b1b1a9356d61783035144e21795facf7360 F autosetup/cc-shared.tcl 4f024e94a47f427ba61de1739f6381ef0080210f9fae89112d5c1de1e5460d78 F autosetup/cc.tcl c0fcc50ca91deff8741e449ddad05bcd08268bc31177e613a6343bbd1fd3e45f -F autosetup/jimsh0.c d40e381ea4526a067590e7b91bd4b2efa6d4980d286f908054c647b3df4aee14 +F autosetup/jimsh0.c 5a74bdbf43c52289e3f482f3b9578db4bd657e88e8fe04b16c564d9fb710540a F autosetup/pkg-config.tcl 4e635bf39022ff65e0d5434339dd41503ea48fc53822c9c5bde88b02d3d952ba F autosetup/proj.tcl 9adf1539673cef15bff862d9360b479e6920cc2c0d85de707b0ba31c04ce4531 F autosetup/sqlite-config.tcl 00af5b9d94d580367bf01984b86397e8d35b74090427def9591a54ded0e1a287 @@ -2156,9 +2156,9 @@ F tool/mkpragmatab.tcl 32e359ccb21011958a821955254bd7a5fa7915d01a8c16fed91ffc8b4 F tool/mkshellc.tcl 9ce74de0fa904a2c56a96f8d8b5261246bacb0eaa8d7e184f9e18ff94145ebbc F tool/mksourceid.c 36aa8020014aed0836fd13c51d6dc9219b0df1761d6b5f58ff5b616211b079b9 F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 -F tool/mksqlite3c-noext.tcl 4f7cfef5152b0c91920355cbfc1d608a4ad242cb819f1aea07f6d0274f584a7f -F tool/mksqlite3c.tcl 1b24a4388f544a7f42fc2d03f34422182d3b2263453f65f642890259566369c1 -F tool/mksqlite3h.tcl 3cc8f3fbb3eca38c899549385622637667254067d865a70ad16e0996c2fd3214 +F tool/mksqlite3c-noext.tcl 351c55256213154cabb051a3c870ef9f4487de905015141ae50dc7578a901b84 +F tool/mksqlite3c.tcl ba13086555b3cb835eba5e47a9250300ab85304d23fd1081abd3f29d8ab71a2b +F tool/mksqlite3h.tcl b05b85c32295bad3fe64807729693d1f19faed3c464c5faac6c53bb6b972ac2f F tool/mksqlite3internalh.tcl eb994013e833359137eb53a55acdad0b5ae1049b F tool/mksrczip.tcl 81efd9974dbb36005383f2cd655520057a2ae5aa85ac2441a80c7c28f803ac52 F tool/mktoolzip.tcl 34b4e92be544f820e2cc26f143f7d5aec511e826ec394cc82969a5dcf7c7a27c @@ -2187,7 +2187,7 @@ F tool/speedtest2.tcl ee2149167303ba8e95af97873c575c3e0fab58ff F tool/speedtest8.c 2902c46588c40b55661e471d7a86e4dd71a18224 F tool/speedtest8inst1.c 7ce07da76b5e745783e703a834417d725b7d45fd F tool/spellsift.tcl 52b4b04dc4333c7ab024f09d9d66ed6b6f7c6eb00b38497a09f338fa55d40618 x -F tool/split-sqlite3c.tcl 5aa60643afca558bc732b1444ae81a522326f91e1dc5665b369c54f09e20de60 +F tool/split-sqlite3c.tcl 07e18a1d8cc3f6b3a4a1f3528e63c9b29a5c8a7bca0b8d394b231da464ce1247 F tool/sqldiff.c 2a0987d183027c795ced13d6749061c1d2f38e24eddb428f56fa64c3a8f51e4b F tool/sqlite3_analyzer.c.in fc7735c499d226a49d843d8209b2543e4e5229eeb71a674c331323a2217b65b4 F tool/sqlite3_rsync.c 9a1cca2ab1271c59b37a6493c15dc1bcd0ab9149197a9125926bc08dd26b83fb @@ -2209,8 +2209,9 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 317e9a470fba2a4b717b9cb66488b8fccb44810a80f3a7deaf1ea81906e2b8d2 -R 70f9a2f7e68a73caf1fe72ecdb3d41d3 -U drh -Z 5ee06f9c240d54c68e35a361db8f0493 +P baac853871ad307b67b4d624b9ee47fc1313f1aa62c9f8072fb49e97aa33db94 +Q +fddcfbcafd1b343ee95960564bb57785b8af18aaae16969d83f1550d6868737e +R a7b74c08eab9f96c10b2c2a2b89f2fbf +U stephan +Z c6d765f25f632bd465da0fecb9f4261f # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index af4c4d49c4..f1bcc15a21 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -baac853871ad307b67b4d624b9ee47fc1313f1aa62c9f8072fb49e97aa33db94 +0974a17c4565f202777fc6203df20dca19acc1e8740ede15334783f41e3e5054 diff --git a/tool/mksqlite3c-noext.tcl b/tool/mksqlite3c-noext.tcl index 8452072564..1148b1c0d5 100644 --- a/tool/mksqlite3c-noext.tcl +++ b/tool/mksqlite3c-noext.tcl @@ -57,7 +57,7 @@ close $in # set out [open sqlite3.c w] # Force the output to use unix line endings, even on Windows. -fconfigure $out -translation lf +fconfigure $out -translation binary set today [clock format [clock seconds] -format "%Y-%m-%d %H:%M:%S UTC" -gmt 1] puts $out [subst \ {/****************************************************************************** diff --git a/tool/mksqlite3c.tcl b/tool/mksqlite3c.tcl index ddc1e58776..1d0f892363 100644 --- a/tool/mksqlite3c.tcl +++ b/tool/mksqlite3c.tcl @@ -88,7 +88,7 @@ set fname sqlite3.c if {$enable_recover} { set fname sqlite3r.c } set out [open $fname wb] # Force the output to use unix line endings, even on Windows. -fconfigure $out -translation lf +fconfigure $out -translation binary set today [clock format [clock seconds] -format "%Y-%m-%d %H:%M:%S UTC" -gmt 1] puts $out [subst \ {/****************************************************************************** diff --git a/tool/mksqlite3h.tcl b/tool/mksqlite3h.tcl index 8ef123bc72..b1d5ecdcd3 100644 --- a/tool/mksqlite3h.tcl +++ b/tool/mksqlite3h.tcl @@ -107,7 +107,7 @@ set declpattern5 \ {^ *([a-zA-Z][a-zA-Z_0-9 ]+ \**)(sqlite3rebaser_[_a-zA-Z0-9]+)(\(.*)$} # Force the output to use unix line endings, even on Windows. -fconfigure stdout -translation lf +fconfigure stdout -translation binary set filelist [subst { $TOP/src/sqlite.h.in diff --git a/tool/split-sqlite3c.tcl b/tool/split-sqlite3c.tcl index 0308431dab..de4db55a1b 100644 --- a/tool/split-sqlite3c.tcl +++ b/tool/split-sqlite3c.tcl @@ -15,7 +15,7 @@ set END {^/\*+ End of %s \*+/} set in [open sqlite3.c] set out1 [open sqlite3-all.c w] -fconfigure $out1 -translation lf +fconfigure $out1 -translation binary # Copy the header from sqlite3.c into sqlite3-all.c # From 6c074e5dc40e7375ea5cf985ca2ea508dacddf4e Mon Sep 17 00:00:00 2001 From: stephan Date: Wed, 5 Feb 2025 12:56:55 +0000 Subject: [PATCH 180/220] Summarize known incompatibilities/gotches between JimTCL and canonical TCL, and their workarounds. Doc changes only. FossilOrigin-Name: 60c932e67b886d4c050698f36e1d3fc04eb99473d62bb3b1585a97d90e27227e --- autosetup/README.md | 24 ++++++++++++++++++++++++ manifest | 13 ++++++------- manifest.uuid | 2 +- 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/autosetup/README.md b/autosetup/README.md index 19a16c943a..2d6cf723c0 100644 --- a/autosetup/README.md +++ b/autosetup/README.md @@ -196,6 +196,30 @@ APIs must not use `[file normalize]`, but autosetup provides a TCL-only implementation of `[file-normalize]` (note the dash) for portable use in the configure script. +Known TCL Incompatibilities +------------------------------------------------------------------------ + +A summary of known incompatibilities in JimTCL + +- **CRNL line endings**: prior to 2025-02-05 `fconfigure -translation ...` + was a no-op in JimTCL, and it emits CRNL line endings by default on + Windows. Since then, it supports `-translation binary`, which is + close enough to `-translation lf` for our purposes. When working + with files using the `open` command, it is important to use mode + `"rb"` or `"wb"`, as appropriate, so that the output does not get + CRNL-mangled on Windows. + +- **`file copy`** does not support multiple source files. See + [](/info/61f18c96183867fe) for a workaround. + +- **Regular expressions**: + + - Patterns treat `\nnn` octal values as back-references (which it + does not support). Those can be reformulated as demonstrated in + [](/info/aeac23359bb681c0). + + - `regsub` does not support the `\y` flag. A workaround is demonstrated + in [](/info/c2e5dd791cce3ec4). Design Conventions diff --git a/manifest b/manifest index 0f78ec938a..da809967ae 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Upstream\sJimTCL\spatch\sand\sminor\stcl\sscript\stweaks\sto\ssupport\s(fconfigure\s-translation\sbinary)\sfor\sbetter\scross-platform\sbuild\sportability. -D 2025-02-05T12:49:15.023 +C Summarize\sknown\sincompatibilities/gotches\sbetween\sJimTCL\sand\scanonical\sTCL,\sand\stheir\sworkarounds.\sDoc\schanges\sonly. +D 2025-02-05T12:56:55.992 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -37,7 +37,7 @@ F autoconf/tea/win/rules.vc 94a18c3e453535459b4a643983acca52fb8756e79055bd2ad4b0 F autoconf/tea/win/targets.vc 96a25a1fa6e9e9cfb348fd3760a5395b4ce8acafc8ed10f0412937ec200d5dbd F autosetup/LICENSE 41a26aebdd2cd185d1e2b210f71b7ce234496979f6b35aef2cbf6b80cbed4ce4 F autosetup/README.autosetup a78ff8c4a3d2636a4268736672a74bf14a82f42687fcf0631a70c516075c031e -F autosetup/README.md 2737c4eb44b022a694b1f93fb01c3b6c3a45b4f663e18490c2106643a77b39da +F autosetup/README.md b306314e8a87ccf873cb5b2a360c4a27bbf841df5b76f3acbd65322cff165476 F autosetup/autosetup df8b53928b1fe3c67db5bc77c8e1eb8160c1b6a26c370e9a06c68748f803b7e4 x F autosetup/autosetup-config.guess dfa101c5e8220e864d5e9c72a85e87110df60260d36cb951ad0a85d6d9eaa463 x F autosetup/autosetup-config.sub a38fb074d0dece01cf919e9fb534a26011608aa8fa606490864295328526cd73 x @@ -2209,9 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P baac853871ad307b67b4d624b9ee47fc1313f1aa62c9f8072fb49e97aa33db94 -Q +fddcfbcafd1b343ee95960564bb57785b8af18aaae16969d83f1550d6868737e -R a7b74c08eab9f96c10b2c2a2b89f2fbf +P 0974a17c4565f202777fc6203df20dca19acc1e8740ede15334783f41e3e5054 +R ac84e39b3790b8114a07b99fae22b35b U stephan -Z c6d765f25f632bd465da0fecb9f4261f +Z 5ac40daff7d720f4fde033e3e4223e0e # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index f1bcc15a21..46ead94eed 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0974a17c4565f202777fc6203df20dca19acc1e8740ede15334783f41e3e5054 +60c932e67b886d4c050698f36e1d3fc04eb99473d62bb3b1585a97d90e27227e From 31c3599ed01897693912f92d36f3285e1f2471b4 Mon Sep 17 00:00:00 2001 From: drh <> Date: Wed, 5 Feb 2025 16:08:11 +0000 Subject: [PATCH 181/220] Fix a harmless unused-parameter compiler warning introduced by [75f3d8744879]. FossilOrigin-Name: 9f28f6694f97d5ee0345b45f9bf81e3fdce0990ce32fb9bdbbaac079126a67c9 --- ext/fts3/fts3_snippet.c | 1 + manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/ext/fts3/fts3_snippet.c b/ext/fts3/fts3_snippet.c index c79cca4a6d..8a6ab8ea62 100644 --- a/ext/fts3/fts3_snippet.c +++ b/ext/fts3/fts3_snippet.c @@ -1594,6 +1594,7 @@ static int fts3ExprTermOffsetInit(Fts3Expr *pExpr, int iPhrase, void *ctx){ static int fts3ExprRestartIfCb(Fts3Expr *pExpr, int iPhrase, void *ctx){ TermOffsetCtx *p = (TermOffsetCtx*)ctx; int rc = SQLITE_OK; + UNUSED_PARAMETER(iPhrase); if( pExpr->pPhrase && pExpr->pPhrase->bIncr ){ rc = sqlite3Fts3MsrCancel(p->pCsr, pExpr); pExpr->pPhrase->bIncr = 0; diff --git a/manifest b/manifest index da809967ae..d0ed9ae692 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Summarize\sknown\sincompatibilities/gotches\sbetween\sJimTCL\sand\scanonical\sTCL,\sand\stheir\sworkarounds.\sDoc\schanges\sonly. -D 2025-02-05T12:56:55.992 +C Fix\sa\sharmless\sunused-parameter\scompiler\swarning\sintroduced\sby\s[75f3d8744879]. +D 2025-02-05T16:08:11.074 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -87,7 +87,7 @@ F ext/fts3/fts3_hash.c 8b6e31bfb0844c27dc6092c2620bdb1fca17ed613072db057d96952c6 F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf F ext/fts3/fts3_icu.c 305ce7fb6036484085b5556a9c8e62acdc7763f0f4cdf5fd538212a9f3720116 F ext/fts3/fts3_porter.c e19807ce0ae31c1c6e9898e89ecc93183d7ec224ea101af039722a4f49e5f2b8 -F ext/fts3/fts3_snippet.c 92196bd5941be0455f2c7e51c2f8280df49c7feb0615a0d1d4d045f2dcf60713 +F ext/fts3/fts3_snippet.c 7a3d5e2cefbb1cb51fb9c65458670cc269647ede18e1ffd57b513f9b4ec10c3e F ext/fts3/fts3_term.c 6a96027ad364001432545fe43322b6af04ed28bb5619ec51af1f59d0710d6d69 F ext/fts3/fts3_test.c 7a9cb3d61774134211bf4bfdf1adcb581a1a0377f2d050a121ae7ab44baef0e3 F ext/fts3/fts3_tokenize_vtab.c 7fd9ef364f257b97218b9c331f2378e307375c592f70fd541f714e747d944962 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 0974a17c4565f202777fc6203df20dca19acc1e8740ede15334783f41e3e5054 -R ac84e39b3790b8114a07b99fae22b35b -U stephan -Z 5ac40daff7d720f4fde033e3e4223e0e +P 60c932e67b886d4c050698f36e1d3fc04eb99473d62bb3b1585a97d90e27227e +R 84a73aa92675a2727074c491235ee053 +U drh +Z 84a578fb1294f91eaec33c542173ac0d # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 46ead94eed..0704181ca7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -60c932e67b886d4c050698f36e1d3fc04eb99473d62bb3b1585a97d90e27227e +9f28f6694f97d5ee0345b45f9bf81e3fdce0990ce32fb9bdbbaac079126a67c9 From 659bafd05dee789298074283ce857e27e65ef675 Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 6 Feb 2025 11:55:18 +0000 Subject: [PATCH 182/220] Version 3.49.0 FossilOrigin-Name: 4a7dd425dc2a0e5082a9049c9b4a9d4f199a71583d014c24b4cfe276c5a77cde --- manifest | 11 +++++++---- manifest.uuid | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/manifest b/manifest index d0ed9ae692..d38d362fbb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sharmless\sunused-parameter\scompiler\swarning\sintroduced\sby\s[75f3d8744879]. -D 2025-02-05T16:08:11.074 +C Version\s3.49.0 +D 2025-02-06T11:55:18.769 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -2209,8 +2209,11 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 60c932e67b886d4c050698f36e1d3fc04eb99473d62bb3b1585a97d90e27227e +P 9f28f6694f97d5ee0345b45f9bf81e3fdce0990ce32fb9bdbbaac079126a67c9 R 84a73aa92675a2727074c491235ee053 +T +sym-major-release * +T +sym-release * +T +sym-version-3.49.0 * U drh -Z 84a578fb1294f91eaec33c542173ac0d +Z 345e0ae7aa6443f7f8d274ba6f526736 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 0704181ca7..71c984af80 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9f28f6694f97d5ee0345b45f9bf81e3fdce0990ce32fb9bdbbaac079126a67c9 +4a7dd425dc2a0e5082a9049c9b4a9d4f199a71583d014c24b4cfe276c5a77cde From 3c013479c3884f5f996bc914a7fd32df84b867d8 Mon Sep 17 00:00:00 2001 From: stephan Date: Thu, 6 Feb 2025 13:18:49 +0000 Subject: [PATCH 183/220] Fix a dependencies/order-of-operations bug in ext/wasm/GNUmakefile which causes creation of files filtered via c-pp to fail if the ext/wasm/jswasm dir did not exist beforehand. FossilOrigin-Name: 4bac76138853a89484d3ac0486a9ed5143aa671b13b4b3abb704c1487213b388 --- ext/wasm/GNUmakefile | 1 + manifest | 17 +++++++---------- manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 11 deletions(-) diff --git a/ext/wasm/GNUmakefile b/ext/wasm/GNUmakefile index 3e9621c6d2..dc8ea54fd4 100644 --- a/ext/wasm/GNUmakefile +++ b/ext/wasm/GNUmakefile @@ -425,6 +425,7 @@ define SQLITE.CALL.C-PP.FILTER # $2 = Output file: c-pp -o $(2).js # $3 = optional c-pp -D... flags $(2): $(1) $$(MAKEFILE) $$(bin.c-pp) + mkdir -p $$(dir $$@) $$(bin.c-pp) -f $(1) -o $$@ $(3) $(SQLITE.CALL.C-PP.FILTER.global) #CLEAN_FILES += $(2) endef diff --git a/manifest b/manifest index d38d362fbb..334058434b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Version\s3.49.0 -D 2025-02-06T11:55:18.769 +C Fix\sa\sdependencies/order-of-operations\sbug\sin\sext/wasm/GNUmakefile\swhich\scauses\screation\sof\sfiles\sfiltered\svia\sc-pp\sto\sfail\sif\sthe\sext/wasm/jswasm\sdir\sdid\snot\sexist\sbeforehand. +D 2025-02-06T13:18:49.829 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -619,7 +619,7 @@ F ext/session/sqlite3session.c 52a680dbb03c4734748b215d95987fb4d95ab23baaf053a01 F ext/session/sqlite3session.h 683ccbf16e2c2521661fc4c1cf918ce57002039efbcabcd8097fa4bca569104b F ext/session/test_session.c 12e0a2c15fd60f92da4bb29c697c9177ff0c0dbcdc5129a54c47e999f147937a F ext/wasm/EXPORTED_FUNCTIONS.fiddle.in 27450c8b8c70875a260aca55435ec927068b34cef801a96205adb81bdcefc65c -F ext/wasm/GNUmakefile 47f121d057c08ba49443c06c1c51ba2572e3d5d28a06c968cf0b2ccd5878c3d3 +F ext/wasm/GNUmakefile 7d1076680e687d01e0f4f343624db4e00e31edbe67bd0cb2e3ad8ecea98a3cae F ext/wasm/README-dist.txt f01081a850ce38a56706af6b481e3a7878e24e42b314cfcd4b129f0f8427066a F ext/wasm/README.md b89605f65661cf35bf034ff6d43e448cc169b8017fc105d498e33b81218b482c F ext/wasm/SQLTester/GNUmakefile e0794f676d55819951bbfae45cc5e8d7818dc460492dc317ce7f0d2eca15caff @@ -2209,11 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 9f28f6694f97d5ee0345b45f9bf81e3fdce0990ce32fb9bdbbaac079126a67c9 -R 84a73aa92675a2727074c491235ee053 -T +sym-major-release * -T +sym-release * -T +sym-version-3.49.0 * -U drh -Z 345e0ae7aa6443f7f8d274ba6f526736 +P 4a7dd425dc2a0e5082a9049c9b4a9d4f199a71583d014c24b4cfe276c5a77cde +R ace1a556cd2682c15f244d0a70c9d1c1 +U stephan +Z e2303326f9884746fc80a4c5bceed35d # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 71c984af80..ee3aa0d336 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4a7dd425dc2a0e5082a9049c9b4a9d4f199a71583d014c24b4cfe276c5a77cde +4bac76138853a89484d3ac0486a9ed5143aa671b13b4b3abb704c1487213b388 From 01bfe2a53114761f0afa301e5d17d00d99e789c4 Mon Sep 17 00:00:00 2001 From: stephan Date: Thu, 6 Feb 2025 13:36:31 +0000 Subject: [PATCH 184/220] Bump version number to 3.50.0 for the next dev cycle. FossilOrigin-Name: 46d08071f3f9fef78bc2444b52060e0e7de8c357a2aa213ac13c565e33acc4a0 --- VERSION | 2 +- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/VERSION b/VERSION index 549b777ead..ca25ff637a 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.49.0 +3.50.0 diff --git a/manifest b/manifest index 334058434b..1f8d299de4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sdependencies/order-of-operations\sbug\sin\sext/wasm/GNUmakefile\swhich\scauses\screation\sof\sfiles\sfiltered\svia\sc-pp\sto\sfail\sif\sthe\sext/wasm/jswasm\sdir\sdid\snot\sexist\sbeforehand. -D 2025-02-06T13:18:49.829 +C Bump\sversion\snumber\sto\s3.50.0\sfor\sthe\snext\sdev\scycle. +D 2025-02-06T13:36:31.028 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -7,7 +7,7 @@ F Makefile.in 38485d15d9190cdad0d7bee25af7b442028865964025dcc61f40fd8d6e369cfc F Makefile.linux-generic bd3e3cacd369821a6241d4ea1967395c962dfe3057e38cb0a435cee0e8b789d0 F Makefile.msc a9b95ae9807e17f9b0734ebe97d68032141c3f95286bb64593cb73b206f043cf F README.md c3c0f19532ce28f6297a71870f3c7b424729f0e6d9ab889616d3587dd2332159 -F VERSION 01f7606130e48fd58a74d1e45e565f2674819d6eadbc219d328d94bb3362b818 +F VERSION 001dea55eb8304ec9130b6b44a32d3fc349f279d45a7e224fc0730c3cb8e2372 F art/icon-243x273.gif 9750b734f82fdb3dc43127753d5e6fbf3b62c9f4e136c2fbf573b2f57ea87af5 F art/icon-80x90.gif 65509ce3e5f86a9cd64fe7fca2d23954199f31fe44c1e09e208c80fb83d87031 F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 4a7dd425dc2a0e5082a9049c9b4a9d4f199a71583d014c24b4cfe276c5a77cde -R ace1a556cd2682c15f244d0a70c9d1c1 +P 4bac76138853a89484d3ac0486a9ed5143aa671b13b4b3abb704c1487213b388 +R b5d195e43beae1111c42ac081a32392a U stephan -Z e2303326f9884746fc80a4c5bceed35d +Z ceb27f6deb0f1234888251cc1a8b6e99 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index ee3aa0d336..367bfe7636 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4bac76138853a89484d3ac0486a9ed5143aa671b13b4b3abb704c1487213b388 +46d08071f3f9fef78bc2444b52060e0e7de8c357a2aa213ac13c565e33acc4a0 From 65552a7ae1c77f627f7667837580c44baa1ba3ef Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 6 Feb 2025 17:10:38 +0000 Subject: [PATCH 185/220] Fix a harmless typo in a comment. FossilOrigin-Name: ed82272904deb37640286448e03153316f828c629547a615a504af1d7ec5a278 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/insert.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 1f8d299de4..1d31210c3e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Bump\sversion\snumber\sto\s3.50.0\sfor\sthe\snext\sdev\scycle. -D 2025-02-06T13:36:31.028 +C Fix\sa\sharmless\stypo\sin\sa\scomment. +D 2025-02-06T17:10:38.852 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -739,7 +739,7 @@ F src/hash.c 9ee4269fb1d6632a6fecfb9479c93a1f29271bddbbaf215dd60420bcb80c7220 F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51 F src/hwtime.h f9c2dfb84dce7acf95ce6d289e46f5f9d3d1afd328e53da8f8e9008e3b3caae6 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c db8bfff30fd7f71812651df3ddf5d1624b9e19104b31e349cd9055bbc9d622c4 +F src/insert.c ccadada52dc508ab8229e343425ab2504db57cfcdf8271f0f9ce1c2c6cad97c1 F src/json.c 68a98c020c22127f2d65f08855f7fc7460ff352a6ce0b543d8931dde83319c22 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 7432c944ff197046d67a1207790a1b13eec4548c85a9457eb0896bb3641dfb36 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 4bac76138853a89484d3ac0486a9ed5143aa671b13b4b3abb704c1487213b388 -R b5d195e43beae1111c42ac081a32392a -U stephan -Z ceb27f6deb0f1234888251cc1a8b6e99 +P 46d08071f3f9fef78bc2444b52060e0e7de8c357a2aa213ac13c565e33acc4a0 +R c4f19381dd3461bfce62af076631de2d +U drh +Z 430f69c01ee43f942d60706245b3b05a # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 367bfe7636..d648338bf7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -46d08071f3f9fef78bc2444b52060e0e7de8c357a2aa213ac13c565e33acc4a0 +ed82272904deb37640286448e03153316f828c629547a615a504af1d7ec5a278 diff --git a/src/insert.c b/src/insert.c index 83baeece64..e2d910fce4 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1394,7 +1394,7 @@ void sqlite3Insert( continue; }else if( pColumn==0 ){ /* Hidden columns that are not explicitly named in the INSERT - ** get there default value */ + ** get their default value */ sqlite3ExprCodeFactorable(pParse, sqlite3ColumnExpr(pTab, &pTab->aCol[i]), iRegStore); From 038424727b4fef582dfb6f6badbcadb39039e39c Mon Sep 17 00:00:00 2001 From: drh <> Date: Thu, 6 Feb 2025 17:29:14 +0000 Subject: [PATCH 186/220] Adjust the test/speedtest.tcl script so that it uses an on-disk database rather than an in-memory database. FossilOrigin-Name: e93d7aa1db9bdbf1996c4c168e67284177e384b7acf176d74a0458258faab05c --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/speedtest.tcl | 5 +++++ 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 1d31210c3e..27e4110605 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sharmless\stypo\sin\sa\scomment. -D 2025-02-06T17:10:38.852 +C Adjust\sthe\stest/speedtest.tcl\sscript\sso\sthat\sit\suses\san\son-disk\sdatabase\nrather\sthan\san\sin-memory\sdatabase. +D 2025-02-06T17:29:14.625 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -1680,7 +1680,7 @@ F test/speed4.test abc0ad3399dcf9703abed2fff8705e4f8e416715 F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa F test/speed4p.test 377a0c48e5a92e0b11c1c5ebb1bc9d83a7312c922bc0cb05970ef5d6a96d1f0c F test/speedtest.md ee958457ae1b729d9715ae33c0320600000bf1d9ddea1a88dcf79f56729d6fad -F test/speedtest.tcl 8a9362c1e429318e741b91d26888e7edcc326f98c3aea505ffd618cc5b9e7f0a x +F test/speedtest.tcl 185f80f8db275852746e8150137b31ba4aaa1c9a1ecb1e35a3b66cd3f31783b9 x F test/speedtest1.c 204acd8af326bbca2c28f68166635d4574381f4cabbac1bc243663f5dcc5051d F test/spellfix.test 951a6405d49d1a23d6b78027d3877b4a33eeb8221dcab5704b499755bb4f552e F test/spellfix2.test dfc8f519a3fc204cb2dfa8b4f29821ae90f6f8c3 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 46d08071f3f9fef78bc2444b52060e0e7de8c357a2aa213ac13c565e33acc4a0 -R c4f19381dd3461bfce62af076631de2d +P ed82272904deb37640286448e03153316f828c629547a615a504af1d7ec5a278 +R 3389deb8f0facbb95e58d6e9fc976f10 U drh -Z 430f69c01ee43f942d60706245b3b05a +Z 9628165988950eefdec8a4b63484fc0a # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index d648338bf7..a345c88775 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ed82272904deb37640286448e03153316f828c629547a615a504af1d7ec5a278 +e93d7aa1db9bdbf1996c4c168e67284177e384b7acf176d74a0458258faab05c diff --git a/test/speedtest.tcl b/test/speedtest.tcl index 93b407c94e..d201297158 100755 --- a/test/speedtest.tcl +++ b/test/speedtest.tcl @@ -174,9 +174,14 @@ if {!$dryrun} { } lappend speedtestflags --testset $testset set stcmd [list valgrind --tool=cachegrind ./speedtest1 {*}$speedtestflags] +lappend stcmd speedtest1.db lappend stcmd >valgrind-out.txt 2>valgrind-err.txt puts $stcmd if {!$dryrun} { + foreach file {speedtest1.db speedtest1.db-journal speedtest1.db-wal + speedtest1.db-shm} { + if {[file exists $file]} {file delete $file} + } exec {*}$stcmd } From 6b3010a1344835e1c57f736cdb06c35ebefd24f0 Mon Sep 17 00:00:00 2001 From: stephan Date: Fri, 7 Feb 2025 01:43:05 +0000 Subject: [PATCH 187/220] Bump TEA configure.ac version number. FossilOrigin-Name: a1a9c780d1f1b47b0408397edded9c5d230c7b144207ad142d06c048792d31fa --- autoconf/tea/configure.ac | 2 +- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/autoconf/tea/configure.ac b/autoconf/tea/configure.ac index e653798fc5..d3952707a2 100644 --- a/autoconf/tea/configure.ac +++ b/autoconf/tea/configure.ac @@ -19,7 +19,7 @@ dnl to configure the system for the local environment. # so that we create the export library with the dll. #----------------------------------------------------------------------- -AC_INIT([sqlite],[3.49.0]) +AC_INIT([sqlite],[3.50.0]) #-------------------------------------------------------------------- # Call TEA_INIT as the first TEA_ macro to set up initial vars. diff --git a/manifest b/manifest index 27e4110605..cad7d41db4 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Adjust\sthe\stest/speedtest.tcl\sscript\sso\sthat\sit\suses\san\son-disk\sdatabase\nrather\sthan\san\sin-memory\sdatabase. -D 2025-02-06T17:29:14.625 +C Bump\sTEA\sconfigure.ac\sversion\snumber. +D 2025-02-07T01:43:05.809 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -24,7 +24,7 @@ F autoconf/auto.def 23bc095a3890c0ca334abf7ef67d1c8af4c22c12832bcc738015e868d54f F autoconf/tea/Makefile.in ba0556fee8da09c066bad85a4457904e46ee2c2eabaa309c0e83a78f2f151a8e F autoconf/tea/README.txt 61e62e519579e4a112791354d6d440f8b51ea6db3b0bab58d59f29df42d2dfe3 F autoconf/tea/aclocal.m4 52c47aac44ce0ddb1f918b6993e8beb8eee88f43 -F autoconf/tea/configure.ac d22326594f005a493a7857cb4ad2496b91480101be731d7f0541bb8d7eba22a2 +F autoconf/tea/configure.ac 830cb2af5a3888312d0fd88402c2509d551d60e4c03f0481006a07c78313ef12 F autoconf/tea/doc/sqlite3.n e1fe45d4f5286ee3d0ccc877aca2a0def488e9bb F autoconf/tea/license.terms 13bd403c9610fd2b76ece0ab50c4c5eda933d523 F autoconf/tea/pkgIndex.tcl.in 55aec3c6d7e9a1de9b8d2fdc9c27fd055da3ac3a51b572195e2ae7300bcfd3a2 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P ed82272904deb37640286448e03153316f828c629547a615a504af1d7ec5a278 -R 3389deb8f0facbb95e58d6e9fc976f10 -U drh -Z 9628165988950eefdec8a4b63484fc0a +P e93d7aa1db9bdbf1996c4c168e67284177e384b7acf176d74a0458258faab05c +R 862fe61394e7b3cb4c5d861b55c28308 +U stephan +Z 4a5b39d46ead9ead0e536423680a6ea5 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index a345c88775..0a49cc208d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e93d7aa1db9bdbf1996c4c168e67284177e384b7acf176d74a0458258faab05c +a1a9c780d1f1b47b0408397edded9c5d230c7b144207ad142d06c048792d31fa From 4192a95d23f828bb556b8602ac4df6edeb002ffc Mon Sep 17 00:00:00 2001 From: stephan Date: Fri, 7 Feb 2025 11:15:58 +0000 Subject: [PATCH 188/220] Fix out-of-tree builds of the autoconf bundle, as reported in [forum:a0cd0beb1baa6bef|forum post a0cd0beb1baa6bef]. FossilOrigin-Name: d47964a65bcfd4bc0b06baca281467a0b7fc87eba912a19c0974f63a54928ff8 --- autoconf/Makefile.in | 27 ++++++++++++++++++--------- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 25 insertions(+), 16 deletions(-) diff --git a/autoconf/Makefile.in b/autoconf/Makefile.in index 0c97f16321..1229a72117 100644 --- a/autoconf/Makefile.in +++ b/autoconf/Makefile.in @@ -1,8 +1,17 @@ ######################################################################## # This is a main makefile for the "autoconf" bundle of SQLite. This is # a trimmed-down version of the canonical makefile, devoid of most -# documentation. For the full docs, see 'main.mk' in the canonical +# documentation. For the full docs, see /main.mk in the canonical # source tree. +# +# Maintenance reminders: +# +# - To keep this working with an out-of-tree build, be sure to prefix +# input file names with $(TOP)/ where appropriate (which is most +# places). +# +# - The original/canonical recipes can be found in /main.mk in the +# canonical source tree. all: TOP = @abs_top_srcdir@ @@ -123,8 +132,8 @@ LDFLAGS.libsqlite3 = \ LDFLAGS.libsqlite3.soname = @LDFLAGS_LIBSQLITE3_SONAME@ CFLAGS.libsqlite3 = -I. $(CFLAGS.core) $(CFLAGS.icu) $(OPT_FEATURE_FLAGS) -sqlite3.o: sqlite3.h sqlite3.c - $(CC) -c sqlite3.c -o $@ $(CFLAGS) $(CFLAGS.libsqlite3) +sqlite3.o: $(TOP)/sqlite3.h $(TOP)/sqlite3.c + $(CC) -c $(TOP)/sqlite3.c -o $@ $(CFLAGS) $(CFLAGS.libsqlite3) libsqlite3.LIB = libsqlite3$(T.lib) libsqlite3.SO = libsqlite3$(T.dll) @@ -169,9 +178,9 @@ install-lib: install-lib-$(ENABLE_LIB_STATIC) install: install-lib -sqlite3$(T.exe): shell.c sqlite3.c +sqlite3$(T.exe): $(TOP)/shell.c $(TOP)/sqlite3.c $(CC) -o $@ \ - shell.c sqlite3.c \ + $(TOP)/shell.c $(TOP)/sqlite3.c \ -I. $(OPT_FEATURE_FLAGS) $(SHELL_OPT) \ $(CFLAGS) $(CFLAGS.readline) $(CFLAGS.icu) \ $(LDFLAGS) $(LDFLAGS.libsqlite3) $(LDFLAGS.readline) @@ -181,16 +190,16 @@ install-shell: sqlite3$(T.exe) $(install-dir.bin) $(INSTALL.strip) sqlite3$(T.exe) "$(install-dir.bin)" install: install-shell -install-headers: sqlite3.h $(install-dir.include) - $(INSTALL.noexec) sqlite3.h sqlite3ext.h "$(install-dir.include)" +install-headers: $(TOP)/sqlite3.h $(install-dir.include) + $(INSTALL.noexec) $(TOP)/sqlite3.h $(TOP)/sqlite3ext.h "$(install-dir.include)" install: install-headers install-pc: sqlite3.pc $(install-dir.pkgconfig) $(INSTALL.noexec) sqlite3.pc "$(install-dir.pkgconfig)" install: install-pc -install-man1: sqlite3.1 $(install-dir.man1) - $(INSTALL.noexec) sqlite3.1 "$(install-dir.man1)" +install-man1: $(TOP)/sqlite3.1 $(install-dir.man1) + $(INSTALL.noexec) $(TOP)/sqlite3.1 "$(install-dir.man1)" install: install-man1 clean: diff --git a/manifest b/manifest index cad7d41db4..58056cf593 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Bump\sTEA\sconfigure.ac\sversion\snumber. -D 2025-02-07T01:43:05.809 +C Fix\sout-of-tree\sbuilds\sof\sthe\sautoconf\sbundle,\sas\sreported\sin\s[forum:a0cd0beb1baa6bef|forum\spost\sa0cd0beb1baa6bef]. +D 2025-02-07T11:15:58.181 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -16,7 +16,7 @@ F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2 F art/sqlite370.svg 40b7e2fe8aac3add5d56dd86ab8d427a4eca5bcb3fe4f8946cb3794e1821d531 F auto.def e7e92090c98aeb0174d29988c259834eb1b71ae1ea927015c3ef300f6f9b68ae F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac -F autoconf/Makefile.in 56697ad25ecf23afa317148b06bdc14f85960b42e5ec434ac1ba87f63a3cb789 +F autoconf/Makefile.in 1748696041b706722fcc2289630aec596e556e10677914ec1dd5de9c627324fa F autoconf/Makefile.msc 0a071367537dc395285a5d624ac4f99f3a387b27cc5e89752423c0499e15aec4 F autoconf/README.first f1d3876e9a7852c22f275a6f06814e64934cecbc0b5b9617d64849094c1fd136 F autoconf/README.txt 7f01dc3915e2d68f329011073662369e62a0938a2c69398807823c57591cb288 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P e93d7aa1db9bdbf1996c4c168e67284177e384b7acf176d74a0458258faab05c -R 862fe61394e7b3cb4c5d861b55c28308 +P a1a9c780d1f1b47b0408397edded9c5d230c7b144207ad142d06c048792d31fa +R b8a9ec2caf630431b78b8fafa6d467ea U stephan -Z 4a5b39d46ead9ead0e536423680a6ea5 +Z 0e72d164ec413ce5120bfc7018dcffe2 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 0a49cc208d..f997b3b722 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a1a9c780d1f1b47b0408397edded9c5d230c7b144207ad142d06c048792d31fa +d47964a65bcfd4bc0b06baca281467a0b7fc87eba912a19c0974f63a54928ff8 From d8452a9517c42a917c7f95aecde1f976f9d876ba Mon Sep 17 00:00:00 2001 From: stephan Date: Fri, 7 Feb 2025 12:33:48 +0000 Subject: [PATCH 189/220] Reorder a piece of ext/wasm/GNUmakefile to correct the timing of various var accesses. Fixes a problem [https://github.com/sqlite/sqlite-wasm/pull/99|reported in the downstream npm subproject] and explains the confusion in [4aa025a943a4024094b9] (which has been reverted). FossilOrigin-Name: 65798c09a00662a3598f01571d6f3a2dc750c3d0b127c344590539244afe4aa7 --- ext/wasm/GNUmakefile | 46 ++++++++++++++++++++++------------------- ext/wasm/index.html | 4 ++-- ext/wasm/mkwasmbuilds.c | 1 + manifest | 16 +++++++------- manifest.uuid | 2 +- 5 files changed, 37 insertions(+), 32 deletions(-) diff --git a/ext/wasm/GNUmakefile b/ext/wasm/GNUmakefile index dc8ea54fd4..4369635cf2 100644 --- a/ext/wasm/GNUmakefile +++ b/ext/wasm/GNUmakefile @@ -910,6 +910,31 @@ sqlite3-worker1-promiser.js := $(dir.dout)/sqlite3-worker1-promiser.js sqlite3-worker1-promiser.mjs := $(dir.dout)/sqlite3-worker1-promiser.mjs sqlite3-worker1-bundler-friendly.mjs := $(dir.dout)/sqlite3-worker1-bundler-friendly.mjs sqlite3-worker1-promiser-bundler-friendly.js := $(dir.dout)/sqlite3-worker1-promiser-bundler-friendly.js + +ifneq (1,$(MAKING_CLEAN)) +# This block MUST come between the above definitions of +# sqlite3-...js/mjs and the $(eval) calls below this block which use +# SQLITE.CALL.C-PP.FILTER. +######################################################################## +# bin.mkwb is used for generating some of the makefile code for the +# various wasm builds. It used to be generated in this makefile via a +# difficult-to-read/maintain block of $(eval)'d code. Attempts were +# made to generate it from tcl and bash (shell) but having to escape +# the $ references in those languages made it just as illegible as the +# native makefile code. Somewhat surprisingly, moving that code generation +# to C makes it slightly less illegible than the previous 3 options. +bin.mkwb := ./mkwasmbuilds +$(bin.mkwb): $(bin.mkwb).c $(MAKEFILE) + $(CC) -o $@ $< +DISTCLEAN_FILES += $(bin.mkwb) +.wasmbuilds.make: $(bin.mkwb) + @rm -f $@ + $(bin.mkwb) > $@ + @chmod -w $@ +-include .wasmbuilds.make +endif +DISTCLEAN_FILES += .wasmbuilds.make + $(eval $(call SQLITE.CALL.C-PP.FILTER,$(sqlite3-worker1.js.in),$(sqlite3-worker1.js))) $(eval $(call SQLITE.CALL.C-PP.FILTER,$(sqlite3-worker1.js.in),$(sqlite3-worker1-bundler-friendly.mjs),\ $(c-pp.D.sqlite3-bundler-friendly))) @@ -941,27 +966,6 @@ sqlite3-api.ext.jses += \ all quick: $(sqlite3-api.ext.jses) q: quick -ifneq (1,$(MAKING_CLEAN)) -######################################################################## -# bin.mkwb is used for generating some of the makefile code for the -# various wasm builds. It used to be generated in this makefile via a -# difficult-to-read/maintain block of $(eval)'d code. Attempts were -# made to generate it from tcl and bash (shell) but having to escape -# the $ references in those languages made it just as illegible as the -# native makefile code. Somewhat surprisingly, moving that code generation -# to C makes it slightly less illegible than the previous 3 options. -bin.mkwb := ./mkwasmbuilds -$(bin.mkwb): $(bin.mkwb).c $(MAKEFILE) - $(CC) -o $@ $< -DISTCLEAN_FILES += $(bin.mkwb) -.wasmbuilds.make: $(bin.mkwb) - @rm -f $@ - $(bin.mkwb) > $@ - @chmod -w $@ --include .wasmbuilds.make -endif -DISTCLEAN_FILES += .wasmbuilds.make - ######################################################################## # batch-runner.js is part of one of the test apps which reads in SQL # dumps generated by $(speedtest1) and executes them. diff --git a/ext/wasm/index.html b/ext/wasm/index.html index 5d53b62d48..a3d41f1a9c 100644 --- a/ext/wasm/index.html +++ b/ext/wasm/index.html @@ -84,8 +84,8 @@ wrapper is significantly easier to use, however.

        17. demo-worker1-promiser: a demo of the Promise-based wrapper of the Worker1 API.
        18. - +
        19. demo-worker1-promiser-esm: + same as the previous demo except loads the promiser from an ESM module.
        20. speedtest1 ports (sqlite3's primary benchmarking tool)... diff --git a/ext/wasm/mkwasmbuilds.c b/ext/wasm/mkwasmbuilds.c index 1e09f83c01..e762b572cd 100644 --- a/ext/wasm/mkwasmbuilds.c +++ b/ext/wasm/mkwasmbuilds.c @@ -274,6 +274,7 @@ static void mk_lib_mode(const char *zName /* build name */, if( !zEmcc ) zEmcc = ""; pf("%s# Begin build [%s-%s]\n", zBanner, zNM); + pf("# zApiJsOut=%s\n# zJsOut=%s\n# zCmppD=%s\n", zApiJsOut, zJsOut, zCmppD); pf("$(info Setting up build [%s-%s]: %s)\n", zNM, zJsOut); mk_pre_post(zNM, zCmppD); pf("\nemcc.flags.%s.%s ?=\n", zNM); diff --git a/manifest b/manifest index 58056cf593..d5d82d5ef5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sout-of-tree\sbuilds\sof\sthe\sautoconf\sbundle,\sas\sreported\sin\s[forum:a0cd0beb1baa6bef|forum\spost\sa0cd0beb1baa6bef]. -D 2025-02-07T11:15:58.181 +C Reorder\sa\spiece\sof\sext/wasm/GNUmakefile\sto\scorrect\sthe\stiming\sof\svarious\svar\saccesses.\sFixes\sa\sproblem\s[https://github.com/sqlite/sqlite-wasm/pull/99|reported\sin\sthe\sdownstream\snpm\ssubproject]\sand\sexplains\sthe\sconfusion\sin\s[4aa025a943a4024094b9]\s(which\shas\sbeen\sreverted). +D 2025-02-07T12:33:48.387 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -619,7 +619,7 @@ F ext/session/sqlite3session.c 52a680dbb03c4734748b215d95987fb4d95ab23baaf053a01 F ext/session/sqlite3session.h 683ccbf16e2c2521661fc4c1cf918ce57002039efbcabcd8097fa4bca569104b F ext/session/test_session.c 12e0a2c15fd60f92da4bb29c697c9177ff0c0dbcdc5129a54c47e999f147937a F ext/wasm/EXPORTED_FUNCTIONS.fiddle.in 27450c8b8c70875a260aca55435ec927068b34cef801a96205adb81bdcefc65c -F ext/wasm/GNUmakefile 7d1076680e687d01e0f4f343624db4e00e31edbe67bd0cb2e3ad8ecea98a3cae +F ext/wasm/GNUmakefile df23a3cb3bfb13f17fc76132a0127a89e2ad64f46b71efee9743929cfd52d441 F ext/wasm/README-dist.txt f01081a850ce38a56706af6b481e3a7878e24e42b314cfcd4b129f0f8427066a F ext/wasm/README.md b89605f65661cf35bf034ff6d43e448cc169b8017fc105d498e33b81218b482c F ext/wasm/SQLTester/GNUmakefile e0794f676d55819951bbfae45cc5e8d7818dc460492dc317ce7f0d2eca15caff @@ -677,10 +677,10 @@ F ext/wasm/fiddle/fiddle-worker.js 850e66fce39b89d59e161d1abac43a181a4caa89ddeea F ext/wasm/fiddle/fiddle.js b444a5646a9aac9f3fc06c53d78af5e1912eb235d69a8e6010723e4eb0e9d4a1 F ext/wasm/fiddle/index.html c79b1741cbeba78f88af0a84cf5ec7de87a909a6a8d10a369b1f4824c66c2088 F ext/wasm/index-dist.html 56132399702b15d70c474c3f1952541e25cb0922942868f70daf188f024b3730 -F ext/wasm/index.html 10ff3ad190aadccb713109fa55a38e5c1f3c2a8cf05cd31783745bab3f184079 +F ext/wasm/index.html e4bbffdb3d40eff12b3f9c7abedef91787e2935620b7f8d40f2c774b80ad8fa9 F ext/wasm/jaccwabyt/jaccwabyt.js 1264710db3cfbcb6887d95665b7aeba60c1126eaef789ca4cf1a4a17d5bc7f54 F ext/wasm/jaccwabyt/jaccwabyt.md 59a20df389abcc3606eb4eaea7fb7ba14504beb3e345dbea9b99a0618ba3bec8 -F ext/wasm/mkwasmbuilds.c d5885bacf2253bed913cdc7eb16b44f9c9e782133e10600652d1a78841c337af +F ext/wasm/mkwasmbuilds.c 954fe4242e877aeb60de44070628f5215ff51e5d102db6e2cb7da8c21e9e3401 F ext/wasm/module-symbols.html dc476b403369b26a1a23773e13b80f41b9a49f0825e81435fe3600a7cfbbe337 F ext/wasm/scratchpad-wasmfs.html a3d7388f3c4b263676b58b526846e9d02dfcb4014ff29d3a5040935286af5b96 F ext/wasm/scratchpad-wasmfs.mjs 66034b9256b218de59248aad796760a1584c1dd842231505895eff00dbd57c63 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P a1a9c780d1f1b47b0408397edded9c5d230c7b144207ad142d06c048792d31fa -R b8a9ec2caf630431b78b8fafa6d467ea +P d47964a65bcfd4bc0b06baca281467a0b7fc87eba912a19c0974f63a54928ff8 +R bc3b5d925c6179c0542f51782afdf047 U stephan -Z 0e72d164ec413ce5120bfc7018dcffe2 +Z 4ad5c2be721c326cfa9c17d54c17536c # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index f997b3b722..778ccade2d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d47964a65bcfd4bc0b06baca281467a0b7fc87eba912a19c0974f63a54928ff8 +65798c09a00662a3598f01571d6f3a2dc750c3d0b127c344590539244afe4aa7 From 7a7002143c893ca06035ddc15c71f095a6b95849 Mon Sep 17 00:00:00 2001 From: stephan Date: Fri, 7 Feb 2025 12:58:09 +0000 Subject: [PATCH 190/220] configure: change extension of static libraries from .lib to .a on msys/cygwin, as per discussion in [forum:02db2d4240|forum post 02db2d4240]. Replace unidiomatic JS-style use of inner procs in autosetup/proj.tcl with TCL lambdas. FossilOrigin-Name: 46f51e2a3707614a2b3ca6261bc6e0e8835477fdb7cbcf2f06b20cdebde2bab9 --- autosetup/proj.tcl | 20 +++++++++++--------- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/autosetup/proj.tcl b/autosetup/proj.tcl index 88da2112cf..5eeec0afb9 100644 --- a/autosetup/proj.tcl +++ b/autosetup/proj.tcl @@ -760,7 +760,7 @@ proc proj-exe-extension {} { # Trivia: for .dylib files, the linker needs the -dynamiclib flag # instead of -shared. proc proj-dll-extension {} { - proc inner {key} { + set inner {{key} { switch -glob -- [get-define $key] { *apple* { return ".dylib" @@ -772,9 +772,9 @@ proc proj-dll-extension {} { return ".so" } } - } - define BUILD_DLLEXT [inner build] - define TARGET_DLLEXT [inner host] + }} + define BUILD_DLLEXT [apply $inner build] + define TARGET_DLLEXT [apply $inner host] } ######################################################################## @@ -784,18 +784,20 @@ proc proj-dll-extension {} { # BUILD_LIBEXT and TARGET_LIBEXT to the conventional static library # extension for the being-built-on resp. the target platform. proc proj-lib-extension {} { - proc inner {key} { + set inner {{key} { switch -glob -- [get-define $key] { *-*-ming* - *-*-cygwin - *-*-msys { - return ".lib" + return ".a" + # ^^^ this was ".lib" until 2025-02-07. See + # https://sqlite.org/forum/forumpost/02db2d4240 } default { return ".a" } } - } - define BUILD_LIBEXT [inner build] - define TARGET_LIBEXT [inner host] + }} + define BUILD_LIBEXT [apply $inner build] + define TARGET_LIBEXT [apply $inner host] } ######################################################################## diff --git a/manifest b/manifest index d5d82d5ef5..29a95f233f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Reorder\sa\spiece\sof\sext/wasm/GNUmakefile\sto\scorrect\sthe\stiming\sof\svarious\svar\saccesses.\sFixes\sa\sproblem\s[https://github.com/sqlite/sqlite-wasm/pull/99|reported\sin\sthe\sdownstream\snpm\ssubproject]\sand\sexplains\sthe\sconfusion\sin\s[4aa025a943a4024094b9]\s(which\shas\sbeen\sreverted). -D 2025-02-07T12:33:48.387 +C configure:\schange\sextension\sof\sstatic\slibraries\sfrom\s.lib\sto\s.a\son\smsys/cygwin,\sas\sper\sdiscussion\sin\s[forum:02db2d4240|forum\spost\s02db2d4240].\sReplace\sunidiomatic\sJS-style\suse\sof\sinner\sprocs\sin\sautosetup/proj.tcl\swith\sTCL\slambdas. +D 2025-02-07T12:58:09.364 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -49,7 +49,7 @@ F autosetup/cc-shared.tcl 4f024e94a47f427ba61de1739f6381ef0080210f9fae89112d5c1d F autosetup/cc.tcl c0fcc50ca91deff8741e449ddad05bcd08268bc31177e613a6343bbd1fd3e45f F autosetup/jimsh0.c 5a74bdbf43c52289e3f482f3b9578db4bd657e88e8fe04b16c564d9fb710540a F autosetup/pkg-config.tcl 4e635bf39022ff65e0d5434339dd41503ea48fc53822c9c5bde88b02d3d952ba -F autosetup/proj.tcl 9adf1539673cef15bff862d9360b479e6920cc2c0d85de707b0ba31c04ce4531 +F autosetup/proj.tcl af5290ee128ce82dd178a474a9dcfaa7e503c88f0709d916cc6079d9b8c801f4 F autosetup/sqlite-config.tcl 00af5b9d94d580367bf01984b86397e8d35b74090427def9591a54ded0e1a287 F autosetup/system.tcl 51d4be76cd9a9074704b584e5c9cbba616202c8468cf9ba8a4f8294a7ab1dba9 F configure 9a00b21dfd13757bbfb8d89b30660a89ec1f8f3a79402b8f9f9b6fc475c3303a x @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P d47964a65bcfd4bc0b06baca281467a0b7fc87eba912a19c0974f63a54928ff8 -R bc3b5d925c6179c0542f51782afdf047 +P 65798c09a00662a3598f01571d6f3a2dc750c3d0b127c344590539244afe4aa7 +R dbe2a8083128cb507b4a3778dff39744 U stephan -Z 4ad5c2be721c326cfa9c17d54c17536c +Z 17346bc038bd674448e57b726746aecf # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 778ccade2d..d18bacd0ca 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -65798c09a00662a3598f01571d6f3a2dc750c3d0b127c344590539244afe4aa7 +46f51e2a3707614a2b3ca6261bc6e0e8835477fdb7cbcf2f06b20cdebde2bab9 From ede1690cce75ecd6fb965c2ff99c54f92e694ed6 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 7 Feb 2025 13:37:15 +0000 Subject: [PATCH 191/220] Reduce the amount of memset() needed to initialize the Parse object. FossilOrigin-Name: 284538d8486ef3e9bee1ab980043b53c144743c31b984be13a5cc137e7cbec31 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/sqliteInt.h | 4 ++-- src/trigger.c | 2 ++ 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 29a95f233f..57aee4069f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C configure:\schange\sextension\sof\sstatic\slibraries\sfrom\s.lib\sto\s.a\son\smsys/cygwin,\sas\sper\sdiscussion\sin\s[forum:02db2d4240|forum\spost\s02db2d4240].\sReplace\sunidiomatic\sJS-style\suse\sof\sinner\sprocs\sin\sautosetup/proj.tcl\swith\sTCL\slambdas. -D 2025-02-07T12:58:09.364 +C Reduce\sthe\samount\sof\smemset()\sneeded\sto\sinitialize\sthe\sParse\sobject. +D 2025-02-07T13:37:15.659 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -785,7 +785,7 @@ F src/shell.c.in b377a59822f207106424f08aead37e78b609222e98f86f04cc8a03563ccf323 F src/sqlite.h.in d2902f13ace94d3d3609646bd6d12a2d7a4f6cbdf6a5a4097580ac305f54c3f0 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54 -F src/sqliteInt.h 9d7052c71f46ca3a1a4880ba4a62590da334651139a38327d488894d9c883f3b +F src/sqliteInt.h d85806d6d66210ddf8b14158c6301608ca6abfa952b5a8e57c9852926a4c9728 F src/sqliteLimit.h 1bbdbf72bd0411d003267ffebc59a262f061df5653027a75627d03f48ca30523 F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -843,7 +843,7 @@ F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c 375a772e2342274f4bf73605a70633237da09deed00a9bf4c4816a56777ea7c9 F src/treeview.c d85ce76e6d1498d781957c07cb234da6d77ce0ed2d196480d516f54dabc62279 -F src/trigger.c 247e2d712d5edc6021d52a169f6ac9a9c10d7144bc4ac7ea06c1ed2aa414659f +F src/trigger.c 9f887ae4d3077d9de67d312e1da12f57e8b3a598468876bb3b8ccc6c1bca2eb1 F src/update.c 0e01aa6a3edf9ec112b33eb714b9016a81241497b1fb7c3e74332f4f71756508 F src/upsert.c 215328c3f91623c520ec8672c44323553f12caeb4f01b1090ebdca99fdf7b4f1 F src/utf.c 8b29d9a5956569ea2700f869669b8ef67a9662ee5e724ff77ab3c387e27094ba @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 65798c09a00662a3598f01571d6f3a2dc750c3d0b127c344590539244afe4aa7 -R dbe2a8083128cb507b4a3778dff39744 -U stephan -Z 17346bc038bd674448e57b726746aecf +P 46f51e2a3707614a2b3ca6261bc6e0e8835477fdb7cbcf2f06b20cdebde2bab9 +R 2ea5c3310ea580989e316d82762bea3d +U drh +Z 9a2383046899765f80ff4490e5ed6b3d # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index d18bacd0ca..7872bfc017 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -46f51e2a3707614a2b3ca6261bc6e0e8835477fdb7cbcf2f06b20cdebde2bab9 +284538d8486ef3e9bee1ab980043b53c144743c31b984be13a5cc137e7cbec31 diff --git a/src/sqliteInt.h b/src/sqliteInt.h index f47009c158..bbef593dfa 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3879,8 +3879,6 @@ struct Parse { int addrCrTab; /* Address of OP_CreateBtree on CREATE TABLE */ Returning *pReturning; /* The RETURNING clause */ } u1; - u32 oldmask; /* Mask of old.* columns referenced */ - u32 newmask; /* Mask of new.* columns referenced */ LogEst nQueryLoop; /* Est number of iterations of a query (10*log2(N)) */ u8 eTriggerOp; /* TK_UPDATE, TK_INSERT or TK_DELETE */ u8 bReturning; /* Coding a RETURNING trigger */ @@ -3897,6 +3895,8 @@ struct Parse { int aTempReg[8]; /* Holding area for temporary registers */ Parse *pOuterParse; /* Outer Parse object when nested */ Token sNameToken; /* Token with unqualified schema object name */ + u32 oldmask; /* Mask of old.* columns referenced */ + u32 newmask; /* Mask of new.* columns referenced */ /************************************************************************ ** Above is constant between recursions. Below is reset before and after diff --git a/src/trigger.c b/src/trigger.c index e306a2e664..e7b75d344a 100644 --- a/src/trigger.c +++ b/src/trigger.c @@ -1277,6 +1277,8 @@ static TriggerPrg *codeRowTrigger( sSubParse.eTriggerOp = pTrigger->op; sSubParse.nQueryLoop = pParse->nQueryLoop; sSubParse.prepFlags = pParse->prepFlags; + sSubParse.oldmask = 0; + sSubParse.newmask = 0; v = sqlite3GetVdbe(&sSubParse); if( v ){ From 189a4a0bbbc81781c2ee8aaf3f31cf55f67085e9 Mon Sep 17 00:00:00 2001 From: stephan Date: Fri, 7 Feb 2025 14:44:31 +0000 Subject: [PATCH 192/220] Mac-specific build fixes discussed in [forum:9dfd5b8fd525a5d7|forum thread 9dfd5b8fd525a5d7]: rename dylib links and add legacy-compatibility versioning stamps to libsqlite3.dylib. FossilOrigin-Name: 668bcf327a82a63d45be8cf38fdddc855dbcefdedf6c208e091eb7e2d244929d --- Makefile.in | 2 ++ auto.def | 5 ++-- autoconf/Makefile.in | 26 ++++++++++++++++----- autoconf/auto.def | 3 +-- autosetup/jimsh0.c | 32 ++++++++++++-------------- autosetup/sqlite-config.tcl | 46 ++++++++++++++++++++++++++++++++++++- main.mk | 21 +++++++++++++---- manifest | 26 ++++++++++----------- manifest.uuid | 2 +- 9 files changed, 116 insertions(+), 47 deletions(-) diff --git a/Makefile.in b/Makefile.in index 15e61217f2..f514046e00 100644 --- a/Makefile.in +++ b/Makefile.in @@ -121,6 +121,8 @@ LDFLAGS.icu = @LDFLAGS_ICU@ CFLAGS.icu = @CFLAGS_ICU@ LDFLAGS.libsqlite3.soname = @LDFLAGS_LIBSQLITE3_SONAME@ # soname: see https://sqlite.org/src/forumpost/5a3b44f510df8ded +LDFLAGS.libsqlite3.os-specific = @LDFLAGS_MAC_CVERSION@ +# os-specific: see https://sqlite.org/forum/forumpost/9dfd5b8fd525a5d7 ENABLE_SHARED = @ENABLE_SHARED@ ENABLE_STATIC = @ENABLE_STATIC@ HAVE_WASI_SDK = @HAVE_WASI_SDK@ diff --git a/auto.def b/auto.def index 52c758850c..3a5a2f64c1 100644 --- a/auto.def +++ b/auto.def @@ -230,7 +230,7 @@ proj-if-opt-truthy dev { define CFLAGS [get-env CFLAGS {-O0 -g}] # -------------^^^^^^^ intentionally using [get-env] instead of # [proj-get-env] here because [sqlite-setup-default-cflags] uses - # [proj-get-env]. + # [proj-get-env] and we want this to supercede that. } sqlite-check-common-bins ;# must come before [sqlite-handle-wasi-sdk] @@ -275,6 +275,5 @@ sqlite-handle-load-extension sqlite-handle-math sqlite-handle-icu sqlite-handle-emsdk -sqlite-process-dot-in-files -sqlite-post-config-validation +sqlite-common-late-stage-config sqlite-dump-defines diff --git a/autoconf/Makefile.in b/autoconf/Makefile.in index 1229a72117..0270b9a1db 100644 --- a/autoconf/Makefile.in +++ b/autoconf/Makefile.in @@ -69,7 +69,6 @@ LDFLAGS.readline = @LDFLAGS_READLINE@ CFLAGS.readline = @CFLAGS_READLINE@ LDFLAGS.icu = @LDFLAGS_ICU@ CFLAGS.icu = @CFLAGS_ICU@ -LDFLAGS.libsqlite3.soname = @LDFLAGS_LIBSQLITE3_SONAME@ # When cross-compiling, we need to avoid the -s flag because it only # works on the build host's platform. @@ -124,12 +123,16 @@ SHELL_OPT ?= @OPT_SHELL@ # OPT_FEATURE_FLAGS = @OPT_FEATURE_FLAGS@ +LDFLAGS.libsqlite3.soname = @LDFLAGS_LIBSQLITE3_SONAME@ +# soname: see https://sqlite.org/src/forumpost/5a3b44f510df8ded +LDFLAGS.libsqlite3.os-specific = @LDFLAGS_MAC_CVERSION@ +# os-specific: see https://sqlite.org/forum/forumpost/9dfd5b8fd525a5d7 + LDFLAGS.libsqlite3 = \ $(LDFLAGS.rpath) $(LDFLAGS.pthread) \ $(LDFLAGS.math) $(LDFLAGS.dlopen) \ $(LDFLAGS.zlib) $(LDFLAGS.icu) \ $(LDFLAGS.configure) -LDFLAGS.libsqlite3.soname = @LDFLAGS_LIBSQLITE3_SONAME@ CFLAGS.libsqlite3 = -I. $(CFLAGS.core) $(CFLAGS.icu) $(OPT_FEATURE_FLAGS) sqlite3.o: $(TOP)/sqlite3.h $(TOP)/sqlite3.c @@ -140,7 +143,8 @@ libsqlite3.SO = libsqlite3$(T.dll) $(libsqlite3.SO): sqlite3.o $(CC) -o $@ sqlite3.o $(LDFLAGS.shlib) \ - $(LDFLAGS) $(LDFLAGS.libsqlite3) $(LDFLAGS.libsqlite3.soname) + $(LDFLAGS) $(LDFLAGS.libsqlite3) \ + $(LDFLAGS.libsqlite3.os-specific) $(LDFLAGS.libsqlite3.soname) all: $(libsqlite3.SO) $(libsqlite3.LIB): sqlite3.o @@ -149,8 +153,16 @@ all: $(libsqlite3.LIB) install-so-1: $(install-dir.lib) $(libsqlite3.SO) $(INSTALL) $(libsqlite3.SO) "$(install-dir.lib)" - @echo "Setting up $(libsqlite3.SO) symlinks..."; \ - cd "$(install-dir.lib)" || exit $$?; \ + @echo "Setting up $(libsqlite3.SO) version symlinks..."; \ + cd "$(install-dir.lib)" || exit $$?; \ + if [ x.dylib = x$(T.dll) ]; then \ + rm -f libsqlite3.0$(T.dll) libsqlite3.$(PACKAGE_VERSION)$(T.dll) || exit $$?; \ + dllname=libsqlite3.$(PACKAGE_VERSION)$(T.dll); \ + mv $(libsqlite3.SO) $$dllname || exit $$?; \ + ln -s $$dllname $(libsqlite3.SO) || exit $$?; \ + ln -s $$dllname libsqlite3.0$(T.dll) || exit $$?; \ + ls -la $$dllname $(libsqlite3.SO) libsqlite3.0$(T.dll); \ + else \ rm -f $(libsqlite3.SO).0 $(libsqlite3.SO).$(PACKAGE_VERSION) || exit $$?; \ mv $(libsqlite3.SO) $(libsqlite3.SO).$(PACKAGE_VERSION) || exit $$?; \ ln -s $(libsqlite3.SO).$(PACKAGE_VERSION) $(libsqlite3.SO) || exit $$?; \ @@ -166,7 +178,9 @@ install-so-1: $(install-dir.lib) $(libsqlite3.SO) rm -f libsqlite3.la $(libsqlite3.SO).0.8.6 || exit $$?; \ ln -s $(libsqlite3.SO).$(PACKAGE_VERSION) $(libsqlite3.SO).0.8.6 || exit $$?; \ ls -la $(libsqlite3.SO).0.8.6; \ - fi + fi; \ + fi + install-so-0 install-so-: install-so: install-so-$(ENABLE_LIB_SHARED) install: install-so diff --git a/autoconf/auto.def b/autoconf/auto.def index 12eb3d75c3..72f50094b8 100644 --- a/autoconf/auto.def +++ b/autoconf/auto.def @@ -94,5 +94,4 @@ sqlite-handle-icu define ENABLE_LIB_SHARED [opt-bool shared] define ENABLE_LIB_STATIC [opt-bool static] -sqlite-process-dot-in-files -sqlite-post-config-validation +sqlite-common-late-stage-config diff --git a/autosetup/jimsh0.c b/autosetup/jimsh0.c index 4b9cf3eebf..0526b9a446 100644 --- a/autosetup/jimsh0.c +++ b/autosetup/jimsh0.c @@ -75,9 +75,6 @@ extern "C" { #if defined(_WIN32) || defined(WIN32) -#ifndef STDIN_FILENO -#define STDIN_FILENO 0 -#endif #define HAVE_DLOPEN void *dlopen(const char *path, int mode); int dlclose(void *handle); @@ -1201,6 +1198,11 @@ int Jim_OpenForRead(const char *filename); #define Jim_FileStat _fstat64 #define Jim_Lseek _lseeki64 #define O_TEXT _O_TEXT + #define O_BINARY _O_BINARY + #define Jim_SetMode _setmode + #ifndef STDIN_FILENO + #define STDIN_FILENO 0 + #endif #else #if defined(HAVE_STAT64) @@ -2941,22 +2943,22 @@ static int aio_cmd_buffering(Jim_Interp *interp, int argc, Jim_Obj *const *argv) static int aio_cmd_translation(Jim_Interp *interp, int argc, Jim_Obj *const *argv) { - enum {OPT_BINARY, OPT_TEXT}; + enum {OPT_BINARY, OPT_TEXT}; static const char * const options[] = { "binary", "text", NULL }; - int opt; + int opt; - if (Jim_GetEnum(interp, argv[0], options, &opt, NULL, JIM_ERRMSG) != JIM_OK) { - return JIM_ERR; - } -#if defined(_setmode) && defined(O_BINARY) - else { - AioFile *af = Jim_CmdPrivData(interp); - _setmode(af->fh, opt == OPT_BINARY ? O_BINARY : O_TEXT); - } + if (Jim_GetEnum(interp, argv[0], options, &opt, NULL, JIM_ERRMSG) != JIM_OK) { + return JIM_ERR; + } +#if defined(Jim_SetMode) + else { + AioFile *af = Jim_CmdPrivData(interp); + Jim_SetMode(af->fd, opt == OPT_BINARY ? O_BINARY : O_TEXT); + } #endif return JIM_OK; } @@ -24374,10 +24376,6 @@ int Jim_InteractivePrompt(Jim_Interp *interp) #include -#ifdef HAVE_UNISTD_H -#include -#endif - extern int Jim_initjimshInit(Jim_Interp *interp); diff --git a/autosetup/sqlite-config.tcl b/autosetup/sqlite-config.tcl index 9f300e317d..cabb32aac0 100644 --- a/autosetup/sqlite-config.tcl +++ b/autosetup/sqlite-config.tcl @@ -43,7 +43,10 @@ set sqliteConfig(is-cross-compiling) [proj-is-cross-compiling] ######################################################################## # Runs some common initialization which must happen immediately after -# autosetup's [options] function is called. +# autosetup's [options] function is called. This is also a convenient +# place to put some generic pieces common to both the canonical +# top-level build and the "autoconf" build, but it's not intended to +# be a catch-all dumping ground for such. proc sqlite-post-options-init {} { # # Carry values from hidden --flag aliases over to their canonical @@ -861,6 +864,47 @@ proc sqlite-handle-math {} { } } +######################################################################## +# If this OS looks like a Mac, checks for the Mac-specific +# -current_version and -compatibility_version linker flags. Defines +# LDFLAGS_MAC_CVERSION to an empty string and returns 0 if they're not +# supported, else defines that to the linker flags and returns 1. +# +# We don't check this on non-Macs because this whole thing is a +# libtool compatibility kludge to account for a version stamp which +# libtool applied only on Mac platforms. +# +# Based on https://sqlite.org/forum/forumpost/9dfd5b8fd525a5d7. +proc sqlite-check-mac-cversion {} { + define LDFLAGS_MAC_CVERSION "" + set rc 0 + if {[proj-looks-like-mac]} { + cc-with {} { + # These version numbers are historical libtool-defined values, not + # library-defined ones + if {[cc-check-flags "-Wl,-current_version,9.6.0"] + && [cc-check-flags "-Wl,-compatibility_version,9.0.0"]} { + define LDFLAGS_MAC_CVERSION "-Wl,-compatibility_version,9.0.0 -Wl,-current_version,9.6.0" + set rc 1 + } elseif {[cc-check-flags "-compatibility_version 9.0.0"] + && [cc-check-flags "-current_version 9.6.0"]} { + define LDFLAGS_MAC_CVERSION "-compatibility_version 9.0.0 -current_version 9.6.0" + set rc 1 + } + } + } + return $rc +} + +######################################################################## +# Performs late-stage config steps common to both the canonical and +# autoconf bundle builds. +proc sqlite-common-late-stage-config {} { + sqlite-check-mac-cversion + sqlite-process-dot-in-files + sqlite-post-config-validation +} + ######################################################################## # Perform some late-stage work and generate the configure-process # output file(s). diff --git a/main.mk b/main.mk index 00632a5d5c..38d1ba5f56 100644 --- a/main.mk +++ b/main.mk @@ -166,6 +166,7 @@ LDFLAGS.shlib ?= -shared LDFLAGS.icu ?= # -licui18n -licuuc -licudata CFLAGS.icu ?= LDFLAGS.libsqlite3.soname ?= # see https://sqlite.org/src/forumpost/5a3b44f510df8ded +LDFLAGS.libsqlite3.os-specific ?= # see https://sqlite.org/forum/forumpost/9dfd5b8fd525a5d7 # libreadline (or a workalike): # To activate readline in the shell: SHELL_OPT = -DHAVE_READLINE=1 LDFLAGS.readline ?= -lreadline # these vary across platforms @@ -1411,7 +1412,7 @@ all: lib # $(libsqlite3.SO): $(LIBOBJ) $(T.link.shared) -o $@ $(LIBOBJ) $(LDFLAGS.libsqlite3) \ - $(LDFLAGS.libsqlite3.soname) + $(LDFLAGS.libsqlite3.os-specific) $(LDFLAGS.libsqlite3.soname) $(libsqlite3.SO)-1: $(libsqlite3.SO) $(libsqlite3.SO)-0 $(libsqlite3.SO)-: so: $(libsqlite3.SO)-$(ENABLE_SHARED) @@ -1429,6 +1430,9 @@ all: so # unnecessary unless we want to set SONAME to libsqlite3.so.3, which # is also unnecessary. # +# N.B. different transformations are applied on systems where $(T.dll) +# is ".dylib" and none of the following docs apply on such systems. +# # The link named libsqlite3.so.0 is provided in an attempt to reduce # downstream disruption when performing upgrades from pre-3.48 to a # version 3.48 or higher. That name is considered a legacy remnant @@ -1465,8 +1469,16 @@ all: so # install-so-1: $(install-dir.lib) $(libsqlite3.SO) $(INSTALL) $(libsqlite3.SO) "$(install-dir.lib)" - @echo "Setting up $(libsqlite3.SO) symlinks..."; \ - cd "$(install-dir.lib)" || exit $$?; \ + @echo "Setting up $(libsqlite3.SO) version symlinks..."; \ + cd "$(install-dir.lib)" || exit $$?; \ + if [ x.dylib = x$(T.dll) ]; then \ + rm -f libsqlite3.0$(T.dll) libsqlite3.$(PACKAGE_VERSION)$(T.dll) || exit $$?; \ + dllname=libsqlite3.$(PACKAGE_VERSION)$(T.dll); \ + mv $(libsqlite3.SO) $$dllname || exit $$?; \ + ln -s $$dllname $(libsqlite3.SO) || exit $$?; \ + ln -s $$dllname libsqlite3.0$(T.dll) || exit $$?; \ + ls -la $$dllname $(libsqlite3.SO) libsqlite3.0$(T.dll); \ + else \ rm -f $(libsqlite3.SO).0 $(libsqlite3.SO).$(PACKAGE_VERSION) || exit $$?; \ mv $(libsqlite3.SO) $(libsqlite3.SO).$(PACKAGE_VERSION) || exit $$?; \ ln -s $(libsqlite3.SO).$(PACKAGE_VERSION) $(libsqlite3.SO) || exit $$?; \ @@ -1482,7 +1494,8 @@ install-so-1: $(install-dir.lib) $(libsqlite3.SO) rm -f libsqlite3.la $(libsqlite3.SO).0.8.6 || exit $$?; \ ln -s $(libsqlite3.SO).$(PACKAGE_VERSION) $(libsqlite3.SO).0.8.6 || exit $$?; \ ls -la $(libsqlite3.SO).0.8.6; \ - fi + fi; \ + fi install-so-0 install-so-: install-so: install-so-$(ENABLE_SHARED) install: install-so diff --git a/manifest b/manifest index 57aee4069f..09675a6203 100644 --- a/manifest +++ b/manifest @@ -1,9 +1,9 @@ -C Reduce\sthe\samount\sof\smemset()\sneeded\sto\sinitialize\sthe\sParse\sobject. -D 2025-02-07T13:37:15.659 +C Mac-specific\sbuild\sfixes\sdiscussed\sin\s[forum:9dfd5b8fd525a5d7|forum\sthread\s9dfd5b8fd525a5d7]:\srename\sdylib\slinks\sand\sadd\slegacy-compatibility\sversioning\sstamps\sto\slibsqlite3.dylib. +D 2025-02-07T14:44:31.113 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d -F Makefile.in 38485d15d9190cdad0d7bee25af7b442028865964025dcc61f40fd8d6e369cfc +F Makefile.in 85ed87882b5d3fd11e6403212f2120e5e07d341bc96a101cfa9475901edd0754 F Makefile.linux-generic bd3e3cacd369821a6241d4ea1967395c962dfe3057e38cb0a435cee0e8b789d0 F Makefile.msc a9b95ae9807e17f9b0734ebe97d68032141c3f95286bb64593cb73b206f043cf F README.md c3c0f19532ce28f6297a71870f3c7b424729f0e6d9ab889616d3587dd2332159 @@ -14,13 +14,13 @@ F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90 F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2 F art/sqlite370.svg 40b7e2fe8aac3add5d56dd86ab8d427a4eca5bcb3fe4f8946cb3794e1821d531 -F auto.def e7e92090c98aeb0174d29988c259834eb1b71ae1ea927015c3ef300f6f9b68ae +F auto.def fdd6965e06bce02a8b9f9ed57a52d05bcbec4b56e4bef2174866bb5713c65fda F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac -F autoconf/Makefile.in 1748696041b706722fcc2289630aec596e556e10677914ec1dd5de9c627324fa +F autoconf/Makefile.in be23c54eef87e6a64d875f96f6cf60a871219c50b04a955ebbd1aac48b4c738e F autoconf/Makefile.msc 0a071367537dc395285a5d624ac4f99f3a387b27cc5e89752423c0499e15aec4 F autoconf/README.first f1d3876e9a7852c22f275a6f06814e64934cecbc0b5b9617d64849094c1fd136 F autoconf/README.txt 7f01dc3915e2d68f329011073662369e62a0938a2c69398807823c57591cb288 -F autoconf/auto.def 23bc095a3890c0ca334abf7ef67d1c8af4c22c12832bcc738015e868d54fe9d7 +F autoconf/auto.def 71dde17158afcd6fb097b66853371991bb6ca5517b034e2efa9f0c47a2e730f2 F autoconf/tea/Makefile.in ba0556fee8da09c066bad85a4457904e46ee2c2eabaa309c0e83a78f2f151a8e F autoconf/tea/README.txt 61e62e519579e4a112791354d6d440f8b51ea6db3b0bab58d59f29df42d2dfe3 F autoconf/tea/aclocal.m4 52c47aac44ce0ddb1f918b6993e8beb8eee88f43 @@ -47,10 +47,10 @@ F autosetup/cc-db.tcl 6e0ed90146197a5a05b245e649975c07c548e30926b218ca3e1d4dc034 F autosetup/cc-lib.tcl 493c5935b5dd3bf9bd4eca89b07c8b1b1a9356d61783035144e21795facf7360 F autosetup/cc-shared.tcl 4f024e94a47f427ba61de1739f6381ef0080210f9fae89112d5c1de1e5460d78 F autosetup/cc.tcl c0fcc50ca91deff8741e449ddad05bcd08268bc31177e613a6343bbd1fd3e45f -F autosetup/jimsh0.c 5a74bdbf43c52289e3f482f3b9578db4bd657e88e8fe04b16c564d9fb710540a +F autosetup/jimsh0.c 6573f6bc6ff204de0139692648d7037ca0b6c067bac83a7b4e087f20a86866a4 F autosetup/pkg-config.tcl 4e635bf39022ff65e0d5434339dd41503ea48fc53822c9c5bde88b02d3d952ba F autosetup/proj.tcl af5290ee128ce82dd178a474a9dcfaa7e503c88f0709d916cc6079d9b8c801f4 -F autosetup/sqlite-config.tcl 00af5b9d94d580367bf01984b86397e8d35b74090427def9591a54ded0e1a287 +F autosetup/sqlite-config.tcl f64aff26763e9ea021aabac222d43a9e0107b45f6de82972b93411fe36ef566b F autosetup/system.tcl 51d4be76cd9a9074704b584e5c9cbba616202c8468cf9ba8a4f8294a7ab1dba9 F configure 9a00b21dfd13757bbfb8d89b30660a89ec1f8f3a79402b8f9f9b6fc475c3303a x F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad @@ -702,7 +702,7 @@ F ext/wasm/tests/opfs/concurrency/test.js d08889a5bb6e61937d0b8cbb78c9efbefbf65a F ext/wasm/tests/opfs/concurrency/worker.js 0a8c1a3e6ebb38aabbee24f122693f1fb29d599948915c76906681bb7da1d3d2 F ext/wasm/wasmfs.make 68999f5bd8c489239592d59a420f8c627c99169bbd6fa16a404751f757b9f702 F magic.txt 5ade0bc977aa135e79e3faaea894d5671b26107cc91e70783aa7dc83f22f3ba0 -F main.mk 8cfe182232ac7bbc87530792db6f31c09f2a2f35e9887d0412978746efe42ea9 +F main.mk 70e140c6825aef1ac94c879db7db188be461db15d40e4d9cd9b3e444c2868e21 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 F mptest/crash01.test 61e61469e257df0850df4293d7d4d6c2af301421 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 46f51e2a3707614a2b3ca6261bc6e0e8835477fdb7cbcf2f06b20cdebde2bab9 -R 2ea5c3310ea580989e316d82762bea3d -U drh -Z 9a2383046899765f80ff4490e5ed6b3d +P 284538d8486ef3e9bee1ab980043b53c144743c31b984be13a5cc137e7cbec31 +R a5275e98c179fe183ddd026b19c342d8 +U stephan +Z 6ccb26b8380cae53c605eba31ac4066e # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 7872bfc017..43c7b78aae 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -284538d8486ef3e9bee1ab980043b53c144743c31b984be13a5cc137e7cbec31 +668bcf327a82a63d45be8cf38fdddc855dbcefdedf6c208e091eb7e2d244929d From 7fd936e5ed08c3bae9207c092a22a5c98520a3cb Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 7 Feb 2025 15:49:21 +0000 Subject: [PATCH 193/220] Further reduction in the amount of memset() needed to initialize the Parse object. FossilOrigin-Name: 45e462c0060e51c3375a226d636148e3415ee6020e544ecc84861c7aef4ecf7b --- manifest | 24 ++++++++++++------------ manifest.uuid | 2 +- src/analyze.c | 3 ++- src/build.c | 45 ++++++++++++++++++++++++++++----------------- src/parse.y | 23 +++++++++++++++++++---- src/sqliteInt.h | 20 +++++++++++++------- src/trigger.c | 6 ++++-- src/vtab.c | 5 +++-- 8 files changed, 82 insertions(+), 46 deletions(-) diff --git a/manifest b/manifest index 09675a6203..aa76df4c1f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Mac-specific\sbuild\sfixes\sdiscussed\sin\s[forum:9dfd5b8fd525a5d7|forum\sthread\s9dfd5b8fd525a5d7]:\srename\sdylib\slinks\sand\sadd\slegacy-compatibility\sversioning\sstamps\sto\slibsqlite3.dylib. -D 2025-02-07T14:44:31.113 +C Further\sreduction\sin\sthe\samount\sof\smemset()\sneeded\sto\sinitialize\sthe\sParse\nobject. +D 2025-02-07T15:49:21.109 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -713,7 +713,7 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 acdff36db796e2d00225b911d3047d580cd136547298435426ce9d40347973cc F sqlite3.pc.in 0977c03a4da7c4204bd60e784a0efb8d51a190448aba78a4e973fe7192bdaf03 F src/alter.c aa93e37e4a36a0525bbb2a2aeda20d2018f0aa995542c7dc658e031375e3f532 -F src/analyze.c 9a8b67239d899ac12289db5db3f5bfe7f7a0ad1277f80f87ead1d048085876eb +F src/analyze.c 0823d2edb3ce564157e9d62714cc729027933209b712e95fbabb23e47fff0aec F src/attach.c 3a5cb9ee4aad6c5b22268287340a4f2f7b07959b7a522201be30fee23cd802e9 F src/auth.c 54ab9c6c5803b47c0d45b76ce27eff22a03b4b1f767c5945a3a4eb13aa4c78dc F src/backup.c 5c97e8023aab1ce14a42387eb3ae00ba5a0644569e3476f38661fa6f824c3523 @@ -722,7 +722,7 @@ F src/btmutex.c 79a43670447eacc651519a429f6ece9fd638563cf95b469d6891185ddae2b522 F src/btree.c 63ca6b647342e8cef643863cd0962a542f133e1069460725ba4461dcda92b03c F src/btree.h 18e5e7b2124c23426a283523e5f31a4bff029131b795bb82391f9d2f3136fc50 F src/btreeInt.h 98aadb6dcb77b012cab2574d6a728fad56b337fc946839b9898c4b4c969e30b6 -F src/build.c 357f98cdd9fe93f86e93ad3324fd224492480e48506c0c7db8ae3a94f3b5c5ee +F src/build.c cac3aa87f3bf137e12c77194150fb05c949d36a12177fd3acccdaa3669ca9744 F src/callback.c acae8c8dddda41ee85cfdf19b926eefe830f371069f8aadca3aa39adf5b1c859 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c d35723024b963edce9c0fad5b3303e8bb9266083784844baed10a6dedfe26f3b @@ -769,7 +769,7 @@ F src/os_win.c 49c7725b500f5867e8360e75eeb30f9d70b62fa1f05c8a101da627210578df32 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 3a1c4e7f69af482e33c8cba8a75afe0dda0ea6391240adac22b040ce1bdeef44 F src/pager.h 6137149346e6c8a3ddc1eeb40aee46381e9bc8b0fcc6dda8a1efde993c2275b8 -F src/parse.y 5dce477d23c6cd41da97ff9bc4ef93fba0e0a0aaa72a15ddb8a3f71618d76cac +F src/parse.y f84673f1454e2bcf517623d4346e67fb2d73e57826ea103681ad5848238f6029 F src/pcache.c 588cc3c5ccaaadde689ed35ce5c5c891a1f7b1f4d1f56f6cf0143b74d8ee6484 F src/pcache.h 1497ce1b823cf00094bb0cf3bac37b345937e6f910890c626b16512316d3abf5 F src/pcache1.c 49516ad7718a3626f28f710fa7448ef1fce3c07fd169acbb4817341950264319 @@ -785,7 +785,7 @@ F src/shell.c.in b377a59822f207106424f08aead37e78b609222e98f86f04cc8a03563ccf323 F src/sqlite.h.in d2902f13ace94d3d3609646bd6d12a2d7a4f6cbdf6a5a4097580ac305f54c3f0 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54 -F src/sqliteInt.h d85806d6d66210ddf8b14158c6301608ca6abfa952b5a8e57c9852926a4c9728 +F src/sqliteInt.h 51f674754f9424d8ec67c3955d1d161d8b31f30d54dd7032408e08ddc9199236 F src/sqliteLimit.h 1bbdbf72bd0411d003267ffebc59a262f061df5653027a75627d03f48ca30523 F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -843,7 +843,7 @@ F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c 375a772e2342274f4bf73605a70633237da09deed00a9bf4c4816a56777ea7c9 F src/treeview.c d85ce76e6d1498d781957c07cb234da6d77ce0ed2d196480d516f54dabc62279 -F src/trigger.c 9f887ae4d3077d9de67d312e1da12f57e8b3a598468876bb3b8ccc6c1bca2eb1 +F src/trigger.c da3c25786870d8bf97cd46b493374c2375d1abaf20a9b0f5f8629a3f2f2ce383 F src/update.c 0e01aa6a3edf9ec112b33eb714b9016a81241497b1fb7c3e74332f4f71756508 F src/upsert.c 215328c3f91623c520ec8672c44323553f12caeb4f01b1090ebdca99fdf7b4f1 F src/utf.c 8b29d9a5956569ea2700f869669b8ef67a9662ee5e724ff77ab3c387e27094ba @@ -859,7 +859,7 @@ F src/vdbemem.c 977438546df236c6a3e7d8b4fe86c0643c13b89b00235db1f11c3a91a4796d30 F src/vdbesort.c d0a3c7056c081703c8b6d91ad60f17da5e062a5c64bf568ed0fa1b5f4cae311f F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823 F src/vdbevtab.c fc46b9cbd759dc013f0b3724549cc0d71379183c667df3a5988f7e2f1bd485f3 -F src/vtab.c bd4ab699ac4d1ee6da7339d3fbbb5edf23d9737c1fd322ccd75984329d070472 +F src/vtab.c 828221bdbeaaa6d62126ee6d07fd4ec0d09dcaea846f87ad01944d8b7e548859 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 4e6181d8780ab0af2e1388d0754cbe6f2f04593d2b1ab6c41699a89942fd8997 F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 284538d8486ef3e9bee1ab980043b53c144743c31b984be13a5cc137e7cbec31 -R a5275e98c179fe183ddd026b19c342d8 -U stephan -Z 6ccb26b8380cae53c605eba31ac4066e +P 668bcf327a82a63d45be8cf38fdddc855dbcefdedf6c208e091eb7e2d244929d +R 24656f83648801915afdc285804c022a +U drh +Z 40d028d63f40c912276ee2b133ee3ab3 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 43c7b78aae..8fe517c65e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -668bcf327a82a63d45be8cf38fdddc855dbcefdedf6c208e091eb7e2d244929d +45e462c0060e51c3375a226d636148e3415ee6020e544ecc84861c7aef4ecf7b diff --git a/src/analyze.c b/src/analyze.c index 9213c202b7..799d43924c 100644 --- a/src/analyze.c +++ b/src/analyze.c @@ -215,7 +215,8 @@ static void openStatTable( sqlite3NestedParse(pParse, "CREATE TABLE %Q.%s(%s)", pDb->zDbSName, zTab, aTable[i].zCols ); - aRoot[i] = (u32)pParse->regRoot; + assert( pParse->isCreate || pParse->nErr ); + aRoot[i] = (u32)pParse->u1.cr.regRoot; aCreateTbl[i] = OPFLAG_P2ISREG; } }else{ diff --git a/src/build.c b/src/build.c index cc29610e0a..986107f48d 100644 --- a/src/build.c +++ b/src/build.c @@ -168,10 +168,12 @@ void sqlite3FinishCoding(Parse *pParse){ || sqlite3VdbeAssertMayAbort(v, pParse->mayAbort)); if( v ){ if( pParse->bReturning ){ - Returning *pReturning = pParse->u1.pReturning; + Returning *pReturning; int addrRewind; int reg; + assert( !pParse->isCreate ); + pReturning = pParse->u1.d.pReturning; if( pReturning->nRetCol ){ sqlite3VdbeAddOp0(v, OP_FkCheck); addrRewind = @@ -247,7 +249,9 @@ void sqlite3FinishCoding(Parse *pParse){ } if( pParse->bReturning ){ - Returning *pRet = pParse->u1.pReturning; + Returning *pRet; + assert( !pParse->isCreate ); + pRet = pParse->u1.d.pReturning; if( pRet->nRetCol ){ sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pRet->iRetCur, pRet->nRetCol); } @@ -1319,8 +1323,9 @@ void sqlite3StartTable( /* If the file format and encoding in the database have not been set, ** set them now. */ - reg1 = pParse->regRowid = ++pParse->nMem; - reg2 = pParse->regRoot = ++pParse->nMem; + assert( pParse->isCreate ); + reg1 = pParse->u1.cr.regRowid = ++pParse->nMem; + reg2 = pParse->u1.cr.regRoot = ++pParse->nMem; reg3 = ++pParse->nMem; sqlite3VdbeAddOp3(v, OP_ReadCookie, iDb, reg3, BTREE_FILE_FORMAT); sqlite3VdbeUsesBtree(v, iDb); @@ -1335,8 +1340,8 @@ void sqlite3StartTable( ** The record created does not contain anything yet. It will be replaced ** by the real entry in code generated at sqlite3EndTable(). ** - ** The rowid for the new entry is left in register pParse->regRowid. - ** The root page number of the new table is left in reg pParse->regRoot. + ** The rowid for the new entry is left in register pParse->u1.cr.regRowid. + ** The root page of the new table is left in reg pParse->u1.cr.regRoot. ** The rowid and root page number values are needed by the code that ** sqlite3EndTable will generate. */ @@ -1347,7 +1352,7 @@ void sqlite3StartTable( #endif { assert( !pParse->bReturning ); - pParse->u1.addrCrTab = + pParse->u1.cr.addrCrTab = sqlite3VdbeAddOp3(v, OP_CreateBtree, iDb, reg2, BTREE_INTKEY); } sqlite3OpenSchemaTable(pParse, iDb); @@ -1425,7 +1430,8 @@ void sqlite3AddReturning(Parse *pParse, ExprList *pList){ sqlite3ExprListDelete(db, pList); return; } - pParse->u1.pReturning = pRet; + assert( !pParse->isCreate ); + pParse->u1.d.pReturning = pRet; pRet->pParse = pParse; pRet->pReturnEL = pList; sqlite3ParserAddCleanup(pParse, sqlite3DeleteReturning, pRet); @@ -1564,7 +1570,8 @@ void sqlite3AddColumn(Parse *pParse, Token sName, Token sType){ } p->nCol++; p->nNVCol++; - pParse->constraintName.n = 0; + assert( pParse->isCreate ); + pParse->u1.cr.constraintName.n = 0; } /* @@ -1888,8 +1895,10 @@ void sqlite3AddCheckConstraint( && !sqlite3BtreeIsReadonly(db->aDb[db->init.iDb].pBt) ){ pTab->pCheck = sqlite3ExprListAppend(pParse, pTab->pCheck, pCheckExpr); - if( pParse->constraintName.n ){ - sqlite3ExprListSetName(pParse, pTab->pCheck, &pParse->constraintName, 1); + assert( pParse->isCreate ); + if( pParse->u1.cr.constraintName.n ){ + sqlite3ExprListSetName(pParse, pTab->pCheck, + &pParse->u1.cr.constraintName, 1); }else{ Token t; for(zStart++; sqlite3Isspace(zStart[0]); zStart++){} @@ -2339,9 +2348,9 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ ** into BTREE_BLOBKEY. */ assert( !pParse->bReturning ); - if( pParse->u1.addrCrTab ){ + if( pParse->u1.cr.addrCrTab ){ assert( v ); - sqlite3VdbeChangeP3(v, pParse->u1.addrCrTab, BTREE_BLOBKEY); + sqlite3VdbeChangeP3(v, pParse->u1.cr.addrCrTab, BTREE_BLOBKEY); } /* Locate the PRIMARY KEY index. Or, if this table was originally @@ -2781,7 +2790,7 @@ void sqlite3EndTable( /* If this is a CREATE TABLE xx AS SELECT ..., execute the SELECT ** statement to populate the new table. The root-page number for the - ** new table is in register pParse->regRoot. + ** new table is in register pParse->u1.cr.regRoot. ** ** Once the SELECT has been coded by sqlite3Select(), it is in a ** suitable state to query for the column names and types to be used @@ -2812,7 +2821,8 @@ void sqlite3EndTable( regRec = ++pParse->nMem; regRowid = ++pParse->nMem; sqlite3MayAbort(pParse); - sqlite3VdbeAddOp3(v, OP_OpenWrite, iCsr, pParse->regRoot, iDb); + assert( pParse->isCreate ); + sqlite3VdbeAddOp3(v, OP_OpenWrite, iCsr, pParse->u1.cr.regRoot, iDb); sqlite3VdbeChangeP5(v, OPFLAG_P2ISREG); addrTop = sqlite3VdbeCurrentAddr(v) + 1; sqlite3VdbeAddOp3(v, OP_InitCoroutine, regYield, 0, addrTop); @@ -2857,6 +2867,7 @@ void sqlite3EndTable( ** schema table. We just need to update that slot with all ** the information we've collected. */ + assert( pParse->isCreate ); sqlite3NestedParse(pParse, "UPDATE %Q." LEGACY_SCHEMA_TABLE " SET type='%s', name=%Q, tbl_name=%Q, rootpage=#%d, sql=%Q" @@ -2865,9 +2876,9 @@ void sqlite3EndTable( zType, p->zName, p->zName, - pParse->regRoot, + pParse->u1.cr.regRoot, zStmt, - pParse->regRowid + pParse->u1.cr.regRowid ); sqlite3DbFree(db, zStmt); sqlite3ChangeCookie(pParse, iDb); diff --git a/src/parse.y b/src/parse.y index e9e2c62e61..76c9a8e4ed 100644 --- a/src/parse.y +++ b/src/parse.y @@ -62,6 +62,11 @@ %include { #include "sqliteInt.h" +/* +** Verify that the pParse->isCreate field is set +*/ +#define ASSERT_IS_CREATE assert(pParse->isCreate) + /* ** Disable all error recovery processing in the parser push-down ** automaton. @@ -125,6 +130,10 @@ static void parserSyntaxError(Parse *pParse, Token *p){ static void disableLookaside(Parse *pParse){ sqlite3 *db = pParse->db; pParse->disableLookaside++; +#ifdef SQLITE_DEBUG + pParse->isCreate = 1; +#endif + memset(&pParse->u1.cr, 0, sizeof(pParse->u1.cr)); DisableLookaside; } @@ -197,7 +206,9 @@ cmd ::= create_table create_table_args. create_table ::= createkw temp(T) TABLE ifnotexists(E) nm(Y) dbnm(Z). { sqlite3StartTable(pParse,&Y,&Z,T,0,0,E); } -createkw(A) ::= CREATE(A). {disableLookaside(pParse);} +createkw(A) ::= CREATE(A). { + disableLookaside(pParse); +} %type ifnotexists {int} ifnotexists(A) ::= . {A = 0;} @@ -373,7 +384,7 @@ scantok(A) ::= . { // carglist ::= carglist ccons. carglist ::= . -ccons ::= CONSTRAINT nm(X). {pParse->constraintName = X;} +ccons ::= CONSTRAINT nm(X). {ASSERT_IS_CREATE; pParse->u1.cr.constraintName = X;} ccons ::= DEFAULT scantok(A) term(X). {sqlite3AddDefaultValue(pParse,X,A.z,&A.z[A.n]);} ccons ::= DEFAULT LP(A) expr(X) RP(Z). @@ -448,9 +459,9 @@ conslist_opt(A) ::= . {A.n = 0; A.z = 0;} conslist_opt(A) ::= COMMA(A) conslist. conslist ::= conslist tconscomma tcons. conslist ::= tcons. -tconscomma ::= COMMA. {pParse->constraintName.n = 0;} +tconscomma ::= COMMA. {ASSERT_IS_CREATE; pParse->u1.cr.constraintName.n = 0;} tconscomma ::= . -tcons ::= CONSTRAINT nm(X). {pParse->constraintName = X;} +tcons ::= CONSTRAINT nm(X). {ASSERT_IS_CREATE; pParse->u1.cr.constraintName = X;} tcons ::= PRIMARY KEY LP sortlist(X) autoinc(I) RP onconf(R). {sqlite3AddPrimaryKey(pParse,X,R,I,0);} tcons ::= UNIQUE LP sortlist(X) RP onconf(R). @@ -1659,6 +1670,10 @@ trigger_decl(A) ::= temp(T) TRIGGER ifnotexists(NOERR) nm(B) dbnm(Z) ON fullname(E) foreach_clause when_clause(G). { sqlite3BeginTrigger(pParse, &B, &Z, C, D.a, D.b, E, G, T, NOERR); A = (Z.n==0?B:Z); /*A-overwrites-T*/ +#ifdef SQLITE_DEBUG + assert( pParse->isCreate ); /* Set by createkw reduce action */ + pParse->isCreate = 0; /* But, should not be set for CREATE TRIGGER */ +#endif } %type trigger_time {int} diff --git a/src/sqliteInt.h b/src/sqliteInt.h index bbef593dfa..acc36f07c0 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3841,6 +3841,8 @@ struct Parse { #endif #ifdef SQLITE_DEBUG u8 ifNotExists; /* Might be true if IF NOT EXISTS. Assert()s only */ + u8 isCreate; /* CREATE TABLE, INDEX, or VIEW (but not TRIGGER) + ** and ALTER TABLE ADD COLUMN. */ #endif int nRangeReg; /* Size of the temporary register block */ int iRangeReg; /* First register in temporary register block */ @@ -3856,11 +3858,8 @@ struct Parse { ExprList *pConstExpr;/* Constant expressions */ IndexedExpr *pIdxEpr;/* List of expressions used by active indexes */ IndexedExpr *pIdxPartExpr; /* Exprs constrained by index WHERE clauses */ - Token constraintName;/* Name of the constraint currently being parsed */ yDbMask writeMask; /* Start a write transaction on these databases */ yDbMask cookieMask; /* Bitmask of schema verified databases */ - int regRowid; /* Register holding rowid of CREATE TABLE entry */ - int regRoot; /* Register holding root page number for new objects */ int nMaxArg; /* Max args passed to user function by sub-program */ int nSelect; /* Number of SELECT stmts. Counter for Select.selId */ #ifndef SQLITE_OMIT_PROGRESS_CALLBACK @@ -3875,10 +3874,6 @@ struct Parse { Table *pTriggerTab; /* Table triggers are being coded for */ TriggerPrg *pTriggerPrg; /* Linked list of coded triggers */ ParseCleanup *pCleanup; /* List of cleanup operations to run after parse */ - union { - int addrCrTab; /* Address of OP_CreateBtree on CREATE TABLE */ - Returning *pReturning; /* The RETURNING clause */ - } u1; LogEst nQueryLoop; /* Est number of iterations of a query (10*log2(N)) */ u8 eTriggerOp; /* TK_UPDATE, TK_INSERT or TK_DELETE */ u8 bReturning; /* Coding a RETURNING trigger */ @@ -3897,6 +3892,17 @@ struct Parse { Token sNameToken; /* Token with unqualified schema object name */ u32 oldmask; /* Mask of old.* columns referenced */ u32 newmask; /* Mask of new.* columns referenced */ + union { + struct { /* These fields available when isCreate is true */ + int addrCrTab; /* Address of OP_CreateBtree on CREATE TABLE */ + int regRowid; /* Register holding rowid of CREATE TABLE entry */ + int regRoot; /* Register holding root page for new objects */ + Token constraintName; /* Name of the constraint currently being parsed */ + } cr; + struct { /* These fields available to all other statements */ + Returning *pReturning; /* The RETURNING clause */ + } d; + } u1; /************************************************************************ ** Above is constant between recursions. Below is reset before and after diff --git a/src/trigger.c b/src/trigger.c index e7b75d344a..604c3ab42f 100644 --- a/src/trigger.c +++ b/src/trigger.c @@ -70,7 +70,8 @@ Trigger *sqlite3TriggerList(Parse *pParse, Table *pTab){ assert( pParse->db->pVtabCtx==0 ); #endif assert( pParse->bReturning ); - assert( &(pParse->u1.pReturning->retTrig) == pTrig ); + assert( !pParse->isCreate ); + assert( &(pParse->u1.d.pReturning->retTrig) == pTrig ); pTrig->table = pTab->zName; pTrig->pTabSchema = pTab->pSchema; pTrig->pNext = pList; @@ -1047,7 +1048,8 @@ static void codeReturningTrigger( return; } assert( db->pParse==pParse ); - pReturning = pParse->u1.pReturning; + assert( !pParse->isCreate ); + pReturning = pParse->u1.d.pReturning; if( pTrigger != &(pReturning->retTrig) ){ /* This RETURNING trigger is for a different statement */ return; diff --git a/src/vtab.c b/src/vtab.c index 09f0c2d7f1..e40f60873a 100644 --- a/src/vtab.c +++ b/src/vtab.c @@ -479,11 +479,12 @@ void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){ ** 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 + ** The VM register number pParse->u1.cr.regRowid holds the rowid of an ** entry in the sqlite_schema table that was created for this vtab ** by sqlite3StartTable(). */ iDb = sqlite3SchemaToIndex(db, pTab->pSchema); + assert( pParse->isCreate ); sqlite3NestedParse(pParse, "UPDATE %Q." LEGACY_SCHEMA_TABLE " " "SET type='table', name=%Q, tbl_name=%Q, rootpage=0, sql=%Q " @@ -492,7 +493,7 @@ void sqlite3VtabFinishParse(Parse *pParse, Token *pEnd){ pTab->zName, pTab->zName, zStmt, - pParse->regRowid + pParse->u1.cr.regRowid ); v = sqlite3GetVdbe(pParse); sqlite3ChangeCookie(pParse, iDb); From 84b0f221f4e92139077d8246cc373e8264224a97 Mon Sep 17 00:00:00 2001 From: drh <> Date: Fri, 7 Feb 2025 19:09:20 +0000 Subject: [PATCH 194/220] Fix comments on the Parse.nMaxArgs field so that they are correct. Add assert()s to ensure they are correct. Other Parse changes to reduce the amount of memset() needed to initialize it. FossilOrigin-Name: c56092507c96723030589ddd9121bc993d615a7acd453305fc3b1dbb9e30554c --- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- src/sqliteInt.h | 20 ++++++++++---------- src/vdbe.c | 2 ++ src/vdbeInt.h | 3 ++- src/vdbeaux.c | 23 +++++++++++++++-------- src/wherecode.c | 3 +++ 7 files changed, 43 insertions(+), 30 deletions(-) diff --git a/manifest b/manifest index aa76df4c1f..23bd8c8395 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Further\sreduction\sin\sthe\samount\sof\smemset()\sneeded\sto\sinitialize\sthe\sParse\nobject. -D 2025-02-07T15:49:21.109 +C Fix\scomments\son\sthe\sParse.nMaxArgs\sfield\sso\sthat\sthey\sare\scorrect.\s\sAdd\nassert()s\sto\sensure\sthey\sare\scorrect.\s\sOther\sParse\schanges\sto\sreduce\sthe\namount\sof\smemset()\sneeded\sto\sinitialize\sit. +D 2025-02-07T19:09:20.404 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -785,7 +785,7 @@ F src/shell.c.in b377a59822f207106424f08aead37e78b609222e98f86f04cc8a03563ccf323 F src/sqlite.h.in d2902f13ace94d3d3609646bd6d12a2d7a4f6cbdf6a5a4097580ac305f54c3f0 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54 -F src/sqliteInt.h 51f674754f9424d8ec67c3955d1d161d8b31f30d54dd7032408e08ddc9199236 +F src/sqliteInt.h f576f21641e8667779424003e552e79a3d3c7e824421f954ef73fce44040581c F src/sqliteLimit.h 1bbdbf72bd0411d003267ffebc59a262f061df5653027a75627d03f48ca30523 F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -849,11 +849,11 @@ F src/upsert.c 215328c3f91623c520ec8672c44323553f12caeb4f01b1090ebdca99fdf7b4f1 F src/utf.c 8b29d9a5956569ea2700f869669b8ef67a9662ee5e724ff77ab3c387e27094ba F src/util.c e5f6a5eeaa26b69054a43bbd0048cfe3d2851f6961052b35aed8f695df922850 F src/vacuum.c b763b6457bd058d2072ef9364832351fd8d11e8abf70cbb349657360f7d55c40 -F src/vdbe.c b428a751953c0c2ff85e3e152ec16e29d488895cd541c8c20876ff9f3bf6978a +F src/vdbe.c b98d86de7f0e6c02fb14e0e1ae8feab6aa84669d389771a848e23f59eb70dcad F src/vdbe.h 3d26d5c7660c5c7bd33ffb0d8784615072d8b23c81f8110870efe2631136bc89 -F src/vdbeInt.h 895b1ab7536f018d3d70d690f6c0adbd1062b6dddce1c2cad912927856d4033c +F src/vdbeInt.h 7abc3ce9732fd487ee2544b478ac0526dca443d6d470fc34784d3122d378cf3e F src/vdbeapi.c 82fe278a7c71b653235c6f9fb5de0b5de589908dfcb011ba2a782e8becf06f86 -F src/vdbeaux.c 885e16100597507fbbe09d82cbb963bff3fd8a9c1e358dc4f463fc95feb18e8b +F src/vdbeaux.c 541d3d232714455960eab4ed10b34cb48b4bcd565d7539ef31092f5e73648e6b F src/vdbeblob.c 255be187436da38b01f276c02e6a08103489bbe2a7c6c21537b7aecbe0e1f797 F src/vdbemem.c 977438546df236c6a3e7d8b4fe86c0643c13b89b00235db1f11c3a91a4796d30 F src/vdbesort.c d0a3c7056c081703c8b6d91ad60f17da5e062a5c64bf568ed0fa1b5f4cae311f @@ -866,7 +866,7 @@ F src/wal.h ba252daaa94f889f4b2c17c027e823d9be47ce39da1d3799886bbd51f0490452 F src/walker.c d5006d6b005e4ea7302ad390957a8d41ed83faa177e412f89bc5600a7462a014 F src/where.c 09dc313e7223ca1217c39c7026b00f16ff449a8323511a762fcba7863a00f4cd F src/whereInt.h d20cddddb1d61b18d5cb1fcfa9b77fbeebbc4afe44d996e603452a23b3009ee1 -F src/wherecode.c 0c3d3199a2b769a5e2bb70feb5003dc85b3d86842ecaf903a47f2b4205ca5dab +F src/wherecode.c 5baa06f0daae7d38aca1d4814030b82ad4f127fe6bad18f0644776a474f6088b F src/whereexpr.c 2415c8eee5ff89a8b709d7d83d71c1ff986cd720d0520057e1d8a5371339012a F src/window.c 2bf01f9941a64fbcead61a0e3cb5db3fca5094b30d2ff0d23274c2a81d2e2385 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 668bcf327a82a63d45be8cf38fdddc855dbcefdedf6c208e091eb7e2d244929d -R 24656f83648801915afdc285804c022a +P 45e462c0060e51c3375a226d636148e3415ee6020e544ecc84861c7aef4ecf7b +R 07888caf6f9e73972781470e8ad03e81 U drh -Z 40d028d63f40c912276ee2b133ee3ab3 +Z 434b297f89532d0b5b94eab3e74d43a4 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 8fe517c65e..fb16c00a62 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -45e462c0060e51c3375a226d636148e3415ee6020e544ecc84861c7aef4ecf7b +c56092507c96723030589ddd9121bc993d615a7acd453305fc3b1dbb9e30554c diff --git a/src/sqliteInt.h b/src/sqliteInt.h index acc36f07c0..359ed1b6b1 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3823,19 +3823,20 @@ struct Parse { char *zErrMsg; /* An error message */ Vdbe *pVdbe; /* An engine for executing database bytecode */ int rc; /* Return code from execution */ - u8 colNamesSet; /* TRUE after OP_ColumnName has been issued to pVdbe */ - u8 checkSchema; /* Causes schema cookie check after an error */ + LogEst nQueryLoop; /* Est number of iterations of a query (10*log2(N)) */ u8 nested; /* Number of nested calls to the parser/code generator */ u8 nTempReg; /* Number of temporary registers in aTempReg[] */ u8 isMultiWrite; /* True if statement may modify/insert multiple rows */ u8 mayAbort; /* True if statement may throw an ABORT exception */ u8 hasCompound; /* Need to invoke convertCompoundSelectToSubquery() */ - u8 okConstFactor; /* OK to factor out constants */ u8 disableLookaside; /* Number of times lookaside has been disabled */ u8 prepFlags; /* SQLITE_PREPARE_* flags */ u8 withinRJSubrtn; /* Nesting level for RIGHT JOIN body subroutines */ - u8 bHasWith; /* True if statement contains WITH */ u8 mSubrtnSig; /* mini Bloom filter on available SubrtnSig.selId */ + u8 eTriggerOp; /* TK_UPDATE, TK_INSERT or TK_DELETE */ + u8 bReturning; /* Coding a RETURNING trigger */ + u8 eOrconf; /* Default ON CONFLICT policy for trigger steps */ + u8 disableTriggers; /* True to disable triggers */ #if defined(SQLITE_DEBUG) || defined(SQLITE_COVERAGE_TEST) u8 earlyCleanup; /* OOM inside sqlite3ParserAddCleanup() */ #endif @@ -3844,6 +3845,10 @@ struct Parse { u8 isCreate; /* CREATE TABLE, INDEX, or VIEW (but not TRIGGER) ** and ALTER TABLE ADD COLUMN. */ #endif + u8 colNamesSet :1; /* TRUE after OP_ColumnName has been issued to pVdbe */ + u8 bHasWith :1; /* True if statement contains WITH */ + u8 okConstFactor :1; /* OK to factor out constants */ + u8 checkSchema :1; /* Causes schema cookie check after an error */ int nRangeReg; /* Size of the temporary register block */ int iRangeReg; /* First register in temporary register block */ int nErr; /* Number of errors seen */ @@ -3860,7 +3865,7 @@ struct Parse { IndexedExpr *pIdxPartExpr; /* Exprs constrained by index WHERE clauses */ yDbMask writeMask; /* Start a write transaction on these databases */ yDbMask cookieMask; /* Bitmask of schema verified databases */ - int nMaxArg; /* Max args passed to user function by sub-program */ + int nMaxArg; /* Max args to xUpdate and xFilter vtab methods */ int nSelect; /* Number of SELECT stmts. Counter for Select.selId */ #ifndef SQLITE_OMIT_PROGRESS_CALLBACK u32 nProgressSteps; /* xProgress steps taken during sqlite3_prepare() */ @@ -3874,11 +3879,6 @@ struct Parse { Table *pTriggerTab; /* Table triggers are being coded for */ TriggerPrg *pTriggerPrg; /* Linked list of coded triggers */ ParseCleanup *pCleanup; /* List of cleanup operations to run after parse */ - LogEst nQueryLoop; /* Est number of iterations of a query (10*log2(N)) */ - u8 eTriggerOp; /* TK_UPDATE, TK_INSERT or TK_DELETE */ - u8 bReturning; /* Coding a RETURNING trigger */ - u8 eOrconf; /* Default ON CONFLICT policy for trigger steps */ - u8 disableTriggers; /* True to disable triggers */ /************************************************************************** ** Fields above must be initialized to zero. The fields that follow, diff --git a/src/vdbe.c b/src/vdbe.c index d41ac8d517..ec871c5a6e 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -8363,6 +8363,7 @@ case OP_VFilter: { /* jump, ncycle */ /* Invoke the xFilter method */ apArg = p->apArg; + assert( nArg<=p->napArg ); for(i = 0; ivtabOnConflict; apArg = p->apArg; pX = &aMem[pOp->p3]; + assert( nArg<=p->napArg ); for(i=0; ipParse; int *aLabel = pParse->aLabel; @@ -916,15 +916,19 @@ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){ } #ifndef SQLITE_OMIT_VIRTUALTABLE case OP_VUpdate: { - if( pOp->p2>nMaxArgs ) nMaxArgs = pOp->p2; + if( pOp->p2>nMaxVtabArgs ) nMaxVtabArgs = pOp->p2; break; } case OP_VFilter: { int n; + /* The instruction immediately prior to VFilter will be an + ** OP_Integer that sets the "argc" value for the VFilter. See + ** the code where OP_VFilter is generated at tag-20250207a. */ assert( (pOp - p->aOp) >= 3 ); assert( pOp[-1].opcode==OP_Integer ); + assert( pOp[-1].p2==pOp->p3+1 ); n = pOp[-1].p1; - if( n>nMaxArgs ) nMaxArgs = n; + if( n>nMaxVtabArgs ) nMaxVtabArgs = n; /* Fall through into the default case */ /* no break */ deliberate_fall_through } @@ -965,7 +969,7 @@ resolve_p2_values_loop_exit: pParse->aLabel = 0; } pParse->nLabel = 0; - *pMaxFuncArgs = nMaxArgs; + *pMaxVtabArgs = nMaxVtabArgs; assert( p->bIsReader!=0 || DbMaskAllZero(p->btreeMask) ); } @@ -2643,7 +2647,7 @@ void sqlite3VdbeMakeReady( int nVar; /* Number of parameters */ int nMem; /* Number of VM memory registers */ int nCursor; /* Number of cursors required */ - int nArg; /* Number of arguments in subprograms */ + int nArg; /* Max number args to xFilter or xUpdate */ int n; /* Loop counter */ struct ReusableSpace x; /* Reusable bulk memory */ @@ -2715,6 +2719,9 @@ void sqlite3VdbeMakeReady( p->apCsr = allocSpace(&x, p->apCsr, nCursor*sizeof(VdbeCursor*)); } } +#ifdef SQLITE_DEBUG + p->napArg = nArg; +#endif if( db->mallocFailed ){ p->nVar = 0; diff --git a/src/wherecode.c b/src/wherecode.c index 045653aac8..1a0cdc6d71 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1608,6 +1608,9 @@ Bitmask sqlite3WhereCodeOneLoopStart( } sqlite3VdbeAddOp2(v, OP_Integer, pLoop->u.vtab.idxNum, iReg); sqlite3VdbeAddOp2(v, OP_Integer, nConstraint, iReg+1); + /* The instruction immediately prior to OP_VFilter must be an OP_Integer + ** that sets the "argc" value for xVFilter. This is necessary for + ** resolveP2() to work correctly. See tag-20250207a. */ sqlite3VdbeAddOp4(v, OP_VFilter, iCur, addrNotFound, iReg, pLoop->u.vtab.idxStr, pLoop->u.vtab.needFree ? P4_DYNAMIC : P4_STATIC); From 7df570421c5522fff619ac526d27f8d16a4ad247 Mon Sep 17 00:00:00 2001 From: stephan Date: Fri, 7 Feb 2025 19:18:20 +0000 Subject: [PATCH 195/220] build: work around a report of (install -d DIR) failing in one environment if DIR already exists. FossilOrigin-Name: 8f7b7840d48c391d43ac034ebfee9227dc1c2800adda24f02f3d3bb942f4380e --- autoconf/Makefile.in | 3 ++- main.mk | 3 ++- manifest | 17 +++++++++-------- manifest.uuid | 2 +- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/autoconf/Makefile.in b/autoconf/Makefile.in index 0270b9a1db..b41c03e76c 100644 --- a/autoconf/Makefile.in +++ b/autoconf/Makefile.in @@ -86,7 +86,8 @@ install-dir.all = $(install-dir.bin) $(install-dir.include) \ $(install-dir.lib) $(install-dir.man1) \ $(install-dir.pkgconfig) $(install-dir.all): - $(INSTALL) -d "$@" + if [ ! -d "$@" ]; then $(INSTALL) -d "$@"; fi +# ^^^^ on some platforms, install -d fails if the target already exists. # diff --git a/main.mk b/main.mk index 38d1ba5f56..27b8848879 100644 --- a/main.mk +++ b/main.mk @@ -435,7 +435,8 @@ install-dir.all = $(install-dir.bin) $(install-dir.include) \ $(install-dir.lib) $(install-dir.man1) \ $(install-dir.pkgconfig) $(install-dir.all): - $(INSTALL) -d "$@" + if [ ! -d "$@" ]; then $(INSTALL) -d "$@"; fi +# ^^^^ on some platforms, install -d fails if the target already exists. # # After jimsh is compiled, we run some sanity checks to ensure that diff --git a/manifest b/manifest index 23bd8c8395..7e646eaf0b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\scomments\son\sthe\sParse.nMaxArgs\sfield\sso\sthat\sthey\sare\scorrect.\s\sAdd\nassert()s\sto\sensure\sthey\sare\scorrect.\s\sOther\sParse\schanges\sto\sreduce\sthe\namount\sof\smemset()\sneeded\sto\sinitialize\sit. -D 2025-02-07T19:09:20.404 +C build:\swork\saround\sa\sreport\sof\s(install\s-d\sDIR)\sfailing\sin\sone\senvironment\sif\sDIR\salready\sexists. +D 2025-02-07T19:18:20.610 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -16,7 +16,7 @@ F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2 F art/sqlite370.svg 40b7e2fe8aac3add5d56dd86ab8d427a4eca5bcb3fe4f8946cb3794e1821d531 F auto.def fdd6965e06bce02a8b9f9ed57a52d05bcbec4b56e4bef2174866bb5713c65fda F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac -F autoconf/Makefile.in be23c54eef87e6a64d875f96f6cf60a871219c50b04a955ebbd1aac48b4c738e +F autoconf/Makefile.in ee765abbb5de7281932f8ea14123cd5a854a05cab692f39626af89a371bee81f F autoconf/Makefile.msc 0a071367537dc395285a5d624ac4f99f3a387b27cc5e89752423c0499e15aec4 F autoconf/README.first f1d3876e9a7852c22f275a6f06814e64934cecbc0b5b9617d64849094c1fd136 F autoconf/README.txt 7f01dc3915e2d68f329011073662369e62a0938a2c69398807823c57591cb288 @@ -702,7 +702,7 @@ F ext/wasm/tests/opfs/concurrency/test.js d08889a5bb6e61937d0b8cbb78c9efbefbf65a F ext/wasm/tests/opfs/concurrency/worker.js 0a8c1a3e6ebb38aabbee24f122693f1fb29d599948915c76906681bb7da1d3d2 F ext/wasm/wasmfs.make 68999f5bd8c489239592d59a420f8c627c99169bbd6fa16a404751f757b9f702 F magic.txt 5ade0bc977aa135e79e3faaea894d5671b26107cc91e70783aa7dc83f22f3ba0 -F main.mk 70e140c6825aef1ac94c879db7db188be461db15d40e4d9cd9b3e444c2868e21 +F main.mk 0e3695222412c9388d8e7db612249cd0cd02722c62a16c48be7c77a7639628a8 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 F mptest/crash01.test 61e61469e257df0850df4293d7d4d6c2af301421 @@ -2209,8 +2209,9 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 45e462c0060e51c3375a226d636148e3415ee6020e544ecc84861c7aef4ecf7b -R 07888caf6f9e73972781470e8ad03e81 -U drh -Z 434b297f89532d0b5b94eab3e74d43a4 +P c56092507c96723030589ddd9121bc993d615a7acd453305fc3b1dbb9e30554c +Q +4bc6fe30c967e4f15e2c154a1af5434bfecd89cab0e4d040a5bf68c8ce47a546 +R 7551ae18ae903d03005b95f880daf40a +U stephan +Z 025070a553bc5509ae846762654dc19b # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index fb16c00a62..5455a6525b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c56092507c96723030589ddd9121bc993d615a7acd453305fc3b1dbb9e30554c +8f7b7840d48c391d43ac034ebfee9227dc1c2800adda24f02f3d3bb942f4380e From f62d053b49c287544c9b807cf9a067b7dca252fa Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 8 Feb 2025 11:15:41 +0000 Subject: [PATCH 196/220] Improvements to the hash table used to store symbols in the schema, so that it works better (requires fewer calls to sqlite3StrICmp()) for large schemas, and uses less code space. FossilOrigin-Name: 0318b68c845c84eded757c67f820e1783551574ac9e5670be640c4bfe22a934b --- manifest | 17 ++++++++++------- manifest.uuid | 2 +- src/hash.c | 43 +++++++++++++++++++++++-------------------- src/hash.h | 1 + 4 files changed, 35 insertions(+), 28 deletions(-) diff --git a/manifest b/manifest index 23bd8c8395..dedc3aa948 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\scomments\son\sthe\sParse.nMaxArgs\sfield\sso\sthat\sthey\sare\scorrect.\s\sAdd\nassert()s\sto\sensure\sthey\sare\scorrect.\s\sOther\sParse\schanges\sto\sreduce\sthe\namount\sof\smemset()\sneeded\sto\sinitialize\sit. -D 2025-02-07T19:09:20.404 +C Improvements\sto\sthe\shash\stable\sused\sto\sstore\ssymbols\sin\sthe\sschema,\sso\sthat\nit\sworks\sbetter\s(requires\sfewer\scalls\sto\ssqlite3StrICmp())\sfor\slarge\sschemas,\nand\suses\sless\scode\sspace. +D 2025-02-08T11:15:41.775 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -735,8 +735,8 @@ F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 928ed2517e8732113d2b9821aa37af639688d752f4ea9ac6e0e393d713eeb76f F src/func.c 0712a5b03fdfc8af0cda6d076bfe231b66388d3d5a28b46dc1a94b90d41cac6a F src/global.c a19e4b1ca1335f560e9560e590fc13081e21f670643367f99cb9e8f9dc7d615b -F src/hash.c 9ee4269fb1d6632a6fecfb9479c93a1f29271bddbbaf215dd60420bcb80c7220 -F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51 +F src/hash.c ab8e8cf8733ccef6fd00831fff56a0fbdfa886505c08778338b8d0dc2f9d003d +F src/hash.h 46b92795a95bfefb210f52f0c316e9d7cdbcdd7e7fcfb0d8be796d3a5767cddf F src/hwtime.h f9c2dfb84dce7acf95ce6d289e46f5f9d3d1afd328e53da8f8e9008e3b3caae6 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c ccadada52dc508ab8229e343425ab2504db57cfcdf8271f0f9ce1c2c6cad97c1 @@ -2209,8 +2209,11 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 45e462c0060e51c3375a226d636148e3415ee6020e544ecc84861c7aef4ecf7b -R 07888caf6f9e73972781470e8ad03e81 +P c56092507c96723030589ddd9121bc993d615a7acd453305fc3b1dbb9e30554c +R 51c0e52e763f3a11eebcce49c33f5a3b +T *branch * hash-improvements +T *sym-hash-improvements * +T -sym-trunk * U drh -Z 434b297f89532d0b5b94eab3e74d43a4 +Z 9b37fd3883a56be3a46fd4cef0eab379 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index fb16c00a62..764f1c6d8a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c56092507c96723030589ddd9121bc993d615a7acd453305fc3b1dbb9e30554c +0318b68c845c84eded757c67f820e1783551574ac9e5670be640c4bfe22a934b diff --git a/src/hash.c b/src/hash.c index 8ec043f119..c822cb5f1f 100644 --- a/src/hash.c +++ b/src/hash.c @@ -55,11 +55,19 @@ void sqlite3HashClear(Hash *pH){ static unsigned int strHash(const char *z){ unsigned int h = 0; unsigned char c; - while( (c = (unsigned char)*z++)!=0 ){ /*OPTIMIZATION-IF-TRUE*/ + while( z[0] ){ /*OPTIMIZATION-IF-TRUE*/ /* Knuth multiplicative hashing. (Sorting & Searching, p. 510). ** 0x9e3779b1 is 2654435761 which is the closest prime number to - ** (2**32)*golden_ratio, where golden_ratio = (sqrt(5) - 1)/2. */ - h += sqlite3UpperToLower[c]; + ** (2**32)*golden_ratio, where golden_ratio = (sqrt(5) - 1)/2. + ** + ** Only bits 0xdf for ASCII and bits 0xbf for EBCDIC each octet are + ** hashed since the omitted bits determine the upper/lower case difference. + */ +#ifdef SQLITE_EBCDIC + h += 0xbf & (unsigned char)*(z++); +#else + h += 0xdf & (unsigned char)*(z++); +#endif h *= 0x9e3779b1; } return h; @@ -132,9 +140,8 @@ static int rehash(Hash *pH, unsigned int new_size){ pH->htsize = new_size = sqlite3MallocSize(new_ht)/sizeof(struct _ht); memset(new_ht, 0, new_size*sizeof(struct _ht)); for(elem=pH->first, pH->first=0; elem; elem = next_elem){ - unsigned int h = strHash(elem->pKey) % new_size; next_elem = elem->next; - insertElement(pH, &new_ht[h], elem); + insertElement(pH, &new_ht[elem->h % new_size], elem); } return 1; } @@ -154,21 +161,20 @@ static HashElem *findElementWithHash( unsigned int h; /* The computed hash */ static HashElem nullElement = { 0, 0, 0, 0 }; + h = strHash(pKey); if( pH->ht ){ /*OPTIMIZATION-IF-TRUE*/ struct _ht *pEntry; - h = strHash(pKey) % pH->htsize; - pEntry = &pH->ht[h]; + pEntry = &pH->ht[h % pH->htsize]; elem = pEntry->chain; count = pEntry->count; }else{ - h = 0; elem = pH->first; count = pH->count; } if( pHash ) *pHash = h; while( count ){ assert( elem!=0 ); - if( sqlite3StrICmp(elem->pKey,pKey)==0 ){ + if( h==elem->h && sqlite3StrICmp(elem->pKey,pKey)==0 ){ return elem; } elem = elem->next; @@ -180,10 +186,9 @@ static HashElem *findElementWithHash( /* Remove a single entry from the hash table given a pointer to that ** element and a hash on the element's key. */ -static void removeElementGivenHash( +static void removeElement( Hash *pH, /* The pH containing "elem" */ - HashElem* elem, /* The element to be removed from the pH */ - unsigned int h /* Hash value for the element */ + HashElem *elem /* The element to be removed from the pH */ ){ struct _ht *pEntry; if( elem->prev ){ @@ -195,7 +200,7 @@ static void removeElementGivenHash( elem->next->prev = elem->prev; } if( pH->ht ){ - pEntry = &pH->ht[h]; + pEntry = &pH->ht[elem->h % pH->htsize]; if( pEntry->chain==elem ){ pEntry->chain = elem->next; } @@ -246,7 +251,7 @@ void *sqlite3HashInsert(Hash *pH, const char *pKey, void *data){ if( elem->data ){ void *old_data = elem->data; if( data==0 ){ - removeElementGivenHash(pH,elem,h); + removeElement(pH,elem); }else{ elem->data = data; elem->pKey = pKey; @@ -257,14 +262,12 @@ void *sqlite3HashInsert(Hash *pH, const char *pKey, void *data){ new_elem = (HashElem*)sqlite3Malloc( sizeof(HashElem) ); if( new_elem==0 ) return data; new_elem->pKey = pKey; + new_elem->h = h; new_elem->data = data; pH->count++; - if( pH->count>=10 && pH->count > 2*pH->htsize ){ - if( rehash(pH, pH->count*2) ){ - assert( pH->htsize>0 ); - h = strHash(pKey) % pH->htsize; - } + if( pH->count>=5 && pH->count > 2*pH->htsize ){ + rehash(pH, pH->count*3); } - insertElement(pH, pH->ht ? &pH->ht[h] : 0, new_elem); + insertElement(pH, pH->ht ? &pH->ht[new_elem->h % pH->htsize] : 0, new_elem); return 0; } diff --git a/src/hash.h b/src/hash.h index 3f491e45c0..cff65d6e50 100644 --- a/src/hash.h +++ b/src/hash.h @@ -60,6 +60,7 @@ struct HashElem { HashElem *next, *prev; /* Next and previous elements in the table */ void *data; /* Data associated with this element */ const char *pKey; /* Key associated with this element */ + unsigned int h; /* hash for pKey */ }; /* From 03c65171b8ff533b28927a1e5fb7939b87077de0 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 8 Feb 2025 13:34:19 +0000 Subject: [PATCH 197/220] Fix GCC-isms and compiler warnings introduced by recent check-ins [c56092507c967230] and [6e57848fe1e0e2b5]. FossilOrigin-Name: 91102c04375f83cffcd0f3204870e476636f651710e9e6fb773cf74085ef7636 --- manifest | 17 ++++++++--------- manifest.uuid | 2 +- src/hash.c | 3 +-- src/sqliteInt.h | 13 +++++++++---- src/vdbeInt.h | 4 ---- 5 files changed, 19 insertions(+), 20 deletions(-) diff --git a/manifest b/manifest index dba09df8c1..910bb3ea65 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improvements\sto\sthe\ssymbol\stable\shash:\sfaster\slookups\swith\sfewer\scalls\sto\nsqlite3StrICmp()\sfor\sschemas\swith\smany\ssymbols\sand\slarge\snames. -D 2025-02-08T12:04:25.764 +C Fix\sGCC-isms\sand\scompiler\swarnings\sintroduced\sby\srecent\scheck-ins\n[c56092507c967230]\sand\s[6e57848fe1e0e2b5]. +D 2025-02-08T13:34:19.496 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -735,7 +735,7 @@ F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 928ed2517e8732113d2b9821aa37af639688d752f4ea9ac6e0e393d713eeb76f F src/func.c 0712a5b03fdfc8af0cda6d076bfe231b66388d3d5a28b46dc1a94b90d41cac6a F src/global.c a19e4b1ca1335f560e9560e590fc13081e21f670643367f99cb9e8f9dc7d615b -F src/hash.c ab8e8cf8733ccef6fd00831fff56a0fbdfa886505c08778338b8d0dc2f9d003d +F src/hash.c 73934a7f7ab1cb110614a9388cb516893b0cf5b7b69e4fd1a0780ac4ce166be7 F src/hash.h 46b92795a95bfefb210f52f0c316e9d7cdbcdd7e7fcfb0d8be796d3a5767cddf F src/hwtime.h f9c2dfb84dce7acf95ce6d289e46f5f9d3d1afd328e53da8f8e9008e3b3caae6 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 @@ -785,7 +785,7 @@ F src/shell.c.in b377a59822f207106424f08aead37e78b609222e98f86f04cc8a03563ccf323 F src/sqlite.h.in d2902f13ace94d3d3609646bd6d12a2d7a4f6cbdf6a5a4097580ac305f54c3f0 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54 -F src/sqliteInt.h f576f21641e8667779424003e552e79a3d3c7e824421f954ef73fce44040581c +F src/sqliteInt.h 7585b45f585c82f803ab89ccd475819c6dfb9eae0dc2afcae62c9d894137e0e8 F src/sqliteLimit.h 1bbdbf72bd0411d003267ffebc59a262f061df5653027a75627d03f48ca30523 F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -851,7 +851,7 @@ F src/util.c e5f6a5eeaa26b69054a43bbd0048cfe3d2851f6961052b35aed8f695df922850 F src/vacuum.c b763b6457bd058d2072ef9364832351fd8d11e8abf70cbb349657360f7d55c40 F src/vdbe.c b98d86de7f0e6c02fb14e0e1ae8feab6aa84669d389771a848e23f59eb70dcad F src/vdbe.h 3d26d5c7660c5c7bd33ffb0d8784615072d8b23c81f8110870efe2631136bc89 -F src/vdbeInt.h 7abc3ce9732fd487ee2544b478ac0526dca443d6d470fc34784d3122d378cf3e +F src/vdbeInt.h 078b1c15b26587b54c1c1879d0d2f4dec812b9de4c337fed9faf73fbcc3bf091 F src/vdbeapi.c 82fe278a7c71b653235c6f9fb5de0b5de589908dfcb011ba2a782e8becf06f86 F src/vdbeaux.c 541d3d232714455960eab4ed10b34cb48b4bcd565d7539ef31092f5e73648e6b F src/vdbeblob.c 255be187436da38b01f276c02e6a08103489bbe2a7c6c21537b7aecbe0e1f797 @@ -2209,9 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 8f7b7840d48c391d43ac034ebfee9227dc1c2800adda24f02f3d3bb942f4380e 0318b68c845c84eded757c67f820e1783551574ac9e5670be640c4bfe22a934b -R 50206c8b661a5653165b14de78589549 -T +closed 0318b68c845c84eded757c67f820e1783551574ac9e5670be640c4bfe22a934b +P 6e57848fe1e0e2b533dd65c2bc5fbac660202cf91cb94ac5468a3434e367a087 +R 2c411617d97350770bd64ca35d94ddfa U drh -Z 088e4d406ab0098b87fcdd617d96f661 +Z 8dddf39b318eaf54797fe9748f81eadf # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 9320ac90f4..c4ad2d2b75 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6e57848fe1e0e2b533dd65c2bc5fbac660202cf91cb94ac5468a3434e367a087 +91102c04375f83cffcd0f3204870e476636f651710e9e6fb773cf74085ef7636 diff --git a/src/hash.c b/src/hash.c index c822cb5f1f..8cc6c09663 100644 --- a/src/hash.c +++ b/src/hash.c @@ -54,7 +54,6 @@ void sqlite3HashClear(Hash *pH){ */ static unsigned int strHash(const char *z){ unsigned int h = 0; - unsigned char c; while( z[0] ){ /*OPTIMIZATION-IF-TRUE*/ /* Knuth multiplicative hashing. (Sorting & Searching, p. 510). ** 0x9e3779b1 is 2654435761 which is the closest prime number to @@ -159,7 +158,7 @@ static HashElem *findElementWithHash( HashElem *elem; /* Used to loop thru the element list */ unsigned int count; /* Number of elements left to test */ unsigned int h; /* The computed hash */ - static HashElem nullElement = { 0, 0, 0, 0 }; + static HashElem nullElement = { 0, 0, 0, 0, 0 }; h = strHash(pKey); if( pH->ht ){ /*OPTIMIZATION-IF-TRUE*/ diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 359ed1b6b1..e46744a129 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -843,6 +843,11 @@ typedef INT16_TYPE i16; /* 2-byte signed integer */ typedef UINT8_TYPE u8; /* 1-byte unsigned integer */ typedef INT8_TYPE i8; /* 1-byte signed integer */ +/* A bitfield type for use inside of structures. Always follow with :N where +** N is the number of bits. +*/ +typedef unsigned bft; /* Bit Field Type */ + /* ** SQLITE_MAX_U32 is a u64 constant that is the maximum u64 value ** that can be stored in a u32 without loss of data. The value @@ -3845,10 +3850,10 @@ struct Parse { u8 isCreate; /* CREATE TABLE, INDEX, or VIEW (but not TRIGGER) ** and ALTER TABLE ADD COLUMN. */ #endif - u8 colNamesSet :1; /* TRUE after OP_ColumnName has been issued to pVdbe */ - u8 bHasWith :1; /* True if statement contains WITH */ - u8 okConstFactor :1; /* OK to factor out constants */ - u8 checkSchema :1; /* Causes schema cookie check after an error */ + bft colNamesSet :1; /* TRUE after OP_ColumnName has been issued to pVdbe */ + bft bHasWith :1; /* True if statement contains WITH */ + bft okConstFactor :1; /* OK to factor out constants */ + bft checkSchema :1; /* Causes schema cookie check after an error */ int nRangeReg; /* Size of the temporary register block */ int iRangeReg; /* First register in temporary register block */ int nErr; /* Number of errors seen */ diff --git a/src/vdbeInt.h b/src/vdbeInt.h index ecc757dd0d..12af827268 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -398,10 +398,6 @@ struct sqlite3_context { sqlite3_value *argv[1]; /* Argument set */ }; -/* A bitfield type for use inside of structures. Always follow with :N where -** N is the number of bits. -*/ -typedef unsigned bft; /* Bit Field Type */ /* The ScanStatus object holds a single value for the ** sqlite3_stmt_scanstatus() interface. From 9d90a3af2fa1108ee3c914f9cb5b602bfb04949d Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 8 Feb 2025 14:15:42 +0000 Subject: [PATCH 198/220] Use the sqlite3ColumnIndex() routine to look up a column in a table, rather than using a custom loop. Performance improvement, size reduction, and complexity decrease. FossilOrigin-Name: 351dbbc2bf0b23efdc625ddaa5dc2239cf2990addf071a04bd41612b341de8c8 --- manifest | 26 +++++++-------- manifest.uuid | 2 +- src/alter.c | 6 ++-- src/build.c | 27 ++++++--------- src/expr.c | 8 +---- src/insert.c | 36 +++++++++----------- src/main.c | 9 ++--- src/resolve.c | 90 ++++++++++++++++++++++---------------------------- src/update.c | 46 +++++++++++--------------- src/vdbeblob.c | 8 ++--- 10 files changed, 106 insertions(+), 152 deletions(-) diff --git a/manifest b/manifest index 910bb3ea65..adfd9058d8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sGCC-isms\sand\scompiler\swarnings\sintroduced\sby\srecent\scheck-ins\n[c56092507c967230]\sand\s[6e57848fe1e0e2b5]. -D 2025-02-08T13:34:19.496 +C Use\sthe\ssqlite3ColumnIndex()\sroutine\sto\slook\sup\sa\scolumn\sin\sa\stable,\srather\nthan\susing\sa\scustom\sloop.\s\sPerformance\simprovement,\ssize\sreduction,\sand\ncomplexity\sdecrease. +D 2025-02-08T14:15:42.707 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -712,7 +712,7 @@ F mptest/multiwrite01.test dab5c5f8f9534971efce679152c5146da265222d F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 acdff36db796e2d00225b911d3047d580cd136547298435426ce9d40347973cc F sqlite3.pc.in 0977c03a4da7c4204bd60e784a0efb8d51a190448aba78a4e973fe7192bdaf03 -F src/alter.c aa93e37e4a36a0525bbb2a2aeda20d2018f0aa995542c7dc658e031375e3f532 +F src/alter.c 1751e231d8385067fa0d0145f0d461a092db6bd3d7edbfc3172db625aceccd9a F src/analyze.c 0823d2edb3ce564157e9d62714cc729027933209b712e95fbabb23e47fff0aec F src/attach.c 3a5cb9ee4aad6c5b22268287340a4f2f7b07959b7a522201be30fee23cd802e9 F src/auth.c 54ab9c6c5803b47c0d45b76ce27eff22a03b4b1f767c5945a3a4eb13aa4c78dc @@ -722,7 +722,7 @@ F src/btmutex.c 79a43670447eacc651519a429f6ece9fd638563cf95b469d6891185ddae2b522 F src/btree.c 63ca6b647342e8cef643863cd0962a542f133e1069460725ba4461dcda92b03c F src/btree.h 18e5e7b2124c23426a283523e5f31a4bff029131b795bb82391f9d2f3136fc50 F src/btreeInt.h 98aadb6dcb77b012cab2574d6a728fad56b337fc946839b9898c4b4c969e30b6 -F src/build.c cac3aa87f3bf137e12c77194150fb05c949d36a12177fd3acccdaa3669ca9744 +F src/build.c 48796a45299dbdf6331bc1bf2eb5319330980f469c1eaaed17d487a381cea488 F src/callback.c acae8c8dddda41ee85cfdf19b926eefe830f371069f8aadca3aa39adf5b1c859 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c d35723024b963edce9c0fad5b3303e8bb9266083784844baed10a6dedfe26f3b @@ -730,7 +730,7 @@ F src/date.c 842c08ac143a56a627b05ac51d68624f2b7b03e3b4cba596205e735eed64ee57 F src/dbpage.c 2e677acb658a29965e55398bbc61161cb7819da538057c8032adac7ab8e4a8c0 F src/dbstat.c 73362c0df0f40ad5523a6f5501224959d0976757b511299bf892313e79d14f5c F src/delete.c 03a77ba20e54f0f42ebd8eddf15411ed6bdb06a2c472ac4b6b336521bf7cea42 -F src/expr.c 8705be31ee713aaa43c97d91399db09f16ee41b88250406eb99de6b47f550a98 +F src/expr.c 15fabfb67261e298a39fe61457f3cfa24148d9ca8d02f4dff385feb5cf523ea7 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 928ed2517e8732113d2b9821aa37af639688d752f4ea9ac6e0e393d713eeb76f F src/func.c 0712a5b03fdfc8af0cda6d076bfe231b66388d3d5a28b46dc1a94b90d41cac6a @@ -739,11 +739,11 @@ F src/hash.c 73934a7f7ab1cb110614a9388cb516893b0cf5b7b69e4fd1a0780ac4ce166be7 F src/hash.h 46b92795a95bfefb210f52f0c316e9d7cdbcdd7e7fcfb0d8be796d3a5767cddf F src/hwtime.h f9c2dfb84dce7acf95ce6d289e46f5f9d3d1afd328e53da8f8e9008e3b3caae6 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c ccadada52dc508ab8229e343425ab2504db57cfcdf8271f0f9ce1c2c6cad97c1 +F src/insert.c 05e04ef637cbc0dccb9a5c5d188a5a2608891e554c8ec17c7a71afe2cf896a06 F src/json.c 68a98c020c22127f2d65f08855f7fc7460ff352a6ce0b543d8931dde83319c22 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 7432c944ff197046d67a1207790a1b13eec4548c85a9457eb0896bb3641dfb36 -F src/main.c 59bdd8d9bbdb3a746eaef14d611ddd5638aa18acef7c5e3271e815dbd215a1af +F src/main.c b99d15d843f7a86adbec855de77b1656dde07359722ef63a9d9393678dbb58d1 F src/malloc.c 410e570b30c26cc36e3372577df50f7a96ee3eed5b2b161c6b6b48773c650c5e F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c 3bb59158c38e05f6270e761a9f435bf19827a264c13d1631c58b84bdc96d73b2 @@ -778,7 +778,7 @@ F src/pragma.h e690a356c18e98414d2e870ea791c1be1545a714ba623719deb63f7f226d8bb7 F src/prepare.c 1832be043fce7d489959aae6f994c452d023914714c4d5457beaed51c0f3d126 F src/printf.c 96f7f8baeedc7639da94e4e7a4a2c200e2537c4eec9e5e1c2ffc821f40eb3105 F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c -F src/resolve.c c8a5372b97b2a2e972a280676f06ddb5b74e885d3b1f5ce383f839907b57ef68 +F src/resolve.c 626c24b258b111f75c22107aa5614ad89810df3026f5ca071116d3fe75925c75 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 F src/select.c 83e88fbb36f89b6703b348777491619554f0fd6f917c9fdf51e4c2e9cda6c04e F src/shell.c.in b377a59822f207106424f08aead37e78b609222e98f86f04cc8a03563ccf3237 @@ -844,7 +844,7 @@ F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c F src/tokenize.c 375a772e2342274f4bf73605a70633237da09deed00a9bf4c4816a56777ea7c9 F src/treeview.c d85ce76e6d1498d781957c07cb234da6d77ce0ed2d196480d516f54dabc62279 F src/trigger.c da3c25786870d8bf97cd46b493374c2375d1abaf20a9b0f5f8629a3f2f2ce383 -F src/update.c 0e01aa6a3edf9ec112b33eb714b9016a81241497b1fb7c3e74332f4f71756508 +F src/update.c 3e5e7ff66fa19ebe4d1b113d480639a24cc1175adbefabbd1a948a07f28e37cf F src/upsert.c 215328c3f91623c520ec8672c44323553f12caeb4f01b1090ebdca99fdf7b4f1 F src/utf.c 8b29d9a5956569ea2700f869669b8ef67a9662ee5e724ff77ab3c387e27094ba F src/util.c e5f6a5eeaa26b69054a43bbd0048cfe3d2851f6961052b35aed8f695df922850 @@ -854,7 +854,7 @@ F src/vdbe.h 3d26d5c7660c5c7bd33ffb0d8784615072d8b23c81f8110870efe2631136bc89 F src/vdbeInt.h 078b1c15b26587b54c1c1879d0d2f4dec812b9de4c337fed9faf73fbcc3bf091 F src/vdbeapi.c 82fe278a7c71b653235c6f9fb5de0b5de589908dfcb011ba2a782e8becf06f86 F src/vdbeaux.c 541d3d232714455960eab4ed10b34cb48b4bcd565d7539ef31092f5e73648e6b -F src/vdbeblob.c 255be187436da38b01f276c02e6a08103489bbe2a7c6c21537b7aecbe0e1f797 +F src/vdbeblob.c 9166b6eb7054e5da82e35255892fb1ed551355a4716452539e8e3ac14f25fbe3 F src/vdbemem.c 977438546df236c6a3e7d8b4fe86c0643c13b89b00235db1f11c3a91a4796d30 F src/vdbesort.c d0a3c7056c081703c8b6d91ad60f17da5e062a5c64bf568ed0fa1b5f4cae311f F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 6e57848fe1e0e2b533dd65c2bc5fbac660202cf91cb94ac5468a3434e367a087 -R 2c411617d97350770bd64ca35d94ddfa +P 91102c04375f83cffcd0f3204870e476636f651710e9e6fb773cf74085ef7636 +R 3617bbdf30502e1c991c0fb4581bc1ec U drh -Z 8dddf39b318eaf54797fe9748f81eadf +Z 863c9742465b0aa338b6dd538c7f9637 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index c4ad2d2b75..a40ac617bb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -91102c04375f83cffcd0f3204870e476636f651710e9e6fb773cf74085ef7636 +351dbbc2bf0b23efdc625ddaa5dc2239cf2990addf071a04bd41612b341de8c8 diff --git a/src/alter.c b/src/alter.c index ff20757589..5f706b513f 100644 --- a/src/alter.c +++ b/src/alter.c @@ -632,10 +632,8 @@ void sqlite3AlterRenameColumn( ** altered. Set iCol to be the index of the column being renamed */ zOld = sqlite3NameFromToken(db, pOld); if( !zOld ) goto exit_rename_column; - for(iCol=0; iColnCol; iCol++){ - if( 0==sqlite3StrICmp(pTab->aCol[iCol].zCnName, zOld) ) break; - } - if( iCol==pTab->nCol ){ + iCol = sqlite3ColumnIndex(pTab, zOld); + if( iCol<0 ){ sqlite3ErrorMsg(pParse, "no such column: \"%T\"", pOld); goto exit_rename_column; } diff --git a/src/build.c b/src/build.c index 986107f48d..2e28af2d1f 100644 --- a/src/build.c +++ b/src/build.c @@ -1473,7 +1473,6 @@ void sqlite3AddColumn(Parse *pParse, Token sName, Token sType){ char *zType; Column *pCol; sqlite3 *db = pParse->db; - u8 hName; Column *aNew; u8 eType = COLTYPE_CUSTOM; u8 szEst = 1; @@ -1527,13 +1526,11 @@ void sqlite3AddColumn(Parse *pParse, Token sName, Token sType){ memcpy(z, sName.z, sName.n); z[sName.n] = 0; sqlite3Dequote(z); - hName = sqlite3StrIHash(z); - for(i=0; inCol; i++){ - if( p->aCol[i].hName==hName && sqlite3StrICmp(z, p->aCol[i].zCnName)==0 ){ - sqlite3ErrorMsg(pParse, "duplicate column name: %s", z); - sqlite3DbFree(db, z); - return; - } + i = sqlite3ColumnIndex(p, z); + if( i>=0 ){ + sqlite3ErrorMsg(pParse, "duplicate column name: %s", z); + sqlite3DbFree(db, z); + return; } aNew = sqlite3DbRealloc(db,p->aCol,((i64)p->nCol+1)*sizeof(p->aCol[0])); if( aNew==0 ){ @@ -1544,7 +1541,7 @@ void sqlite3AddColumn(Parse *pParse, Token sName, Token sType){ pCol = &p->aCol[p->nCol]; memset(pCol, 0, sizeof(p->aCol[0])); pCol->zCnName = z; - pCol->hName = hName; + pCol->hName = sqlite3StrIHash(z); sqlite3ColumnPropertiesFromName(p, pCol); if( sType.n==0 ){ @@ -1835,15 +1832,11 @@ void sqlite3AddPrimaryKey( assert( pCExpr!=0 ); sqlite3StringToId(pCExpr); if( pCExpr->op==TK_ID ){ - const char *zCName; assert( !ExprHasProperty(pCExpr, EP_IntValue) ); - zCName = pCExpr->u.zToken; - for(iCol=0; iColnCol; iCol++){ - if( sqlite3StrICmp(zCName, pTab->aCol[iCol].zCnName)==0 ){ - pCol = &pTab->aCol[iCol]; - makeColumnPartOfPrimaryKey(pParse, pCol); - break; - } + iCol = sqlite3ColumnIndex(pTab, pCExpr->u.zToken); + if( iCol>=0 ){ + pCol = &pTab->aCol[iCol]; + makeColumnPartOfPrimaryKey(pParse, pCol); } } } diff --git a/src/expr.c b/src/expr.c index 8f898a1e3b..df47e34593 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2966,13 +2966,7 @@ const char *sqlite3RowidAlias(Table *pTab){ int ii; assert( VisibleRowid(pTab) ); for(ii=0; iinCol; iCol++){ - if( sqlite3_stricmp(azOpt[ii], pTab->aCol[iCol].zCnName)==0 ) break; - } - if( iCol==pTab->nCol ){ - return azOpt[ii]; - } + if( sqlite3ColumnIndex(pTab, azOpt[ii])<0 ) return azOpt[ii]; } return 0; } diff --git a/src/insert.c b/src/insert.c index e2d910fce4..c1ca1897ed 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1075,28 +1075,22 @@ void sqlite3Insert( aTabColMap = sqlite3DbMallocZero(db, pTab->nCol*sizeof(int)); if( aTabColMap==0 ) goto insert_cleanup; for(i=0; inId; i++){ - const char *zCName = pColumn->a[i].zName; - u8 hName = sqlite3StrIHash(zCName); - for(j=0; jnCol; j++){ - if( pTab->aCol[j].hName!=hName ) continue; - if( sqlite3StrICmp(zCName, pTab->aCol[j].zCnName)==0 ){ - if( aTabColMap[j]==0 ) aTabColMap[j] = i+1; - if( i!=j ) bIdListInOrder = 0; - if( j==pTab->iPKey ){ - ipkColumn = i; assert( !withoutRowid ); - } -#ifndef SQLITE_OMIT_GENERATED_COLUMNS - if( pTab->aCol[j].colFlags & (COLFLAG_STORED|COLFLAG_VIRTUAL) ){ - sqlite3ErrorMsg(pParse, - "cannot INSERT into generated column \"%s\"", - pTab->aCol[j].zCnName); - goto insert_cleanup; - } -#endif - break; + j = sqlite3ColumnIndex(pTab, pColumn->a[i].zName); + if( j>=0 ){ + if( aTabColMap[j]==0 ) aTabColMap[j] = i+1; + if( i!=j ) bIdListInOrder = 0; + if( j==pTab->iPKey ){ + ipkColumn = i; assert( !withoutRowid ); } - } - if( j>=pTab->nCol ){ +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + if( pTab->aCol[j].colFlags & (COLFLAG_STORED|COLFLAG_VIRTUAL) ){ + sqlite3ErrorMsg(pParse, + "cannot INSERT into generated column \"%s\"", + pTab->aCol[j].zCnName); + goto insert_cleanup; + } +#endif + }else{ if( sqlite3IsRowid(pColumn->a[i].zName) && !withoutRowid ){ ipkColumn = i; bIdListInOrder = 0; diff --git a/src/main.c b/src/main.c index 6a9d03d87c..17d0cd434a 100644 --- a/src/main.c +++ b/src/main.c @@ -3943,13 +3943,10 @@ int sqlite3_table_column_metadata( if( zColumnName==0 ){ /* Query for existence of table only */ }else{ - for(iCol=0; iColnCol; iCol++){ + iCol = sqlite3ColumnIndex(pTab, zColumnName); + if( iCol>=0 ){ pCol = &pTab->aCol[iCol]; - if( 0==sqlite3StrICmp(pCol->zCnName, zColumnName) ){ - break; - } - } - if( iCol==pTab->nCol ){ + }else{ if( HasRowid(pTab) && sqlite3IsRowid(zColumnName) ){ iCol = pTab->iPKey; pCol = iCol>=0 ? &pTab->aCol[iCol] : 0; diff --git a/src/resolve.c b/src/resolve.c index d6a5144af8..54ce4fb1ea 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -294,7 +294,6 @@ static int lookupName( Schema *pSchema = 0; /* Schema of the expression */ int eNewExprOp = TK_COLUMN; /* New value for pExpr->op on success */ Table *pTab = 0; /* Table holding the row */ - Column *pCol; /* A column of pTab */ ExprList *pFJMatch = 0; /* Matches for FULL JOIN .. USING */ const char *zCol = pRight->u.zToken; @@ -345,7 +344,6 @@ static int lookupName( if( pSrcList ){ for(i=0, pItem=pSrcList->a; inSrc; i++, pItem++){ - u8 hCol; pTab = pItem->pSTab; assert( pTab!=0 && pTab->zName!=0 ); assert( pTab->nCol>0 || pParse->nErr ); @@ -433,43 +431,38 @@ static int lookupName( sqlite3RenameTokenRemap(pParse, 0, (void*)&pExpr->y.pTab); } } - hCol = sqlite3StrIHash(zCol); - for(j=0, pCol=pTab->aCol; jnCol; j++, pCol++){ - if( pCol->hName==hCol - && sqlite3StrICmp(pCol->zCnName, zCol)==0 - ){ - if( cnt>0 ){ - if( pItem->fg.isUsing==0 - || sqlite3IdListIndex(pItem->u3.pUsing, zCol)<0 - ){ - /* Two or more tables have the same column name which is - ** not joined by USING. This is an error. Signal as much - ** by clearing pFJMatch and letting cnt go above 1. */ - sqlite3ExprListDelete(db, pFJMatch); - pFJMatch = 0; - }else - if( (pItem->fg.jointype & JT_RIGHT)==0 ){ - /* An INNER or LEFT JOIN. Use the left-most table */ - continue; - }else - if( (pItem->fg.jointype & JT_LEFT)==0 ){ - /* A RIGHT JOIN. Use the right-most table */ - cnt = 0; - sqlite3ExprListDelete(db, pFJMatch); - pFJMatch = 0; - }else{ - /* For a FULL JOIN, we must construct a coalesce() func */ - extendFJMatch(pParse, &pFJMatch, pMatch, pExpr->iColumn); - } + j = sqlite3ColumnIndex(pTab, zCol); + if( j>=0 ){ + if( cnt>0 ){ + if( pItem->fg.isUsing==0 + || sqlite3IdListIndex(pItem->u3.pUsing, zCol)<0 + ){ + /* Two or more tables have the same column name which is + ** not joined by USING. This is an error. Signal as much + ** by clearing pFJMatch and letting cnt go above 1. */ + sqlite3ExprListDelete(db, pFJMatch); + pFJMatch = 0; + }else + if( (pItem->fg.jointype & JT_RIGHT)==0 ){ + /* An INNER or LEFT JOIN. Use the left-most table */ + continue; + }else + if( (pItem->fg.jointype & JT_LEFT)==0 ){ + /* A RIGHT JOIN. Use the right-most table */ + cnt = 0; + sqlite3ExprListDelete(db, pFJMatch); + pFJMatch = 0; + }else{ + /* For a FULL JOIN, we must construct a coalesce() func */ + extendFJMatch(pParse, &pFJMatch, pMatch, pExpr->iColumn); } - cnt++; - pMatch = pItem; - /* Substitute the rowid (column -1) for the INTEGER PRIMARY KEY */ - pExpr->iColumn = j==pTab->iPKey ? -1 : (i16)j; - if( pItem->fg.isNestedFrom ){ - sqlite3SrcItemColumnUsed(pItem, j); - } - break; + } + cnt++; + pMatch = pItem; + /* Substitute the rowid (column -1) for the INTEGER PRIMARY KEY */ + pExpr->iColumn = j==pTab->iPKey ? -1 : (i16)j; + if( pItem->fg.isNestedFrom ){ + sqlite3SrcItemColumnUsed(pItem, j); } } if( 0==cnt && VisibleRowid(pTab) ){ @@ -559,23 +552,18 @@ static int lookupName( if( pTab ){ int iCol; - u8 hCol = sqlite3StrIHash(zCol); pSchema = pTab->pSchema; cntTab++; - for(iCol=0, pCol=pTab->aCol; iColnCol; iCol++, pCol++){ - if( pCol->hName==hCol - && sqlite3StrICmp(pCol->zCnName, zCol)==0 - ){ - if( iCol==pTab->iPKey ){ - iCol = -1; - } - break; + iCol = sqlite3ColumnIndex(pTab, zCol); + if( iCol>=0 ){ + if( pTab->iPKey==iCol ) iCol = -1; + }else{ + if( sqlite3IsRowid(zCol) && VisibleRowid(pTab) ){ + iCol = -1; + }else{ + iCol = pTab->nCol; } } - if( iCol>=pTab->nCol && sqlite3IsRowid(zCol) && VisibleRowid(pTab) ){ - /* IMP: R-51414-32910 */ - iCol = -1; - } if( iColnCol ){ cnt++; pMatch = 0; diff --git a/src/update.c b/src/update.c index a8e7f77803..979afea1f5 100644 --- a/src/update.c +++ b/src/update.c @@ -465,38 +465,32 @@ void sqlite3Update( */ chngRowid = chngPk = 0; for(i=0; inExpr; i++){ - u8 hCol = sqlite3StrIHash(pChanges->a[i].zEName); /* If this is an UPDATE with a FROM clause, do not resolve expressions ** here. The call to sqlite3Select() below will do that. */ if( nChangeFrom==0 && sqlite3ResolveExprNames(&sNC, pChanges->a[i].pExpr) ){ goto update_cleanup; } - for(j=0; jnCol; j++){ - if( pTab->aCol[j].hName==hCol - && sqlite3StrICmp(pTab->aCol[j].zCnName, pChanges->a[i].zEName)==0 - ){ - if( j==pTab->iPKey ){ - chngRowid = 1; - pRowidExpr = pChanges->a[i].pExpr; - iRowidExpr = i; - }else if( pPk && (pTab->aCol[j].colFlags & COLFLAG_PRIMKEY)!=0 ){ - chngPk = 1; - } -#ifndef SQLITE_OMIT_GENERATED_COLUMNS - else if( pTab->aCol[j].colFlags & COLFLAG_GENERATED ){ - testcase( pTab->aCol[j].colFlags & COLFLAG_VIRTUAL ); - testcase( pTab->aCol[j].colFlags & COLFLAG_STORED ); - sqlite3ErrorMsg(pParse, - "cannot UPDATE generated column \"%s\"", - pTab->aCol[j].zCnName); - goto update_cleanup; - } -#endif - aXRef[j] = i; - break; + j = sqlite3ColumnIndex(pTab, pChanges->a[i].zEName); + if( j>=0 ){ + 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; } - } - if( j>=pTab->nCol ){ +#ifndef SQLITE_OMIT_GENERATED_COLUMNS + else if( pTab->aCol[j].colFlags & COLFLAG_GENERATED ){ + testcase( pTab->aCol[j].colFlags & COLFLAG_VIRTUAL ); + testcase( pTab->aCol[j].colFlags & COLFLAG_STORED ); + sqlite3ErrorMsg(pParse, + "cannot UPDATE generated column \"%s\"", + pTab->aCol[j].zCnName); + goto update_cleanup; + } +#endif + aXRef[j] = i; + }else{ if( pPk==0 && sqlite3IsRowid(pChanges->a[i].zEName) ){ j = -1; chngRowid = 1; diff --git a/src/vdbeblob.c b/src/vdbeblob.c index 6cb36da37a..79698d0af4 100644 --- a/src/vdbeblob.c +++ b/src/vdbeblob.c @@ -192,12 +192,8 @@ int sqlite3_blob_open( pBlob->zDb = db->aDb[sqlite3SchemaToIndex(db, pTab->pSchema)].zDbSName; /* Now search pTab for the exact column. */ - for(iCol=0; iColnCol; iCol++) { - if( sqlite3StrICmp(pTab->aCol[iCol].zCnName, zColumn)==0 ){ - break; - } - } - if( iCol==pTab->nCol ){ + iCol = sqlite3ColumnIndex(pTab, zColumn); + if( iCol<0 ){ sqlite3DbFree(db, zErr); zErr = sqlite3MPrintf(db, "no such column: \"%s\"", zColumn); rc = SQLITE_ERROR; From 66172ceb890bb0e6a03478f02b5603335abdfe1e Mon Sep 17 00:00:00 2001 From: drh <> Date: Sat, 8 Feb 2025 16:16:08 +0000 Subject: [PATCH 199/220] Put a 16-byte hash table for column names on each Table object, to speed up column name lookups. FossilOrigin-Name: 11eb8f99e5c4974cb6ba39e5bbc99f6b88b9e01006b70d5fea85c2a6d4f7044f --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/build.c | 4 ++++ src/select.c | 28 +++++++++++++++++++++++++--- src/sqliteInt.h | 1 + 5 files changed, 39 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index adfd9058d8..66664febff 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\sthe\ssqlite3ColumnIndex()\sroutine\sto\slook\sup\sa\scolumn\sin\sa\stable,\srather\nthan\susing\sa\scustom\sloop.\s\sPerformance\simprovement,\ssize\sreduction,\sand\ncomplexity\sdecrease. -D 2025-02-08T14:15:42.707 +C Put\sa\s16-byte\shash\stable\sfor\scolumn\snames\son\seach\sTable\sobject,\sto\sspeed\nup\scolumn\sname\slookups. +D 2025-02-08T16:16:08.621 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -722,7 +722,7 @@ F src/btmutex.c 79a43670447eacc651519a429f6ece9fd638563cf95b469d6891185ddae2b522 F src/btree.c 63ca6b647342e8cef643863cd0962a542f133e1069460725ba4461dcda92b03c F src/btree.h 18e5e7b2124c23426a283523e5f31a4bff029131b795bb82391f9d2f3136fc50 F src/btreeInt.h 98aadb6dcb77b012cab2574d6a728fad56b337fc946839b9898c4b4c969e30b6 -F src/build.c 48796a45299dbdf6331bc1bf2eb5319330980f469c1eaaed17d487a381cea488 +F src/build.c 83c43ddb517a15673d1dc17f88ea8cd1db06e0d277e6dc666ac8985017a99ac5 F src/callback.c acae8c8dddda41ee85cfdf19b926eefe830f371069f8aadca3aa39adf5b1c859 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c d35723024b963edce9c0fad5b3303e8bb9266083784844baed10a6dedfe26f3b @@ -780,12 +780,12 @@ F src/printf.c 96f7f8baeedc7639da94e4e7a4a2c200e2537c4eec9e5e1c2ffc821f40eb3105 F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c F src/resolve.c 626c24b258b111f75c22107aa5614ad89810df3026f5ca071116d3fe75925c75 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 -F src/select.c 83e88fbb36f89b6703b348777491619554f0fd6f917c9fdf51e4c2e9cda6c04e +F src/select.c 5c8ac3f0b7dd72745719f0137119a6f9016a9c2633a7351ef11c00a43b4c0944 F src/shell.c.in b377a59822f207106424f08aead37e78b609222e98f86f04cc8a03563ccf3237 F src/sqlite.h.in d2902f13ace94d3d3609646bd6d12a2d7a4f6cbdf6a5a4097580ac305f54c3f0 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54 -F src/sqliteInt.h 7585b45f585c82f803ab89ccd475819c6dfb9eae0dc2afcae62c9d894137e0e8 +F src/sqliteInt.h 8cbfef6c26efd539eb93011905f4d3ce7fdb77475d1280764d86f9e7954c464b F src/sqliteLimit.h 1bbdbf72bd0411d003267ffebc59a262f061df5653027a75627d03f48ca30523 F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 91102c04375f83cffcd0f3204870e476636f651710e9e6fb773cf74085ef7636 -R 3617bbdf30502e1c991c0fb4581bc1ec +P 351dbbc2bf0b23efdc625ddaa5dc2239cf2990addf071a04bd41612b341de8c8 +R cda99bdc5b1dd85ef2acf18a1826a5a1 U drh -Z 863c9742465b0aa338b6dd538c7f9637 +Z c5517dc029ab4cf78c2ac97792e86679 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index a40ac617bb..c62113f3d6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -351dbbc2bf0b23efdc625ddaa5dc2239cf2990addf071a04bd41612b341de8c8 +11eb8f99e5c4974cb6ba39e5bbc99f6b88b9e01006b70d5fea85c2a6d4f7044f diff --git a/src/build.c b/src/build.c index 2e28af2d1f..7b80425291 100644 --- a/src/build.c +++ b/src/build.c @@ -1565,6 +1565,10 @@ void sqlite3AddColumn(Parse *pParse, Token sName, Token sType){ pCol->affinity = sqlite3AffinityType(zType, pCol); pCol->colFlags |= COLFLAG_HASTYPE; } + if( p->nCol<=0xff ){ + u8 h = pCol->hName % sizeof(p->aHx); + p->aHx[h] = p->nCol; + } p->nCol++; p->nNVCol++; assert( pParse->isCreate ); diff --git a/src/select.c b/src/select.c index cf25c8e678..e848c46a39 100644 --- a/src/select.c +++ b/src/select.c @@ -319,10 +319,32 @@ int sqlite3JoinType(Parse *pParse, Token *pA, Token *pB, Token *pC){ */ int sqlite3ColumnIndex(Table *pTab, const char *zCol){ int i; - u8 h = sqlite3StrIHash(zCol); + u8 h; Column *pCol; - for(pCol=pTab->aCol, i=0; inCol; pCol++, i++){ - if( pCol->hName==h && sqlite3StrICmp(pCol->zCnName, zCol)==0 ) return i; + + if( pTab->nCol==0 ){ + return -1; + } + h = sqlite3StrIHash(zCol); + + i = pTab->aHx[h % sizeof(pTab->aHx)]; + assert( inCol ); + if( pTab->aCol[i].hName==h + && sqlite3StrICmp(pTab->aCol[i].zCnName, zCol)==0 + ){ + return i; + } + pCol = pTab->aCol; + i = 0; + while( 1 /*exit-by-break*/ ){ + if( pCol->hName==h + && sqlite3StrICmp(pCol->zCnName, zCol)==0 + ){ + return i; + } + i++; + if( i>=pTab->nCol ) break; + pCol++; } return -1; } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index e46744a129..c8ecaf8571 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -2431,6 +2431,7 @@ struct Table { } u; Trigger *pTrigger; /* List of triggers on this object */ Schema *pSchema; /* Schema that contains this table */ + u8 aHx[16]; /* Column aHt[K%sizeof(aHt)] might have hash K */ }; /* From 5b0b8653b665a02686d80ec67f0d93de522f82e5 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sun, 9 Feb 2025 00:54:56 +0000 Subject: [PATCH 200/220] Add the "star" testset to speedtest1. Include it as part of "mix1". FossilOrigin-Name: f1345b84eaae5404268df1d0449c409fe5c4a4f9742bd67a75c7333c8c9cd597 --- manifest | 12 ++--- manifest.uuid | 2 +- test/speedtest1.c | 120 ++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 122 insertions(+), 12 deletions(-) diff --git a/manifest b/manifest index 66664febff..a6ff85864c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Put\sa\s16-byte\shash\stable\sfor\scolumn\snames\son\seach\sTable\sobject,\sto\sspeed\nup\scolumn\sname\slookups. -D 2025-02-08T16:16:08.621 +C Add\sthe\s"star"\stestset\sto\sspeedtest1.\s\sInclude\sit\sas\spart\sof\s"mix1". +D 2025-02-09T00:54:56.995 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -1681,7 +1681,7 @@ F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa F test/speed4p.test 377a0c48e5a92e0b11c1c5ebb1bc9d83a7312c922bc0cb05970ef5d6a96d1f0c F test/speedtest.md ee958457ae1b729d9715ae33c0320600000bf1d9ddea1a88dcf79f56729d6fad F test/speedtest.tcl 185f80f8db275852746e8150137b31ba4aaa1c9a1ecb1e35a3b66cd3f31783b9 x -F test/speedtest1.c 204acd8af326bbca2c28f68166635d4574381f4cabbac1bc243663f5dcc5051d +F test/speedtest1.c ef340d391366afc875d11fc59332601c470154352b0db836b2cba813999a8fb4 F test/spellfix.test 951a6405d49d1a23d6b78027d3877b4a33eeb8221dcab5704b499755bb4f552e F test/spellfix2.test dfc8f519a3fc204cb2dfa8b4f29821ae90f6f8c3 F test/spellfix3.test 0f9efaaa502a0e0a09848028518a6fb096c8ad33 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 351dbbc2bf0b23efdc625ddaa5dc2239cf2990addf071a04bd41612b341de8c8 -R cda99bdc5b1dd85ef2acf18a1826a5a1 +P 11eb8f99e5c4974cb6ba39e5bbc99f6b88b9e01006b70d5fea85c2a6d4f7044f +R 1a1bec3385a102a8e6f260d5d8c260d8 U drh -Z c5517dc029ab4cf78c2ac97792e86679 +Z 34712e1b605bf59fda97cb6a7434984c # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index c62113f3d6..ac22274f1b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -11eb8f99e5c4974cb6ba39e5bbc99f6b88b9e01006b70d5fea85c2a6d4f7044f +f1345b84eaae5404268df1d0449c409fe5c4a4f9742bd67a75c7333c8c9cd597 diff --git a/test/speedtest1.c b/test/speedtest1.c index 9d8ddc4545..c6d5fd4a10 100644 --- a/test/speedtest1.c +++ b/test/speedtest1.c @@ -64,10 +64,9 @@ static const char zHelp[] = " --stats Show statistics at the end\n" " --stmtscanstatus Activate SQLITE_DBCONFIG_STMT_SCANSTATUS\n" " --temp N N from 0 to 9. 0: no temp table. 9: all temp tables\n" - " --testset T Run test-set T (main, cte, rtree, orm, fp, json," - " debug)\n" - " Can be a comma-separated list of values, with /SCALE\n" - " suffixes or macro \"mix1\"\n" + " --testset T Run test-set T (main, cte, rtree, orm, fp, json,\n" + " star, debug). Can be a comma-separated list of\n" + " values, with /SCALE suffixes or macro \"mix1\"\n" " --trace Turn on SQL tracing\n" " --threads N Use up to N threads for sorting\n" " --utf16be Set text encoding to UTF-16BE\n" @@ -1458,6 +1457,114 @@ void testset_fp(void){ speedtest1_end_test(); } +/* +** A testset for star-schema queries. +*/ +void testset_star(void){ + int n; + int i; + n = g.szTest*50; + speedtest1_begin_test(100, "Create a fact table with %d entries", n); + speedtest1_exec( + "CREATE TABLE facttab(" + " attr01 INT," + " attr02 INT," + " attr03 INT," + " data01 TEXT," + " attr04 INT," + " attr05 INT," + " attr06 INT," + " attr07 INT," + " attr08 INT," + " factid INTEGER PRIMARY KEY," + " data02 TEXT" + ");" + ); + speedtest1_exec( + "WITH RECURSIVE counter(nnn) AS" + "(VALUES(1) UNION ALL SELECT nnn+1 FROM counter WHERE nnn<%d)" + "INSERT INTO facttab(attr01,attr02,attr03,attr04,attr05," + "attr06,attr07,attr08,data01,data02)" + "SELECT random()%%12, random()%%13, random()%%14, random()%%15," + "random()%%16, random()%%17, random()%%18, random()%%19," + "concat('data-',nnn), format('%%x',random()) FROM counter;", + n + ); + speedtest1_end_test(); + + speedtest1_begin_test(110, "Create indexes on all attributes columns"); + for(i=1; i<=8; i++){ + speedtest1_exec( + "CREATE INDEX fact_attr%02d ON facttab(attr%02d)", i, i + ); + } + speedtest1_end_test(); + + speedtest1_begin_test(120, "Create dimension tables"); + for(i=1; i<=8; i++){ + speedtest1_exec( + "CREATE TABLE dimension%02d(" + "beta%02d INT, " + "content%02d TEXT, " + "rate%02d REAL)", + i, i, i, i + ); + speedtest1_exec( + "WITH RECURSIVE ctr(nn) AS" + " (VALUES(1) UNION ALL SELECT nn+1 FROM ctr WHERE nn<%d)" + " INSERT INTO dimension%02d" + " SELECT nn%%(%d), concat('content-%02d-',nn)," + " (random()%%10000)*0.125 FROM ctr;", + 4*(i+1), i, 2*(i+1), i + ); + if( i&2 ){ + speedtest1_exec( + "CREATE INDEX dim%02d ON dimension%02d(beta%02d);", + i, i, i + ); + }else{ + speedtest1_exec( + "CREATE INDEX dim%02d ON dimension%02d(beta%02d,content%02d);", + i, i, i, i + ); + } + } + speedtest1_end_test(); + + speedtest1_begin_test(130, "Star query over the entire fact table"); + speedtest1_exec( + "SELECT count(*), max(content04), min(content03), sum(rate04), avg(rate05)" + " FROM facttab, dimension01, dimension02, dimension03, dimension04," + " dimension05, dimension06, dimension07, dimension08" + " WHERE attr01=beta01" + " AND attr02=beta02" + " AND attr03=beta03" + " AND attr04=beta04" + " AND attr05=beta05" + " AND attr06=beta06" + " AND attr07=beta07" + " AND attr08=beta08" + ";" + ); + speedtest1_end_test(); + + speedtest1_begin_test(130, "Star query with LEFT JOINs"); + speedtest1_exec( + "SELECT count(*), max(content04), min(content03), sum(rate04), avg(rate05)" + " FROM facttab LEFT JOIN dimension01 ON attr01=beta01" + " LEFT JOIN dimension02 ON attr02=beta02" + " JOIN dimension03 ON attr03=beta03" + " JOIN dimension04 ON attr04=beta04" + " JOIN dimension05 ON attr05=beta05" + " LEFT JOIN dimension06 ON attr06=beta06" + " JOIN dimension07 ON attr07=beta07" + " JOIN dimension08 ON attr08=beta08" + " WHERE facttab.data01 LIKE 'data-9%%'" + ";" + ); + speedtest1_end_test(); +} + #ifdef SQLITE_ENABLE_RTREE /* Generate two numbers between 1 and mx. The first number is less than ** the second. Usually the numbers are near each other but can sometimes @@ -2560,7 +2667,8 @@ int main(int argc, char **argv){ } g.eTemp = argv[i][0] - '0'; }else if( strcmp(z,"testset")==0 ){ - static char zMix1Tests[] = "main,orm/25,cte/20,json,fp/3,parsenumber/25,rtree/10"; + static char zMix1Tests[] = + "main,orm/25,cte/20,json,fp/3,parsenumber/25,rtree/10,star"; ARGC_VALUE_CHECK(1); zTSet = argv[++i]; if( strcmp(zTSet,"mix1")==0 ) zTSet = zMix1Tests; @@ -2749,6 +2857,8 @@ int main(int argc, char **argv){ testset_orm(); }else if( strcmp(zThisTest,"cte")==0 ){ testset_cte(); + }else if( strcmp(zThisTest,"star")==0 ){ + testset_star(); }else if( strcmp(zThisTest,"fp")==0 ){ testset_fp(); }else if( strcmp(zThisTest,"json")==0 ){ From 3e06f2d79b15754999892a4ded6a7585520294a6 Mon Sep 17 00:00:00 2001 From: stephan Date: Sun, 9 Feb 2025 01:25:00 +0000 Subject: [PATCH 201/220] configure: when transfering ENABLE/OMIT flags from CFLAGS to OPT_FEATURE_FLAGS, also do the same for CPPFLAGS and remove those ENABLE/OMIT flags from CFLAGS/CPPFLAGS to mimic legacy build behavior. Strip ENABLE/OMIT flags from BUILD_CFLAGS but do not transfer those to OPT_FEATURE_FLAGS, also to mimic legacy behavior. This is the second part of a fix discussed at [forum:9801e54665afd728|forum post 9801e54665afd728]. FossilOrigin-Name: 16d307cc6c1e203900e7a2dc0730fc0e453946622a2114a07d64ebb99045cfbf --- autosetup/sqlite-config.tcl | 36 ++++++++++++++++++++++++++++++------ manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 38 insertions(+), 14 deletions(-) diff --git a/autosetup/sqlite-config.tcl b/autosetup/sqlite-config.tcl index cabb32aac0..2a73548662 100644 --- a/autosetup/sqlite-config.tcl +++ b/autosetup/sqlite-config.tcl @@ -230,23 +230,47 @@ proc sqlite-setup-default-cflags {} { # BUILD_CFLAGS is the CFLAGS for CC_FOR_BUILD. define BUILD_CFLAGS [proj-get-env BUILD_CFLAGS {-g}] - # Copy all CFLAGS entries matching -DSQLITE_OMIT* and + # Copy all CFLAGS and CPPFLAGS entries matching -DSQLITE_OMIT* and # -DSQLITE_ENABLE* to OPT_FEATURE_FLAGS. This behavior is derived # from the legacy build and was missing the 3.48.0 release (the # initial Autosetup port). # https://sqlite.org/forum/forumpost/9801e54665afd728 # + # Handling of CPPFLAGS, as well as removing ENABLE/OMIT from + # CFLAGS/CPPFLAGS, was missing in the 3.49.0 release as well. + # # If any configure flags for features are in conflict with - # CFLAGS-specified feature flags, all bets are off. There are no - # guarantees about which one will take precedence. - foreach cf [get-define CFLAGS ""] { + # CFLAGS/CPPFLAGS-specified feature flags, all bets are off. There + # are no guarantees about which one will take precedence. + foreach flagDef {CFLAGS CPPFLAGS} { + set tmp "" + foreach cf [get-define $flagDef ""] { + switch -glob -- $cf { + -DSQLITE_OMIT* - + -DSQLITE_ENABLE* { + sqlite-add-feature-flag $cf + } + default { + lappend tmp $cf + } + } + } + define $flagDef $tmp + } + + # Strip all SQLITE_ENABLE/OMIT flags from BUILD_CFLAGS, + # for compatibility with the legacy build. + set tmp "" + foreach cf [get-define BUILD_CFLAGS ""] { switch -glob -- $cf { -DSQLITE_OMIT* - - -DSQLITE_ENABLE* { - sqlite-add-feature-flag $cf + -DSQLITE_ENABLE* {} + default { + lappend tmp $cf } } } + define BUILD_CFLAGS $tmp } ######################################################################## diff --git a/manifest b/manifest index a6ff85864c..3de37a6e66 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s"star"\stestset\sto\sspeedtest1.\s\sInclude\sit\sas\spart\sof\s"mix1". -D 2025-02-09T00:54:56.995 +C configure:\swhen\stransfering\sENABLE/OMIT\sflags\sfrom\sCFLAGS\sto\sOPT_FEATURE_FLAGS,\salso\sdo\sthe\ssame\sfor\sCPPFLAGS\sand\sremove\sthose\sENABLE/OMIT\sflags\sfrom\sCFLAGS/CPPFLAGS\sto\smimic\slegacy\sbuild\sbehavior.\sStrip\sENABLE/OMIT\sflags\sfrom\sBUILD_CFLAGS\sbut\sdo\snot\stransfer\sthose\sto\sOPT_FEATURE_FLAGS,\salso\sto\smimic\slegacy\sbehavior.\sThis\sis\sthe\ssecond\spart\sof\sa\sfix\sdiscussed\sat\s[forum:9801e54665afd728|forum\spost\s9801e54665afd728]. +D 2025-02-09T01:25:00.990 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -50,7 +50,7 @@ F autosetup/cc.tcl c0fcc50ca91deff8741e449ddad05bcd08268bc31177e613a6343bbd1fd3e F autosetup/jimsh0.c 6573f6bc6ff204de0139692648d7037ca0b6c067bac83a7b4e087f20a86866a4 F autosetup/pkg-config.tcl 4e635bf39022ff65e0d5434339dd41503ea48fc53822c9c5bde88b02d3d952ba F autosetup/proj.tcl af5290ee128ce82dd178a474a9dcfaa7e503c88f0709d916cc6079d9b8c801f4 -F autosetup/sqlite-config.tcl f64aff26763e9ea021aabac222d43a9e0107b45f6de82972b93411fe36ef566b +F autosetup/sqlite-config.tcl d2c6467c557ec0437f2115e94fbe7a77af2d3e6d34b98b8ad85212f5cb890332 F autosetup/system.tcl 51d4be76cd9a9074704b584e5c9cbba616202c8468cf9ba8a4f8294a7ab1dba9 F configure 9a00b21dfd13757bbfb8d89b30660a89ec1f8f3a79402b8f9f9b6fc475c3303a x F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 11eb8f99e5c4974cb6ba39e5bbc99f6b88b9e01006b70d5fea85c2a6d4f7044f -R 1a1bec3385a102a8e6f260d5d8c260d8 -U drh -Z 34712e1b605bf59fda97cb6a7434984c +P f1345b84eaae5404268df1d0449c409fe5c4a4f9742bd67a75c7333c8c9cd597 +R 303d972057cca0b1b2eb8945cbdc8b8b +U stephan +Z 7b9d892b6b2cefdb6b9041463ba9bb8b # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index ac22274f1b..db22146b7e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f1345b84eaae5404268df1d0449c409fe5c4a4f9742bd67a75c7333c8c9cd597 +16d307cc6c1e203900e7a2dc0730fc0e453946622a2114a07d64ebb99045cfbf From f85818268965207d7682438132d51195d4e28bf0 Mon Sep 17 00:00:00 2001 From: stephan Date: Sun, 9 Feb 2025 02:41:35 +0000 Subject: [PATCH 202/220] JS: add a mechanism to the Worker1 exec API to fetch the last_insert_rowid(), as requested in [forum:56bc35390183f5d5|forum post 56bc353901]. FossilOrigin-Name: c22c48360756b1c7e2f5a9c01aff799bc188e100d364931de0dc3686e5de57a9 --- ext/wasm/api/sqlite3-api-worker1.c-pp.js | 25 +++++++++++++++++++----- ext/wasm/demo-worker1-promiser.c-pp.js | 5 ++++- ext/wasm/demo-worker1.js | 5 ++++- manifest | 16 +++++++-------- manifest.uuid | 2 +- 5 files changed, 37 insertions(+), 16 deletions(-) diff --git a/ext/wasm/api/sqlite3-api-worker1.c-pp.js b/ext/wasm/api/sqlite3-api-worker1.c-pp.js index 9918625459..5e088f4384 100644 --- a/ext/wasm/api/sqlite3-api-worker1.c-pp.js +++ b/ext/wasm/api/sqlite3-api-worker1.c-pp.js @@ -279,11 +279,11 @@ The arguments are in the same form accepted by oo1.DB.exec(), with the exceptions noted below. - If the `countChanges` arguments property (added in version 3.43) is - truthy then the `result` property contained by the returned object - will have a `changeCount` property which holds the number of changes - made by the provided SQL. Because the SQL may contain an arbitrary - number of statements, the `changeCount` is calculated by calling + If `args.countChanges` (added in version 3.43) is truthy then the + `result` property contained by the returned object will have a + `changeCount` property which holds the number of changes made by the + provided SQL. Because the SQL may contain an arbitrary number of + statements, the `changeCount` is calculated by calling `sqlite3_total_changes()` before and after the SQL is evaluated. If the value of `countChanges` is 64 then the `changeCount` property will be returned as a 64-bit integer in the form of a BigInt (noting @@ -292,6 +292,15 @@ calling `sqlite3_total_changes64()` before and after the SQL is evaluated. + If the `args.lastInsertRowId` (added in version 3.50.0) is truthy + then the `result` property contained by the returned object will + have a `lastInsertRowId` will hold a BigInt-type value corresponding + to the result of sqlite3_last_insert_rowid(). This value is only + fetched once, after the SQL is run, regardless of how many + statements the SQL contains. This API has no idea whether the SQL + contains any INSERTs, so it is up to the client to apply/rely on + this property only when it makes sense to do so. + A function-type args.callback property cannot cross the window/Worker boundary, so is not useful here. If args.callback is a string then it is assumed to be a @@ -542,6 +551,12 @@ sqlite3.initWorker1API = function(){ if(undefined !== changeCount){ rc.changeCount = db.changes(true,64===rc.countChanges) - changeCount; } + const lastInsertRowId = !!rc.lastInsertRowId + ? sqlite3.capi.sqlite3_last_insert_rowid(db) + : undefined; + if( undefined!==lastInsertRowId ){ + rc.lastInsertRowId = lastInsertRowId; + } if(rc.callback instanceof Function){ rc.callback = theCallback; /* Post a sentinel message to tell the client that the end diff --git a/ext/wasm/demo-worker1-promiser.c-pp.js b/ext/wasm/demo-worker1-promiser.c-pp.js index f6fc9568ae..0b8557b826 100644 --- a/ext/wasm/demo-worker1-promiser.c-pp.js +++ b/ext/wasm/demo-worker1-promiser.c-pp.js @@ -115,6 +115,7 @@ delete globalThis.sqlite3Worker1Promiser; "insert into t(a,b) values(1,2),(3,4),(5,6)" ].join(';'), resultRows: [], columnNames: [], + lastInsertRowId: true, countChanges: sqConfig.bigIntEnabled ? 64 : true }, function(ev){ ev = ev.result; @@ -122,7 +123,9 @@ delete globalThis.sqlite3Worker1Promiser; .assert(0===ev.columnNames.length) .assert(sqConfig.bigIntEnabled ? (3n===ev.changeCount) - : (3===ev.changeCount)); + : (3===ev.changeCount)) + .assert('bigint'===typeof ev.lastInsertRowId) + .assert(ev.lastInsertRowId>=3); }); await wtest('exec',{ diff --git a/ext/wasm/demo-worker1.js b/ext/wasm/demo-worker1.js index 60f5e8dec0..1a05cc7ac2 100644 --- a/ext/wasm/demo-worker1.js +++ b/ext/wasm/demo-worker1.js @@ -156,11 +156,14 @@ sql: ["create table t(a,b);", "insert into t(a,b) values(1,2),(3,4),(5,6)" ], + lastInsertRowId: true, resultRows: [], columnNames: [] }, function(ev){ ev = ev.result; T.assert(0===ev.resultRows.length) - .assert(0===ev.columnNames.length); + .assert(0===ev.columnNames.length) + .assert('bigint'===typeof ev.lastInsertRowId) + .assert(ev.lastInsertRowId>=3); }); runOneTest('exec',{ sql: 'select a a, b b from t order by a', diff --git a/manifest b/manifest index 3de37a6e66..c61d26c043 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C configure:\swhen\stransfering\sENABLE/OMIT\sflags\sfrom\sCFLAGS\sto\sOPT_FEATURE_FLAGS,\salso\sdo\sthe\ssame\sfor\sCPPFLAGS\sand\sremove\sthose\sENABLE/OMIT\sflags\sfrom\sCFLAGS/CPPFLAGS\sto\smimic\slegacy\sbuild\sbehavior.\sStrip\sENABLE/OMIT\sflags\sfrom\sBUILD_CFLAGS\sbut\sdo\snot\stransfer\sthose\sto\sOPT_FEATURE_FLAGS,\salso\sto\smimic\slegacy\sbehavior.\sThis\sis\sthe\ssecond\spart\sof\sa\sfix\sdiscussed\sat\s[forum:9801e54665afd728|forum\spost\s9801e54665afd728]. -D 2025-02-09T01:25:00.990 +C JS:\sadd\sa\smechanism\sto\sthe\sWorker1\sexec\sAPI\sto\sfetch\sthe\slast_insert_rowid(),\sas\srequested\sin\s[forum:56bc35390183f5d5|forum\spost\s56bc353901]. +D 2025-02-09T02:41:35.084 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -641,7 +641,7 @@ F ext/wasm/api/sqlite3-api-cleanup.js 3ac1786e461ada63033143be8c3b00b26b93954066 F ext/wasm/api/sqlite3-api-glue.c-pp.js 5c0209e6a28164b4c2c1a34b0bb4aee3b7b1a264988d7e71fac08b8ede5b7ae3 F ext/wasm/api/sqlite3-api-oo1.c-pp.js f3a8e2004c6625d17946c11f2fb32008be78bc5207bf746fc77d59848813225f F ext/wasm/api/sqlite3-api-prologue.js 5ff913355b3144f1c9719d0406667fa6e13eb813c71ed7ce29440e2e65363e82 -F ext/wasm/api/sqlite3-api-worker1.c-pp.js 5cc22a3c0d52828cb32aad8691488719f47d27567e63e8bc8b832d74371c352d +F ext/wasm/api/sqlite3-api-worker1.c-pp.js f646a65257973b8c4481f8a6a216370b85644f23e64b126e7ae113570587c0ab F ext/wasm/api/sqlite3-license-version-header.js 0c807a421f0187e778dc1078f10d2994b915123c1223fe752b60afdcd1263f89 F ext/wasm/api/sqlite3-opfs-async-proxy.js 3774befd97cd1a5e2895c8225a894aad946848c6d9b4028acc988b5d123475af F ext/wasm/api/sqlite3-vfs-helper.c-pp.js 3f828cc66758acb40e9c5b4dcfd87fd478a14c8fb7f0630264e6c7fa0e57515d @@ -667,9 +667,9 @@ F ext/wasm/demo-123.js c7b3cca50c55841c381a9ca4f9396e5bbdc6114273d0b10a43e378e32 F ext/wasm/demo-jsstorage.html 409c4be4af5f207fb2877160724b91b33ea36a3cd8c204e8da1acb828ffe588e F ext/wasm/demo-jsstorage.js 44e3ae7ec2483b6c511384c3c290beb6f305c721186bcf5398ca4e00004a06b8 F ext/wasm/demo-worker1-promiser.c-pp.html 635cf90685805e21772a5f7a35d1ace80f98a9ef7c42ff04d7a125ddca7e5db8 -F ext/wasm/demo-worker1-promiser.c-pp.js fcc628cb42fcfaf07d250477801de1e6deb1e319d003976612a0db8d76b9fccc +F ext/wasm/demo-worker1-promiser.c-pp.js af168699d3cab1c27ad2364ebe06cd49db300bdbf404e23b00d5742ed52816ba F ext/wasm/demo-worker1.html 2c178c1890a2beb5a5fecb1453e796d067a4b8d3d2a04d65ca2eb1ab2c68ef5d -F ext/wasm/demo-worker1.js 836bece8615b17b1b572584f7b15912236a5947fe8c68b98d2737d7e287447ef +F ext/wasm/demo-worker1.js 08720227e98fa5b44761cf6e219269cee3e9dd0421d8d91459535da776950314 F ext/wasm/dist.make 92ef4ffe33022a50f92d602acabad10bd8dd91759f3eb7df27fc6d7d37072b96 F ext/wasm/example_extra_init.c 2347cd69d19d839ef4e5e77b7855103a7fe3ef2af86f2e8c95839afd8b05862f F ext/wasm/fiddle.make d4969f0322a582c57a22ce3541f10a5b09a609d14eab32891f613f43b3c14d8b @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P f1345b84eaae5404268df1d0449c409fe5c4a4f9742bd67a75c7333c8c9cd597 -R 303d972057cca0b1b2eb8945cbdc8b8b +P 16d307cc6c1e203900e7a2dc0730fc0e453946622a2114a07d64ebb99045cfbf +R 5520495f3ccea7918b4a343a7efb2785 U stephan -Z 7b9d892b6b2cefdb6b9041463ba9bb8b +Z 1bf6695082490bb2a22dcd9297477549 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index db22146b7e..cfcb1b16c1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -16d307cc6c1e203900e7a2dc0730fc0e453946622a2114a07d64ebb99045cfbf +c22c48360756b1c7e2f5a9c01aff799bc188e100d364931de0dc3686e5de57a9 From 00bc96c05c9fb6294c4785037e9ad67e72fcf882 Mon Sep 17 00:00:00 2001 From: stephan Date: Sun, 9 Feb 2025 03:24:00 +0000 Subject: [PATCH 203/220] wasm: when building in -O0 mode (typical dev mode), use -sASSERTIONS=2, else -sASSERTIONS=0, in response [https://github.com/emscripten-core/emscripten/pull/23629/commits/7e3e35cbff9c5688eacb3cddc5045f872d744efd|Emscripten checkin 7e3e35cbff9], which adds assertions to check for the condition reported in [https://github.com/emscripten-core/emscripten/issues/23420|Emscripten ticket 23420]. Update some unrelated JS-side internal docs. FossilOrigin-Name: 1f554610ba5d9d474ec4570bb7ca09125fd2cdfb4976530a4227cc6ebdf3a962 --- ext/wasm/GNUmakefile | 6 ++++++ ext/wasm/api/post-js-header.js | 10 +++++----- ext/wasm/api/sqlite3-api-prologue.js | 12 ++++++------ manifest | 16 ++++++++-------- manifest.uuid | 2 +- 5 files changed, 26 insertions(+), 20 deletions(-) diff --git a/ext/wasm/GNUmakefile b/ext/wasm/GNUmakefile index 4369635cf2..e18ec074c6 100644 --- a/ext/wasm/GNUmakefile +++ b/ext/wasm/GNUmakefile @@ -619,6 +619,12 @@ emcc.exportedRuntimeMethods := \ emcc.jsflags += $(emcc.exportedRuntimeMethods) emcc.jsflags += -sUSE_CLOSURE_COMPILER=0 emcc.jsflags += -sIMPORTED_MEMORY +ifeq (,$(filter -O0,$(emcc_opt))) +emcc.assert ?= 0 +else +emcc.assert ?= 2 +endif +emcc.jsflags += -sASSERTIONS=$(emcc.assert) emcc.jsflags += -sSTRICT_JS=0 # STRICT_JS disabled due to: # https://github.com/emscripten-core/emscripten/issues/18610 diff --git a/ext/wasm/api/post-js-header.js b/ext/wasm/api/post-js-header.js index a543c14f3a..77e3cd227c 100644 --- a/ext/wasm/api/post-js-header.js +++ b/ext/wasm/api/post-js-header.js @@ -8,16 +8,16 @@ point the sqlite3 JS API bits will get set up. */ Module.runSQLite3PostLoadInit = function(EmscriptenModule/*the Emscripten-style module object*/){ - /** ^^^ As don't use Module.postRun, as that runs a different time + /** ^^^ Don't use Module.postRun, as that runs a different time depending on whether this file is built with emcc 3.1.x or 4.0.x. This function name is intentionally obnoxiously verbose to ensure that we don't collide with current and future Emscripten symbol names. */ 'use strict'; - //console.warn("This is the start of the Module.postRun handler."); + //console.warn("This is the start of Module.runSQLite3PostLoadInit()"); /* This function will contain at least the following: - - post-js-header.js (this file) + - post-js-header.js => this file - sqlite3-api-prologue.js => Bootstrapping bits to attach the rest to - common/whwasmutil.js => Replacements for much of Emscripten's glue - jaccwabyt/jaccwabyt.js => Jaccwabyt (C/JS struct binding) @@ -26,8 +26,8 @@ Module.runSQLite3PostLoadInit = function(EmscriptenModule/*the Emscripten-style - sqlite3-api-worker1.js => Worker-based API - sqlite3-vfs-helper.c-pp.js => Utilities for VFS impls - sqlite3-vtab-helper.c-pp.js => Utilities for virtual table impls - - sqlite3-vfs-opfs.c-pp.js => OPFS VFS + - sqlite3-vfs-opfs.c-pp.js => OPFS VFS - sqlite3-vfs-opfs-sahpool.c-pp.js => OPFS SAHPool VFS - sqlite3-api-cleanup.js => final API cleanup - - post-js-footer.js => closes this postRun() function + - post-js-footer.js => closes this function */ diff --git a/ext/wasm/api/sqlite3-api-prologue.js b/ext/wasm/api/sqlite3-api-prologue.js index 277efa14ab..6b032be84d 100644 --- a/ext/wasm/api/sqlite3-api-prologue.js +++ b/ext/wasm/api/sqlite3-api-prologue.js @@ -12,12 +12,12 @@ This file is intended to be combined at build-time with other related code, most notably a header and footer which wraps this - whole file into an Emscripten Module.postRun()-style handler. The - sqlite3 JS API has no hard requirements on Emscripten and does not - expose any Emscripten APIs to clients. It is structured such that - its build can be tweaked to include it in arbitrary WASM - environments which can supply the necessary underlying features - (e.g. a POSIX file I/O layer). + whole file into a single callback which can be run after Emscripten + loads the corresponding WASM module. The sqlite3 JS API has no hard + requirements on Emscripten and does not expose any Emscripten APIs + to clients. It is structured such that its build can be tweaked to + include it in arbitrary WASM environments which can supply the + necessary underlying features (e.g. a POSIX file I/O layer). Main project home page: https://sqlite.org diff --git a/manifest b/manifest index c61d26c043..5332ffd8f1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C JS:\sadd\sa\smechanism\sto\sthe\sWorker1\sexec\sAPI\sto\sfetch\sthe\slast_insert_rowid(),\sas\srequested\sin\s[forum:56bc35390183f5d5|forum\spost\s56bc353901]. -D 2025-02-09T02:41:35.084 +C wasm:\swhen\sbuilding\sin\s-O0\smode\s(typical\sdev\smode),\suse\s-sASSERTIONS=2,\selse\s-sASSERTIONS=0,\sin\sresponse\s[https://github.com/emscripten-core/emscripten/pull/23629/commits/7e3e35cbff9c5688eacb3cddc5045f872d744efd|Emscripten\scheckin\s7e3e35cbff9],\swhich\sadds\sassertions\sto\scheck\sfor\sthe\scondition\sreported\sin\s[https://github.com/emscripten-core/emscripten/issues/23420|Emscripten\sticket\s23420].\sUpdate\ssome\sunrelated\sJS-side\sinternal\sdocs. +D 2025-02-09T03:24:00.963 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -619,7 +619,7 @@ F ext/session/sqlite3session.c 52a680dbb03c4734748b215d95987fb4d95ab23baaf053a01 F ext/session/sqlite3session.h 683ccbf16e2c2521661fc4c1cf918ce57002039efbcabcd8097fa4bca569104b F ext/session/test_session.c 12e0a2c15fd60f92da4bb29c697c9177ff0c0dbcdc5129a54c47e999f147937a F ext/wasm/EXPORTED_FUNCTIONS.fiddle.in 27450c8b8c70875a260aca55435ec927068b34cef801a96205adb81bdcefc65c -F ext/wasm/GNUmakefile df23a3cb3bfb13f17fc76132a0127a89e2ad64f46b71efee9743929cfd52d441 +F ext/wasm/GNUmakefile 654f27c0735e83c63f541b1964ef0f57423ceb71b05146de90c56b2f534f7b3b F ext/wasm/README-dist.txt f01081a850ce38a56706af6b481e3a7878e24e42b314cfcd4b129f0f8427066a F ext/wasm/README.md b89605f65661cf35bf034ff6d43e448cc169b8017fc105d498e33b81218b482c F ext/wasm/SQLTester/GNUmakefile e0794f676d55819951bbfae45cc5e8d7818dc460492dc317ce7f0d2eca15caff @@ -635,12 +635,12 @@ F ext/wasm/api/README.md c64ec8e84449c069e0217706d9d7d31b3bd53627228b2ba0c3cddbd F ext/wasm/api/extern-post-js.c-pp.js 3fcd904f1204685dea84e5ae90d8b7e65a1dcebab1e838386d8328b74cce46c9 F ext/wasm/api/extern-pre-js.js cc61c09c7a24a07dbecb4c352453c3985170cec12b4e7e7e7a4d11d43c5c8f41 F ext/wasm/api/post-js-footer.js 365405929f41ca0e6d389ed8a8da3f3c93e11d3ef43a90ae151e37fa9f75bf41 -F ext/wasm/api/post-js-header.js 54b2b4294501b3866245cc94315a16f5424c0e87729d0fb610fba151593c6d26 +F ext/wasm/api/post-js-header.js 53740d824e5d9027eb1e6fd59e216abbd2136740ce260ea5f0699ff2acb0a701 F ext/wasm/api/pre-js.c-pp.js a614a2c82b12c4d96d8e3ba77330329efc53c4d56a8a7e60ade900f341866cfb F ext/wasm/api/sqlite3-api-cleanup.js 3ac1786e461ada63033143be8c3b00b26b939540661f3e839515bb92f2e35359 F ext/wasm/api/sqlite3-api-glue.c-pp.js 5c0209e6a28164b4c2c1a34b0bb4aee3b7b1a264988d7e71fac08b8ede5b7ae3 F ext/wasm/api/sqlite3-api-oo1.c-pp.js f3a8e2004c6625d17946c11f2fb32008be78bc5207bf746fc77d59848813225f -F ext/wasm/api/sqlite3-api-prologue.js 5ff913355b3144f1c9719d0406667fa6e13eb813c71ed7ce29440e2e65363e82 +F ext/wasm/api/sqlite3-api-prologue.js 9e7d89a2c0d02b8b2052a62757a89f1e7e4dbcc0d9cd3f2dafa896786954dad2 F ext/wasm/api/sqlite3-api-worker1.c-pp.js f646a65257973b8c4481f8a6a216370b85644f23e64b126e7ae113570587c0ab F ext/wasm/api/sqlite3-license-version-header.js 0c807a421f0187e778dc1078f10d2994b915123c1223fe752b60afdcd1263f89 F ext/wasm/api/sqlite3-opfs-async-proxy.js 3774befd97cd1a5e2895c8225a894aad946848c6d9b4028acc988b5d123475af @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 16d307cc6c1e203900e7a2dc0730fc0e453946622a2114a07d64ebb99045cfbf -R 5520495f3ccea7918b4a343a7efb2785 +P c22c48360756b1c7e2f5a9c01aff799bc188e100d364931de0dc3686e5de57a9 +R 28b52c82e3748c1458cec26f6dc126a2 U stephan -Z 1bf6695082490bb2a22dcd9297477549 +Z f11611286d8691d31123798a11e49271 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index cfcb1b16c1..5585f98c01 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c22c48360756b1c7e2f5a9c01aff799bc188e100d364931de0dc3686e5de57a9 +1f554610ba5d9d474ec4570bb7ca09125fd2cdfb4976530a4227cc6ebdf3a962 From e108f97256c2cc60f21edc171ccfcd5eebdf2865 Mon Sep 17 00:00:00 2001 From: stephan Date: Sun, 9 Feb 2025 04:16:01 +0000 Subject: [PATCH 204/220] wasm: add some build-time validation to ensure that the problem fixed in [65798c09a00662a3] does not recur. Ensure that files generated via mkwasmbuilds.c have the generated makefile as a dependency. FossilOrigin-Name: 55e01365946b3432e93da5c08200e476e2a134c98b963b4170e4dfae8408a005 --- ext/wasm/GNUmakefile | 6 +++--- ext/wasm/mkwasmbuilds.c | 23 +++++++++++++++++------ manifest | 15 ++++++++------- manifest.uuid | 2 +- 4 files changed, 29 insertions(+), 17 deletions(-) diff --git a/ext/wasm/GNUmakefile b/ext/wasm/GNUmakefile index e18ec074c6..c9852e389c 100644 --- a/ext/wasm/GNUmakefile +++ b/ext/wasm/GNUmakefile @@ -165,7 +165,7 @@ dir.wasmfs := $(dir.dout) MKDIR.bld := $(dir.tmp) $(MKDIR.bld): - -mkdir -p $@ $(dir.dout) + @mkdir -p $@ $(dir.dout) CLEAN_FILES += *~ $(dir.jacc)/*~ $(dir.api)/*~ $(dir.common)/*~ $(dir.fiddle)/*~ \ $(dir.fiddle-debug)/* $(dir.dout)/* $(dir.tmp)/* @@ -424,8 +424,8 @@ define SQLITE.CALL.C-PP.FILTER # $1 = Input file: c-pp -f $(1).js # $2 = Output file: c-pp -o $(2).js # $3 = optional c-pp -D... flags -$(2): $(1) $$(MAKEFILE) $$(bin.c-pp) - mkdir -p $$(dir $$@) +$(2): $(1) $$(MAKEFILE_LIST) $$(bin.c-pp) + @mkdir -p $$(dir $$@) $$(bin.c-pp) -f $(1) -o $$@ $(3) $(SQLITE.CALL.C-PP.FILTER.global) #CLEAN_FILES += $(2) endef diff --git a/ext/wasm/mkwasmbuilds.c b/ext/wasm/mkwasmbuilds.c index e762b572cd..91c03b6d42 100644 --- a/ext/wasm/mkwasmbuilds.c +++ b/ext/wasm/mkwasmbuilds.c @@ -151,7 +151,7 @@ static void mk_pre_post(const char *zName /* build name */, /* --pre-js=... */ pf("pre-js.js.%s-%s := $(dir.tmp)/pre-js.%s-%s.js\n", zNM, zNM); - pf("$(pre-js.js.%s-%s): $(MAKEFILE)\n", zNM); + pf("$(pre-js.js.%s-%s): $(MAKEFILE_LIST)\n", zNM); #if 1 pf("$(eval $(call SQLITE.CALL.C-PP.FILTER,$(pre-js.js.in),$(pre-js.js.%s-%s)," "$(c-pp.D.%s-%s)))\n", zNM, zNM); @@ -218,7 +218,7 @@ static void mk_fiddle(){ pf("fiddle-module.js%s := %s/fiddle-module.js\n", zTail, zDir); pf("fiddle-module.wasm%s := " "$(subst .js,.wasm,$(fiddle-module.js%s))\n", zTail, zTail); - pf("$(fiddle-module.js%s):%s $(MAKEFILE) $(MAKEFILE.fiddle) " + pf("$(fiddle-module.js%s):%s $(MAKEFILE_LIST) $(MAKEFILE.fiddle) " "$(EXPORTED_FUNCTIONS.fiddle) " "$(fiddle.cses) $(pre-post-fiddle-module-vanilla.deps) " "$(SOAP.js)\n", @@ -285,7 +285,7 @@ static void mk_lib_mode(const char *zName /* build name */, zApiJsOut, zCmppD); /* target zJsOut */ - pf("%s: %s $(MAKEFILE) $(sqlite3-wasm.cfiles) $(EXPORTED_FUNCTIONS.api) " + pf("%s: %s $(MAKEFILE_LIST) $(sqlite3-wasm.cfiles) $(EXPORTED_FUNCTIONS.api) " "$(pre-post-%s-%s.deps) " "$(sqlite3-api.ext.jses)" /* ^^^ maintenance reminder: we set these as deps so that they @@ -304,9 +304,10 @@ static void mk_lib_mode(const char *zName /* build name */, "\t\t$(cflags.%s) $(cflags.%s.%s) \\\n" "\t\t$(cflags.wasm_extra_init) $(sqlite3-wasm.cfiles)\n", zName, zNM); if( bIsEsm ){ - /* TODO? Replace this CALL with the corresponding makefile code. - ** OTOH, we also use this $(call) in the speedtest1-wasmfs build, - ** which is not part of the rules emitted by this program. */ + /* TODO? Replace this $(call) with the corresponding makefile + ** code. OTOH, we also use this $(call) in the speedtest1-wasmfs + ** build, which is not part of the rules emitted by this + ** program. */ pf("\t@$(call SQLITE.CALL.xJS.ESM-EXPORT-DEFAULT,1,%d)\n", 0==strcmp("sqlite3-wasmfs", zName) ? 1 : 0); } @@ -338,6 +339,16 @@ static void mk_lib_mode(const char *zName /* build name */, /* ^^^^^^ reminder: Mac/BSD sed has no -i flag */ zNM, zName); pf("\t@ls -la $@\n"); + if( 0==strcmp("bundler-friendly", zMode) ){ + /* Avoid a 3rd occurance of the bug fixed by 65798c09a00662a3, + ** which was (in two cases) caused by makefile refactoring and + ** not recognized until after a release was made with the broken + ** sqlite3-bundler-friendly.mjs: */ + pf("\t@if grep -e '^ *importScripts(' $@; " + "then echo 'ERROR: bug fixed in 65798c09a00662a3 has re-appeared'; " + "exit 1; fi;\n"); + } + }else{ pf("\t@ls -la %s $@\n", zWasmOut); } diff --git a/manifest b/manifest index 5332ffd8f1..1172e83ce6 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C wasm:\swhen\sbuilding\sin\s-O0\smode\s(typical\sdev\smode),\suse\s-sASSERTIONS=2,\selse\s-sASSERTIONS=0,\sin\sresponse\s[https://github.com/emscripten-core/emscripten/pull/23629/commits/7e3e35cbff9c5688eacb3cddc5045f872d744efd|Emscripten\scheckin\s7e3e35cbff9],\swhich\sadds\sassertions\sto\scheck\sfor\sthe\scondition\sreported\sin\s[https://github.com/emscripten-core/emscripten/issues/23420|Emscripten\sticket\s23420].\sUpdate\ssome\sunrelated\sJS-side\sinternal\sdocs. -D 2025-02-09T03:24:00.963 +C wasm:\sadd\ssome\sbuild-time\svalidation\sto\sensure\sthat\sthe\sproblem\sfixed\sin\s[65798c09a00662a3]\sdoes\snot\srecur.\sEnsure\sthat\sfiles\sgenerated\svia\smkwasmbuilds.c\shave\sthe\sgenerated\smakefile\sas\sa\sdependency. +D 2025-02-09T04:16:01.518 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -619,7 +619,7 @@ F ext/session/sqlite3session.c 52a680dbb03c4734748b215d95987fb4d95ab23baaf053a01 F ext/session/sqlite3session.h 683ccbf16e2c2521661fc4c1cf918ce57002039efbcabcd8097fa4bca569104b F ext/session/test_session.c 12e0a2c15fd60f92da4bb29c697c9177ff0c0dbcdc5129a54c47e999f147937a F ext/wasm/EXPORTED_FUNCTIONS.fiddle.in 27450c8b8c70875a260aca55435ec927068b34cef801a96205adb81bdcefc65c -F ext/wasm/GNUmakefile 654f27c0735e83c63f541b1964ef0f57423ceb71b05146de90c56b2f534f7b3b +F ext/wasm/GNUmakefile 06e0556e9840fd3d8870997025c2507ace9ba7bf11195f770295fc7947dfc1b5 F ext/wasm/README-dist.txt f01081a850ce38a56706af6b481e3a7878e24e42b314cfcd4b129f0f8427066a F ext/wasm/README.md b89605f65661cf35bf034ff6d43e448cc169b8017fc105d498e33b81218b482c F ext/wasm/SQLTester/GNUmakefile e0794f676d55819951bbfae45cc5e8d7818dc460492dc317ce7f0d2eca15caff @@ -680,7 +680,7 @@ F ext/wasm/index-dist.html 56132399702b15d70c474c3f1952541e25cb0922942868f70daf1 F ext/wasm/index.html e4bbffdb3d40eff12b3f9c7abedef91787e2935620b7f8d40f2c774b80ad8fa9 F ext/wasm/jaccwabyt/jaccwabyt.js 1264710db3cfbcb6887d95665b7aeba60c1126eaef789ca4cf1a4a17d5bc7f54 F ext/wasm/jaccwabyt/jaccwabyt.md 59a20df389abcc3606eb4eaea7fb7ba14504beb3e345dbea9b99a0618ba3bec8 -F ext/wasm/mkwasmbuilds.c 954fe4242e877aeb60de44070628f5215ff51e5d102db6e2cb7da8c21e9e3401 +F ext/wasm/mkwasmbuilds.c baf6636e139e2c1e3b56e8dc26073ec80f6d14ae1876b023985315f43ccf312b F ext/wasm/module-symbols.html dc476b403369b26a1a23773e13b80f41b9a49f0825e81435fe3600a7cfbbe337 F ext/wasm/scratchpad-wasmfs.html a3d7388f3c4b263676b58b526846e9d02dfcb4014ff29d3a5040935286af5b96 F ext/wasm/scratchpad-wasmfs.mjs 66034b9256b218de59248aad796760a1584c1dd842231505895eff00dbd57c63 @@ -2209,8 +2209,9 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P c22c48360756b1c7e2f5a9c01aff799bc188e100d364931de0dc3686e5de57a9 -R 28b52c82e3748c1458cec26f6dc126a2 +P 1f554610ba5d9d474ec4570bb7ca09125fd2cdfb4976530a4227cc6ebdf3a962 +Q +012b308b04e6a9e3acbb842317b01b4b91ac165b925918cf20c1f52d045a6ec0 +R 808b1c99ce5bd703201eda0df9bba093 U stephan -Z f11611286d8691d31123798a11e49271 +Z 6ac45fbba274f684a5ae3627af8e6a38 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 5585f98c01..f2651eae98 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1f554610ba5d9d474ec4570bb7ca09125fd2cdfb4976530a4227cc6ebdf3a962 +55e01365946b3432e93da5c08200e476e2a134c98b963b4170e4dfae8408a005 From 63f49265244842f04ae40d14df0bc8b434ca85e1 Mon Sep 17 00:00:00 2001 From: stephan Date: Sun, 9 Feb 2025 04:38:56 +0000 Subject: [PATCH 205/220] configure: if the linker supports --out-implib, generate libsqlite3.X.a, where X is the platform's DLL file extension. Discussion in/around [forum:0c7fc097b2|forum post 0c7fc097b2]. FossilOrigin-Name: 6092b0b86bf93a3d58a83774b6d07ef9735e6c8a0f2ac2d0a6d263c2e9f1e3ca --- Makefile.in | 6 ++++-- autosetup/sqlite-config.tcl | 22 ++++++++++++++++++++++ main.mk | 2 +- manifest | 17 ++++++++--------- manifest.uuid | 2 +- 5 files changed, 36 insertions(+), 13 deletions(-) diff --git a/Makefile.in b/Makefile.in index f514046e00..b932f56e20 100644 --- a/Makefile.in +++ b/Makefile.in @@ -121,8 +121,10 @@ LDFLAGS.icu = @LDFLAGS_ICU@ CFLAGS.icu = @CFLAGS_ICU@ LDFLAGS.libsqlite3.soname = @LDFLAGS_LIBSQLITE3_SONAME@ # soname: see https://sqlite.org/src/forumpost/5a3b44f510df8ded -LDFLAGS.libsqlite3.os-specific = @LDFLAGS_MAC_CVERSION@ -# os-specific: see https://sqlite.org/forum/forumpost/9dfd5b8fd525a5d7 +LDFLAGS.libsqlite3.os-specific = @LDFLAGS_MAC_CVERSION@ @LDFLAGS_OUT_IMPLIB@ +# os-specific: see +# - https://sqlite.org/forum/forumpost/9dfd5b8fd525a5d7 +# - https://sqlite.org/forum/forumpost/0c7fc097b2 ENABLE_SHARED = @ENABLE_SHARED@ ENABLE_STATIC = @ENABLE_STATIC@ HAVE_WASI_SDK = @HAVE_WASI_SDK@ diff --git a/autosetup/sqlite-config.tcl b/autosetup/sqlite-config.tcl index 2a73548662..f1888084e4 100644 --- a/autosetup/sqlite-config.tcl +++ b/autosetup/sqlite-config.tcl @@ -920,11 +920,33 @@ proc sqlite-check-mac-cversion {} { return $rc } +######################################################################## +# Define LDFLAGS_OUT_IMPLIB to either an empty string or to a +# -Wl,... flag for the platform-specific --out-implib flag, which is +# used for building an "import library .dll.a" file on some platforms +# (e.g. mingw). Returns 1 if supported, else 0. +# +# Added in response to: https://sqlite.org/forum/forumpost/0c7fc097b2 +proc sqlite-check-out-implib {} { + define LDFLAGS_OUT_IMPLIB "" + set rc 0 + cc-with {} { + set dll "libsqlite3[get-define TARGET_DLLEXT]" + set flags "-Wl,--out-implib,${dll}.a" + if {[cc-check-flags $flags]} { + define LDFLAGS_OUT_IMPLIB $flags + set rc 1 + } + } + return $rc +} + ######################################################################## # Performs late-stage config steps common to both the canonical and # autoconf bundle builds. proc sqlite-common-late-stage-config {} { sqlite-check-mac-cversion + sqlite-check-out-implib sqlite-process-dot-in-files sqlite-post-config-validation } diff --git a/main.mk b/main.mk index 27b8848879..f5d8185f71 100644 --- a/main.mk +++ b/main.mk @@ -2332,7 +2332,7 @@ tidy: tidy-. rm -f lemon$(B.exe) sqlite*.tar.gz rm -f mkkeywordhash$(B.exe) mksourceid$(B.exe) rm -f parse.* fts5parse.* - rm -f $(libsqlite3.SO) $(libsqlite3.LIB) $(libtclsqlite3.SO) + rm -f $(libsqlite3.SO) $(libsqlite3.LIB) $(libtclsqlite3.SO) libsqlite3$(T.dll).a rm -f tclsqlite3$(T.exe) $(TESTPROGS) rm -f LogEst$(T.exe) fts3view$(T.exe) rollback-test$(T.exe) showdb$(T.exe) rm -f showjournal$(T.exe) showstat4$(T.exe) showwal$(T.exe) speedtest1$(T.exe) diff --git a/manifest b/manifest index 1172e83ce6..ea5197a572 100644 --- a/manifest +++ b/manifest @@ -1,9 +1,9 @@ -C wasm:\sadd\ssome\sbuild-time\svalidation\sto\sensure\sthat\sthe\sproblem\sfixed\sin\s[65798c09a00662a3]\sdoes\snot\srecur.\sEnsure\sthat\sfiles\sgenerated\svia\smkwasmbuilds.c\shave\sthe\sgenerated\smakefile\sas\sa\sdependency. -D 2025-02-09T04:16:01.518 +C configure:\sif\sthe\slinker\ssupports\s--out-implib,\sgenerate\slibsqlite3.X.a,\swhere\sX\sis\sthe\splatform's\sDLL\sfile\sextension.\sDiscussion\sin/around\s[forum:0c7fc097b2|forum\spost\s0c7fc097b2]. +D 2025-02-09T04:38:56.042 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d -F Makefile.in 85ed87882b5d3fd11e6403212f2120e5e07d341bc96a101cfa9475901edd0754 +F Makefile.in 63c4d6e535dac4b7f6a6ffa566c96e3d68fa7f244799c38ee1e3d59305c5b55b F Makefile.linux-generic bd3e3cacd369821a6241d4ea1967395c962dfe3057e38cb0a435cee0e8b789d0 F Makefile.msc a9b95ae9807e17f9b0734ebe97d68032141c3f95286bb64593cb73b206f043cf F README.md c3c0f19532ce28f6297a71870f3c7b424729f0e6d9ab889616d3587dd2332159 @@ -50,7 +50,7 @@ F autosetup/cc.tcl c0fcc50ca91deff8741e449ddad05bcd08268bc31177e613a6343bbd1fd3e F autosetup/jimsh0.c 6573f6bc6ff204de0139692648d7037ca0b6c067bac83a7b4e087f20a86866a4 F autosetup/pkg-config.tcl 4e635bf39022ff65e0d5434339dd41503ea48fc53822c9c5bde88b02d3d952ba F autosetup/proj.tcl af5290ee128ce82dd178a474a9dcfaa7e503c88f0709d916cc6079d9b8c801f4 -F autosetup/sqlite-config.tcl d2c6467c557ec0437f2115e94fbe7a77af2d3e6d34b98b8ad85212f5cb890332 +F autosetup/sqlite-config.tcl 6bff327462d34d2d9fe45738b0be70b80cf709de91b8c3b8a921cbdc2f05f6ff F autosetup/system.tcl 51d4be76cd9a9074704b584e5c9cbba616202c8468cf9ba8a4f8294a7ab1dba9 F configure 9a00b21dfd13757bbfb8d89b30660a89ec1f8f3a79402b8f9f9b6fc475c3303a x F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad @@ -702,7 +702,7 @@ F ext/wasm/tests/opfs/concurrency/test.js d08889a5bb6e61937d0b8cbb78c9efbefbf65a F ext/wasm/tests/opfs/concurrency/worker.js 0a8c1a3e6ebb38aabbee24f122693f1fb29d599948915c76906681bb7da1d3d2 F ext/wasm/wasmfs.make 68999f5bd8c489239592d59a420f8c627c99169bbd6fa16a404751f757b9f702 F magic.txt 5ade0bc977aa135e79e3faaea894d5671b26107cc91e70783aa7dc83f22f3ba0 -F main.mk 0e3695222412c9388d8e7db612249cd0cd02722c62a16c48be7c77a7639628a8 +F main.mk 7c9df07a41c406a5fbe4e7e4021f29fa4f18821d61354721fd0435fc24f95321 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 F mptest/crash01.test 61e61469e257df0850df4293d7d4d6c2af301421 @@ -2209,9 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 1f554610ba5d9d474ec4570bb7ca09125fd2cdfb4976530a4227cc6ebdf3a962 -Q +012b308b04e6a9e3acbb842317b01b4b91ac165b925918cf20c1f52d045a6ec0 -R 808b1c99ce5bd703201eda0df9bba093 +P 55e01365946b3432e93da5c08200e476e2a134c98b963b4170e4dfae8408a005 +R e1eadfc29a299ad14b7e6250e28c0f67 U stephan -Z 6ac45fbba274f684a5ae3627af8e6a38 +Z 4dcc7ba8a1a116665e01ae1e0e3cb31a # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index f2651eae98..474bb40f6f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -55e01365946b3432e93da5c08200e476e2a134c98b963b4170e4dfae8408a005 +6092b0b86bf93a3d58a83774b6d07ef9735e6c8a0f2ac2d0a6d263c2e9f1e3ca From 79d0aa6f56dfdbe2acdc682ba9ebe1deb87fe438 Mon Sep 17 00:00:00 2001 From: stephan Date: Sun, 9 Feb 2025 05:30:47 +0000 Subject: [PATCH 206/220] Apply [6092b0b8] to autoconf/Makefile.in. FossilOrigin-Name: 9ae245cff49716e4c0bbd3fbb3f82276e5fb54d595d1e1d9a452edef45d7740f --- autoconf/Makefile.in | 6 ++++-- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/autoconf/Makefile.in b/autoconf/Makefile.in index b41c03e76c..1677c751ee 100644 --- a/autoconf/Makefile.in +++ b/autoconf/Makefile.in @@ -126,8 +126,10 @@ OPT_FEATURE_FLAGS = @OPT_FEATURE_FLAGS@ LDFLAGS.libsqlite3.soname = @LDFLAGS_LIBSQLITE3_SONAME@ # soname: see https://sqlite.org/src/forumpost/5a3b44f510df8ded -LDFLAGS.libsqlite3.os-specific = @LDFLAGS_MAC_CVERSION@ -# os-specific: see https://sqlite.org/forum/forumpost/9dfd5b8fd525a5d7 +LDFLAGS.libsqlite3.os-specific = @LDFLAGS_MAC_CVERSION@ @LDFLAGS_OUT_IMPLIB@ +# os-specific: see +# - https://sqlite.org/forum/forumpost/9dfd5b8fd525a5d7 +# - https://sqlite.org/forum/forumpost/0c7fc097b2 LDFLAGS.libsqlite3 = \ $(LDFLAGS.rpath) $(LDFLAGS.pthread) \ diff --git a/manifest b/manifest index ea5197a572..1a5a36f8ee 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C configure:\sif\sthe\slinker\ssupports\s--out-implib,\sgenerate\slibsqlite3.X.a,\swhere\sX\sis\sthe\splatform's\sDLL\sfile\sextension.\sDiscussion\sin/around\s[forum:0c7fc097b2|forum\spost\s0c7fc097b2]. -D 2025-02-09T04:38:56.042 +C Apply\s[6092b0b8]\sto\sautoconf/Makefile.in. +D 2025-02-09T05:30:47.201 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -16,7 +16,7 @@ F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2 F art/sqlite370.svg 40b7e2fe8aac3add5d56dd86ab8d427a4eca5bcb3fe4f8946cb3794e1821d531 F auto.def fdd6965e06bce02a8b9f9ed57a52d05bcbec4b56e4bef2174866bb5713c65fda F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac -F autoconf/Makefile.in ee765abbb5de7281932f8ea14123cd5a854a05cab692f39626af89a371bee81f +F autoconf/Makefile.in 916e354c3d3b1169daff2053c299f38e41cf4205abfbbd432a9bd544d1f9ca31 F autoconf/Makefile.msc 0a071367537dc395285a5d624ac4f99f3a387b27cc5e89752423c0499e15aec4 F autoconf/README.first f1d3876e9a7852c22f275a6f06814e64934cecbc0b5b9617d64849094c1fd136 F autoconf/README.txt 7f01dc3915e2d68f329011073662369e62a0938a2c69398807823c57591cb288 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 55e01365946b3432e93da5c08200e476e2a134c98b963b4170e4dfae8408a005 -R e1eadfc29a299ad14b7e6250e28c0f67 +P 6092b0b86bf93a3d58a83774b6d07ef9735e6c8a0f2ac2d0a6d263c2e9f1e3ca +R 8546c978240013284036f5addd99955c U stephan -Z 4dcc7ba8a1a116665e01ae1e0e3cb31a +Z bd5a02db20f1b0dda736d80da15a42fa # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 474bb40f6f..0491610ca3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6092b0b86bf93a3d58a83774b6d07ef9735e6c8a0f2ac2d0a6d263c2e9f1e3ca +9ae245cff49716e4c0bbd3fbb3f82276e5fb54d595d1e1d9a452edef45d7740f From b85b7f257dc760768172c30d5b8d442737d7dec9 Mon Sep 17 00:00:00 2001 From: stephan Date: Sun, 9 Feb 2025 05:37:25 +0000 Subject: [PATCH 207/220] Update the 'clean' rules for autoconf/Makefile.in to account for [6092b0b8]. FossilOrigin-Name: f3a35fdc9113ad5f1fed6a2f474aee670e1793d355475a7971d376bf33823cc4 --- autoconf/Makefile.in | 2 +- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/autoconf/Makefile.in b/autoconf/Makefile.in index 1677c751ee..16e60879ea 100644 --- a/autoconf/Makefile.in +++ b/autoconf/Makefile.in @@ -221,7 +221,7 @@ install: install-man1 clean: rm -f *.o sqlite3$(T.exe) - rm -f $(libsqlite3.LIB) $(libsqlite3.SO) + rm -f $(libsqlite3.LIB) $(libsqlite3.SO) $(libsqlite3.SO).a distclean: clean rm -f jimsh0$(T.exe) config.* sqlite3.pc diff --git a/manifest b/manifest index 1a5a36f8ee..da0b642c00 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Apply\s[6092b0b8]\sto\sautoconf/Makefile.in. -D 2025-02-09T05:30:47.201 +C Update\sthe\s'clean'\srules\sfor\sautoconf/Makefile.in\sto\saccount\sfor\s[6092b0b8]. +D 2025-02-09T05:37:25.111 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -16,7 +16,7 @@ F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2 F art/sqlite370.svg 40b7e2fe8aac3add5d56dd86ab8d427a4eca5bcb3fe4f8946cb3794e1821d531 F auto.def fdd6965e06bce02a8b9f9ed57a52d05bcbec4b56e4bef2174866bb5713c65fda F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac -F autoconf/Makefile.in 916e354c3d3b1169daff2053c299f38e41cf4205abfbbd432a9bd544d1f9ca31 +F autoconf/Makefile.in f706b48abb13553ecc5034d5fc296d424fd36d73c222285b7590004dec508925 F autoconf/Makefile.msc 0a071367537dc395285a5d624ac4f99f3a387b27cc5e89752423c0499e15aec4 F autoconf/README.first f1d3876e9a7852c22f275a6f06814e64934cecbc0b5b9617d64849094c1fd136 F autoconf/README.txt 7f01dc3915e2d68f329011073662369e62a0938a2c69398807823c57591cb288 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 6092b0b86bf93a3d58a83774b6d07ef9735e6c8a0f2ac2d0a6d263c2e9f1e3ca -R 8546c978240013284036f5addd99955c +P 9ae245cff49716e4c0bbd3fbb3f82276e5fb54d595d1e1d9a452edef45d7740f +R cdceaad430550f7ec94e5d96f00f7ab4 U stephan -Z bd5a02db20f1b0dda736d80da15a42fa +Z 4725199d04d2eeff317384520a0a53f5 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 0491610ca3..f76b8288c0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9ae245cff49716e4c0bbd3fbb3f82276e5fb54d595d1e1d9a452edef45d7740f +f3a35fdc9113ad5f1fed6a2f474aee670e1793d355475a7971d376bf33823cc4 From 3bdebaeabb4266be82ad1ab06fd5e901f5dcba72 Mon Sep 17 00:00:00 2001 From: drh <> Date: Sun, 9 Feb 2025 19:49:46 +0000 Subject: [PATCH 208/220] Performance and size optimization for the sqlite3ColumnIndex() routine. FossilOrigin-Name: a93e3fe0ee8f98a7ec0dfb2e1abf432cc9d5f9d3ad345b5db261475215d43df9 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/build.c | 3 +-- src/select.c | 25 +++++++++++++------------ 4 files changed, 23 insertions(+), 23 deletions(-) diff --git a/manifest b/manifest index da0b642c00..4b5d165af9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sthe\s'clean'\srules\sfor\sautoconf/Makefile.in\sto\saccount\sfor\s[6092b0b8]. -D 2025-02-09T05:37:25.111 +C Performance\sand\ssize\soptimization\sfor\sthe\ssqlite3ColumnIndex()\sroutine. +D 2025-02-09T19:49:46.297 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -722,7 +722,7 @@ F src/btmutex.c 79a43670447eacc651519a429f6ece9fd638563cf95b469d6891185ddae2b522 F src/btree.c 63ca6b647342e8cef643863cd0962a542f133e1069460725ba4461dcda92b03c F src/btree.h 18e5e7b2124c23426a283523e5f31a4bff029131b795bb82391f9d2f3136fc50 F src/btreeInt.h 98aadb6dcb77b012cab2574d6a728fad56b337fc946839b9898c4b4c969e30b6 -F src/build.c 83c43ddb517a15673d1dc17f88ea8cd1db06e0d277e6dc666ac8985017a99ac5 +F src/build.c 602fc45ea6301a3dc03ec20a9f9b294c492b7e1766ae96651f2ba8044dc445a6 F src/callback.c acae8c8dddda41ee85cfdf19b926eefe830f371069f8aadca3aa39adf5b1c859 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c d35723024b963edce9c0fad5b3303e8bb9266083784844baed10a6dedfe26f3b @@ -780,7 +780,7 @@ F src/printf.c 96f7f8baeedc7639da94e4e7a4a2c200e2537c4eec9e5e1c2ffc821f40eb3105 F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c F src/resolve.c 626c24b258b111f75c22107aa5614ad89810df3026f5ca071116d3fe75925c75 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97 -F src/select.c 5c8ac3f0b7dd72745719f0137119a6f9016a9c2633a7351ef11c00a43b4c0944 +F src/select.c 57893cc8b099f231f7ed5b84faff14841f2aabb4776e32e17fae00aeae0a8993 F src/shell.c.in b377a59822f207106424f08aead37e78b609222e98f86f04cc8a03563ccf3237 F src/sqlite.h.in d2902f13ace94d3d3609646bd6d12a2d7a4f6cbdf6a5a4097580ac305f54c3f0 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 9ae245cff49716e4c0bbd3fbb3f82276e5fb54d595d1e1d9a452edef45d7740f -R cdceaad430550f7ec94e5d96f00f7ab4 -U stephan -Z 4725199d04d2eeff317384520a0a53f5 +P f3a35fdc9113ad5f1fed6a2f474aee670e1793d355475a7971d376bf33823cc4 +R 07cb4b330390fc770f5d5e73fded3930 +U drh +Z 8439106cb5dd02e83a92bb726a395093 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index f76b8288c0..bd2f91ec8d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f3a35fdc9113ad5f1fed6a2f474aee670e1793d355475a7971d376bf33823cc4 +a93e3fe0ee8f98a7ec0dfb2e1abf432cc9d5f9d3ad345b5db261475215d43df9 diff --git a/src/build.c b/src/build.c index 7b80425291..8f64d5ec30 100644 --- a/src/build.c +++ b/src/build.c @@ -1526,8 +1526,7 @@ void sqlite3AddColumn(Parse *pParse, Token sName, Token sType){ memcpy(z, sName.z, sName.n); z[sName.n] = 0; sqlite3Dequote(z); - i = sqlite3ColumnIndex(p, z); - if( i>=0 ){ + if( p->nCol && sqlite3ColumnIndex(p, z)>=0 ){ sqlite3ErrorMsg(pParse, "duplicate column name: %s", z); sqlite3DbFree(db, z); return; diff --git a/src/select.c b/src/select.c index e848c46a39..e47a9b6be2 100644 --- a/src/select.c +++ b/src/select.c @@ -320,31 +320,32 @@ int sqlite3JoinType(Parse *pParse, Token *pA, Token *pB, Token *pC){ int sqlite3ColumnIndex(Table *pTab, const char *zCol){ int i; u8 h; - Column *pCol; + const Column *aCol; + int nCol; - if( pTab->nCol==0 ){ - return -1; - } h = sqlite3StrIHash(zCol); + aCol = pTab->aCol; + nCol = pTab->nCol; + /* See if the aHx gives us a lucky match */ i = pTab->aHx[h % sizeof(pTab->aHx)]; - assert( inCol ); - if( pTab->aCol[i].hName==h - && sqlite3StrICmp(pTab->aCol[i].zCnName, zCol)==0 + assert( iaCol; + + /* No lucky match from the hash table. Do a full search. */ i = 0; while( 1 /*exit-by-break*/ ){ - if( pCol->hName==h - && sqlite3StrICmp(pCol->zCnName, zCol)==0 + if( aCol[i].hName==h + && sqlite3StrICmp(aCol[i].zCnName, zCol)==0 ){ return i; } i++; - if( i>=pTab->nCol ) break; - pCol++; + if( i>=nCol ) break; } return -1; } From 3efac4aa782fa58857de1018152305e3d7a7c3eb Mon Sep 17 00:00:00 2001 From: drh <> Date: Sun, 9 Feb 2025 20:23:29 +0000 Subject: [PATCH 209/220] Performance optimization to the substr() SQL function. FossilOrigin-Name: ce228ce3d0132ad758b5b7464fcf22ae5976df3c02ec948280cc76290c79ed0b --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/func.c | 25 ++++++++++++------------- 3 files changed, 19 insertions(+), 20 deletions(-) diff --git a/manifest b/manifest index 4b5d165af9..98df1c108a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Performance\sand\ssize\soptimization\sfor\sthe\ssqlite3ColumnIndex()\sroutine. -D 2025-02-09T19:49:46.297 +C Performance\soptimization\sto\sthe\ssubstr()\sSQL\sfunction. +D 2025-02-09T20:23:29.902 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -733,7 +733,7 @@ F src/delete.c 03a77ba20e54f0f42ebd8eddf15411ed6bdb06a2c472ac4b6b336521bf7cea42 F src/expr.c 15fabfb67261e298a39fe61457f3cfa24148d9ca8d02f4dff385feb5cf523ea7 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 928ed2517e8732113d2b9821aa37af639688d752f4ea9ac6e0e393d713eeb76f -F src/func.c 0712a5b03fdfc8af0cda6d076bfe231b66388d3d5a28b46dc1a94b90d41cac6a +F src/func.c b2fb33139972d7d65640b27ea962a49f1616265428001090cab39fcf270228e1 F src/global.c a19e4b1ca1335f560e9560e590fc13081e21f670643367f99cb9e8f9dc7d615b F src/hash.c 73934a7f7ab1cb110614a9388cb516893b0cf5b7b69e4fd1a0780ac4ce166be7 F src/hash.h 46b92795a95bfefb210f52f0c316e9d7cdbcdd7e7fcfb0d8be796d3a5767cddf @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P f3a35fdc9113ad5f1fed6a2f474aee670e1793d355475a7971d376bf33823cc4 -R 07cb4b330390fc770f5d5e73fded3930 +P a93e3fe0ee8f98a7ec0dfb2e1abf432cc9d5f9d3ad345b5db261475215d43df9 +R 6458c5e9c4d2d7940a949acd5df2c6a3 U drh -Z 8439106cb5dd02e83a92bb726a395093 +Z 384512ae3dd3c9dcc3fa9d0daadac731 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index bd2f91ec8d..468eacb582 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a93e3fe0ee8f98a7ec0dfb2e1abf432cc9d5f9d3ad345b5db261475215d43df9 +ce228ce3d0132ad758b5b7464fcf22ae5976df3c02ec948280cc76290c79ed0b diff --git a/src/func.c b/src/func.c index e8cd174e42..52462b4682 100644 --- a/src/func.c +++ b/src/func.c @@ -356,11 +356,6 @@ static void substrFunc( i64 p1, p2; assert( argc==3 || argc==2 ); - if( sqlite3_value_type(argv[1])==SQLITE_NULL - || (argc==3 && sqlite3_value_type(argv[2])==SQLITE_NULL) - ){ - return; - } p0type = sqlite3_value_type(argv[0]); p1 = sqlite3_value_int64(argv[1]); if( p0type==SQLITE_BLOB ){ @@ -378,19 +373,23 @@ static void substrFunc( } } } -#ifdef SQLITE_SUBSTR_COMPATIBILITY - /* If SUBSTR_COMPATIBILITY is defined then substr(X,0,N) work the same as - ** as substr(X,1,N) - it returns the first N characters of X. This - ** is essentially a back-out of the bug-fix in check-in [5fc125d362df4b8] - ** from 2009-02-02 for compatibility of applications that exploited the - ** old buggy behavior. */ - if( p1==0 ) p1 = 1; /* */ -#endif if( argc==3 ){ p2 = sqlite3_value_int64(argv[2]); + if( p2==0 && sqlite3_value_type(argv[2])==SQLITE_NULL ) return; }else{ p2 = sqlite3_context_db_handle(context)->aLimit[SQLITE_LIMIT_LENGTH]; } + if( p1==0 ){ +#ifdef SQLITE_SUBSTR_COMPATIBILITY + /* If SUBSTR_COMPATIBILITY is defined then substr(X,0,N) work the same as + ** as substr(X,1,N) - it returns the first N characters of X. This + ** is essentially a back-out of the bug-fix in check-in [5fc125d362df4b8] + ** from 2009-02-02 for compatibility of applications that exploited the + ** old buggy behavior. */ + p1 = 1; /* */ +#endif + if( sqlite3_value_type(argv[1])==SQLITE_NULL ) return; + } if( p1<0 ){ p1 += len; if( p1<0 ){ From 93df8109fc188b35968fa3a4d51400866399fd7c Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 10 Feb 2025 00:20:50 +0000 Subject: [PATCH 210/220] Small performance increase in jsonTranslateBlobToText(). FossilOrigin-Name: 3b1dcac2eeaf5f97450919f2a6eed74a4d54fb2b812bdb4a580f79d075e99dfe --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/json.c | 9 ++++++--- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 98df1c108a..ac641f9971 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Performance\soptimization\sto\sthe\ssubstr()\sSQL\sfunction. -D 2025-02-09T20:23:29.902 +C Small\sperformance\sincrease\sin\sjsonTranslateBlobToText(). +D 2025-02-10T00:20:50.032 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -740,7 +740,7 @@ F src/hash.h 46b92795a95bfefb210f52f0c316e9d7cdbcdd7e7fcfb0d8be796d3a5767cddf F src/hwtime.h f9c2dfb84dce7acf95ce6d289e46f5f9d3d1afd328e53da8f8e9008e3b3caae6 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 05e04ef637cbc0dccb9a5c5d188a5a2608891e554c8ec17c7a71afe2cf896a06 -F src/json.c 68a98c020c22127f2d65f08855f7fc7460ff352a6ce0b543d8931dde83319c22 +F src/json.c 50d0032812673d304b66fa7c2dbc86207e7e78505c69d85521c762f52ac37329 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 7432c944ff197046d67a1207790a1b13eec4548c85a9457eb0896bb3641dfb36 F src/main.c b99d15d843f7a86adbec855de77b1656dde07359722ef63a9d9393678dbb58d1 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P a93e3fe0ee8f98a7ec0dfb2e1abf432cc9d5f9d3ad345b5db261475215d43df9 -R 6458c5e9c4d2d7940a949acd5df2c6a3 +P ce228ce3d0132ad758b5b7464fcf22ae5976df3c02ec948280cc76290c79ed0b +R 121930a1cd26bde82bd8ad52b6e51587 U drh -Z 384512ae3dd3c9dcc3fa9d0daadac731 +Z f5ec5ef9a94161cf3474a090fcd2095c # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 468eacb582..afadd4872d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ce228ce3d0132ad758b5b7464fcf22ae5976df3c02ec948280cc76290c79ed0b +3b1dcac2eeaf5f97450919f2a6eed74a4d54fb2b812bdb4a580f79d075e99dfe diff --git a/src/json.c b/src/json.c index a0a075e66c..2517f6c31c 100644 --- a/src/json.c +++ b/src/json.c @@ -2199,9 +2199,12 @@ static u32 jsonTranslateBlobToText( } case JSONB_TEXT: case JSONB_TEXTJ: { - jsonAppendChar(pOut, '"'); - jsonAppendRaw(pOut, (const char*)&pParse->aBlob[i+n], sz); - jsonAppendChar(pOut, '"'); + if( pOut->nUsed+sz+2<=pOut->nAlloc || jsonStringGrow(pOut, sz+2)==0 ){ + pOut->zBuf[pOut->nUsed] = '"'; + memcpy(pOut->zBuf+pOut->nUsed+1,(const char*)&pParse->aBlob[i+n],sz); + pOut->zBuf[pOut->nUsed+sz+1] = '"'; + pOut->nUsed += sz+2; + } break; } case JSONB_TEXT5: { From a0d35d44e4382e761943b263b9183234d44f1f0b Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 10 Feb 2025 11:16:37 +0000 Subject: [PATCH 211/220] Convert some expensive NEVER() and ASSERT() macros into assert()s. FossilOrigin-Name: 4aad891802d9d87f1ff3cbbf4bc70fa242c6782088189a2bd5d6f8863f552d29 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/json.c | 9 +++------ src/util.c | 6 +++++- src/vdbemem.c | 2 +- 5 files changed, 18 insertions(+), 17 deletions(-) diff --git a/manifest b/manifest index ac641f9971..7ca924c8b2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Small\sperformance\sincrease\sin\sjsonTranslateBlobToText(). -D 2025-02-10T00:20:50.032 +C Convert\ssome\sexpensive\sNEVER()\sand\sASSERT()\smacros\sinto\sassert()s. +D 2025-02-10T11:16:37.391 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -740,7 +740,7 @@ F src/hash.h 46b92795a95bfefb210f52f0c316e9d7cdbcdd7e7fcfb0d8be796d3a5767cddf F src/hwtime.h f9c2dfb84dce7acf95ce6d289e46f5f9d3d1afd328e53da8f8e9008e3b3caae6 F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 F src/insert.c 05e04ef637cbc0dccb9a5c5d188a5a2608891e554c8ec17c7a71afe2cf896a06 -F src/json.c 50d0032812673d304b66fa7c2dbc86207e7e78505c69d85521c762f52ac37329 +F src/json.c 2663a0c7e574cb928de944720dcdcc11c931877d877549b8f1258a4002efd6f7 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c 7432c944ff197046d67a1207790a1b13eec4548c85a9457eb0896bb3641dfb36 F src/main.c b99d15d843f7a86adbec855de77b1656dde07359722ef63a9d9393678dbb58d1 @@ -847,7 +847,7 @@ F src/trigger.c da3c25786870d8bf97cd46b493374c2375d1abaf20a9b0f5f8629a3f2f2ce383 F src/update.c 3e5e7ff66fa19ebe4d1b113d480639a24cc1175adbefabbd1a948a07f28e37cf F src/upsert.c 215328c3f91623c520ec8672c44323553f12caeb4f01b1090ebdca99fdf7b4f1 F src/utf.c 8b29d9a5956569ea2700f869669b8ef67a9662ee5e724ff77ab3c387e27094ba -F src/util.c e5f6a5eeaa26b69054a43bbd0048cfe3d2851f6961052b35aed8f695df922850 +F src/util.c 9ff6470dabcf943fd796d2da766c98bd328c8f6fe036a31e5b338e628603f989 F src/vacuum.c b763b6457bd058d2072ef9364832351fd8d11e8abf70cbb349657360f7d55c40 F src/vdbe.c b98d86de7f0e6c02fb14e0e1ae8feab6aa84669d389771a848e23f59eb70dcad F src/vdbe.h 3d26d5c7660c5c7bd33ffb0d8784615072d8b23c81f8110870efe2631136bc89 @@ -855,7 +855,7 @@ F src/vdbeInt.h 078b1c15b26587b54c1c1879d0d2f4dec812b9de4c337fed9faf73fbcc3bf091 F src/vdbeapi.c 82fe278a7c71b653235c6f9fb5de0b5de589908dfcb011ba2a782e8becf06f86 F src/vdbeaux.c 541d3d232714455960eab4ed10b34cb48b4bcd565d7539ef31092f5e73648e6b F src/vdbeblob.c 9166b6eb7054e5da82e35255892fb1ed551355a4716452539e8e3ac14f25fbe3 -F src/vdbemem.c 977438546df236c6a3e7d8b4fe86c0643c13b89b00235db1f11c3a91a4796d30 +F src/vdbemem.c 4af21a948820259ced96e3d46d70f9af347afa2deb7cb60a8b3981d5748e4279 F src/vdbesort.c d0a3c7056c081703c8b6d91ad60f17da5e062a5c64bf568ed0fa1b5f4cae311f F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823 F src/vdbevtab.c fc46b9cbd759dc013f0b3724549cc0d71379183c667df3a5988f7e2f1bd485f3 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P ce228ce3d0132ad758b5b7464fcf22ae5976df3c02ec948280cc76290c79ed0b -R 121930a1cd26bde82bd8ad52b6e51587 +P 3b1dcac2eeaf5f97450919f2a6eed74a4d54fb2b812bdb4a580f79d075e99dfe +R 47d7be136c4f4c146dd38f56c85a1064 U drh -Z f5ec5ef9a94161cf3474a090fcd2095c +Z 9dd82a4bb1074323ccd62faaa22b0ea3 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index afadd4872d..7692f2ba23 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3b1dcac2eeaf5f97450919f2a6eed74a4d54fb2b812bdb4a580f79d075e99dfe +4aad891802d9d87f1ff3cbbf4bc70fa242c6782088189a2bd5d6f8863f552d29 diff --git a/src/json.c b/src/json.c index 2517f6c31c..47a9c875e7 100644 --- a/src/json.c +++ b/src/json.c @@ -2054,10 +2054,7 @@ static u32 jsonbPayloadSize(const JsonParse *pParse, u32 i, u32 *pSz){ u8 x; u32 sz; u32 n; - if( NEVER(i>pParse->nBlob) ){ - *pSz = 0; - return 0; - } + assert( i<=pParse->nBlob ); x = pParse->aBlob[i]>>4; if( x<=11 ){ sz = x; @@ -2101,8 +2098,8 @@ static u32 jsonbPayloadSize(const JsonParse *pParse, u32 i, u32 *pSz){ if( (i64)i+sz+n > pParse->nBlob && (i64)i+sz+n > pParse->nBlob-pParse->delta ){ - sz = 0; - n = 0; + *pSz = 0; + return 0; } *pSz = sz; return n; diff --git a/src/util.c b/src/util.c index ecce460e01..703ef0a23a 100644 --- a/src/util.c +++ b/src/util.c @@ -1130,7 +1130,11 @@ void sqlite3FpDecode(FpDecode *p, double r, int iRound, int mxRound){ } p->z = &p->zBuf[i+1]; assert( i+p->n < sizeof(p->zBuf) ); - while( ALWAYS(p->n>0) && p->z[p->n-1]=='0' ){ p->n--; } + assert( p->n>0 ); + while( p->z[p->n-1]=='0' ){ + p->n--; + assert( p->n>0 ); + } } /* diff --git a/src/vdbemem.c b/src/vdbemem.c index 38ba5abe80..61298d10ff 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -327,7 +327,7 @@ void sqlite3VdbeMemZeroTerminateIfAble(Mem *pMem){ return; } if( pMem->enc!=SQLITE_UTF8 ) return; - if( NEVER(pMem->z==0) ) return; + assert( pMem->z!=0 ); if( pMem->flags & MEM_Dyn ){ if( pMem->xDel==sqlite3_free && sqlite3_msize(pMem->z) >= (u64)(pMem->n+1) From 3ea05b5b4f219a0cadb5d573bf73c0818cee02cf Mon Sep 17 00:00:00 2001 From: stephan Date: Mon, 10 Feb 2025 15:01:14 +0000 Subject: [PATCH 212/220] configure: when dlopen() is not found, only fail fatally if --enable-loadable-module is explicitly provided, else warn instead. Based on discussion around [forum:2efe9c33bd9021ca|forum post 2efe9c33bd9021ca]. Update proj-indented-notice to behave like its docs say it should when the -error flag is used. FossilOrigin-Name: f28e52cbf9e80cb5a1cde7cba099e2c2b6787a77263796e4f9febf3f30bc99dc --- autosetup/proj.tcl | 7 ++++-- autosetup/sqlite-config.tcl | 47 +++++++++++++++++++++++++++++++------ manifest | 16 ++++++------- manifest.uuid | 2 +- 4 files changed, 54 insertions(+), 18 deletions(-) diff --git a/autosetup/proj.tcl b/autosetup/proj.tcl index 5eeec0afb9..6a1960f603 100644 --- a/autosetup/proj.tcl +++ b/autosetup/proj.tcl @@ -114,11 +114,13 @@ proc proj-bold {str} { # # If the -notice flag it used then it emits using [user-notice], which # means its rendering will (A) go to stderr and (B) be delayed until -# the next time autosetup goes to output a message. If -notice -# is not used, it will send the message to stdout without delay. +# the next time autosetup goes to output a message. # # If the -error flag is provided then it renders the message # immediately to stderr and then exits. +# +# If neither -notice nor -error are used, the message will be sent to +# stdout without delay. proc proj-indented-notice {args} { set fErr "" set outFunc "puts" @@ -126,6 +128,7 @@ proc proj-indented-notice {args} { switch -exact -- [lindex $args 0] { -error { set args [lassign $args fErr] + set outFunc "user-notice" } -notice { set args [lassign $args -] diff --git a/autosetup/sqlite-config.tcl b/autosetup/sqlite-config.tcl index f1888084e4..904c439e0b 100644 --- a/autosetup/sqlite-config.tcl +++ b/autosetup/sqlite-config.tcl @@ -855,20 +855,53 @@ proc sqlite-handle-icu {} { ######################################################################## -# Handles the --enable-load-extension flag. +# Handles the --enable-load-extension flag. Returns 1 if the support +# is enabled, else 0. If support for that feature is not found, a +# fatal error is triggered if --enable-load-extension is explicitly +# provided, else a loud warning is instead emited. If +# --disable-load-extension is used, no check is performed. +# +# Makes the following environment changes: +# +# - defines LDFLAGS_DLOPEN to any linker flags needed for this +# feature. It may legally be empty on some systems where dlopen() +# is in libc. +# +# - If the feature is not available, adds +# -DSQLITE_OMIT_LOAD_EXTENSION=1 to the feature flags list. proc sqlite-handle-load-extension {} { + define LDFLAGS_DLOPEN "" + set found 0 proj-if-opt-truthy load-extension { - if {[proj-check-function-in-lib dlopen dl]} { + set found [proj-check-function-in-lib dlopen dl] + if {$found} { define LDFLAGS_DLOPEN [get-define lib_dlopen] undefine lib_dlopen } else { - user-error "dlopen() not found. Use --disable-load-extension to bypass this check." + if {[proj-opt-was-provided load-extension]} { + # Explicit --enable-load-extension: fail if not found + proj-indented-notice -error { + --enable-load-extension was provided but dlopen() + not found. Use --disable-load-extension to bypass this + check. + } + } else { + # It was implicitly enabled: warn if not found + proj-indented-notice { + WARNING: dlopen() not found, so loadable module support will + be disabled. Use --disable-load-extension to bypass this + check. + } + } } - } { - define LDFLAGS_DLOPEN "" - sqlite-add-feature-flag {-DSQLITE_OMIT_LOAD_EXTENSION=1} - msg-result "Disabling loadable extensions." } + if {$found} { + msg-result "Loadable extension support enabled." + } else { + msg-result "Disabling loadable extension support. Use --enable-load-extensions to enable them." + sqlite-add-feature-flag {-DSQLITE_OMIT_LOAD_EXTENSION=1} + } + return $found } ######################################################################## diff --git a/manifest b/manifest index 7ca924c8b2..3221103887 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Convert\ssome\sexpensive\sNEVER()\sand\sASSERT()\smacros\sinto\sassert()s. -D 2025-02-10T11:16:37.391 +C configure:\swhen\sdlopen()\sis\snot\sfound,\sonly\sfail\sfatally\sif\s--enable-loadable-module\sis\sexplicitly\sprovided,\selse\swarn\sinstead.\sBased\son\sdiscussion\saround\s[forum:2efe9c33bd9021ca|forum\spost\s2efe9c33bd9021ca].\sUpdate\sproj-indented-notice\sto\sbehave\slike\sits\sdocs\ssay\sit\sshould\swhen\sthe\s-error\sflag\sis\sused. +D 2025-02-10T15:01:14.412 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -49,8 +49,8 @@ F autosetup/cc-shared.tcl 4f024e94a47f427ba61de1739f6381ef0080210f9fae89112d5c1d F autosetup/cc.tcl c0fcc50ca91deff8741e449ddad05bcd08268bc31177e613a6343bbd1fd3e45f F autosetup/jimsh0.c 6573f6bc6ff204de0139692648d7037ca0b6c067bac83a7b4e087f20a86866a4 F autosetup/pkg-config.tcl 4e635bf39022ff65e0d5434339dd41503ea48fc53822c9c5bde88b02d3d952ba -F autosetup/proj.tcl af5290ee128ce82dd178a474a9dcfaa7e503c88f0709d916cc6079d9b8c801f4 -F autosetup/sqlite-config.tcl 6bff327462d34d2d9fe45738b0be70b80cf709de91b8c3b8a921cbdc2f05f6ff +F autosetup/proj.tcl 42119a2e899e319b92f3159952b7ef7219c82cb45eeb636aaf8d909def8150f8 +F autosetup/sqlite-config.tcl 341c2751f42c6c8eeeae50bec13d2bb28db73ca2c8b9b97598332aed02e0a71b F autosetup/system.tcl 51d4be76cd9a9074704b584e5c9cbba616202c8468cf9ba8a4f8294a7ab1dba9 F configure 9a00b21dfd13757bbfb8d89b30660a89ec1f8f3a79402b8f9f9b6fc475c3303a x F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 3b1dcac2eeaf5f97450919f2a6eed74a4d54fb2b812bdb4a580f79d075e99dfe -R 47d7be136c4f4c146dd38f56c85a1064 -U drh -Z 9dd82a4bb1074323ccd62faaa22b0ea3 +P 4aad891802d9d87f1ff3cbbf4bc70fa242c6782088189a2bd5d6f8863f552d29 +R 0e46282cf2ae1fcf5877508517bc3bb3 +U stephan +Z 8b12a9b798d6d21e89b61eb16ecc7324 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 7692f2ba23..94b9a5b26c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4aad891802d9d87f1ff3cbbf4bc70fa242c6782088189a2bd5d6f8863f552d29 +f28e52cbf9e80cb5a1cde7cba099e2c2b6787a77263796e4f9febf3f30bc99dc From 9dfc2c61ec7125898dfdceab43fc5a83b87ebc7a Mon Sep 17 00:00:00 2001 From: stephan Date: Mon, 10 Feb 2025 15:58:22 +0000 Subject: [PATCH 213/220] Add jimsh.exe and jimsh0.exe to the clean rules in Makefile.msc so that stale builds of those files from msys2 and friends do not cause mysterious build errors. FossilOrigin-Name: 44b4e4db321815c6fc0327ed7b97df868833654411e882b70f54ad3f6d212987 --- Makefile.msc | 1 + manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/Makefile.msc b/Makefile.msc index c1a8f88b6e..93b0935b1e 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -2846,4 +2846,5 @@ clean: del /Q fts5.* fts5parse.* 2>NUL del /Q lsm.h lsm1.c 2>NUL del /q src-verify.exe 2>NUL + del /q jimsh.exe jimsh0.exe 2>NUL # <> diff --git a/manifest b/manifest index 3221103887..356f131170 100644 --- a/manifest +++ b/manifest @@ -1,11 +1,11 @@ -C configure:\swhen\sdlopen()\sis\snot\sfound,\sonly\sfail\sfatally\sif\s--enable-loadable-module\sis\sexplicitly\sprovided,\selse\swarn\sinstead.\sBased\son\sdiscussion\saround\s[forum:2efe9c33bd9021ca|forum\spost\s2efe9c33bd9021ca].\sUpdate\sproj-indented-notice\sto\sbehave\slike\sits\sdocs\ssay\sit\sshould\swhen\sthe\s-error\sflag\sis\sused. -D 2025-02-10T15:01:14.412 +C Add\sjimsh.exe\sand\sjimsh0.exe\sto\sthe\sclean\srules\sin\sMakefile.msc\sso\sthat\sstale\sbuilds\sof\sthose\sfiles\sfrom\smsys2\sand\sfriends\sdo\snot\scause\smysterious\sbuild\serrors. +D 2025-02-10T15:58:22.800 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d F Makefile.in 63c4d6e535dac4b7f6a6ffa566c96e3d68fa7f244799c38ee1e3d59305c5b55b F Makefile.linux-generic bd3e3cacd369821a6241d4ea1967395c962dfe3057e38cb0a435cee0e8b789d0 -F Makefile.msc a9b95ae9807e17f9b0734ebe97d68032141c3f95286bb64593cb73b206f043cf +F Makefile.msc 990e4ea94a417135d1b2fd35550997c3f40fc1758bd7546bd17c0f4312f0babc F README.md c3c0f19532ce28f6297a71870f3c7b424729f0e6d9ab889616d3587dd2332159 F VERSION 001dea55eb8304ec9130b6b44a32d3fc349f279d45a7e224fc0730c3cb8e2372 F art/icon-243x273.gif 9750b734f82fdb3dc43127753d5e6fbf3b62c9f4e136c2fbf573b2f57ea87af5 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 4aad891802d9d87f1ff3cbbf4bc70fa242c6782088189a2bd5d6f8863f552d29 -R 0e46282cf2ae1fcf5877508517bc3bb3 +P f28e52cbf9e80cb5a1cde7cba099e2c2b6787a77263796e4f9febf3f30bc99dc +R 9884f4a919e7e313dc0ab42868810e5c U stephan -Z 8b12a9b798d6d21e89b61eb16ecc7324 +Z 6aa92bc3b567c51b695c0a3eafdd20c2 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 94b9a5b26c..024fc6f4cf 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f28e52cbf9e80cb5a1cde7cba099e2c2b6787a77263796e4f9febf3f30bc99dc +44b4e4db321815c6fc0327ed7b97df868833654411e882b70f54ad3f6d212987 From dadd0b4085fc6d76b0100f60c50d5fe95850aa77 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 10 Feb 2025 16:13:56 +0000 Subject: [PATCH 214/220] Enhance speedtest1 with a new testset that calls sqlite3_open() and uses the connection many times. FossilOrigin-Name: ce307addb0c7cf72e4cca066521df6e15d1220bce303a3796a794a2ae5fa95b3 --- manifest | 14 +- manifest.uuid | 2 +- test/speedtest1.c | 481 ++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 474 insertions(+), 23 deletions(-) diff --git a/manifest b/manifest index 356f131170..8a2dd3ba43 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sjimsh.exe\sand\sjimsh0.exe\sto\sthe\sclean\srules\sin\sMakefile.msc\sso\sthat\sstale\sbuilds\sof\sthose\sfiles\sfrom\smsys2\sand\sfriends\sdo\snot\scause\smysterious\sbuild\serrors. -D 2025-02-10T15:58:22.800 +C Enhance\sspeedtest1\swith\sa\snew\stestset\sthat\scalls\ssqlite3_open()\sand\suses\sthe\nconnection\smany\stimes. +D 2025-02-10T16:13:56.580 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -1681,7 +1681,7 @@ F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa F test/speed4p.test 377a0c48e5a92e0b11c1c5ebb1bc9d83a7312c922bc0cb05970ef5d6a96d1f0c F test/speedtest.md ee958457ae1b729d9715ae33c0320600000bf1d9ddea1a88dcf79f56729d6fad F test/speedtest.tcl 185f80f8db275852746e8150137b31ba4aaa1c9a1ecb1e35a3b66cd3f31783b9 x -F test/speedtest1.c ef340d391366afc875d11fc59332601c470154352b0db836b2cba813999a8fb4 +F test/speedtest1.c abcce434642f8f1e1be530d25d8e7d7862360236d7a8e4f626521bc3263bd38c F test/spellfix.test 951a6405d49d1a23d6b78027d3877b4a33eeb8221dcab5704b499755bb4f552e F test/spellfix2.test dfc8f519a3fc204cb2dfa8b4f29821ae90f6f8c3 F test/spellfix3.test 0f9efaaa502a0e0a09848028518a6fb096c8ad33 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P f28e52cbf9e80cb5a1cde7cba099e2c2b6787a77263796e4f9febf3f30bc99dc -R 9884f4a919e7e313dc0ab42868810e5c -U stephan -Z 6aa92bc3b567c51b695c0a3eafdd20c2 +P 44b4e4db321815c6fc0327ed7b97df868833654411e882b70f54ad3f6d212987 +R 6770e3052628a73d65a1abe270e15306 +U drh +Z b145be6a514a8b9ab22ab7f6982431ae # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 024fc6f4cf..2351f8f438 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -44b4e4db321815c6fc0327ed7b97df868833654411e882b70f54ad3f6d212987 +ce307addb0c7cf72e4cca066521df6e15d1220bce303a3796a794a2ae5fa95b3 diff --git a/test/speedtest1.c b/test/speedtest1.c index c6d5fd4a10..a03bdbb73b 100644 --- a/test/speedtest1.c +++ b/test/speedtest1.c @@ -65,8 +65,8 @@ static const char zHelp[] = " --stmtscanstatus Activate SQLITE_DBCONFIG_STMT_SCANSTATUS\n" " --temp N N from 0 to 9. 0: no temp table. 9: all temp tables\n" " --testset T Run test-set T (main, cte, rtree, orm, fp, json,\n" - " star, debug). Can be a comma-separated list of\n" - " values, with /SCALE suffixes or macro \"mix1\"\n" + " star, app, debug). Can be a comma-separated list\n" + " of values, with /SCALE suffixes or macro \"mix1\"\n" " --trace Turn on SQL tracing\n" " --threads N Use up to N threads for sorting\n" " --utf16be Set text encoding to UTF-16BE\n" @@ -112,6 +112,8 @@ struct HashContext { /* All global state is held in this structure */ static struct Global { sqlite3 *db; /* The open database connection */ + const char *zDbName; /* Name of the database file */ + const char *zVfs; /* --vfs NAME */ sqlite3_stmt *pStmt; /* Current SQL statement */ sqlite3_int64 iStart; /* Start-time for the current test */ sqlite3_int64 iTotal; /* Total time */ @@ -1565,6 +1567,453 @@ void testset_star(void){ speedtest1_end_test(); } +/* +** Tests that simulate an application opening and closing an SQLite database +** frequently. Fossil is used as the model. The focus here is on rapidly +** parsing the database schema and rapidly generating prepared statements, +** in other words, rapid start-up of Fossil-like applications. +** +** The same database has no data, so the performance of sqlite3_step() is +** not significant to this testset. +*/ +static void testset_app(void){ + int i, n; + speedtest1_begin_test(100, "Generate a Fossil-like database schema"); + speedtest1_exec( + "BEGIN;" + "CREATE TABLE blob(\n" + " rid INTEGER PRIMARY KEY,\n" + " rcvid INTEGER,\n" + " size INTEGER,\n" + " uuid TEXT UNIQUE NOT NULL,\n" + " content BLOB,\n" + " CHECK( length(uuid)>=40 AND rid>0 )\n" + ");\n" + "CREATE TABLE delta(\n" + " rid INTEGER PRIMARY KEY,\n" + " srcid INTEGER NOT NULL REFERENCES blob\n" + ");\n" + "CREATE TABLE rcvfrom(\n" + " rcvid INTEGER PRIMARY KEY,\n" + " uid INTEGER REFERENCES user,\n" + " mtime DATETIME,\n" + " nonce TEXT UNIQUE,\n" + " ipaddr TEXT\n" + ");\n" + "CREATE TABLE private(rid INTEGER PRIMARY KEY);\n" + "CREATE TABLE accesslog(\n" + " uname TEXT,\n" + " ipaddr TEXT,\n" + " success BOOLEAN,\n" + " mtime TIMESTAMP\n" + ");\n" + "CREATE TABLE user(\n" + " uid INTEGER PRIMARY KEY,\n" + " login TEXT UNIQUE,\n" + " pw TEXT,\n" + " cap TEXT,\n" + " cookie TEXT,\n" + " ipaddr TEXT,\n" + " cexpire DATETIME,\n" + " info TEXT,\n" + " mtime DATE,\n" + " photo BLOB\n" + ", jx TEXT DEFAULT '{}');\n" + "CREATE TABLE reportfmt(\n" + " rn INTEGER PRIMARY KEY,\n" + " owner TEXT,\n" + " title TEXT UNIQUE,\n" + " mtime INTEGER,\n" + " cols TEXT,\n" + " sqlcode TEXT\n" + ", jx TEXT DEFAULT '{}');\n" + "CREATE TABLE config(\n" + " name TEXT PRIMARY KEY NOT NULL,\n" + " value CLOB, mtime INTEGER,\n" + " CHECK( typeof(name)='text' AND length(name)>=1 )\n" + ") WITHOUT ROWID;\n" + "CREATE TABLE shun(uuid PRIMARY KEY, mtime INTEGER, scom TEXT)\n" + " WITHOUT ROWID;\n" + "CREATE TABLE concealed(\n" + " hash TEXT PRIMARY KEY,\n" + " content TEXT\n" + ", mtime INTEGER) WITHOUT ROWID;\n" + "CREATE TABLE admin_log(\n" + " id INTEGER PRIMARY KEY,\n" + " time INTEGER, -- Seconds since 1970\n" + " page TEXT, -- path of page\n" + " who TEXT, -- User who made the change\n" + " what TEXT -- What changed\n" + ");\n" + "CREATE TABLE unversioned(\n" + " name TEXT PRIMARY KEY,\n" + " rcvid INTEGER,\n" + " mtime DATETIME,\n" + " hash TEXT,\n" + " sz INTEGER,\n" + " encoding INT,\n" + " content BLOB\n" + ") WITHOUT ROWID;\n" + "CREATE TABLE subscriber(\n" + " subscriberId INTEGER PRIMARY KEY,\n" + " subscriberCode BLOB DEFAULT (randomblob(32)) UNIQUE,\n" + " semail TEXT UNIQUE COLLATE nocase,\n" + " suname TEXT,\n" + " sverified BOOLEAN DEFAULT true,\n" + " sdonotcall BOOLEAN,\n" + " sdigest BOOLEAN,\n" + " ssub TEXT,\n" + " sctime INTDATE,\n" + " mtime INTDATE,\n" + " smip TEXT\n" + ", lastContact INT);\n" + "CREATE TABLE pending_alert(\n" + " eventid TEXT PRIMARY KEY,\n" + " sentSep BOOLEAN DEFAULT false,\n" + " sentDigest BOOLEAN DEFAULT false\n" + ", sentMod BOOLEAN DEFAULT false) WITHOUT ROWID;\n" + "CREATE TABLE filename(\n" + " fnid INTEGER PRIMARY KEY,\n" + " name TEXT UNIQUE\n" + ") STRICT;\n" + "CREATE TABLE mlink(\n" + " mid INTEGER,\n" + " fid INTEGER,\n" + " pmid INTEGER,\n" + " pid INTEGER,\n" + " fnid INTEGER REFERENCES filename,\n" + " pfnid INTEGER,\n" + " mperm INTEGER,\n" + " isaux INT DEFAULT 0\n" + ") STRICT;\n" + "CREATE TABLE plink(\n" + " pid INTEGER REFERENCES blob,\n" + " cid INTEGER REFERENCES blob,\n" + " isprim INT,\n" + " mtime REAL,\n" + " baseid INTEGER REFERENCES blob,\n" + " UNIQUE(pid, cid)\n" + ") STRICT;\n" + "CREATE TABLE leaf(rid INTEGER PRIMARY KEY);\n" + "CREATE TABLE event(\n" + " type TEXT,\n" + " mtime REAL,\n" + " objid INTEGER PRIMARY KEY,\n" + " tagid INTEGER,\n" + " uid INTEGER REFERENCES user,\n" + " bgcolor TEXT,\n" + " euser TEXT,\n" + " user TEXT,\n" + " ecomment TEXT,\n" + " comment TEXT,\n" + " brief TEXT,\n" + " omtime REAL\n" + ") STRICT;\n" + "CREATE TABLE phantom(\n" + " rid INTEGER PRIMARY KEY\n" + ");\n" + "CREATE TABLE orphan(\n" + " rid INTEGER PRIMARY KEY,\n" + " baseline INTEGER\n" + ") STRICT;\n" + "CREATE TABLE unclustered(\n" + " rid INTEGER PRIMARY KEY\n" + ");\n" + "CREATE TABLE unsent(\n" + " rid INTEGER PRIMARY KEY\n" + ");\n" + "CREATE TABLE tag(\n" + " tagid INTEGER PRIMARY KEY,\n" + " tagname TEXT UNIQUE\n" + ") STRICT;\n" + "CREATE TABLE tagxref(\n" + " tagid INTEGER REFERENCES tag,\n" + " tagtype INTEGER,\n" + " srcid INTEGER REFERENCES blob,\n" + " origid INTEGER REFERENCES blob,\n" + " value TEXT,\n" + " mtime REAL,\n" + " rid INTEGER REFERENCES blob,\n" + " UNIQUE(rid, tagid)\n" + ") STRICT;\n" + "CREATE TABLE backlink(\n" + " target TEXT,\n" + " srctype INT,\n" + " srcid INT,\n" + " mtime REAL,\n" + " UNIQUE(target, srctype, srcid)\n" + ") STRICT;\n" + "CREATE TABLE attachment(\n" + " attachid INTEGER PRIMARY KEY,\n" + " isLatest INT DEFAULT 0,\n" + " mtime REAL,\n" + " src TEXT,\n" + " target TEXT,\n" + " filename TEXT,\n" + " comment TEXT,\n" + " user TEXT\n" + ") STRICT;\n" + "CREATE TABLE cherrypick(\n" + " parentid INT,\n" + " childid INT,\n" + " isExclude INT DEFAULT false,\n" + " PRIMARY KEY(parentid, childid)\n" + ") WITHOUT ROWID, STRICT;\n" + "CREATE TABLE vcache(\n" + " vid INTEGER, -- check-in ID\n" + " fname TEXT, -- filename\n" + " rid INTEGER, -- artifact ID\n" + " PRIMARY KEY(vid,fname)\n" + ") WITHOUT ROWID;\n" + "CREATE TABLE synclog(\n" + " sfrom TEXT,\n" + " sto TEXT,\n" + " stime INT NOT NULL,\n" + " stype TEXT,\n" + " PRIMARY KEY(sfrom,sto)\n" + ") WITHOUT ROWID;\n" + "CREATE TABLE chat(\n" + " msgid INTEGER PRIMARY KEY AUTOINCREMENT,\n" + " mtime JULIANDAY,\n" + " lmtime TEXT,\n" + " xfrom TEXT,\n" + " xmsg TEXT,\n" + " fname TEXT,\n" + " fmime TEXT,\n" + " mdel INT,\n" + " file BLOB\n" + ");\n" + "CREATE TABLE ftsdocs(\n" + " rowid INTEGER PRIMARY KEY,\n" + " type CHAR(1),\n" + " rid INTEGER,\n" + " name TEXT,\n" + " idxed BOOLEAN,\n" + " label TEXT,\n" + " url TEXT,\n" + " mtime DATE,\n" + " bx TEXT,\n" + " UNIQUE(type,rid)\n" + ");\n" + "CREATE TABLE ticket(\n" + " -- Do not change any column that begins with tkt_\n" + " tkt_id INTEGER PRIMARY KEY,\n" + " tkt_uuid TEXT UNIQUE,\n" + " tkt_mtime DATE,\n" + " tkt_ctime DATE,\n" + " -- Add as many fields as required below this line\n" + " type TEXT,\n" + " status TEXT,\n" + " subsystem TEXT,\n" + " priority TEXT,\n" + " severity TEXT,\n" + " foundin TEXT,\n" + " private_contact TEXT,\n" + " resolution TEXT,\n" + " title TEXT,\n" + " comment TEXT\n" + ");\n" + "CREATE TABLE ticketchng(\n" + " -- Do not change any column that begins with tkt_\n" + " tkt_id INTEGER REFERENCES ticket,\n" + " tkt_rid INTEGER REFERENCES blob,\n" + " tkt_mtime DATE,\n" + " tkt_user TEXT,\n" + " -- Add as many fields as required below this line\n" + " login TEXT,\n" + " username TEXT,\n" + " mimetype TEXT,\n" + " icomment TEXT\n" + ");\n" + "CREATE TABLE forumpost(\n" + " fpid INTEGER PRIMARY KEY,\n" + " froot INT,\n" + " fprev INT,\n" + " firt INT,\n" + " fmtime REAL\n" + ");\n" + "CREATE INDEX delta_i1 ON delta(srcid);\n" + "CREATE INDEX blob_rcvid ON blob(rcvid);\n" + "CREATE INDEX subscriberUname\n" + " ON subscriber(suname) WHERE suname IS NOT NULL;\n" + "CREATE INDEX mlink_i1 ON mlink(mid);\n" + "CREATE INDEX mlink_i2 ON mlink(fnid);\n" + "CREATE INDEX mlink_i3 ON mlink(fid);\n" + "CREATE INDEX mlink_i4 ON mlink(pid);\n" + "CREATE INDEX plink_i2 ON plink(cid,pid);\n" + "CREATE INDEX event_i1 ON event(mtime);\n" + "CREATE INDEX orphan_baseline ON orphan(baseline);\n" + "CREATE INDEX tagxref_i1 ON tagxref(tagid, mtime);\n" + "CREATE INDEX backlink_src ON backlink(srcid, srctype);\n" + "CREATE INDEX attachment_idx1 ON attachment(target, filename, mtime);\n" + "CREATE INDEX attachment_idx2 ON attachment(src);\n" + "CREATE INDEX cherrypick_cid ON cherrypick(childid);\n" + "CREATE INDEX ftsdocIdxed ON ftsdocs(type,rid,name) WHERE idxed==0;\n" + "CREATE INDEX ftsdocName ON ftsdocs(name) WHERE type='w';\n" + "CREATE INDEX ticketchng_idx1 ON ticketchng(tkt_id, tkt_mtime);\n" + "CREATE INDEX forumthread ON forumpost(froot,fmtime);\n" + "CREATE VIEW artifact(rid,rcvid,size,atype,srcid,hash,content) AS\n" + " SELECT blob.rid,rcvid,size,1,srcid,uuid,content\n" + " FROM blob LEFT JOIN delta ON (blob.rid=delta.rid);\n" + "CREATE VIEW ftscontent AS\n" + " SELECT rowid, type, rid, name, idxed, label, url, mtime,\n" + " title(type,rid,name) AS 'title', body(type,rid,name) AS 'body'\n" + " FROM ftsdocs;\n" + ); + if( sqlite3_compileoption_used("ENABLE_FTS5") ){ + speedtest1_exec( + "CREATE VIRTUAL TABLE ftsidx\n" + " USING fts5(content=\"ftscontent\", title, body);\n" + "CREATE VIRTUAL TABLE chatfts1 USING fts5(\n" + " xmsg, content=chat, content_rowid=msgid,tokenize=porter);\n" + ); + }else{ + speedtest1_exec( + "CREATE TABLE ftsidx_data(id INTEGER PRIMARY KEY, block BLOB);\n" + "CREATE TABLE ftsidx_idx(segid, term, pgno, PRIMARY KEY(segid, term))\n" + " WITHOUT ROWID;\n" + "CREATE TABLE ftsidx_docsize(id INTEGER PRIMARY KEY, sz BLOB);\n" + "CREATE TABLE ftsidx_config(k PRIMARY KEY, v) WITHOUT ROWID;\n" + "CREATE TABLE chatfts1_data(id INTEGER PRIMARY KEY, block BLOB);\n" + "CREATE TABLE chatfts1_idx(segid, term, pgno, PRIMARY KEY(segid, term))\n" + " WITHOUT ROWID;\n" + "CREATE TABLE chatfts1_docsize(id INTEGER PRIMARY KEY, sz BLOB);\n" + "CREATE TABLE chatfts1_config(k PRIMARY KEY, v) WITHOUT ROWID;\n" + ); + } + speedtest1_exec( + "ANALYZE sqlite_schema;\n" + "INSERT INTO sqlite_stat1(tbl,idx,stat) VALUES\n" + " ('ftsidx_config','ftsidx_config','1 1'),\n" + " ('ftsidx_idx','ftsidx_idx','4215 401 1'),\n" + " ('user','sqlite_autoindex_user_1','25 1'),\n" + " ('phantom',NULL,'26'),\n" + " ('reportfmt','sqlite_autoindex_reportfmt_1','9 1'),\n" + " ('rcvfrom','sqlite_autoindex_rcvfrom_1','18445 401'),\n" + " ('private',NULL,'99'),\n" + " ('mlink','mlink_i4','116678 401'),\n" + " ('mlink','mlink_i3','121212 2'),\n" + " ('mlink','mlink_i2','106372 401'),\n" + " ('mlink','mlink_i1','99298 5'),\n" + " ('ftsidx_data',NULL,'3795'),\n" + " ('leaf',NULL,'1559'),\n" + " ('delta','delta_i1','66340 1'),\n" + " ('unversioned','unversioned','3 1'),\n" + " ('pending_alert','pending_alert','3 1'),\n" + " ('cherrypick','cherrypick_cid','680 2'),\n" + " ('cherrypick','cherrypick','628 1 1'),\n" + " ('config','config','128 1'),\n" + " ('ftsidx_docsize',NULL,'33848'),\n" + " ('event','event_i1','36096 1'),\n" + " ('plink','plink_i2','38236 1 1'),\n" + " ('plink','sqlite_autoindex_plink_1','38357 1 1'),\n" + " ('shun','shun','10 1'),\n" + " ('concealed','concealed','110 1'),\n" + " ('vcache','vcache','1888 401 1'),\n" + " ('ftsdocs','ftsdocName','19 1'),\n" + " ('ftsdocs','ftsdocIdxed','168 84 1 1'),\n" + " ('ftsdocs','sqlite_autoindex_ftsdocs_1','37312 401 1'),\n" + " ('subscriber','subscriberUname','5 1'),\n" + " ('subscriber','sqlite_autoindex_subscriber_2','37 1'),\n" + " ('subscriber','sqlite_autoindex_subscriber_1','37 1'),\n" + " ('tag','sqlite_autoindex_tag_1','2990 1'),\n" + " ('filename','sqlite_autoindex_filename_1','3168 1'),\n" + " ('chat',NULL,'56124'),\n" + " ('tagxref','tagxref_i1','40992 401 2'),\n" + " ('tagxref','sqlite_autoindex_tagxref_1','79233 3 1'),\n" + " ('attachment','attachment_idx2','11 1'),\n" + " ('attachment','attachment_idx1','11 2 2 1'),\n" + " ('blob','blob_rcvid','128240 201'),\n" + " ('blob','sqlite_autoindex_blob_1','126480 1'),\n" + " ('synclog','synclog','12 3 1'),\n" + " ('backlink','backlink_src','2160 2 2'),\n" + " ('backlink','sqlite_autoindex_backlink_1','2340 2 2 1'),\n" + " ('accesslog',NULL,'38'),\n" + " ('chatfts1_config','chatfts1_config','1 1'),\n" + " ('chatfts1_idx','chatfts1_idx','688 230 1'),\n" + " ('ticket','sqlite_autoindex_ticket_1','794 1'),\n" + " ('ticketchng','ticketchng_idx1','2089 3 1'),\n" + " ('forumpost','forumthread','4 4 1'),\n" + " ('unclustered',NULL,'12');\n" + "COMMIT;" + ); + speedtest1_end_test(); + + n = g.szTest*3; + speedtest1_begin_test(110, "Open and use the database %d times", n); + for(i=0; i=$date OR parent.pid=$pid)\n" + " ORDER BY mtime DESC LIMIT 10\n" + " )\n" + " INSERT OR IGNORE INTO ok SELECT rid FROM ancestor;" + ); + sqlite3_close(dbAux); + g.db = dbMain; + } + speedtest1_end_test(); +} + #ifdef SQLITE_ENABLE_RTREE /* Generate two numbers between 1 and mx. The first number is less than ** the second. Usually the numbers are near each other but can sometimes @@ -2512,10 +2961,8 @@ int main(int argc, char **argv){ int openFlags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE ; /* SQLITE_OPEN_xxx flags. */ char *zTSet = "main"; /* Which --testset torun */ - const char * zVfs = 0; /* --vfs NAME */ int doTrace = 0; /* True for --trace */ const char *zEncoding = 0; /* --utf16be or --utf16le */ - const char *zDbName = 0; /* Name of the test database */ void *pHeap = 0; /* Allocated heap space */ void *pLook = 0; /* Allocated lookaside space */ @@ -2542,6 +2989,8 @@ int main(int argc, char **argv){ sqlite3_libversion(), sqlite3_sourceid()); /* Process command-line arguments */ + g.zDbName = 0; + g.zVfs = 0; g.zWR = ""; g.zNN = ""; g.zPK = "UNIQUE"; @@ -2668,7 +3117,7 @@ int main(int argc, char **argv){ g.eTemp = argv[i][0] - '0'; }else if( strcmp(z,"testset")==0 ){ static char zMix1Tests[] = - "main,orm/25,cte/20,json,fp/3,parsenumber/25,rtree/10,star"; + "main,orm/25,cte/20,json,fp/3,parsenumber/25,rtree/10,star,app"; ARGC_VALUE_CHECK(1); zTSet = argv[++i]; if( strcmp(zTSet,"mix1")==0 ) zTSet = zMix1Tests; @@ -2688,7 +3137,7 @@ int main(int argc, char **argv){ #endif }else if( strcmp(z,"vfs")==0 ){ ARGC_VALUE_CHECK(1); - zVfs = argv[++i]; + g.zVfs = argv[++i]; }else if( strcmp(z,"reserve")==0 ){ ARGC_VALUE_CHECK(1); g.nReserve = atoi(argv[++i]); @@ -2718,8 +3167,8 @@ int main(int argc, char **argv){ fatal_error("unknown option: %s\nUse \"%s -?\" for help\n", argv[i], argv[0]); } - }else if( zDbName==0 ){ - zDbName = argv[i]; + }else if( g.zDbName==0 ){ + g.zDbName = argv[i]; }else{ fatal_error("surplus argument: %s\nUse \"%s -?\" for help\n", argv[i], argv[0]); @@ -2748,8 +3197,8 @@ int main(int argc, char **argv){ #endif sqlite3_initialize(); - if( zDbName!=0 ){ - sqlite3_vfs *pVfs = sqlite3_vfs_find(zVfs); + if( g.zDbName!=0 ){ + sqlite3_vfs *pVfs = sqlite3_vfs_find(g.zVfs); /* For some VFSes, e.g. opfs, unlink() is not sufficient. Use the ** selected (or default) VFS's xDelete method to delete the ** database. This is specifically important for the "opfs" VFS @@ -2757,15 +3206,15 @@ int main(int argc, char **argv){ ** can be cleaned up properly. For historical compatibility, we'll ** also simply unlink(). */ if( pVfs!=0 ){ - pVfs->xDelete(pVfs, zDbName, 1); + pVfs->xDelete(pVfs, g.zDbName, 1); } - unlink(zDbName); + unlink(g.zDbName); } /* Open the database and the input file */ - if( sqlite3_open_v2(memDb ? ":memory:" : zDbName, &g.db, - openFlags, zVfs) ){ - fatal_error("Cannot open database file: %s\n", zDbName); + if( sqlite3_open_v2(memDb ? ":memory:" : g.zDbName, &g.db, + openFlags, g.zVfs) ){ + fatal_error("Cannot open database file: %s\n", g.zDbName); } #if SQLITE_VERSION_NUMBER>=3006001 if( nLook>0 && szLook>0 ){ @@ -2859,6 +3308,8 @@ int main(int argc, char **argv){ testset_cte(); }else if( strcmp(zThisTest,"star")==0 ){ testset_star(); + }else if( strcmp(zThisTest,"app")==0 ){ + testset_app(); }else if( strcmp(zThisTest,"fp")==0 ){ testset_fp(); }else if( strcmp(zThisTest,"json")==0 ){ From 8f79342f6aeb47bfb59b17e82423587378593a66 Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 10 Feb 2025 16:34:30 +0000 Subject: [PATCH 215/220] Make the "mix1" testset the default for speedtest1. FossilOrigin-Name: 7a0c3d0e14984dd49a7c1e824b9e50564094ad57c43182bfec7624a55815f961 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/speedtest1.c | 10 ++++++---- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 8a2dd3ba43..f647110054 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sspeedtest1\swith\sa\snew\stestset\sthat\scalls\ssqlite3_open()\sand\suses\sthe\nconnection\smany\stimes. -D 2025-02-10T16:13:56.580 +C Make\sthe\s"mix1"\stestset\sthe\sdefault\sfor\sspeedtest1. +D 2025-02-10T16:34:30.128 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -1681,7 +1681,7 @@ F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa F test/speed4p.test 377a0c48e5a92e0b11c1c5ebb1bc9d83a7312c922bc0cb05970ef5d6a96d1f0c F test/speedtest.md ee958457ae1b729d9715ae33c0320600000bf1d9ddea1a88dcf79f56729d6fad F test/speedtest.tcl 185f80f8db275852746e8150137b31ba4aaa1c9a1ecb1e35a3b66cd3f31783b9 x -F test/speedtest1.c abcce434642f8f1e1be530d25d8e7d7862360236d7a8e4f626521bc3263bd38c +F test/speedtest1.c 132cd5ba064f48910bb4b68337442b0ef419218c8de9e9855f66d98015286ddb F test/spellfix.test 951a6405d49d1a23d6b78027d3877b4a33eeb8221dcab5704b499755bb4f552e F test/spellfix2.test dfc8f519a3fc204cb2dfa8b4f29821ae90f6f8c3 F test/spellfix3.test 0f9efaaa502a0e0a09848028518a6fb096c8ad33 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 44b4e4db321815c6fc0327ed7b97df868833654411e882b70f54ad3f6d212987 -R 6770e3052628a73d65a1abe270e15306 +P ce307addb0c7cf72e4cca066521df6e15d1220bce303a3796a794a2ae5fa95b3 +R 7ff52f027efda91f136a0ad19e93519e U drh -Z b145be6a514a8b9ab22ab7f6982431ae +Z 3d75c6193c4df011902dd598934d5c2c # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 2351f8f438..be6b3b23b4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ce307addb0c7cf72e4cca066521df6e15d1220bce303a3796a794a2ae5fa95b3 +7a0c3d0e14984dd49a7c1e824b9e50564094ad57c43182bfec7624a55815f961 diff --git a/test/speedtest1.c b/test/speedtest1.c index a03bdbb73b..b49c70098f 100644 --- a/test/speedtest1.c +++ b/test/speedtest1.c @@ -2960,7 +2960,7 @@ int main(int argc, char **argv){ int memDb = 0; /* --memdb. Use an in-memory database */ int openFlags = SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE ; /* SQLITE_OPEN_xxx flags. */ - char *zTSet = "main"; /* Which --testset torun */ + char *zTSet = "mix1"; /* Which --testset torun */ int doTrace = 0; /* True for --trace */ const char *zEncoding = 0; /* --utf16be or --utf16le */ @@ -2971,6 +2971,10 @@ int main(int argc, char **argv){ int i; /* Loop counter */ int rc; /* API return code */ + /* "mix1" is a macro testset: */ + static char zMix1Tests[] = + "main,orm/25,cte/20,json,fp/3,parsenumber/25,rtree/10,star,app"; + #ifdef SQLITE_SPEEDTEST1_WASM /* Resetting all state is important for the WASM build, which may ** call main() multiple times. */ @@ -3116,11 +3120,8 @@ int main(int argc, char **argv){ } g.eTemp = argv[i][0] - '0'; }else if( strcmp(z,"testset")==0 ){ - static char zMix1Tests[] = - "main,orm/25,cte/20,json,fp/3,parsenumber/25,rtree/10,star,app"; ARGC_VALUE_CHECK(1); zTSet = argv[++i]; - if( strcmp(zTSet,"mix1")==0 ) zTSet = zMix1Tests; }else if( strcmp(z,"trace")==0 ){ doTrace = 1; }else if( strcmp(z,"threads")==0 ){ @@ -3272,6 +3273,7 @@ int main(int argc, char **argv){ } if( g.bExplain ) printf(".explain\n.echo on\n"); + if( strcmp(zTSet,"mix1")==0 ) zTSet = zMix1Tests; do{ char *zThisTest = zTSet; char *zSep; From b2972b8c6f864c99659ff469055a16db3ec34dd3 Mon Sep 17 00:00:00 2001 From: stephan Date: Mon, 10 Feb 2025 18:41:46 +0000 Subject: [PATCH 216/220] Minor autosetup doc tweaks. FossilOrigin-Name: bb53beb267ee5f5836020a58f32f1bed8deb587890eef9a6e034dad53f8c3f42 --- autosetup/proj.tcl | 6 +++--- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/autosetup/proj.tcl b/autosetup/proj.tcl index 6a1960f603..fdfbf3a5ed 100644 --- a/autosetup/proj.tcl +++ b/autosetup/proj.tcl @@ -184,8 +184,8 @@ proc proj-lshift_ {listVar {count 1}} { ######################################################################## # Expects to receive string input, which it splits on newlines, strips -# out any lines which begin with an number of whitespace followed by a -# '#', and returns a value containing the [append]ed results of each +# out any lines which begin with any number of whitespace followed by +# a '#', and returns a value containing the [append]ed results of each # remaining line with a \n between each. proc proj-strip-hash-comments {val} { set x {} @@ -203,7 +203,7 @@ proc proj-strip-hash-comments {val} { # A proxy for cc-check-function-in-lib which does not make any global # changes to the LIBS define. Returns the result of # cc-check-function-in-lib (i.e. true or false). The resulting linker -# flags are stored in ${lib_${function}}. +# flags are stored in the [define] named lib_${function}. proc proj-check-function-in-lib {function libs {otherlibs {}}} { set found 0 define-push {LIBS} { diff --git a/manifest b/manifest index f647110054..42a7ffe1d2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Make\sthe\s"mix1"\stestset\sthe\sdefault\sfor\sspeedtest1. -D 2025-02-10T16:34:30.128 +C Minor\sautosetup\sdoc\stweaks. +D 2025-02-10T18:41:46.630 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -49,7 +49,7 @@ F autosetup/cc-shared.tcl 4f024e94a47f427ba61de1739f6381ef0080210f9fae89112d5c1d F autosetup/cc.tcl c0fcc50ca91deff8741e449ddad05bcd08268bc31177e613a6343bbd1fd3e45f F autosetup/jimsh0.c 6573f6bc6ff204de0139692648d7037ca0b6c067bac83a7b4e087f20a86866a4 F autosetup/pkg-config.tcl 4e635bf39022ff65e0d5434339dd41503ea48fc53822c9c5bde88b02d3d952ba -F autosetup/proj.tcl 42119a2e899e319b92f3159952b7ef7219c82cb45eeb636aaf8d909def8150f8 +F autosetup/proj.tcl cef1e0aa0f2dee2042af66f28c97a9445f84d55d858ba9db4f6116846a1a325f F autosetup/sqlite-config.tcl 341c2751f42c6c8eeeae50bec13d2bb28db73ca2c8b9b97598332aed02e0a71b F autosetup/system.tcl 51d4be76cd9a9074704b584e5c9cbba616202c8468cf9ba8a4f8294a7ab1dba9 F configure 9a00b21dfd13757bbfb8d89b30660a89ec1f8f3a79402b8f9f9b6fc475c3303a x @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P ce307addb0c7cf72e4cca066521df6e15d1220bce303a3796a794a2ae5fa95b3 -R 7ff52f027efda91f136a0ad19e93519e -U drh -Z 3d75c6193c4df011902dd598934d5c2c +P 7a0c3d0e14984dd49a7c1e824b9e50564094ad57c43182bfec7624a55815f961 +R d2d2e8c6e583d1621c49ccc900539cec +U stephan +Z 67e48a24ab45c6698c52d6bd11ee89d3 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index be6b3b23b4..f29a5355c0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7a0c3d0e14984dd49a7c1e824b9e50564094ad57c43182bfec7624a55815f961 +bb53beb267ee5f5836020a58f32f1bed8deb587890eef9a6e034dad53f8c3f42 From 6cc36dfb16fcf101ec7e1f7dcebe4731233c96ea Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 10 Feb 2025 19:12:18 +0000 Subject: [PATCH 217/220] Add the --size option to the test/speedtest.tcl script. FossilOrigin-Name: 6b9007cb30257ca97de74dec1df47f46f238f034083517a51c24334e4bd30663 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/speedtest.tcl | 9 +++++++++ 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 42a7ffe1d2..b4d216617b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Minor\sautosetup\sdoc\stweaks. -D 2025-02-10T18:41:46.630 +C Add\sthe\s--size\soption\sto\sthe\stest/speedtest.tcl\sscript. +D 2025-02-10T19:12:18.297 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -1680,7 +1680,7 @@ F test/speed4.test abc0ad3399dcf9703abed2fff8705e4f8e416715 F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa F test/speed4p.test 377a0c48e5a92e0b11c1c5ebb1bc9d83a7312c922bc0cb05970ef5d6a96d1f0c F test/speedtest.md ee958457ae1b729d9715ae33c0320600000bf1d9ddea1a88dcf79f56729d6fad -F test/speedtest.tcl 185f80f8db275852746e8150137b31ba4aaa1c9a1ecb1e35a3b66cd3f31783b9 x +F test/speedtest.tcl 926d1e168f4a14e6fb68c5dc174de743536b547f365264bd5bac533b3621a4a0 x F test/speedtest1.c 132cd5ba064f48910bb4b68337442b0ef419218c8de9e9855f66d98015286ddb F test/spellfix.test 951a6405d49d1a23d6b78027d3877b4a33eeb8221dcab5704b499755bb4f552e F test/spellfix2.test dfc8f519a3fc204cb2dfa8b4f29821ae90f6f8c3 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 7a0c3d0e14984dd49a7c1e824b9e50564094ad57c43182bfec7624a55815f961 -R d2d2e8c6e583d1621c49ccc900539cec -U stephan -Z 67e48a24ab45c6698c52d6bd11ee89d3 +P bb53beb267ee5f5836020a58f32f1bed8deb587890eef9a6e034dad53f8c3f42 +R 00ccd32b91c1afa4d9f2520464e4c3e9 +U drh +Z c42977e3dfb38afa1042e7b43c0552ba # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index f29a5355c0..35a3e68b45 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bb53beb267ee5f5836020a58f32f1bed8deb587890eef9a6e034dad53f8c3f42 +6b9007cb30257ca97de74dec1df47f46f238f034083517a51c24334e4bd30663 diff --git a/test/speedtest.tcl b/test/speedtest.tcl index d201297158..1ad92d9ab0 100755 --- a/test/speedtest.tcl +++ b/test/speedtest.tcl @@ -27,6 +27,7 @@ Other options include: --lookaside N SZ Lookahead uses N slots of SZ bytes each. --pagesize N Use N as the page size. --quiet | -q "Quite". Put results in file but don't pop up editor + --size N Change the test size. 100 means 100%. Default: 5. --testset TEST Specify the specific testset to use. The default is "mix1". Other options include: "main", "json", "cte", "orm", "fp", "rtree". @@ -78,6 +79,14 @@ for {set i 0} {$i<[llength $argv]} {incr i} { incr i set testset [lindex $argv $i] } + -size - + --size { + incr i + set newsize [lindex $argv $i] + if {$newsize<1} {set newsize 1} + set speedtestflags \ + [regsub {.-size \d+} $speedtestflags "-size $newsize"] + } -n - -dryrun - --dryrun { From 0a4af54a7e67e3cf87a7cec44d80870f5df260cf Mon Sep 17 00:00:00 2001 From: drh <> Date: Mon, 10 Feb 2025 19:48:13 +0000 Subject: [PATCH 218/220] Remove a pointless line of code. FossilOrigin-Name: 57b2b812c8c5524f315e20cee0e6a12a3b1635aeb42925bf891532a7029d0eb0 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/expr.c | 1 - 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index b4d216617b..68312e890c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\s--size\soption\sto\sthe\stest/speedtest.tcl\sscript. -D 2025-02-10T19:12:18.297 +C Remove\sa\spointless\sline\sof\scode. +D 2025-02-10T19:48:13.176 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -730,7 +730,7 @@ F src/date.c 842c08ac143a56a627b05ac51d68624f2b7b03e3b4cba596205e735eed64ee57 F src/dbpage.c 2e677acb658a29965e55398bbc61161cb7819da538057c8032adac7ab8e4a8c0 F src/dbstat.c 73362c0df0f40ad5523a6f5501224959d0976757b511299bf892313e79d14f5c F src/delete.c 03a77ba20e54f0f42ebd8eddf15411ed6bdb06a2c472ac4b6b336521bf7cea42 -F src/expr.c 15fabfb67261e298a39fe61457f3cfa24148d9ca8d02f4dff385feb5cf523ea7 +F src/expr.c ca943270395374afc65256ce86cdb152a22fa6ff146895175833b89ba870e117 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c 928ed2517e8732113d2b9821aa37af639688d752f4ea9ac6e0e393d713eeb76f F src/func.c b2fb33139972d7d65640b27ea962a49f1616265428001090cab39fcf270228e1 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P bb53beb267ee5f5836020a58f32f1bed8deb587890eef9a6e034dad53f8c3f42 -R 00ccd32b91c1afa4d9f2520464e4c3e9 +P 6b9007cb30257ca97de74dec1df47f46f238f034083517a51c24334e4bd30663 +R 6d33e5e79434d78cc0854681af5e3875 U drh -Z c42977e3dfb38afa1042e7b43c0552ba +Z 4cd996db652c357ad0cb2f7e1b69e405 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 35a3e68b45..862aaf2925 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6b9007cb30257ca97de74dec1df47f46f238f034083517a51c24334e4bd30663 +57b2b812c8c5524f315e20cee0e6a12a3b1635aeb42925bf891532a7029d0eb0 diff --git a/src/expr.c b/src/expr.c index df47e34593..3011fcd9ad 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1849,7 +1849,6 @@ ExprList *sqlite3ExprListDup(sqlite3 *db, const ExprList *p, int flags){ } pItem->zEName = sqlite3DbStrDup(db, pOldItem->zEName); pItem->fg = pOldItem->fg; - pItem->fg.done = 0; pItem->u = pOldItem->u; } return pNew; From df9b89932f39a84da9f88603d80b5a1fa9f0e771 Mon Sep 17 00:00:00 2001 From: stephan Date: Tue, 11 Feb 2025 13:00:40 +0000 Subject: [PATCH 219/220] Adapt [https://fossil-scm.org/home/info/3bff7b92d6d|Fossil SCM patch 3bff7b92d6d], applying -lrt for platforms which need it for one of {fdatasync, nanosleep}. FossilOrigin-Name: 1768de6e9e2c6ff3a9ee29fa6f488fb3d23a3599195ac7d1b09e61c02b7d18b3 --- Makefile.in | 1 + autoconf/Makefile.in | 3 ++- autosetup/sqlite-config.tcl | 12 +++++++++--- main.mk | 3 ++- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- 6 files changed, 25 insertions(+), 16 deletions(-) diff --git a/Makefile.in b/Makefile.in index b932f56e20..59a62d0618 100644 --- a/Makefile.in +++ b/Makefile.in @@ -118,6 +118,7 @@ LDFLAGS.dlopen = @LDFLAGS_DLOPEN@ LDFLAGS.readline = @LDFLAGS_READLINE@ CFLAGS.readline = @CFLAGS_READLINE@ LDFLAGS.icu = @LDFLAGS_ICU@ +LDFLAGS.rt = @LDFLAGS_RT@ CFLAGS.icu = @CFLAGS_ICU@ LDFLAGS.libsqlite3.soname = @LDFLAGS_LIBSQLITE3_SONAME@ # soname: see https://sqlite.org/src/forumpost/5a3b44f510df8ded diff --git a/autoconf/Makefile.in b/autoconf/Makefile.in index 16e60879ea..8e09b9c610 100644 --- a/autoconf/Makefile.in +++ b/autoconf/Makefile.in @@ -67,6 +67,7 @@ LDFLAGS.pthread = @LDFLAGS_PTHREAD@ LDFLAGS.dlopen = @LDFLAGS_DLOPEN@ LDFLAGS.readline = @LDFLAGS_READLINE@ CFLAGS.readline = @CFLAGS_READLINE@ +LDFLAGS.rt = @LDFLAGS_RT@ LDFLAGS.icu = @LDFLAGS_ICU@ CFLAGS.icu = @CFLAGS_ICU@ @@ -135,7 +136,7 @@ LDFLAGS.libsqlite3 = \ $(LDFLAGS.rpath) $(LDFLAGS.pthread) \ $(LDFLAGS.math) $(LDFLAGS.dlopen) \ $(LDFLAGS.zlib) $(LDFLAGS.icu) \ - $(LDFLAGS.configure) + $(LDFLAGS.rt) $(LDFLAGS.configure) CFLAGS.libsqlite3 = -I. $(CFLAGS.core) $(CFLAGS.icu) $(OPT_FEATURE_FLAGS) sqlite3.o: $(TOP)/sqlite3.h $(TOP)/sqlite3.c diff --git a/autosetup/sqlite-config.tcl b/autosetup/sqlite-config.tcl index 904c439e0b..040d8d8b2d 100644 --- a/autosetup/sqlite-config.tcl +++ b/autosetup/sqlite-config.tcl @@ -187,9 +187,15 @@ proc sqlite-check-common-system-deps {} { cc-check-functions gmtime_r isnan localtime_r localtime_s \ malloc_usable_size strchrnul usleep utime pread pread64 pwrite pwrite64 - proj-check-function-in-lib fdatasync rt - define LDFLAGS_FDATASYNC [get-define lib_fdatasync] - undefine lib_fdatasync + set ldrt "" + # Collapse funcs from librt into LDFLAGS_RT. + # Some systems (ex: SunOS) require -lrt in order to use nanosleep + foreach func {fdatasync nanosleep} { + if {[proj-check-function-in-lib $func rt]} { + lappend ldrt [get-define lib_${func}] + } + } + define LDFLAGS_RT [join [lsort -unique $ldrt] ""] # # Check for needed/wanted headers diff --git a/main.mk b/main.mk index f5d8185f71..9eec5495ee 100644 --- a/main.mk +++ b/main.mk @@ -163,6 +163,7 @@ LDFLAGS.rpath ?= -Wl,-rpath -Wl,$(prefix)/lib LDFLAGS.pthread ?= -lpthread LDFLAGS.dlopen ?= -ldl LDFLAGS.shlib ?= -shared +LDFLAGS.rt ?= # nanosleep on some platforms LDFLAGS.icu ?= # -licui18n -licuuc -licudata CFLAGS.icu ?= LDFLAGS.libsqlite3.soname ?= # see https://sqlite.org/src/forumpost/5a3b44f510df8ded @@ -413,7 +414,7 @@ LDFLAGS.libsqlite3 = \ $(LDFLAGS.rpath) $(LDFLAGS.pthread) \ $(LDFLAGS.math) $(LDFLAGS.dlopen) \ $(LDFLAGS.zlib) $(LDFLAGS.icu) \ - $(LDFLAGS.configure) + $(LDFLAGS.rt) $(LDFLAGS.configure) # # $(install-dir.XYZ) = dirs for installation. diff --git a/manifest b/manifest index 68312e890c..f9ac5ccf3a 100644 --- a/manifest +++ b/manifest @@ -1,9 +1,9 @@ -C Remove\sa\spointless\sline\sof\scode. -D 2025-02-10T19:48:13.176 +C Adapt\s[https://fossil-scm.org/home/info/3bff7b92d6d|Fossil\sSCM\spatch\s3bff7b92d6d],\sapplying\s-lrt\sfor\splatforms\swhich\sneed\sit\sfor\sone\sof\s{fdatasync,\snanosleep}. +D 2025-02-11T13:00:40.707 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d -F Makefile.in 63c4d6e535dac4b7f6a6ffa566c96e3d68fa7f244799c38ee1e3d59305c5b55b +F Makefile.in aa869faf7ca086f35c9b3e974fddc7fd65ed2dc45a246b1a94e6f9fdc99b0ed5 F Makefile.linux-generic bd3e3cacd369821a6241d4ea1967395c962dfe3057e38cb0a435cee0e8b789d0 F Makefile.msc 990e4ea94a417135d1b2fd35550997c3f40fc1758bd7546bd17c0f4312f0babc F README.md c3c0f19532ce28f6297a71870f3c7b424729f0e6d9ab889616d3587dd2332159 @@ -16,7 +16,7 @@ F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2 F art/sqlite370.svg 40b7e2fe8aac3add5d56dd86ab8d427a4eca5bcb3fe4f8946cb3794e1821d531 F auto.def fdd6965e06bce02a8b9f9ed57a52d05bcbec4b56e4bef2174866bb5713c65fda F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac -F autoconf/Makefile.in f706b48abb13553ecc5034d5fc296d424fd36d73c222285b7590004dec508925 +F autoconf/Makefile.in 7bd73a4c8cd89025cbc92b4f887c6fd1b8cd8ecbe62c4ac1f36ac84d04043479 F autoconf/Makefile.msc 0a071367537dc395285a5d624ac4f99f3a387b27cc5e89752423c0499e15aec4 F autoconf/README.first f1d3876e9a7852c22f275a6f06814e64934cecbc0b5b9617d64849094c1fd136 F autoconf/README.txt 7f01dc3915e2d68f329011073662369e62a0938a2c69398807823c57591cb288 @@ -50,7 +50,7 @@ F autosetup/cc.tcl c0fcc50ca91deff8741e449ddad05bcd08268bc31177e613a6343bbd1fd3e F autosetup/jimsh0.c 6573f6bc6ff204de0139692648d7037ca0b6c067bac83a7b4e087f20a86866a4 F autosetup/pkg-config.tcl 4e635bf39022ff65e0d5434339dd41503ea48fc53822c9c5bde88b02d3d952ba F autosetup/proj.tcl cef1e0aa0f2dee2042af66f28c97a9445f84d55d858ba9db4f6116846a1a325f -F autosetup/sqlite-config.tcl 341c2751f42c6c8eeeae50bec13d2bb28db73ca2c8b9b97598332aed02e0a71b +F autosetup/sqlite-config.tcl 9b3ae79286705077003f0b54bb9d2cd388f9bef5017707cc73f0f90ba56ce865 F autosetup/system.tcl 51d4be76cd9a9074704b584e5c9cbba616202c8468cf9ba8a4f8294a7ab1dba9 F configure 9a00b21dfd13757bbfb8d89b30660a89ec1f8f3a79402b8f9f9b6fc475c3303a x F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad @@ -702,7 +702,7 @@ F ext/wasm/tests/opfs/concurrency/test.js d08889a5bb6e61937d0b8cbb78c9efbefbf65a F ext/wasm/tests/opfs/concurrency/worker.js 0a8c1a3e6ebb38aabbee24f122693f1fb29d599948915c76906681bb7da1d3d2 F ext/wasm/wasmfs.make 68999f5bd8c489239592d59a420f8c627c99169bbd6fa16a404751f757b9f702 F magic.txt 5ade0bc977aa135e79e3faaea894d5671b26107cc91e70783aa7dc83f22f3ba0 -F main.mk 7c9df07a41c406a5fbe4e7e4021f29fa4f18821d61354721fd0435fc24f95321 +F main.mk c85055d36c36c188cee94cabe2e252cd912d10d1a9d62af477e855533b9531b2 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 F mptest/crash01.test 61e61469e257df0850df4293d7d4d6c2af301421 @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 6b9007cb30257ca97de74dec1df47f46f238f034083517a51c24334e4bd30663 -R 6d33e5e79434d78cc0854681af5e3875 -U drh -Z 4cd996db652c357ad0cb2f7e1b69e405 +P 57b2b812c8c5524f315e20cee0e6a12a3b1635aeb42925bf891532a7029d0eb0 +R 914d530882ce85285895c4ba17cd5bb4 +U stephan +Z 452df3b98ff1feca6a8fd2421b0c5ff6 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 862aaf2925..834fa7d6b4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -57b2b812c8c5524f315e20cee0e6a12a3b1635aeb42925bf891532a7029d0eb0 +1768de6e9e2c6ff3a9ee29fa6f488fb3d23a3599195ac7d1b09e61c02b7d18b3 From 62e1d44846baa68cdfcdcbdd58fcb4483cc5de47 Mon Sep 17 00:00:00 2001 From: stephan Date: Tue, 11 Feb 2025 13:13:46 +0000 Subject: [PATCH 220/220] Make the --out-implib support ([6092b0b86bf93a3d]) specifically opt-in because the feature check for it passes on some platforms where it is not recognized at link-time. FossilOrigin-Name: 75535f2355b3b2e83dd57f4c30340af98c8dbcfe6ff1e9be17d23bd30d7d766c --- auto.def | 8 ++++++-- autoconf/auto.def | 4 ++++ autosetup/sqlite-config.tcl | 19 +++++++++++++------ manifest | 16 ++++++++-------- manifest.uuid | 2 +- 5 files changed, 32 insertions(+), 17 deletions(-) diff --git a/auto.def b/auto.def index 3a5a2f64c1..6274d79b68 100644 --- a/auto.def +++ b/auto.def @@ -198,6 +198,9 @@ set flags { gcov=0 => {Enable coverage testing using gcov} linemacros => {Enable #line macros in the amalgamation} dynlink-tools => {Dynamically link libsqlite3 to certain tools which normally statically embed it.} + dump-defines=0 => {Dump autosetup defines to $::sqliteConfig(dump-defines-txt) (for build debugging)} + # + # soname:=legacy => # --soname has a long story behind it: https://sqlite.org/src/forumpost/5a3b44f510df8ded {SONAME for libsqlite3.so. "none", or not using this flag, sets no @@ -207,8 +210,9 @@ set flags { suffix which gets applied to "libsqlite3.so.", e.g. --soname=9.10 equates to "libsqlite3.so.9.10". } - dump-defines=0 => {Dump autosetup defines to $::sqliteConfig(dump-defines-txt) (for build debugging)} - # + out-implib=0 => + {Enable use of --out-implib linker flag to generate an "import library" for the DLL} + # } if {"" ne $::sqliteConfig(dump-defines-json)} { lappend flags \ diff --git a/autoconf/auto.def b/autoconf/auto.def index 72f50094b8..42af1b459b 100644 --- a/autoconf/auto.def +++ b/autoconf/auto.def @@ -66,6 +66,7 @@ options { performance-critical loops. Never use --debug for production builds.} # + # soname:=legacy => # --soname has a long story behind it: https://sqlite.org/src/forumpost/5a3b44f510df8ded {SONAME for libsqlite3.so. "none", or not using this flag, sets no @@ -75,6 +76,9 @@ options { suffix which gets applied to "libsqlite3.so.", e.g. --soname=9.10 equates to "libsqlite3.so.9.10". } + out-implib=0 => + {Enable use of --out-implib linker flag to generate an "import library" for the DLL} + # } sqlite-post-options-init diff --git a/autosetup/sqlite-config.tcl b/autosetup/sqlite-config.tcl index 040d8d8b2d..1aaa8af374 100644 --- a/autosetup/sqlite-config.tcl +++ b/autosetup/sqlite-config.tcl @@ -965,16 +965,23 @@ proc sqlite-check-mac-cversion {} { # used for building an "import library .dll.a" file on some platforms # (e.g. mingw). Returns 1 if supported, else 0. # +# If the configure flag --out-implib is not used then this is a no-op. +# The feature is specifically opt-in because on some platforms the +# feature test will pass but using that flag will fail at link-time +# (e.g. OpenBSD). +# # Added in response to: https://sqlite.org/forum/forumpost/0c7fc097b2 proc sqlite-check-out-implib {} { define LDFLAGS_OUT_IMPLIB "" set rc 0 - cc-with {} { - set dll "libsqlite3[get-define TARGET_DLLEXT]" - set flags "-Wl,--out-implib,${dll}.a" - if {[cc-check-flags $flags]} { - define LDFLAGS_OUT_IMPLIB $flags - set rc 1 + if {[proj-opt-was-provided out-implib]} { + cc-with {} { + set dll "libsqlite3[get-define TARGET_DLLEXT]" + set flags "-Wl,--out-implib,${dll}.a" + if {[cc-check-flags $flags]} { + define LDFLAGS_OUT_IMPLIB $flags + set rc 1 + } } } return $rc diff --git a/manifest b/manifest index f9ac5ccf3a..77a1282113 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Adapt\s[https://fossil-scm.org/home/info/3bff7b92d6d|Fossil\sSCM\spatch\s3bff7b92d6d],\sapplying\s-lrt\sfor\splatforms\swhich\sneed\sit\sfor\sone\sof\s{fdatasync,\snanosleep}. -D 2025-02-11T13:00:40.707 +C Make\sthe\s--out-implib\ssupport\s([6092b0b86bf93a3d])\sspecifically\sopt-in\sbecause\sthe\sfeature\scheck\sfor\sit\spasses\son\ssome\splatforms\swhere\sit\sis\snot\srecognized\sat\slink-time. +D 2025-02-11T13:13:46.626 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -14,13 +14,13 @@ F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90 F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2 F art/sqlite370.svg 40b7e2fe8aac3add5d56dd86ab8d427a4eca5bcb3fe4f8946cb3794e1821d531 -F auto.def fdd6965e06bce02a8b9f9ed57a52d05bcbec4b56e4bef2174866bb5713c65fda +F auto.def ccf74471ec89edfd5bf942fd6d60fc8ce09f7aa7527d668a1ac44d1bbbcb412d F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac F autoconf/Makefile.in 7bd73a4c8cd89025cbc92b4f887c6fd1b8cd8ecbe62c4ac1f36ac84d04043479 F autoconf/Makefile.msc 0a071367537dc395285a5d624ac4f99f3a387b27cc5e89752423c0499e15aec4 F autoconf/README.first f1d3876e9a7852c22f275a6f06814e64934cecbc0b5b9617d64849094c1fd136 F autoconf/README.txt 7f01dc3915e2d68f329011073662369e62a0938a2c69398807823c57591cb288 -F autoconf/auto.def 71dde17158afcd6fb097b66853371991bb6ca5517b034e2efa9f0c47a2e730f2 +F autoconf/auto.def f468a32e6f57c52390e0fe2466974d0afaa1b0fc1d51cbacb4cb3950bd089f67 F autoconf/tea/Makefile.in ba0556fee8da09c066bad85a4457904e46ee2c2eabaa309c0e83a78f2f151a8e F autoconf/tea/README.txt 61e62e519579e4a112791354d6d440f8b51ea6db3b0bab58d59f29df42d2dfe3 F autoconf/tea/aclocal.m4 52c47aac44ce0ddb1f918b6993e8beb8eee88f43 @@ -50,7 +50,7 @@ F autosetup/cc.tcl c0fcc50ca91deff8741e449ddad05bcd08268bc31177e613a6343bbd1fd3e F autosetup/jimsh0.c 6573f6bc6ff204de0139692648d7037ca0b6c067bac83a7b4e087f20a86866a4 F autosetup/pkg-config.tcl 4e635bf39022ff65e0d5434339dd41503ea48fc53822c9c5bde88b02d3d952ba F autosetup/proj.tcl cef1e0aa0f2dee2042af66f28c97a9445f84d55d858ba9db4f6116846a1a325f -F autosetup/sqlite-config.tcl 9b3ae79286705077003f0b54bb9d2cd388f9bef5017707cc73f0f90ba56ce865 +F autosetup/sqlite-config.tcl 62fd6e8782ecfb9f8e54cf2860e590ce9d8692218f03cfa8b25e87ff6b1d0b9b F autosetup/system.tcl 51d4be76cd9a9074704b584e5c9cbba616202c8468cf9ba8a4f8294a7ab1dba9 F configure 9a00b21dfd13757bbfb8d89b30660a89ec1f8f3a79402b8f9f9b6fc475c3303a x F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad @@ -2209,8 +2209,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 57b2b812c8c5524f315e20cee0e6a12a3b1635aeb42925bf891532a7029d0eb0 -R 914d530882ce85285895c4ba17cd5bb4 +P 1768de6e9e2c6ff3a9ee29fa6f488fb3d23a3599195ac7d1b09e61c02b7d18b3 +R fdc42f738677b90118628cf2f1a344a1 U stephan -Z 452df3b98ff1feca6a8fd2421b0c5ff6 +Z 712b8acba7b833aec2f3ddadc507080f # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 834fa7d6b4..d8bcef0a58 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1768de6e9e2c6ff3a9ee29fa6f488fb3d23a3599195ac7d1b09e61c02b7d18b3 +75535f2355b3b2e83dd57f4c30340af98c8dbcfe6ff1e9be17d23bd30d7d766c