1
0
mirror of https://github.com/sqlite/sqlite.git synced 2026-10-23 21:49:02 +03:00

Merge latest trunk changes into this branch.

FossilOrigin-Name: 1f71b530c9e8ddce5b25ed0971447cd925f9194afc7a2f929429318a5fcb5a72
This commit is contained in:
dan
2026-05-19 16:07:22 +00:00
14 changed files with 224 additions and 68 deletions

View File

@@ -341,7 +341,7 @@ static int fts3auxNextMethod(sqlite3_vtab_cursor *pCursor){
/* State 3. The integer just read is a column number. */
default: assert( eState==3 );
iCol = (int)v;
if( iCol<1 ){
if( iCol<1 || iCol>0x3fffffff ){
rc = SQLITE_CORRUPT_VTAB;
break;
}

View File

@@ -471,6 +471,7 @@ static int getNextNode(
assert( nKey==4 );
if( zInput[4]=='/' && zInput[5]>='0' && zInput[5]<='9' ){
nKey += 1+sqlite3Fts3ReadInt(&zInput[nKey+1], &nNear);
if( nNear>=1000000000 ) nNear = 1000000000;
}
}

View File

@@ -887,7 +887,7 @@ static int fts3ExprLHits(
if( p->flag==FTS3_MATCHINFO_LHITS ){
p->aMatchinfo[iStart + iCol] = (u32)nHit;
}else if( nHit ){
p->aMatchinfo[iStart + (iCol+1)/32] |= (1 << (iCol&0x1F));
p->aMatchinfo[iStart + iCol/32] |= (1U << (iCol&0x1F));
}
}
assert( *pIter==0x00 || *pIter==0x01 );

View File

@@ -29,6 +29,17 @@
** RBU does not use this extension directly. Rather, this extension is
** provided as a convenience to developers who want to analyze RBU files
** that contain deltas.
**
** Typical build commands assuming
**
** DIR=ext/misc
* NAME=fossildelta
**
** First run "make sqlite3ext.h" then:
**
** linux: gcc -shared -I. -fPIC -o $NAME.so $DIR/$NAME.c
** OS-X: gcc -dynamiclib -fPIC -I. -o $NAME.dylib $DIR/$NAME.c
** Win11: cl -I. $DIR/$NAME.c -link -dll -out:$NAME.dll
*/
#include <string.h>
#include <assert.h>
@@ -43,6 +54,7 @@ SQLITE_EXTENSION_INIT1
*/
typedef unsigned int u32;
typedef sqlite3_uint64 u64;
typedef sqlite3_int64 i64;
/*
** Must be a 16-bit value
@@ -769,11 +781,11 @@ struct deltaparsevtab_vtab {
struct deltaparsevtab_cursor {
sqlite3_vtab_cursor base; /* Base class - must be first */
char *aDelta; /* The delta being parsed */
int nDelta; /* Number of bytes in the delta */
int iCursor; /* Current cursor location */
i64 iCursor; /* Current cursor location */
i64 iNext; /* Next cursor value */
i64 nDelta; /* Number of bytes in the delta */
int eOp; /* Name of current operator */
unsigned int a1, a2; /* Arguments to current operator */
int iNext; /* Next cursor value */
};
/* Operator names:
@@ -887,14 +899,14 @@ static int deltaparsevtabNext(sqlite3_vtab_cursor *cur){
}
pCur->a2 = deltaGetInt(&z, &i);
pCur->eOp = DELTAPARSE_OP_COPY;
pCur->iNext = (int)(&z[1] - pCur->aDelta);
pCur->iNext = (i64)(&z[1] - pCur->aDelta);
break;
}
case ':': {
z++;
pCur->a2 = (unsigned int)(z - pCur->aDelta);
pCur->eOp = DELTAPARSE_OP_INSERT;
pCur->iNext = (int)(&z[pCur->a1] - pCur->aDelta);
pCur->iNext = (i64)(&z[pCur->a1] - pCur->aDelta);
break;
}
case ';': {
@@ -938,7 +950,7 @@ static int deltaparsevtabColumn(
if( pCur->eOp==DELTAPARSE_OP_COPY ){
sqlite3_result_int(ctx, pCur->a2);
}else if( pCur->eOp==DELTAPARSE_OP_INSERT ){
if( pCur->a2 + pCur->a1 > pCur->nDelta ){
if( (i64)pCur->a2 + (i64)pCur->a1 > pCur->nDelta ){
sqlite3_result_zeroblob(ctx, pCur->a1);
}else{
sqlite3_result_blob(ctx, pCur->aDelta+pCur->a2, pCur->a1,
@@ -1014,7 +1026,7 @@ static int deltaparsevtabFilter(
return SQLITE_OK;
}
a++;
pCur->iNext = (unsigned int)(a - pCur->aDelta);
pCur->iNext = (i64)(a - pCur->aDelta);
return SQLITE_OK;
}

View File

@@ -289,6 +289,10 @@ static void prefixLengthFunc(
int nL = sqlite3_value_bytes(apVal[0]);
int nR = sqlite3_value_bytes(apVal[1]);
int i;
if( zL==0 || zR==0 ){
sqlite3_result_int(ctx, 0);
return;
}
nByte = (nL > nR ? nL : nR);
for(i=0; i<nByte; i++){

View File

@@ -1008,6 +1008,8 @@ static int editDist3Core(
unsigned int stackSpace[SQLITE_SPELLFIX_STACKALLOC_SZ/sizeof(unsigned int)];
/* allocate the Wagner matrix and the aTo[] array for the TO string */
if( n2>10000 ) return -2;
if( f.n>10000 ) return -2;
n = (f.n+1)*(n2+1);
n = (n+1)&~1;
nByte = n*sizeof(m[0]) + sizeof(a2[0])*n2;
@@ -1198,6 +1200,8 @@ static void editDist3SqlFunc(
editDist3FromStringDelete(pFrom);
if( dist==(-1) ){
sqlite3_result_error_nomem(context);
}else if( dist==(-2) ){
sqlite3_result_error_toobig(context);
}else{
sqlite3_result_int(context, dist);
}

View File

@@ -1,5 +1,5 @@
C Fix\sa\sproblem\sapplying\schangesets\sthat\scontain\smultiple\sUPDATE\sconstraint\sloops.
D 2026-05-18T20:34:56.095
C Merge\slatest\strunk\schanges\sinto\sthis\sbranch.
D 2026-05-19T16:07:22.065
F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
@@ -82,13 +82,13 @@ F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d
F ext/fts3/fts3.c 6cc7bbc307f27e7b6ee2e1d5ff63ffff4df3b42529dfe00eb34ddded417961b3
F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe
F ext/fts3/fts3Int.h 277f32f304e82f4397fc2a74793c0a95318b7abb9670b519e4805a00946cbd9b
F ext/fts3/fts3_aux.c 37ba1b10bbd163ddc6b05dbc3a306a0d5d68aee3d30f33b4dc5794955cc50887
F ext/fts3/fts3_expr.c 5c13796638d8192c388777166075cdc8bc4b6712024cd5b72c31acdbefce5984
F ext/fts3/fts3_aux.c c105f6502df588f49a383eb22aed953844fb0e31265361a0cc8dd73037b37e39
F ext/fts3/fts3_expr.c 907dd64deb881c0586d5ecbabc96cfebdbe2ff9e7a052d379fd3b606edfa21ea
F ext/fts3/fts3_hash.c d9dba473741445789330c7513d4f65737c92df23c3212784312931641814672a
F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf
F ext/fts3/fts3_icu.c 305ce7fb6036484085b5556a9c8e62acdc7763f0f4cdf5fd538212a9f3720116
F ext/fts3/fts3_porter.c 024417020c57dd1ab39816f5fe6cf45222a857b78a1f6412f040ada1ceabd4ff
F ext/fts3/fts3_snippet.c abe3b2998e7cb6d1ab6019f87f021758a0df3ee4010fe144a174a524cff96fe6
F ext/fts3/fts3_snippet.c 65e178107b59ad4724a11339a645f2e3789f3cf59b2f4e29c90efd864e53c5b4
F ext/fts3/fts3_term.c 6a96027ad364001432545fe43322b6af04ed28bb5619ec51af1f59d0710d6d69
F ext/fts3/fts3_test.c cc329471e573f95a6ea9fbca87e89dcfa1d355591c80172ffcd759ac521d25d8
F ext/fts3/fts3_tokenize_vtab.c 66eba6c2baa04b2b15e80d68341b8fd0b4d3831f6b2edb33916a2906ff2d4389
@@ -377,7 +377,7 @@ F ext/misc/decimal.c 432e5b03a0e2a68a1846a9852a565a1b546ca9b295deda834e4653f0f55
F ext/misc/eval.c 04bc9aada78c888394204b4ed996ab834b99726fb59603b0ee3ed6e049755dc1
F ext/misc/explain.c 9670c8ff7b255eea7845abc5123a4958e74016c16990b10497e56380f91704b9
F ext/misc/fileio.c 936c0a7b3382a047d833ad33f62ba59a3847b79ea745bf529797cd344966fbb0
F ext/misc/fossildelta.c 40add35db7f355d29ae856fe09043e66802fceff6f2551baccb28d794cadbc77
F ext/misc/fossildelta.c 6aa3f15279cd2d796583e3ff654be7d2df745fdbea7987c1640e78ce1fac899e
F ext/misc/fuzzer.c decaca5a3479dfba69576cd41d4e17161eaf154a5438e12d316bbc5853571802
F ext/misc/ieee754.c 2901d08a586d00a1d3c0fd89e03c57ee9e2b5f013b0daab9e49c7a48a9d5946b
F ext/misc/memstat.c 03ab52d2d841eb3f55118105c1964d5225f152b23bd708844c648b48d14ccbcf
@@ -388,7 +388,7 @@ F ext/misc/noop.c f1a21cc9b7a4e667e5c8458d80ba680b8bd4315a003f256006046879f679c5
F ext/misc/normalize.c fbb144a861809686ff2b5b6eee8bb2e1207f9bf13ce7376e5273c700a1eafbd5
F ext/misc/pcachetrace.c f4227ce03fb16aa8d6f321b72dd051097419d7a028a9853af048bee7645cb405
F ext/misc/percentile.c 72e05a21db20a2fa85264b99515941f00ae698824c9db82d7edfbb16cea8ec80
F ext/misc/prefixes.c aa15fd268e7d1336d1a1d4bc79265860d1d2ad68bba4cbcab61f83e4989dc68c
F ext/misc/prefixes.c efc261429fd8ab43cedc0d38b94d86d87437af5550651bceb618bd7e84e25125
F ext/misc/qpvtab.c 470a5fffba005c8e1994209e59c1848122351e19522de71beb68d666c4fa39a5
F ext/misc/randomjson.c ef835fc64289e76ac4873b85fe12f9463a036168d7683cf2b773e36e6262c4ed
F ext/misc/regexp.c 378e6e84516952a4b9f3f4df88927f20e6538e2609f55b773ed78899dab8206e
@@ -399,7 +399,7 @@ F ext/misc/series.c 496f43bac9bad2ee2cea63fb5212036f30ad3003b4cd317d5c2d6f3ad7c7
F ext/misc/sha1.c 9a11826db885e8afd997c0a1b28bb799a43e462ef770ac33f19e744887c9c6fa
F ext/misc/shathree.c fd22d70620f86a0467acfdd3acd8435d5cb54eb1e2d9ff36ae44e389826993df
F ext/misc/showauth.c 732578f0fe4ce42d577e1c86dc89dd14a006ab52
F ext/misc/spellfix.c 693c8fd3293087fa821322967a97e59dfa24051e5d2ca7fa85790a4034db6fa4
F ext/misc/spellfix.c 33c92014c4662c2678ec01fd7dfa622aeff2f6f0f7821f643b331d4cabac2c7e
F ext/misc/sqlar.c 97c100b010159c08a7a9acd8eb1ea510a5522e64741aaafcd7b6c629de682edc
F ext/misc/sqlite3_stdio.c b43a0f530c6f0fb3d41d9af8c0b40f3f71198a1db55ab8ffffbef5c8cc329d22
F ext/misc/sqlite3_stdio.h 27a4ecea47e61bc9574ccdf2806f468afe23af2f95028c9b689bfa08ab1ce99f
@@ -677,7 +677,7 @@ F src/auth.c b5ece4e1edccad082c0332fa0087df225473bae0feea9269f824312201377185
F src/backup.c 6ebe22ccbedfcb92423833992130e8d65824be4e6599c3a03f540ab38fc7d13c
F src/bitvec.c e242d4496774dfc88fa278177dd23b607dce369ccafb3f61b41638eea2c9b399
F src/btmutex.c 30dada73a819a1ef5b7583786370dce1842e12e1ad941e4d05ac29695528daea
F src/btree.c 6a111fbcc9f4fa1450f81f9531f2045ab75c1fe33112fb7d7a20b631fa9ca4b9
F src/btree.c eba3271a61031f5a930486416ae2ec8697221e86d1a3c68a014c5f78641f2116
F src/btree.h e823c46d87f63d904d735a24b76146d19f51f04445ea561f71cc3382fd1307f0
F src/btreeInt.h 9c0f9ea5c9b5f4dcaea18111d43efe95f2ac276cd86d770dce10fd99ccc93886
F src/build.c 866e584cdf40fbc83f530af9fd4d0991582a6fdbd8a9911b7cdbbea5f26a4a9e
@@ -735,7 +735,7 @@ F src/pragma.c 789ef67117b74b5be0a2db6681f7f0c55e6913791b9da309aefd280de2c8a74d
F src/prepare.c 084a037fd3810cb7ffbfc001cd58c0ffac68ba36598a5084b55ea2a090014ebd
F src/printf.c 2bc09ee91d69c709528575bbbee2199e16d6a7e68e1508ac7cf998a7289170ca
F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
F src/resolve.c 11134922dfc2c89d10c658a1ae9ae9e1af0df031d40b9e9171dc14d3f2e6d80f
F src/resolve.c 7e936a09405cb59e2b3e51a3ad23753e4803afc5269c5171a54c9bdd70f4fc50
F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
F src/select.c 4c05cde130f26991b7411d8c6809e0630625e18078742c963a047b4b9cc01d49
F src/shell.c.in 9dcc77636cdc48d67ea0cd7f4d54d791202e435e05598ec0a147cd61269e1c4d
@@ -1520,7 +1520,7 @@ F test/pragma4.test 396ef9bff1fb966d41721545ad4b12bfc26aae315f5fe51d9b917828d49e
F test/pragma5.test 7b33fc43e2e41abf17f35fb73f71b49671a380ea92a6c94b6ce530a25f8d9102
F test/pragma6.test c5ec577ba087954b4dfa619a3cbe97b155b60a0af487527abe89b10fc17e6512
F test/pragmafault.test 275edaf3161771d37de60e5c2b412627ac94cef11739236bec12ed1258b240f8
F test/prefixes.test b524a1c44bffec225b9aec98bd728480352aa8532ac4c15771fb85e8beef65d9
F test/prefixes.test f2c4f30d5d439ca203ec69d72f5e1cc408916104e5310423542faef8003cf013
F test/printf.test 854ddc19b31e83de41142a6b0c8dbb812fcdbbb127cdcafc0c5efef58b790eee
F test/printf2.test 3f55c1871a5a65507416076f6eb97e738d5210aeda7595a74ee895f2224cce60
F test/progress.test ebab27f670bd0d4eb9d20d49cef96e68141d92fb
@@ -1677,7 +1677,7 @@ F test/speedtest1.c f9f30f35431bfc1d3ee9acc561624e0c0b4614071044bc302169dd27206a
F test/spellfix.test 951a6405d49d1a23d6b78027d3877b4a33eeb8221dcab5704b499755bb4f552e
F test/spellfix2.test dfc8f519a3fc204cb2dfa8b4f29821ae90f6f8c3
F test/spellfix3.test 0f9efaaa502a0e0a09848028518a6fb096c8ad33
F test/spellfix4.test 51c7c26514ade169855c66bcf130bd5acfb4d7fd090cc624645ab275ae6a41fb
F test/spellfix4.test 7c56a09de68b95051ef0627fe235e514efbba2aa816dc2a9c5c670d98877e632
F test/sqldiff1.test 1b7ab4f312442c5cc6b3a5f299fa8ca051416d1dd173cb1126fd51bf64f2c3fb
F test/sqllimits1.test 408131e4975d61868711c83f101a56d4602313cc5cae88d3eee81c1da364fd89
F test/sqllog.test 6af6cb0b09f4e44e1917e06ce85be7670302517a
@@ -1722,8 +1722,8 @@ F test/temptrigfault.tes fc5918e64f3867156fefe7cfca9d8e1f495134a5229b2b511b0dc11
F test/temptrigger.test a00f258ed8d21a0e8fd4f322f15e8cfb5cef2e43655670e07a753e3fb4769d61
F test/tester.tcl 2d943f60200e0a36bcd3f1f0baf181a751cd3604ef6b6bd4c8dc39b4e8a53116
F test/testloadext.c 862b848783eaed9985fbce46c65cd214664376b549fae252b364d5d1ef350a27
F test/testrunner.tcl 6d13732185c13aef87540ebf9daafb8d9657e66f0ac00eb082d93f4749311d4e x
F test/testrunner_data.tcl dfcf192d274e965845189cc014ac89fff91dde92b6e2ac9e1262897fc21ee2e0
F test/testrunner.tcl ca474a06ef014260fa2b26489dd7896e0920944a8f4f4beae1339c0a9c862df8 x
F test/testrunner_data.tcl 4b3cf036d39c98b83f9289a5c047eb01089c932d4f59a81bf764f6800589b959
F test/testrunner_estwork.tcl 81e2ae10238f50540f42fbf2d94913052a99bfb494b69e546506323f195dcff9
F test/thread001.test a0985c117eab62c0c65526e9fa5d1360dd1cac5b03bde223902763274ce21899
F test/thread002.test c24c83408e35ba5a952a3638b7ac03ccdf1ce4409289c54a050ac4c5f1de7502
@@ -2206,8 +2206,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee
F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c
P 5f8010599fb33fbe1dadc894a679056a5d38040ab4f09772cd59827941e9348b
R 0e16a12d6b8b38337384a7915987c0d2
P 8e89aafab1b8fa7d59ac98c39b7f1c1cc23a98ba868a5dac83dee63688786a3f 00d546812810252a4d51ff796931dc2ff5bdd5173ddb8f95fb5efccd897087ff
R ccba5192e3ac1ab0f2f6f49d3fa4ca52
U dan
Z c71ece5751b3bebe9c49c58b00d28025
Z 3c493d02f7acdba605881b535f4660c2
# Remove this line to create a well-formed Fossil manifest.

View File

@@ -1 +1 @@
8e89aafab1b8fa7d59ac98c39b7f1c1cc23a98ba868a5dac83dee63688786a3f
1f71b530c9e8ddce5b25ed0971447cd925f9194afc7a2f929429318a5fcb5a72

View File

@@ -1656,7 +1656,7 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){
** reconstruct the entire page. */
if( (int)data[hdr+7]<=nMaxFrag ){
int iFree = get2byte(&data[hdr+1]);
if( iFree>usableSize-4 ) return SQLITE_CORRUPT_PAGE(pPage);
if( NEVER(iFree>usableSize-4) ) return SQLITE_CORRUPT_PAGE(pPage);
if( iFree ){
int iFree2 = get2byte(&data[iFree]);
if( iFree2>usableSize-4 ) return SQLITE_CORRUPT_PAGE(pPage);
@@ -5300,6 +5300,12 @@ static int accessPayload(
(eOp==0 ? PAGER_GET_READONLY : 0)
);
if( rc==SQLITE_OK ){
if( eOp!=0
&& (sqlite3PagerPageRefcount(pDbPage)!=1
|| NEVER(((MemPage*)sqlite3PagerGetExtra(pDbPage))->isInit)) ){
sqlite3PagerUnref(pDbPage);
return SQLITE_CORRUPT_PAGE(pPage);
}
aPayload = sqlite3PagerGetData(pDbPage);
nextPage = get4byte(aPayload);
rc = copyPayload(&aPayload[offset+4], pBuf, a, eOp, pDbPage);

View File

@@ -941,6 +941,26 @@ static int exprProbability(Expr *p){
return (int)(r*134217728.0);
}
/*
** Set the EP_SubtArg property on every expression inside of
** pList. If any subexpression is actually a subquery, then
** also set the EP_SubtArg property on the first result-set
** column of that subquery.
*/
static SQLITE_NOINLINE void resolveSetExprSubtypeArg(ExprList *pList){
int nn, ii;
nn = pList ? pList->nExpr : 0;
for(ii=0; ii<nn; ii++){
Expr *pExpr = pList->a[ii].pExpr;
ExprSetProperty(pExpr, EP_SubtArg);
if( pExpr->op==TK_SELECT ){
assert( ExprUseXSelect(pExpr) );
assert( pExpr->x.pSelect!=0 );
resolveSetExprSubtypeArg(pExpr->x.pSelect->pEList);
}
}
}
/*
** This routine is callback for sqlite3WalkExpr().
**
@@ -1185,10 +1205,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
if( (pDef->funcFlags & SQLITE_SUBTYPE)
|| ExprHasProperty(pExpr, EP_SubtArg)
){
int ii;
for(ii=0; ii<n; ii++){
ExprSetProperty(pList->a[ii].pExpr, EP_SubtArg);
}
resolveSetExprSubtypeArg(pList);
}
if( pDef->funcFlags & (SQLITE_FUNC_CONSTANT|SQLITE_FUNC_SLOCHNG) ){

View File

@@ -14,7 +14,7 @@
set testdir [file dirname $argv0]
source $testdir/tester.tcl
set testprefix unionvtab
set testprefix prefixes
ifcapable !vtab {
finish_test
@@ -85,4 +85,12 @@ foreach {tn INPUT expected} {
} $expected
}
do_execsql_test 3.1 {
SELECT prefix_length(null,'abc');
} 0
do_execsql_test 3.2 {
SELECT prefix_length('abc',null);
} 0
finish_test

View File

@@ -350,4 +350,14 @@ do_execsql_test 320 {
)
} {69d0a31872203a775e19325ea98cd053}
do_catchsql_test 400 {
SELECT editdist3(format('%.10001c','x'),'abc');
} {1 {string or blob too big}}
do_catchsql_test 401 {
SELECT editdist3('xxxabc',format('%.10001c','x'));
} {1 {string or blob too big}}
do_catchsql_test 410 {
SELECT editdist3(format('abc%.9997c','x'),format('abc%.9997c','x'));
} {0 0}
finish_test

View File

@@ -113,6 +113,7 @@ Usage:
$a0 joblist ?PATTERN?
$a0 njob ?NJOB?
$a0 retest
$a0 make CONFIG TARGETS
$a0 script ?-msvc? CONFIG
$a0 status ?-d SECS? ?--cls?
@@ -171,6 +172,8 @@ as complete. Testing will halt when all tests currently running complete.
The "clean" command removes files and directories created by a prior
invocation of testrunner.tcl.
The "make" command runs "make" configured for the specific CONFIG.
The "script" command outputs the script used to build a configuration.
Add the "-msvc" option for a Windows-compatible script. For a list of
available configurations enter "$a0 script help".
@@ -585,6 +588,87 @@ if {[string compare -nocase script [lindex $argv 0]]==0} {
exit
}
#--------------------------------------------------------------------------
# Check if this is the "make" command. Example:
#
# test/testrunner.tcl make Debug-Two clean testfixture
# \_______/ \_______________/
# Configuration ----------^ ^---------- Arguments to "make"
#
# This works by running the equivalent of "testrunner.tcl script" to generate
# the approprate shell script or BAT file, then invoking that script. The
# generated script is usually deleted automatically, but that can be suppressed
# using the --keep option.
#
if {[string compare -nocase "make" [lindex $argv 0]]==0} {
set bKeep 0
set bDryRun 0
set Config {}
set MakeArgs [list]
for {set i 1} {$i<[llength $argv]} {incr i} {
set arg [lindex $argv $i]
if {$arg eq "-keep" || $arg eq "--keep"} {
set bKeep 1
continue
}
if {[regexp {^--?dry-?run$} $arg] || [regexp {^--?n$} $arg]} {
set bDryRun 1
continue
}
if {$Config eq ""} {
if {![info exists ::trd::build($arg)]} {
puts stderr "No such configuration: $arg"
puts stderr "Should be one of: [lsort [array names ::trd::build]]"
exit 1
}
set Config $arg
continue
}
lappend MakeArgs $arg
}
if {$Config eq ""} {
puts stderr "Missing configuration name"
puts stderr "Run \"$argv0 help\" for help"
exit 1
}
set scriptname testrunner-[expr {int(rand()*1000000)}][clock seconds]
if {$tcl_platform(platform) eq "windows"} {
set bMsvc 1
append scriptname .bat
} else {
set bMsvc 0
append scriptname .sh
}
if {$bDryRun} {
puts "Script \"$scriptname\" would have been:"
puts [trd_buildscript $Config [file dirname $testdir] $bMsvc $MakeArgs]
exit 0
}
set fd [open $scriptname w]
puts $fd [trd_buildscript $Config [file dirname $testdir] $bMsvc $MakeArgs]
close $fd
if {$bMsvc} {
set rc [catch {
exec $scriptname >@stdout
} msg]
set rc 0
} else {
set rc [catch {
exec sh $scriptname >@stdout 2>@stderr
} msg]
}
if {$bKeep} {
puts "script retained in \"$scriptname\"
} else {
file delete -force $scriptname
}
if {$rc} {
puts stderr "make failed: $msg"
exit 1
}
exit
}
# Compute an elapse time string MM:SS or HH:MM:SS based on the
# number of milliseconds in the argument.
#
@@ -2052,6 +2136,3 @@ if {$TRG(explain)} {
}
trdb close
exit $exit_status

View File

@@ -473,10 +473,12 @@ proc trd_all_configs {} {
}
proc trimscript {text} {
set text [string map {"\n " "\n"} [string trim $text]]
set text [string map {"\n " "\n"} [string trim $text]]
set text [string map {"\n\n" "\n"} $text]
return $text
}
proc make_sh_script {srcdir opts cflags makeOpts configOpts} {
proc make_sh_script {srcdir opts cflags makeOpts configOpts {targets {}}} {
set tcldir [::tcl::pkgconfig get libdir,install]
set myopts ""
@@ -488,43 +490,54 @@ proc make_sh_script {srcdir opts cflags makeOpts configOpts} {
append myopts "OPTS=\"\$OPTS $o\"\n"
}
return [trimscript [subst -nocommands {
set -e
if [ "\$#" -ne 1 ] ; then
echo "Usage: \$0 <target>"
exit -1
fi
SRCDIR="$srcdir"
TCLDIR="$tcldir"
if [ ! -f Makefile ] ; then
\$SRCDIR/configure --with-tcl=\$TCLDIR $configOpts
fi
$myopts
CFLAGS="$cflags"
make \$1 "CFLAGS=\$CFLAGS" "OPTS=\$OPTS" $makeOpts
set out "set -e\n"
if {[llength $targets]==0} {
set out [trimscript {
if [ "$#" -lt 1 ] ; then
echo "Usage: $0 <target>"
exit -1
fi
}]\n
}
append out [trimscript [subst -nocommands {
SRCDIR="$srcdir"
TCLDIR="$tcldir"
if [ ! -f Makefile ] ; then
\$SRCDIR/configure --with-tcl=\$TCLDIR $configOpts
fi
$myopts
CFLAGS="$cflags"
}]]\n
if {[llength $targets]==0} {set targets {$*}}
append out [trimscript [subst -nocommands {
make $targets "CFLAGS=\$CFLAGS" "OPTS=\$OPTS" $makeOpts
}]]
return $out
}
# Generate the text of a *.bat script.
#
proc make_bat_file {srcdir opts cflags makeOpts} {
proc make_bat_file {srcdir opts cflags makeOpts {targets {}}} {
set srcdir [file nativename [file normalize $srcdir]]
return [trimscript [subst -nocommands {
set TARGET=%1
set TMP=%CD%
nmake /f $srcdir\\Makefile.msc TOP="$srcdir" %TARGET% "CCOPTS=$cflags" "OPTS=$opts" $makeOpts
}]]
set makefile $srcdir\\Makefile.msc
if {[llength $targets]==0} {
return [trimscript [subst -nocommands {
set TARGET=%1
set TMP=%CD%
nmake /f $makefile TOP="$srcdir" %TARGET% "CCOPTS=$cflags" "OPTS=$opts" $makeOpts
}]]
} else {
return [trimscript [subst -nocommands {
set TMP=%CD%
nmake /f $makefile TOP="$srcdir" $targets "CCOPTS=$cflags" "OPTS=$opts" $makeOpts
}]]
}
}
# Generate the text of a shell script.
#
proc make_script {cfg srcdir bMsvc} {
proc make_script {cfg srcdir bMsvc {targets {}}} {
set opts [list] ;# OPTS value
set cflags [expr {$bMsvc ? "-Zi" : "-g"}] ;# CFLAGS value
set makeOpts [list] ;# Extra args for [make]
@@ -624,9 +637,9 @@ proc make_script {cfg srcdir bMsvc} {
}
if {$bMsvc==0} {
set zRet [make_sh_script $srcdir $opts $cflags $makeOpts $configOpts]
return [make_sh_script $srcdir $opts $cflags $makeOpts $configOpts $targets]
} else {
set zRet [make_bat_file $srcdir $opts $cflags $makeOpts]
return [make_bat_file $srcdir $opts $cflags $makeOpts $targets]
}
}
@@ -643,7 +656,7 @@ proc make_script {cfg srcdir bMsvc} {
# directory of that containing this script). MSVC is a boolean - true to
# use the MSVC compiler, false otherwise.
#
proc trd_buildscript {config srcdir bMsvc} {
proc trd_buildscript {config srcdir bMsvc {targets {}}} {
trd_import
# Ensure that the named configuration exists.
@@ -657,7 +670,7 @@ proc trd_buildscript {config srcdir bMsvc} {
}
# Generate and return the script.
return [make_script $build($config) $srcdir $bMsvc]
return [make_script $build($config) $srcdir $bMsvc $targets]
}
# Usage: