From 76226dd28d79a19d9b942931866390dec6937179 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 24 Sep 2015 17:38:01 +0000 Subject: [PATCH 01/98] Fix over-length source code lines in where.c. No logic changes. FossilOrigin-Name: 1c8c5380a8b45c9e04d9663c3cb8182ef3a61b81 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/where.c | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 54da3e3420..cb00afceb9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Strengthen\sthe\simplementations\sof\sxShmMemoryBarrier\son\sboth\sthe\sunix\sand\nwindows\sVFSes,\sso\sthat\sthey\slikely\swork\seven\sif\sSQLITE_THREADSAFE=0\sis\sused. -D 2015-09-24T12:40:43.573 +C Fix\sover-length\ssource\scode\slines\sin\swhere.c.\s\sNo\slogic\schanges. +D 2015-09-24T17:38:01.215 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1afa6fb2de2bddd50e0ddae8166c2ee9d69b301 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -417,7 +417,7 @@ F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb F src/wal.c 18b0ed49830cf04fe2d68224b41838a73ac6cd24 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/walker.c 2e14d17f592d176b6dc879c33fbdec4fbccaa2ba -F src/where.c d5eed2584542e7f3bc78ddef7809a9d76d14d811 +F src/where.c 6f7156dc7285c4ff4f625e4f4fee57a83f25f89c F src/whereInt.h 7892bb54cf9ca0ae5c7e6094491b94c9286dc647 F src/wherecode.c 7660e1ad16817a921b099af553f3e1349352d16f F src/whereexpr.c 2473e4350e30f9b55d1c6a8f66ca23c689f23f1d @@ -1388,7 +1388,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P c2fcb03299f2872d7f97a540ea145519f8b2e5cc -R 48a05a5fcfc27e989d0482f8603455ad +P c6ab807b72ddfc1462f61aa91442b6fac04ace8a +R 2adfc3245dccf622041366bbd2c07bc2 U drh -Z 5529d899992d962be9e3269522b69c12 +Z 1d5bb04c383d0f49d84249f8afd90c66 diff --git a/manifest.uuid b/manifest.uuid index 8b729d0105..90d457ac4d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c6ab807b72ddfc1462f61aa91442b6fac04ace8a \ No newline at end of file +1c8c5380a8b45c9e04d9663c3cb8182ef3a61b81 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 1e13cf0ed0..c99306fa46 100644 --- a/src/where.c +++ b/src/where.c @@ -188,7 +188,7 @@ static WhereTerm *whereScanNext(WhereScan *pScan){ if( pTerm->leftCursor==iCur && pTerm->u.leftColumn==iColumn && (iColumn!=(-2) - || sqlite3ExprCompare(pTerm->pExpr->pLeft,pScan->pIdxExpr,iCur)==0) + || sqlite3ExprCompare(pTerm->pExpr->pLeft,pScan->pIdxExpr,iCur)==0) && (pScan->iEquiv<=1 || !ExprHasProperty(pTerm->pExpr, EP_FromJoin)) ){ if( (pTerm->eOperator & WO_EQUIV)!=0 @@ -2580,7 +2580,7 @@ static int whereLoopAddBtree( && (pWInfo->pParse->db->flags & SQLITE_AutoIndex)!=0 && pSrc->pIBIndex==0 /* Has no INDEXED BY clause */ && !pSrc->fg.notIndexed /* Has no NOT INDEXED clause */ - && HasRowid(pTab) /* Is not a WITHOUT ROWID table. (FIXME: Why not?) */ + && 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. */ ){ From dae26fe518c65f26e7d256a161acfe37910f897e Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 24 Sep 2015 18:47:59 +0000 Subject: [PATCH 02/98] Enhance the query planner so that it is able to use indexed expressions to help fulfill an ORDER BY clause. FossilOrigin-Name: 668fc1ebaf426f9eed3ed7865e41f1023dafebfb --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/where.c | 23 ++++++++++++++++++----- test/indexexpr1.test | 37 +++++++++++++++++++++++++++++++++++++ 4 files changed, 63 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index cb00afceb9..e5079a39f3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sover-length\ssource\scode\slines\sin\swhere.c.\s\sNo\slogic\schanges. -D 2015-09-24T17:38:01.215 +C Enhance\sthe\squery\splanner\sso\sthat\sit\sis\sable\sto\suse\sindexed\sexpressions\nto\shelp\sfulfill\san\sORDER\sBY\sclause. +D 2015-09-24T18:47:59.761 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1afa6fb2de2bddd50e0ddae8166c2ee9d69b301 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -417,7 +417,7 @@ F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb F src/wal.c 18b0ed49830cf04fe2d68224b41838a73ac6cd24 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/walker.c 2e14d17f592d176b6dc879c33fbdec4fbccaa2ba -F src/where.c 6f7156dc7285c4ff4f625e4f4fee57a83f25f89c +F src/where.c 278073aabce8d2020d30dff2edb6fe9430e1762c F src/whereInt.h 7892bb54cf9ca0ae5c7e6094491b94c9286dc647 F src/wherecode.c 7660e1ad16817a921b099af553f3e1349352d16f F src/whereexpr.c 2473e4350e30f9b55d1c6a8f66ca23c689f23f1d @@ -785,7 +785,7 @@ F test/index5.test 8621491915800ec274609e42e02a97d67e9b13e7 F test/index6.test 7102ec371414c42dfb1d5ca37eb4519aa9edc23a F test/index7.test 9c6765a74fc3fcde7aebc5b3bd40d98df14a527c F test/indexedby.test 9c4cd331224e57f79fbf411ae245e6272d415985 -F test/indexexpr1.test 203c83a05accf6f2b748834192f3564321b8c0d8 +F test/indexexpr1.test 4bce4e4b6b1a2d0c34e17d4e04f3957a3bcdc500 F test/indexfault.test 31d4ab9a7d2f6e9616933eb079722362a883eb1d F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 F test/insert.test 38742b5e9601c8f8d76e9b7555f7270288c2d371 @@ -1388,7 +1388,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P c6ab807b72ddfc1462f61aa91442b6fac04ace8a -R 2adfc3245dccf622041366bbd2c07bc2 +P 1c8c5380a8b45c9e04d9663c3cb8182ef3a61b81 +R 292146e62fe1cf1653fb27c4bd570968 U drh -Z 1d5bb04c383d0f49d84249f8afd90c66 +Z 3832f12930eca538f34541b12960504f diff --git a/manifest.uuid b/manifest.uuid index 90d457ac4d..8bdf819c4f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1c8c5380a8b45c9e04d9663c3cb8182ef3a61b81 \ No newline at end of file +668fc1ebaf426f9eed3ed7865e41f1023dafebfb \ No newline at end of file diff --git a/src/where.c b/src/where.c index c99306fa46..e6c7728c3a 100644 --- a/src/where.c +++ b/src/where.c @@ -2421,18 +2421,25 @@ static int indexMightHelpWithOrderBy( int iCursor ){ ExprList *pOB; + ExprList *aColExpr; int ii, jj; if( pIndex->bUnordered ) return 0; if( (pOB = pBuilder->pWInfo->pOrderBy)==0 ) return 0; for(ii=0; iinExpr; ii++){ Expr *pExpr = sqlite3ExprSkipCollate(pOB->a[ii].pExpr); - if( pExpr->op!=TK_COLUMN ) return 0; - if( pExpr->iTable==iCursor ){ + if( pExpr->op==TK_COLUMN && pExpr->iTable==iCursor ){ if( pExpr->iColumn<0 ) return 1; for(jj=0; jjnKeyCol; jj++){ if( pExpr->iColumn==pIndex->aiColumn[jj] ) return 1; } + }else if( (aColExpr = pIndex->aColExpr)!=0 ){ + for(jj=0; jjnKeyCol; jj++){ + if( pIndex->aiColumn[jj]!=(-2) ) continue; + if( sqlite3ExprCompare(pExpr,aColExpr->a[jj].pExpr,iCursor)==0 ){ + return 1; + } + } } } return 0; @@ -3264,9 +3271,15 @@ static i8 wherePathSatisfiesOrderBy( testcase( wctrlFlags & WHERE_GROUPBY ); testcase( wctrlFlags & WHERE_DISTINCTBY ); if( (wctrlFlags & (WHERE_GROUPBY|WHERE_DISTINCTBY))==0 ) bOnce = 0; - if( pOBExpr->op!=TK_COLUMN ) continue; - if( pOBExpr->iTable!=iCur ) continue; - if( pOBExpr->iColumn!=iColumn ) continue; + if( iColumn>=(-1) ){ + if( pOBExpr->op!=TK_COLUMN ) continue; + if( pOBExpr->iTable!=iCur ) continue; + if( pOBExpr->iColumn!=iColumn ) continue; + }else{ + if( sqlite3ExprCompare(pOBExpr,pIndex->aColExpr->a[j].pExpr,iCur) ){ + continue; + } + } if( iColumn>=0 ){ pColl = sqlite3ExprCollSeq(pWInfo->pParse, pOrderBy->a[i].pExpr); if( !pColl ) pColl = db->pDfltColl; diff --git a/test/indexexpr1.test b/test/indexexpr1.test index 1945059f2b..e18cbd8d38 100644 --- a/test/indexexpr1.test +++ b/test/indexexpr1.test @@ -88,6 +88,23 @@ do_execsql_test indexexpr1-160eqp { WHERE substr(a,27,3)=='ord' AND d>=29; } {/USING INDEX t1a2/} +# ORDER BY using an indexed expression +# +do_execsql_test indexexpr1-170 { + CREATE INDEX t1alen ON t1(length(a)); + SELECT length(a) FROM t1 ORDER BY length(a); +} {20 25 27 29 38 52} +do_execsql_test indexexpr1-170eqp { + EXPLAIN QUERY PLAN + SELECT length(a) FROM t1 ORDER BY length(a); +} {/SCAN TABLE t1 USING INDEX t1alen/} +do_execsql_test indexexpr1-171 { + SELECT length(a) FROM t1 ORDER BY length(a) DESC; +} {52 38 29 27 25 20} +do_execsql_test indexexpr1-171eqp { + EXPLAIN QUERY PLAN + SELECT length(a) FROM t1 ORDER BY length(a) DESC; +} {/SCAN TABLE t1 USING INDEX t1alen/} do_execsql_test indexexpr1-200 { DROP TABLE t1; @@ -255,4 +272,24 @@ do_execsql_test indexexpr1-710 { ORDER BY +a, +x; } {1 1 | 2 2 |} +# Collating sequences on indexes of expressions +# +do_execsql_test indexexpr1-800 { + DROP TABLE IF EXISTS t8; + CREATE TABLE t8(a INTEGER PRIMARY KEY, b TEXT); + CREATE UNIQUE INDEX t8bx ON t8(substr(b,2,4) COLLATE nocase); + INSERT INTO t8(a,b) VALUES(1,'Alice'),(2,'Bartholemew'),(3,'Cynthia'); + SELECT * FROM t8 WHERE substr(b,2,4)='ARTH' COLLATE nocase; +} {2 Bartholemew} +do_catchsql_test indexexpr1-810 { + INSERT INTO t8(a,b) VALUES(4,'BARTHMERE'); +} {1 {UNIQUE constraint failed: index 't8bx'}} +do_catchsql_test indexexpr1-820 { + DROP INDEX t8bx; + CREATE UNIQUE INDEX t8bx ON t8(substr(b,2,4) COLLATE rtrim); + INSERT INTO t8(a,b) VALUES(4,'BARTHMERE'); +} {0 {}} + + + finish_test From 8ffddeb7087fa263cb794244b6e6edce859e3319 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 25 Sep 2015 01:09:27 +0000 Subject: [PATCH 03/98] Fix a problem computing affinities for indexes during skip-scan code generation when SQLITE_ENABLE_STAT4 is on. Bug introduced by check-in [1ee089a72d789002]. FossilOrigin-Name: 1350dd42d056508337b1a07ad8b1c9c97593f8d3 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/where.c | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index e5079a39f3..e86f6aafd2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sthe\squery\splanner\sso\sthat\sit\sis\sable\sto\suse\sindexed\sexpressions\nto\shelp\sfulfill\san\sORDER\sBY\sclause. -D 2015-09-24T18:47:59.761 +C Fix\sa\sproblem\scomputing\saffinities\sfor\sindexes\sduring\sskip-scan\scode\s\ngeneration\swhen\sSQLITE_ENABLE_STAT4\sis\son.\s\sBug\sintroduced\sby\ncheck-in\s[1ee089a72d789002]. +D 2015-09-25T01:09:27.582 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1afa6fb2de2bddd50e0ddae8166c2ee9d69b301 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -417,7 +417,7 @@ F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb F src/wal.c 18b0ed49830cf04fe2d68224b41838a73ac6cd24 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/walker.c 2e14d17f592d176b6dc879c33fbdec4fbccaa2ba -F src/where.c 278073aabce8d2020d30dff2edb6fe9430e1762c +F src/where.c a7582b752d436d335bfb62f445e1c2771e7daa95 F src/whereInt.h 7892bb54cf9ca0ae5c7e6094491b94c9286dc647 F src/wherecode.c 7660e1ad16817a921b099af553f3e1349352d16f F src/whereexpr.c 2473e4350e30f9b55d1c6a8f66ca23c689f23f1d @@ -1388,7 +1388,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 1c8c5380a8b45c9e04d9663c3cb8182ef3a61b81 -R 292146e62fe1cf1653fb27c4bd570968 +P 668fc1ebaf426f9eed3ed7865e41f1023dafebfb +R e89f89bb659102a73737ed43d8a4eae7 U drh -Z 3832f12930eca538f34541b12960504f +Z 28a6620004b61f128b9c9ee72c986f80 diff --git a/manifest.uuid b/manifest.uuid index 8bdf819c4f..1fe02891b6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -668fc1ebaf426f9eed3ed7865e41f1023dafebfb \ No newline at end of file +1350dd42d056508337b1a07ad8b1c9c97593f8d3 \ No newline at end of file diff --git a/src/where.c b/src/where.c index e6c7728c3a..6578900c10 100644 --- a/src/where.c +++ b/src/where.c @@ -1159,6 +1159,7 @@ static LogEst whereRangeAdjust(WhereTerm *pTerm, LogEst nNew){ ** Return the affinity for a single column of an index. */ static char sqlite3IndexColumnAffinity(sqlite3 *db, Index *pIdx, int iCol){ + assert( iCol>=0 && iColnColumn ); if( !pIdx->zColAff ){ if( sqlite3IndexAffinityStr(db, pIdx)==0 ) return SQLITE_AFF_BLOB; } @@ -1216,8 +1217,7 @@ static int whereRangeSkipScanEst( int nLower = -1; int nUpper = p->nSample+1; int rc = SQLITE_OK; - int iCol = p->aiColumn[nEq]; - u8 aff = sqlite3IndexColumnAffinity(db, p, iCol); + u8 aff = sqlite3IndexColumnAffinity(db, p, nEq); CollSeq *pColl; sqlite3_value *p1 = 0; /* Value extracted from pLower */ From 2679f14fd942cb103e52bf9141ec73e427dc63b0 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 25 Sep 2015 13:42:55 +0000 Subject: [PATCH 04/98] Report an error if the number of named columns in a VIEW is different from the number of result columns in the SELECT statement that implements the VIEW. FossilOrigin-Name: 6e4ac0be2de1a16fcbb2a314504122ad95aa257e --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/select.c | 10 ++++++++++ test/view.test | 10 ++++++++++ 4 files changed, 28 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index e86f6aafd2..e784e63e3f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sproblem\scomputing\saffinities\sfor\sindexes\sduring\sskip-scan\scode\s\ngeneration\swhen\sSQLITE_ENABLE_STAT4\sis\son.\s\sBug\sintroduced\sby\ncheck-in\s[1ee089a72d789002]. -D 2015-09-25T01:09:27.582 +C Report\san\serror\sif\sthe\snumber\sof\snamed\scolumns\sin\sa\sVIEW\sis\sdifferent\nfrom\sthe\snumber\sof\sresult\scolumns\sin\sthe\sSELECT\sstatement\sthat\simplements\nthe\sVIEW. +D 2015-09-25T13:42:55.978 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1afa6fb2de2bddd50e0ddae8166c2ee9d69b301 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -340,7 +340,7 @@ F src/printf.c 0c4bcdd1c2e2521024f0a69cb5eb334f86b3652a F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 F src/resolve.c 1954a0f01bf65d78d7d559aea3d5c67f33376d91 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e -F src/select.c 36ee14d729e182cd8b6796f980b7ab3fc9bcee72 +F src/select.c 33230303f5f32430ee971a6fcc6a370e4a93ae1a F src/shell.c 6332ef06db1390ef812cfdff1fc97b4fd76cdd42 F src/sqlite.h.in 4e06cb5fed36736242c66237991db6f3e2395eb9 F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad @@ -1248,7 +1248,7 @@ F test/vacuum3.test 77ecdd54592b45a0bcb133339f99f1ae0ae94d0d F test/vacuum4.test d3f8ecff345f166911568f397d2432c16d2867d9 F test/varint.test ab7b110089a08b9926ed7390e7e97bdefeb74102 F test/veryquick.test 57ab846bacf7b90cf4e9a672721ea5c5b669b661 -F test/view.test 3930ae94042d702ab15a6a0ef692cfa5c9f9b68b +F test/view.test bfdec45ad4b2ed5dd5fddbc3dcafcfca2ab23574 F test/vtab1.test 6210e076997f176bedc300a87ad6404651b601dd F test/vtab2.test f8cd1bb9aba7143eba97812d9617880a36d247ad F test/vtab3.test b45f47d20f225ccc9c28dc915d92740c2dee311e @@ -1388,7 +1388,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 668fc1ebaf426f9eed3ed7865e41f1023dafebfb -R e89f89bb659102a73737ed43d8a4eae7 +P 1350dd42d056508337b1a07ad8b1c9c97593f8d3 +R 9672ebd00531833a09889a78098f4f34 U drh -Z 28a6620004b61f128b9c9ee72c986f80 +Z 160c60a319774154e17ae3a2bf9d8f26 diff --git a/manifest.uuid b/manifest.uuid index 1fe02891b6..aaf3eedcfb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1350dd42d056508337b1a07ad8b1c9c97593f8d3 \ No newline at end of file +6e4ac0be2de1a16fcbb2a314504122ad95aa257e \ No newline at end of file diff --git a/src/select.c b/src/select.c index a4aaa0ecaf..f410a3b329 100644 --- a/src/select.c +++ b/src/select.c @@ -4861,7 +4861,17 @@ int sqlite3Select( struct SrcList_item *pItem = &pTabList->a[i]; Select *pSub = pItem->pSelect; int isAggSub; + Table *pTab = pItem->pTab; if( pSub==0 ) continue; + + /* Catch mismatch in the declared columns of a view and the number of + ** columns in the SELECT on the RHS */ + if( pTab->nCol!=pSub->pEList->nExpr ){ + sqlite3ErrorMsg(pParse, "expected %d columns for '%s' but got %d", + pTab->nCol, pTab->zName, pSub->pEList->nExpr); + goto select_end; + } + isAggSub = (pSub->selFlags & SF_Aggregate)!=0; if( flattenSubquery(pParse, p, i, isAgg, isAggSub) ){ /* This subquery can be absorbed into its parent. */ diff --git a/test/view.test b/test/view.test index b39487689c..891dde6579 100644 --- a/test/view.test +++ b/test/view.test @@ -161,6 +161,16 @@ do_test view-3.3.3 { do_catchsql_test view-3.3.4 { CREATE VIEW v1err(x,y DESC,z) AS SELECT a, b+c, c-b FROM t1; } {1 {syntax error after column name "y"}} +do_catchsql_test view-3.3.5 { + DROP VIEW IF EXISTS v1err; + CREATE VIEW v1err(x,y) AS SELECT a, b+c, c-b FROM t1; + SELECT * FROM v1err; +} {1 {expected 2 columns for 'v1err' but got 3}} +do_catchsql_test view-3.3.6 { + DROP VIEW IF EXISTS v1err; + CREATE VIEW v1err(w,x,y,z) AS SELECT a, b+c, c-b FROM t1; + SELECT * FROM v1err; +} {1 {expected 4 columns for 'v1err' but got 3}} ifcapable compound { do_test view-3.4 { From 68391acd5f11ec64e74eca419ec8088f26c03c5c Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 25 Sep 2015 20:49:16 +0000 Subject: [PATCH 05/98] Fix PRAGMA integrity_check so that it works with a UNIQUE index over expressions. FossilOrigin-Name: 113181cec4db418b07640d6b1967923992efd71a --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/pragma.c | 4 ++-- test/indexexpr1.test | 18 +++++++++++++++++- 4 files changed, 27 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index e784e63e3f..c2494e6384 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Report\san\serror\sif\sthe\snumber\sof\snamed\scolumns\sin\sa\sVIEW\sis\sdifferent\nfrom\sthe\snumber\sof\sresult\scolumns\sin\sthe\sSELECT\sstatement\sthat\simplements\nthe\sVIEW. -D 2015-09-25T13:42:55.978 +C Fix\sPRAGMA\sintegrity_check\sso\sthat\sit\sworks\swith\sa\sUNIQUE\sindex\sover\nexpressions. +D 2015-09-25T20:49:16.032 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1afa6fb2de2bddd50e0ddae8166c2ee9d69b301 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -333,7 +333,7 @@ F src/parse.y f599aa5e871a493330d567ced93de696f61f48f7 F src/pcache.c 24be750c79272e0ca7b6e007bc94999700f3e5ef F src/pcache.h 9968603796240cdf83da7e7bef76edf90619cea9 F src/pcache1.c e822007159d53a7ea7aa040d6e28964ddb6de083 -F src/pragma.c d71b813e67bf03f3116b9dd5164fbfd81ec673a2 +F src/pragma.c 577f70c3899ee6fc2e5a4c37158c69c1c23f71e7 F src/pragma.h 631a91c8b0e6ca8f051a1d8a4a0da4150e04620a F src/prepare.c 82e5db1013846a819f198336fed72c44c974e7b1 F src/printf.c 0c4bcdd1c2e2521024f0a69cb5eb334f86b3652a @@ -785,7 +785,7 @@ F test/index5.test 8621491915800ec274609e42e02a97d67e9b13e7 F test/index6.test 7102ec371414c42dfb1d5ca37eb4519aa9edc23a F test/index7.test 9c6765a74fc3fcde7aebc5b3bd40d98df14a527c F test/indexedby.test 9c4cd331224e57f79fbf411ae245e6272d415985 -F test/indexexpr1.test 4bce4e4b6b1a2d0c34e17d4e04f3957a3bcdc500 +F test/indexexpr1.test bbb52b5d5717d9f23853826963b0af5110009366 F test/indexfault.test 31d4ab9a7d2f6e9616933eb079722362a883eb1d F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 F test/insert.test 38742b5e9601c8f8d76e9b7555f7270288c2d371 @@ -1388,7 +1388,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 1350dd42d056508337b1a07ad8b1c9c97593f8d3 -R 9672ebd00531833a09889a78098f4f34 +P 6e4ac0be2de1a16fcbb2a314504122ad95aa257e +R ddf8c16716e71dc2258fab1042b22895 U drh -Z 160c60a319774154e17ae3a2bf9d8f26 +Z 58a6b6e5eae00c6fe24fb1e13719f1e4 diff --git a/manifest.uuid b/manifest.uuid index aaf3eedcfb..4cdda680b1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6e4ac0be2de1a16fcbb2a314504122ad95aa257e \ No newline at end of file +113181cec4db418b07640d6b1967923992efd71a \ No newline at end of file diff --git a/src/pragma.c b/src/pragma.c index 2dcad614f1..1edc66daf8 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1524,8 +1524,8 @@ void sqlite3Pragma( int kk; for(kk=0; kknKeyCol; kk++){ int iCol = pIdx->aiColumn[kk]; - assert( iCol>=0 && iColnCol ); - if( pTab->aCol[iCol].notNull ) continue; + assert( iCol!=(-1) && iColnCol ); + if( iCol>=0 && pTab->aCol[iCol].notNull ) continue; sqlite3VdbeAddOp2(v, OP_IsNull, r1+kk, uniqOk); VdbeCoverage(v); } diff --git a/test/indexexpr1.test b/test/indexexpr1.test index e18cbd8d38..89bea1877f 100644 --- a/test/indexexpr1.test +++ b/test/indexexpr1.test @@ -210,7 +210,8 @@ do_execsql_test indexexpr1-400 { SELECT x, printf('ab%04xyz',x), random() FROM c; CREATE UNIQUE INDEX t3abc ON t3(CAST(a AS text), b, substr(c,1,3)); SELECT a FROM t3 WHERE CAST(a AS text)<='10' ORDER BY +a; -} {1 10} + PRAGMA integrity_check; +} {1 10 ok} do_catchsql_test indexexpr1-410 { INSERT INTO t3 SELECT * FROM t3 WHERE rowid=10; } {1 {UNIQUE constraint failed: index 't3abc'}} @@ -290,6 +291,21 @@ do_catchsql_test indexexpr1-820 { INSERT INTO t8(a,b) VALUES(4,'BARTHMERE'); } {0 {}} +# Check that PRAGMA integrity_check works correctly on a +# UNIQUE index that includes rowid and expression terms. +# +do_execsql_test indexexpr1-900 { + CREATE TABLE t9(a,b,c,d); + CREATE UNIQUE INDEX t9x1 ON t9(c,abs(d),b); + INSERT INTO t9(rowid,a,b,c,d) VALUES(1,2,3,4,5); + INSERT INTO t9(rowid,a,b,c,d) VALUES(2,NULL,NULL,NULL,NULL); + INSERT INTO t9(rowid,a,b,c,d) VALUES(3,NULL,NULL,NULL,NULL); + INSERT INTO t9(rowid,a,b,c,d) VALUES(4,5,6,7,8); + PRAGMA integrity_check; +} {ok} +do_catchsql_test indexexpr1-910 { + INSERT INTO t9(a,b,c,d) VALUES(5,6,7,-8); +} {1 {UNIQUE constraint failed: index 't9x1'}} finish_test From 2ea31b1286adb309baad799e5e82a2d28071d785 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 25 Sep 2015 23:40:01 +0000 Subject: [PATCH 06/98] Fix threads.c so that setting sqlite3FaultSim(200) using the SQLITE_TESTCTRL_FAULT_INSTALL callback causes both unix and windows worker threads to be sequential and deterministic, so that they can be tested reliably. FossilOrigin-Name: 2d867c054d6d3e1e841ba9ca524e986bc6993ac3 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/threads.c | 11 ++++++++++- 3 files changed, 17 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index c2494e6384..2325407c95 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sPRAGMA\sintegrity_check\sso\sthat\sit\sworks\swith\sa\sUNIQUE\sindex\sover\nexpressions. -D 2015-09-25T20:49:16.032 +C Fix\sthreads.c\sso\sthat\ssetting\ssqlite3FaultSim(200)\susing\sthe\nSQLITE_TESTCTRL_FAULT_INSTALL\scallback\scauses\sboth\sunix\sand\swindows\sworker\nthreads\sto\sbe\ssequential\sand\sdeterministic,\sso\sthat\sthey\scan\sbe\stested\nreliably. +D 2015-09-25T23:40:01.663 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1afa6fb2de2bddd50e0ddae8166c2ee9d69b301 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -395,7 +395,7 @@ F src/test_thread.c af391ec03d23486dffbcc250b7e58e073f172af9 F src/test_vfs.c 3b65d42e18b262805716bd96178c81da8f2d9283 F src/test_vfstrace.c bab9594adc976cbe696ff3970728830b4c5ed698 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 -F src/threads.c 6bbcc9fe50c917864d48287b4792d46d6e873481 +F src/threads.c 87639bc293d470f50d48c370028511ad3e1ccfd5 F src/tokenize.c 83c6ed569423a3af83a83973b444cf7123be33a6 F src/treeview.c 154f0acc622fa3514de8777dcedf4c8a8802b4ce F src/trigger.c 322f23aad694e8f31d384dcfa386d52a48d3c52f @@ -1388,7 +1388,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 6e4ac0be2de1a16fcbb2a314504122ad95aa257e -R ddf8c16716e71dc2258fab1042b22895 +P 113181cec4db418b07640d6b1967923992efd71a +R c9cd2c770b7c10173d40a9ea442ad6dd U drh -Z 58a6b6e5eae00c6fe24fb1e13719f1e4 +Z 0fbda38735b1950a4a02ae04b92eb3a5 diff --git a/manifest.uuid b/manifest.uuid index 4cdda680b1..906e367c5d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -113181cec4db418b07640d6b1967923992efd71a \ No newline at end of file +2d867c054d6d3e1e841ba9ca524e986bc6993ac3 \ No newline at end of file diff --git a/src/threads.c b/src/threads.c index 4ce6122274..8ed2b42611 100644 --- a/src/threads.c +++ b/src/threads.c @@ -67,6 +67,10 @@ int sqlite3ThreadCreate( memset(p, 0, sizeof(*p)); p->xTask = xTask; p->pIn = pIn; + /* If the SQLITE_TESTCTRL_FAULT_INSTALL callback is registered to a + ** function that returns SQLITE_ERROR when passed the argument 200, that + ** forces worker threads to run sequentially and deterministically + ** for testing purposes. */ if( sqlite3FaultSim(200) ){ rc = 1; }else{ @@ -151,7 +155,12 @@ int sqlite3ThreadCreate( *ppThread = 0; p = sqlite3Malloc(sizeof(*p)); if( p==0 ) return SQLITE_NOMEM; - if( sqlite3GlobalConfig.bCoreMutex==0 ){ + /* If the SQLITE_TESTCTRL_FAULT_INSTALL callback is registered to a + ** function that returns SQLITE_ERROR when passed the argument 200, that + ** forces worker threads to run sequentially and deterministically + ** (via the sqlite3FaultSim() term of the conditional) for testing + ** purposes. */ + if( sqlite3GlobalConfig.bCoreMutex==0 || sqlite3FaultSim(200) ){ memset(p, 0, sizeof(*p)); }else{ p->xTask = xTask; From 17db155fed685c0c1d3c438c3e0e02851722e83f Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 26 Sep 2015 01:28:46 +0000 Subject: [PATCH 07/98] Remove an assert in the windows worker-thread logic that can fail in a race condition. FossilOrigin-Name: d7bfb96092a6b812af194f32b22283a0f6a7da96 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/threads.c | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 2325407c95..60536e3e34 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthreads.c\sso\sthat\ssetting\ssqlite3FaultSim(200)\susing\sthe\nSQLITE_TESTCTRL_FAULT_INSTALL\scallback\scauses\sboth\sunix\sand\swindows\sworker\nthreads\sto\sbe\ssequential\sand\sdeterministic,\sso\sthat\sthey\scan\sbe\stested\nreliably. -D 2015-09-25T23:40:01.663 +C Remove\san\sassert\sin\sthe\swindows\sworker-thread\slogic\sthat\scan\sfail\sin\sa\srace\ncondition. +D 2015-09-26T01:28:46.988 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1afa6fb2de2bddd50e0ddae8166c2ee9d69b301 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -395,7 +395,7 @@ F src/test_thread.c af391ec03d23486dffbcc250b7e58e073f172af9 F src/test_vfs.c 3b65d42e18b262805716bd96178c81da8f2d9283 F src/test_vfstrace.c bab9594adc976cbe696ff3970728830b4c5ed698 F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 -F src/threads.c 87639bc293d470f50d48c370028511ad3e1ccfd5 +F src/threads.c bbfb74450643cb5372a43ad4f6cffd7e9dfcecb0 F src/tokenize.c 83c6ed569423a3af83a83973b444cf7123be33a6 F src/treeview.c 154f0acc622fa3514de8777dcedf4c8a8802b4ce F src/trigger.c 322f23aad694e8f31d384dcfa386d52a48d3c52f @@ -1388,7 +1388,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 113181cec4db418b07640d6b1967923992efd71a -R c9cd2c770b7c10173d40a9ea442ad6dd +P 2d867c054d6d3e1e841ba9ca524e986bc6993ac3 +R 1758ec9357330b0579141ecae96a2702 U drh -Z 0fbda38735b1950a4a02ae04b92eb3a5 +Z da76e4bf593addae8cb1880d2dd70b45 diff --git a/manifest.uuid b/manifest.uuid index 906e367c5d..ba759293c9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2d867c054d6d3e1e841ba9ca524e986bc6993ac3 \ No newline at end of file +d7bfb96092a6b812af194f32b22283a0f6a7da96 \ No newline at end of file diff --git a/src/threads.c b/src/threads.c index 8ed2b42611..251b9b7631 100644 --- a/src/threads.c +++ b/src/threads.c @@ -188,7 +188,7 @@ int sqlite3ThreadJoin(SQLiteThread *p, void **ppOut){ assert( ppOut!=0 ); if( NEVER(p==0) ) return SQLITE_NOMEM; if( p->xTask==0 ){ - assert( p->id==GetCurrentThreadId() ); + /* assert( p->id==GetCurrentThreadId() ); */ rc = WAIT_OBJECT_0; assert( p->tid==0 ); }else{ From 539482b76a3d005364d2668213b99d63f7521735 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 26 Sep 2015 03:23:29 +0000 Subject: [PATCH 08/98] Expand the header comment to clarify the purpose for the sqlite3MemoryBarrier() function. FossilOrigin-Name: b89495ae09aa0e9652475b2ba1943dfd87c73e07 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/mutex_unix.c | 4 +++- src/mutex_w32.c | 4 +++- 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 60536e3e34..e46cf93be8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\san\sassert\sin\sthe\swindows\sworker-thread\slogic\sthat\scan\sfail\sin\sa\srace\ncondition. -D 2015-09-26T01:28:46.988 +C Expand\sthe\sheader\scomment\sto\sclarify\sthe\spurpose\sfor\sthe\nsqlite3MemoryBarrier()\sfunction. +D 2015-09-26T03:23:29.340 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1afa6fb2de2bddd50e0ddae8166c2ee9d69b301 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -317,8 +317,8 @@ F src/msvc.h d9ba56c6851227ab44b3f228a35f3f5772296495 F src/mutex.c 8e45800ee78e0cd1f1f3fe8e398853307f4a085c F src/mutex.h 779d588e3b7756ec3ecf7d78cde1d84aba414f85 F src/mutex_noop.c 9d4309c075ba9cc7249e19412d3d62f7f94839c4 -F src/mutex_unix.c 8cfa6e83c618d2fcae0fe63f4d2b5bb16b11a97a -F src/mutex_w32.c 2e025e6642eaf27597403690980f560d1a91f62c +F src/mutex_unix.c a94b46f3f7beba307dde1b298b0f99f9c3677a93 +F src/mutex_w32.c b483d3e5914b84c82516a6a9919582f12ef3b838 F src/notify.c 9711a7575036f0d3040ba61bc6e217f13a9888e7 F src/os.c 8fd25588eeba74068d41102d26810e216999b6c8 F src/os.h 3e57a24e2794a94d3cf2342c6d9a884888cd96bf @@ -1388,7 +1388,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 2d867c054d6d3e1e841ba9ca524e986bc6993ac3 -R 1758ec9357330b0579141ecae96a2702 +P d7bfb96092a6b812af194f32b22283a0f6a7da96 +R 53a860536ab1d397fede465244d51351 U drh -Z da76e4bf593addae8cb1880d2dd70b45 +Z f65cf73c8cac5f871fc434c67cdccd1a diff --git a/manifest.uuid b/manifest.uuid index ba759293c9..eab8e97c0a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d7bfb96092a6b812af194f32b22283a0f6a7da96 \ No newline at end of file +b89495ae09aa0e9652475b2ba1943dfd87c73e07 \ No newline at end of file diff --git a/src/mutex_unix.c b/src/mutex_unix.c index cebb96c90e..dbdaa225b3 100644 --- a/src/mutex_unix.c +++ b/src/mutex_unix.c @@ -81,7 +81,9 @@ static int pthreadMutexNotheld(sqlite3_mutex *p){ #endif /* -** Try to provide a memory barrier operation, needed for initialization only. +** Try to provide a memory barrier operation, needed for initialization +** and also for the implementation of xShmBarrier in the VFS in cases +** where SQLite is compiled without mutexes. */ void sqlite3MemoryBarrier(void){ #if defined(SQLITE_MEMORY_BARRIER) diff --git a/src/mutex_w32.c b/src/mutex_w32.c index 90be07db2d..7d28e4defc 100644 --- a/src/mutex_w32.c +++ b/src/mutex_w32.c @@ -78,7 +78,9 @@ static int winMutexNotheld(sqlite3_mutex *p){ #endif /* -** Try to provide a memory barrier operation, needed for initialization only. +** Try to provide a memory barrier operation, needed for initialization +** and also for the xShmBarrier method of the VFS in cases when SQLite is +** compiled without mutexes (SQLITE_THREADSAFE=0). */ void sqlite3MemoryBarrier(void){ #if defined(SQLITE_MEMORY_BARRIER) From c4cdb29a0e4dd69f2f02e27765d723cc6e8700f6 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 26 Sep 2015 03:31:47 +0000 Subject: [PATCH 09/98] Fix the title of the documentation on sqlite3_value_subtype(). This is a comment change only. FossilOrigin-Name: b79023542458f7e839469c5e313694f1e4cf223a --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/sqlite.h.in | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index e46cf93be8..c7255365d5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Expand\sthe\sheader\scomment\sto\sclarify\sthe\spurpose\sfor\sthe\nsqlite3MemoryBarrier()\sfunction. -D 2015-09-26T03:23:29.340 +C Fix\sthe\stitle\sof\sthe\sdocumentation\son\ssqlite3_value_subtype().\s\sThis\sis\sa\ncomment\schange\sonly. +D 2015-09-26T03:31:47.786 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1afa6fb2de2bddd50e0ddae8166c2ee9d69b301 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -342,7 +342,7 @@ F src/resolve.c 1954a0f01bf65d78d7d559aea3d5c67f33376d91 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e F src/select.c 33230303f5f32430ee971a6fcc6a370e4a93ae1a F src/shell.c 6332ef06db1390ef812cfdff1fc97b4fd76cdd42 -F src/sqlite.h.in 4e06cb5fed36736242c66237991db6f3e2395eb9 +F src/sqlite.h.in 02f6ed7de3a96d10bd1e6e5803e4e4b786dff014 F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad F src/sqlite3ext.h 64350bf36833a56ad675e27392a913f417c5c308 F src/sqliteInt.h 5afc6e50402be1e0a870f28e1cd8b32eb9db590f @@ -1388,7 +1388,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P d7bfb96092a6b812af194f32b22283a0f6a7da96 -R 53a860536ab1d397fede465244d51351 +P b89495ae09aa0e9652475b2ba1943dfd87c73e07 +R 61d90f8d030c1e925088df624cbea8dd U drh -Z f65cf73c8cac5f871fc434c67cdccd1a +Z c6f8608e2016c08a0ff2908d96bb63fd diff --git a/manifest.uuid b/manifest.uuid index eab8e97c0a..4489ececf5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b89495ae09aa0e9652475b2ba1943dfd87c73e07 \ No newline at end of file +b79023542458f7e839469c5e313694f1e4cf223a \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 45a11e3b9c..0f7d3a21bf 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -4360,7 +4360,7 @@ int sqlite3_value_type(sqlite3_value*); int sqlite3_value_numeric_type(sqlite3_value*); /* -** CAPI3REF: Obtaining SQL Values +** CAPI3REF: Finding The Subtype Of SQL Values ** METHOD: sqlite3_value ** ** The sqlite3_value_subtype(V) function returns the subtype for From 32498f132160f70ed0a45fed751f4fdb9d54db34 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 26 Sep 2015 11:15:44 +0000 Subject: [PATCH 10/98] Fix a memory leak that can occur following a syntax error in CREATE VIEW. FossilOrigin-Name: f4704035a6134f702c00110358e36f1579e2ea78 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/build.c | 3 +-- test/view.test | 5 +++++ 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index c7255365d5..7a27708eba 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\stitle\sof\sthe\sdocumentation\son\ssqlite3_value_subtype().\s\sThis\sis\sa\ncomment\schange\sonly. -D 2015-09-26T03:31:47.786 +C Fix\sa\smemory\sleak\sthat\scan\soccur\sfollowing\sa\ssyntax\serror\sin\sCREATE\sVIEW. +D 2015-09-26T11:15:44.897 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in e1afa6fb2de2bddd50e0ddae8166c2ee9d69b301 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -285,7 +285,7 @@ F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 F src/btree.c 164583151135a3764672c2c25aa8e4fa06bdb12b F src/btree.h 40189aefdc2b830d25c8b58fd7d56538481bfdd7 F src/btreeInt.h 8177c9ab90d772d6d2c6c517e05bed774b7c92c0 -F src/build.c 8a86f4203ac8a9ac0734f242a96f043edffb6018 +F src/build.c edc5a29cd55257b05be837c3613e2cade02b3e03 F src/callback.c 7b44ce59674338ad48b0e84e7b72f935ea4f68b0 F src/complete.c addcd8160b081131005d5bc2d34adf20c1c5c92f F src/ctime.c 5a0b735dc95604766f5dac73973658eef782ee8b @@ -1248,7 +1248,7 @@ F test/vacuum3.test 77ecdd54592b45a0bcb133339f99f1ae0ae94d0d F test/vacuum4.test d3f8ecff345f166911568f397d2432c16d2867d9 F test/varint.test ab7b110089a08b9926ed7390e7e97bdefeb74102 F test/veryquick.test 57ab846bacf7b90cf4e9a672721ea5c5b669b661 -F test/view.test bfdec45ad4b2ed5dd5fddbc3dcafcfca2ab23574 +F test/view.test 0d8935e64867ae01492347884f5cbb47f056f4c8 F test/vtab1.test 6210e076997f176bedc300a87ad6404651b601dd F test/vtab2.test f8cd1bb9aba7143eba97812d9617880a36d247ad F test/vtab3.test b45f47d20f225ccc9c28dc915d92740c2dee311e @@ -1388,7 +1388,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P b89495ae09aa0e9652475b2ba1943dfd87c73e07 -R 61d90f8d030c1e925088df624cbea8dd +P b79023542458f7e839469c5e313694f1e4cf223a +R 5bffdcb8f106214b20b1e8dd3d8300df U drh -Z c6f8608e2016c08a0ff2908d96bb63fd +Z 606c03f040a7d5d452758b762c64cca4 diff --git a/manifest.uuid b/manifest.uuid index 4489ececf5..1d3445431b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b79023542458f7e839469c5e313694f1e4cf223a \ No newline at end of file +f4704035a6134f702c00110358e36f1579e2ea78 \ No newline at end of file diff --git a/src/build.c b/src/build.c index eee62ee151..6a9c613165 100644 --- a/src/build.c +++ b/src/build.c @@ -2082,8 +2082,7 @@ void sqlite3CreateView( if( pParse->nVar>0 ){ sqlite3ErrorMsg(pParse, "parameters are not allowed in views"); - sqlite3SelectDelete(db, pSelect); - return; + goto create_view_fail; } sqlite3StartTable(pParse, pName1, pName2, isTemp, 1, 0, noErr); p = pParse->pNewTable; diff --git a/test/view.test b/test/view.test index 891dde6579..0b8354a38e 100644 --- a/test/view.test +++ b/test/view.test @@ -474,6 +474,11 @@ do_test view-12.1 { CREATE VIEW v12 AS SELECT a FROM t1 WHERE b=? } } {1 {parameters are not allowed in views}} +do_test view-12.2 { + catchsql { + CREATE VIEW v12(x) AS SELECT a FROM t1 WHERE b=? + } +} {1 {parameters are not allowed in views}} ifcapable attach { do_test view-13.1 { From 2f20e13b83f1c7bb80c61043f8d233c72d2878c2 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 26 Sep 2015 17:44:59 +0000 Subject: [PATCH 11/98] Enable adding JSON1 by appending the json1.c source file to the amalgamation and compiling with -DSQLITE_ENABLE_JSON1 FossilOrigin-Name: 33404b2029120d4aabe1e25d484871810777e934 --- Makefile.in | 5 ++++- Makefile.msc | 4 ++-- ext/misc/json1.c | 29 +++++++++++++++++------------ main.mk | 5 ++++- manifest | 22 +++++++++++----------- manifest.uuid | 2 +- src/main.c | 7 +++++++ src/shell.c | 2 +- 8 files changed, 47 insertions(+), 29 deletions(-) diff --git a/Makefile.in b/Makefile.in index 424d839750..5c78abde94 100644 --- a/Makefile.in +++ b/Makefile.in @@ -544,7 +544,7 @@ FUZZDATA = \ # Extra arguments for including json1 in the build of tools # JSON1_DEP = $(TOP)/ext/misc/json1.c sqlite3ext.h -JSON1_OPT = -DSQLITE_ENABLE_JSON1 -DSQLITE_CORE +JSON1_OPT = -DSQLITE_SHELL_JSON1 -DSQLITE_CORE JSON1_SRC = $(TOP)/ext/misc/json1.c # Standard options to testfixture @@ -625,6 +625,9 @@ sqlite3.c: .target_source $(TOP)/tool/mksqlite3c.tcl $(TCLSH_CMD) $(TOP)/tool/mksqlite3c.tcl cp tsrc/shell.c tsrc/sqlite3ext.h . +sqlite3ext.h: .target_source + cp tsrc/sqlite3ext.h . + tclsqlite3.c: sqlite3.c echo '#ifndef USE_SYSTEM_SQLITE' >tclsqlite3.c cat sqlite3.c >>tclsqlite3.c diff --git a/Makefile.msc b/Makefile.msc index 7e69589705..678b547fed 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -390,9 +390,9 @@ CORE_LINK_OPTS = /DEF:sqlite3.def # !IFNDEF SHELL_COMPILE_OPTS !IF $(DYNAMIC_SHELL)!=0 -SHELL_COMPILE_OPTS = -DSQLITE_ENABLE_JSON1 $(SHELL_CCONV_OPTS) -DSQLITE_API=__declspec(dllimport) +SHELL_COMPILE_OPTS = -DSQLITE_SHELL_JSON1 $(SHELL_CCONV_OPTS) -DSQLITE_API=__declspec(dllimport) !ELSE -SHELL_COMPILE_OPTS = -DSQLITE_ENABLE_JSON1 $(SHELL_CCONV_OPTS) +SHELL_COMPILE_OPTS = -DSQLITE_SHELL_JSON1 $(SHELL_CCONV_OPTS) !ENDIF !ENDIF diff --git a/ext/misc/json1.c b/ext/misc/json1.c index 89b70f0838..77857f5447 100644 --- a/ext/misc/json1.c +++ b/ext/misc/json1.c @@ -1937,19 +1937,12 @@ static sqlite3_module jsonTreeModule = { #endif /* SQLITE_OMIT_VIRTUALTABLE */ /**************************************************************************** -** The following routine is the only publically visible identifier in this -** file. Call the following routine in order to register the various SQL +** The following routines are the only publically visible identifiers in this +** file. Call the following routines in order to register the various SQL ** functions and the virtual table implemented by this file. ****************************************************************************/ -#ifdef _WIN32 -__declspec(dllexport) -#endif -int sqlite3_json_init( - sqlite3 *db, - char **pzErrMsg, - const sqlite3_api_routines *pApi -){ +int sqlite3Json1Init(sqlite3 *db){ int rc = SQLITE_OK; unsigned int i; static const struct { @@ -1987,8 +1980,6 @@ int sqlite3_json_init( { "json_tree", &jsonTreeModule }, }; #endif - SQLITE_EXTENSION_INIT2(pApi); - (void)pzErrMsg; /* Unused parameter */ for(i=0; i>tclsqlite3.c cat $(TOP)/src/tclsqlite.c >>tclsqlite3.c +sqlite3ext.h: target_source + cp tsrc/sqlite3ext.h . + sqlite3.c-debug: target_source $(TOP)/tool/mksqlite3c.tcl tclsh $(TOP)/tool/mksqlite3c.tcl --linemacros echo '#ifndef USE_SYSTEM_SQLITE' >tclsqlite3.c diff --git a/manifest b/manifest index 7a27708eba..02424b2039 100644 --- a/manifest +++ b/manifest @@ -1,9 +1,9 @@ -C Fix\sa\smemory\sleak\sthat\scan\soccur\sfollowing\sa\ssyntax\serror\sin\sCREATE\sVIEW. -D 2015-09-26T11:15:44.897 +C Enable\sadding\sJSON1\sby\sappending\sthe\sjson1.c\ssource\sfile\sto\sthe\samalgamation\nand\scompiling\swith\s-DSQLITE_ENABLE_JSON1 +D 2015-09-26T17:44:59.245 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f -F Makefile.in e1afa6fb2de2bddd50e0ddae8166c2ee9d69b301 +F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 -F Makefile.msc f090cdf036f3c07fb13aa2f4494e388c0b1ed1e4 +F Makefile.msc b9054642ab305be4174d8b0433c9951c2839701d F Makefile.vxworks e1b65dea203f054e71653415bd8f96dcaed47858 F README.md 8ecc12493ff9f820cdea6520a9016001cb2e59b7 F VERSION ccfc4d1576dbfdeece0a4372a2e6a2e37d3e7975 @@ -195,7 +195,7 @@ F ext/misc/eval.c f971962e92ebb8b0a4e6b62949463ee454d88fa2 F ext/misc/fileio.c d4171c815d6543a9edef8308aab2951413cd8d0f F ext/misc/fuzzer.c 4c84635c71c26cfa7c2e5848cf49fe2d2cfcd767 F ext/misc/ieee754.c b0362167289170627659e84173f5d2e8fee8566e -F ext/misc/json1.c 557d6b2d0c3d26625e686a4b4ef8d4a50b8cec94 +F ext/misc/json1.c 263cac0292302b7cf7ecb2e8bd698a50d1aedecc F ext/misc/nextchar.c 35c8b8baacb96d92abbb34a83a997b797075b342 F ext/misc/percentile.c bcbee3c061b884eccb80e21651daaae8e1e43c63 F ext/misc/regexp.c af92cdaa5058fcec1451e49becc7ba44dba023dc @@ -261,7 +261,7 @@ F ext/userauth/userauth.c 5fa3bdb492f481bbc1709fc83c91ebd13460c69e F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk d12601118f1d1dadebe1329a53a6d5c512b36d44 +F main.mk 151fcaba704fdeeb0a1941857ef6e1d6216732d8 F mkopcodec.awk c2ff431854d702cdd2d779c9c0d1f58fa16fa4ea F mkopcodeh.awk 0e7f04a8eb90f92259e47d80110e4e98d7ce337a F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 @@ -305,7 +305,7 @@ F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d F src/legacy.c ba1863ea58c4c840335a84ec276fc2b25e22bc4e F src/lempar.c d344a95d60c24e2f490ee59db9784b1b17439012 F src/loadext.c f0b66d28e377fd6c6d36cc9d92df1ff251ebee44 -F src/main.c e17fcffae4306a9b8334faf3bac80d7396850b54 +F src/main.c c80ea19ec71609ccbec21f334fbcf475bb6af2fc F src/malloc.c 3a37ce6979a40f499d8cea9e9ab4e8517854d35d F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c abe6ee469b6c5a35c7f22bfeb9c9bac664a1c987 @@ -341,7 +341,7 @@ F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 F src/resolve.c 1954a0f01bf65d78d7d559aea3d5c67f33376d91 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e F src/select.c 33230303f5f32430ee971a6fcc6a370e4a93ae1a -F src/shell.c 6332ef06db1390ef812cfdff1fc97b4fd76cdd42 +F src/shell.c a11b20da4c6630e0e8f83c47ce36f717dd0422f0 F src/sqlite.h.in 02f6ed7de3a96d10bd1e6e5803e4e4b786dff014 F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad F src/sqlite3ext.h 64350bf36833a56ad675e27392a913f417c5c308 @@ -1388,7 +1388,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P b79023542458f7e839469c5e313694f1e4cf223a -R 5bffdcb8f106214b20b1e8dd3d8300df +P f4704035a6134f702c00110358e36f1579e2ea78 +R 6dd9af66a4beb7d52dbecad30f413fd3 U drh -Z 606c03f040a7d5d452758b762c64cca4 +Z 2dae51b0464af5412711a65e5f2d84bb diff --git a/manifest.uuid b/manifest.uuid index 1d3445431b..f2175fce2e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f4704035a6134f702c00110358e36f1579e2ea78 \ No newline at end of file +33404b2029120d4aabe1e25d484871810777e934 \ No newline at end of file diff --git a/src/main.c b/src/main.c index 575cad92c5..fa374c7012 100644 --- a/src/main.c +++ b/src/main.c @@ -2896,6 +2896,13 @@ static int openDatabase( } #endif +#ifdef SQLITE_ENABLE_JSON1 + if( !db->mallocFailed && rc==SQLITE_OK){ + extern int sqlite3Json1Init(sqlite3*); + rc = sqlite3Json1Init(db); + } +#endif + /* -DSQLITE_DEFAULT_LOCKING_MODE=1 makes EXCLUSIVE the default locking ** mode. -DSQLITE_DEFAULT_LOCKING_MODE=0 make NORMAL the default locking ** mode. Doing nothing at all also makes NORMAL the default. diff --git a/src/shell.c b/src/shell.c index e5eb394ead..02938eb1e6 100644 --- a/src/shell.c +++ b/src/shell.c @@ -4619,7 +4619,7 @@ int SQLITE_CDECL main(int argc, char **argv){ } data.out = stdout; -#ifdef SQLITE_ENABLE_JSON1 +#ifdef SQLITE_SHELL_JSON1 { extern int sqlite3_json_init(sqlite3*); sqlite3_auto_extension((void(*)(void))sqlite3_json_init); From 63c85a7a6607809ea0461e48820f48c34cf0689b Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 28 Sep 2015 14:40:20 +0000 Subject: [PATCH 12/98] Fix a database corruption bug caused by the ONEPASS optimization added in check-in [8b93cc5937000535]. Bug detected (prior to release) by [https://www.sqlite.org/sqllogictest|sqllogictest]. Test cases to follow. FossilOrigin-Name: 9d057f52217e7ef9c3f3eb84117abe3365503f44 --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/where.c | 5 ++++- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 02424b2039..fb761dcc80 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enable\sadding\sJSON1\sby\sappending\sthe\sjson1.c\ssource\sfile\sto\sthe\samalgamation\nand\scompiling\swith\s-DSQLITE_ENABLE_JSON1 -D 2015-09-26T17:44:59.245 +C Fix\sa\sdatabase\scorruption\sbug\scaused\sby\sthe\sONEPASS\soptimization\sadded\nin\scheck-in\s[8b93cc5937000535].\s\sBug\sdetected\s(prior\sto\srelease)\sby\n[https://www.sqlite.org/sqllogictest|sqllogictest].\s\sTest\scases\sto\sfollow. +D 2015-09-28T14:40:20.768 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -417,7 +417,7 @@ F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb F src/wal.c 18b0ed49830cf04fe2d68224b41838a73ac6cd24 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/walker.c 2e14d17f592d176b6dc879c33fbdec4fbccaa2ba -F src/where.c a7582b752d436d335bfb62f445e1c2771e7daa95 +F src/where.c f2c4905e47fe80043a0c45f374f555615da365ba F src/whereInt.h 7892bb54cf9ca0ae5c7e6094491b94c9286dc647 F src/wherecode.c 7660e1ad16817a921b099af553f3e1349352d16f F src/whereexpr.c 2473e4350e30f9b55d1c6a8f66ca23c689f23f1d @@ -1388,7 +1388,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P f4704035a6134f702c00110358e36f1579e2ea78 -R 6dd9af66a4beb7d52dbecad30f413fd3 +P 33404b2029120d4aabe1e25d484871810777e934 +R 221ece26a434b0c8583fbc9c4416f571 U drh -Z 2dae51b0464af5412711a65e5f2d84bb +Z d13c27a5f9aee35d4aed34621e7033a2 diff --git a/manifest.uuid b/manifest.uuid index f2175fce2e..8c57cdd55c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -33404b2029120d4aabe1e25d484871810777e934 \ No newline at end of file +9d057f52217e7ef9c3f3eb84117abe3365503f44 \ No newline at end of file diff --git a/src/where.c b/src/where.c index 6578900c10..dfff3ca5c4 100644 --- a/src/where.c +++ b/src/where.c @@ -4529,7 +4529,10 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){ }else if( pLoop->wsFlags & WHERE_MULTI_OR ){ pIdx = pLevel->u.pCovidx; } - if( pIdx && !db->mallocFailed ){ + if( pIdx + && (pWInfo->eOnePass==ONEPASS_OFF || !HasRowid(pIdx->pTable)) + && !db->mallocFailed + ){ last = sqlite3VdbeCurrentAddr(v); k = pLevel->addrBody; pOp = sqlite3VdbeGetOp(v, k); From 3169713be00b3772a472bf85554d742c7f15318d Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 28 Sep 2015 15:08:28 +0000 Subject: [PATCH 13/98] Add test cases to the ONEPASS optimization corruption problem fixed by the previous check-in. FossilOrigin-Name: 5c14d447055bb337428eb1fe0a2934abee381829 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/delete4.test | 43 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 50 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index fb761dcc80..faf2febc41 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\sdatabase\scorruption\sbug\scaused\sby\sthe\sONEPASS\soptimization\sadded\nin\scheck-in\s[8b93cc5937000535].\s\sBug\sdetected\s(prior\sto\srelease)\sby\n[https://www.sqlite.org/sqllogictest|sqllogictest].\s\sTest\scases\sto\sfollow. -D 2015-09-28T14:40:20.768 +C Add\stest\scases\sto\sthe\sONEPASS\soptimization\scorruption\sproblem\sfixed\sby\sthe\nprevious\scheck-in. +D 2015-09-28T15:08:28.795 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -572,7 +572,7 @@ F test/default.test 0cb49b1c315a0d81c81d775e407f66906a2a604d F test/delete.test e1bcdf8926234e27aac24b346ad83d3329ec8b6f F test/delete2.test 3a03f2cca1f9a67ec469915cb8babd6485db43fa F test/delete3.test 555e84a00a99230b7d049d477a324a631126a6ab -F test/delete4.test d9e7d553a939597b27d205b022d769469f361c1f +F test/delete4.test 3ac0b8d23689ba764c2e8b78c1b56b8f1b942fa2 F test/descidx1.test 6d03b44c8538fe0eb4924e19fba10cdd8f3c9240 F test/descidx2.test 9f1a0c83fd57f8667c82310ca21b30a350888b5d F test/descidx3.test 09ddbe3f5295f482d2f8b687cf6db8bad7acd9a2 @@ -1388,7 +1388,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 33404b2029120d4aabe1e25d484871810777e934 -R 221ece26a434b0c8583fbc9c4416f571 +P 9d057f52217e7ef9c3f3eb84117abe3365503f44 +R 075466467a3c577c7bea65d16a397b4e U drh -Z d13c27a5f9aee35d4aed34621e7033a2 +Z a775dc5a399b71fca215b8951f694541 diff --git a/manifest.uuid b/manifest.uuid index 8c57cdd55c..caba2b4da5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9d057f52217e7ef9c3f3eb84117abe3365503f44 \ No newline at end of file +5c14d447055bb337428eb1fe0a2934abee381829 \ No newline at end of file diff --git a/test/delete4.test b/test/delete4.test index 7334bf02ed..f3598a9496 100644 --- a/test/delete4.test +++ b/test/delete4.test @@ -98,5 +98,48 @@ do_execsql_test 3.4 { PRAGMA integrity_check; } {ok} +# Between 2015-09-14 and 2015-09-28, the following test cases would result +# in corruption (wrong # of entries in index) due to a bug in the ONEPASS +# optimization. +# +do_execsql_test 4.1 { + DROP TABLE IF EXISTS t4; + CREATE TABLE t4(col0, col1); + INSERT INTO "t4" VALUES(14, 'abcde'); + CREATE INDEX idx_t4_0 ON t4 (col1, col0); + CREATE INDEX idx_t4_3 ON t4 (col0); + DELETE FROM t4 WHERE col0=69 OR col0>7; + PRAGMA integrity_check; +} {ok} +do_execsql_test 4.2 { + DROP TABLE IF EXISTS t4; + CREATE TABLE t4(col0, col1); + INSERT INTO "t4" VALUES(14, 'abcde'); + CREATE INDEX idx_t4_3 ON t4 (col0); + CREATE INDEX idx_t4_0 ON t4 (col1, col0); + DELETE FROM t4 WHERE col0=69 OR col0>7; + PRAGMA integrity_check; +} {ok} +do_execsql_test 4.11 { + DROP TABLE IF EXISTS t4; + CREATE TABLE t4(col0, col1, pk PRIMARY KEY) WITHOUT ROWID; + INSERT INTO t4 VALUES(14, 'abcde','xyzzy'); + CREATE INDEX idx_t4_0 ON t4 (col1, col0); + CREATE INDEX idx_t4_3 ON t4 (col0); + DELETE FROM t4 WHERE col0=69 OR col0>7; + PRAGMA integrity_check; +} {ok} +do_execsql_test 4.12 { + DROP TABLE IF EXISTS t4; + CREATE TABLE t4(col0, col1, pk PRIMARY KEY) WITHOUT ROWID; + INSERT INTO t4 VALUES(14, 'abcde','xyzzy'); + CREATE INDEX idx_t4_3 ON t4 (col0); + CREATE INDEX idx_t4_0 ON t4 (col1, col0); + DELETE FROM t4 WHERE col0=69 OR col0>7; + PRAGMA integrity_check; +} {ok} + + + finish_test From 076e0f9674a9eecc59cac3c31d93bd1b79d1247e Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 28 Sep 2015 15:20:58 +0000 Subject: [PATCH 14/98] Changes to allow DELETE operations on virtual tables to use the onepass strategy under some circumstances. FossilOrigin-Name: e73f919fae1833c6ffb36eddbc76d9a8d9324214 --- manifest | 23 +++++++++++++---------- manifest.uuid | 2 +- src/build.c | 2 ++ src/delete.c | 16 +++++++++++----- src/sqlite.h.in | 7 +++++++ src/where.c | 10 ++++++++++ 6 files changed, 44 insertions(+), 16 deletions(-) diff --git a/manifest b/manifest index faf2febc41..d8a00a1ea3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\stest\scases\sto\sthe\sONEPASS\soptimization\scorruption\sproblem\sfixed\sby\sthe\nprevious\scheck-in. -D 2015-09-28T15:08:28.795 +C Changes\sto\sallow\sDELETE\soperations\son\svirtual\stables\sto\suse\sthe\sonepass\sstrategy\sunder\ssome\scircumstances. +D 2015-09-28T15:20:58.913 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -285,13 +285,13 @@ F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 F src/btree.c 164583151135a3764672c2c25aa8e4fa06bdb12b F src/btree.h 40189aefdc2b830d25c8b58fd7d56538481bfdd7 F src/btreeInt.h 8177c9ab90d772d6d2c6c517e05bed774b7c92c0 -F src/build.c edc5a29cd55257b05be837c3613e2cade02b3e03 +F src/build.c 361f58b73aad7804f5706bf62d210bd9cd608041 F src/callback.c 7b44ce59674338ad48b0e84e7b72f935ea4f68b0 F src/complete.c addcd8160b081131005d5bc2d34adf20c1c5c92f F src/ctime.c 5a0b735dc95604766f5dac73973658eef782ee8b F src/date.c fb1c99172017dcc8e237339132c91a21a0788584 F src/dbstat.c e637e7a7ff40ef32132a418c6fdf1cfb63aa27c7 -F src/delete.c 371df4fc86e96efeaed3d37565aef77f956be109 +F src/delete.c b454df59d57cb3f07118dfc68821760593fcaab3 F src/expr.c 3a76afcdac925294c39903b7002ddb9e5fd29863 F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb F src/fkey.c 83e1baba999bed3144ea5a2143fc922edf51135f @@ -342,7 +342,7 @@ F src/resolve.c 1954a0f01bf65d78d7d559aea3d5c67f33376d91 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e F src/select.c 33230303f5f32430ee971a6fcc6a370e4a93ae1a F src/shell.c a11b20da4c6630e0e8f83c47ce36f717dd0422f0 -F src/sqlite.h.in 02f6ed7de3a96d10bd1e6e5803e4e4b786dff014 +F src/sqlite.h.in eade8bcc0456ff4d3f7ecfbbd3c4eec117314f26 F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad F src/sqlite3ext.h 64350bf36833a56ad675e27392a913f417c5c308 F src/sqliteInt.h 5afc6e50402be1e0a870f28e1cd8b32eb9db590f @@ -417,7 +417,7 @@ F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb F src/wal.c 18b0ed49830cf04fe2d68224b41838a73ac6cd24 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/walker.c 2e14d17f592d176b6dc879c33fbdec4fbccaa2ba -F src/where.c f2c4905e47fe80043a0c45f374f555615da365ba +F src/where.c d07fb77010949be9b96e9120b4653712bf9f74ae F src/whereInt.h 7892bb54cf9ca0ae5c7e6094491b94c9286dc647 F src/wherecode.c 7660e1ad16817a921b099af553f3e1349352d16f F src/whereexpr.c 2473e4350e30f9b55d1c6a8f66ca23c689f23f1d @@ -1388,7 +1388,10 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 9d057f52217e7ef9c3f3eb84117abe3365503f44 -R 075466467a3c577c7bea65d16a397b4e -U drh -Z a775dc5a399b71fca215b8951f694541 +P 5c14d447055bb337428eb1fe0a2934abee381829 +R 3d1a8d879c965d0f75999b9c5903a435 +T *branch * vtab-onepass +T *sym-vtab-onepass * +T -sym-trunk * +U dan +Z 049fa8c468f3a0165cbcd245b0299bac diff --git a/manifest.uuid b/manifest.uuid index caba2b4da5..a16e447313 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5c14d447055bb337428eb1fe0a2934abee381829 \ No newline at end of file +e73f919fae1833c6ffb36eddbc76d9a8d9324214 \ No newline at end of file diff --git a/src/build.c b/src/build.c index 6a9c613165..c0bd81b1a0 100644 --- a/src/build.c +++ b/src/build.c @@ -192,6 +192,8 @@ void sqlite3FinishCoding(Parse *pParse){ db->aDb[iDb].pSchema->iGeneration /* P4 */ ); if( db->init.busy==0 ) sqlite3VdbeChangeP5(v, 1); + VdbeComment((v, + "usesStmtJournal=%d", pParse->mayAbort && pParse->isMultiWrite)); } #ifndef SQLITE_OMIT_VIRTUALTABLE for(i=0; inVtabLock; i++){ diff --git a/src/delete.c b/src/delete.c index c387c20bef..9c928f8d51 100644 --- a/src/delete.c +++ b/src/delete.c @@ -411,7 +411,7 @@ void sqlite3DeleteFrom( pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, 0, 0, wcf, iTabCur+1); if( pWInfo==0 ) goto delete_from_cleanup; eOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass); - assert( IsVirtual(pTab)==0 || eOnePass==ONEPASS_OFF ); + assert( IsVirtual(pTab)==0 || eOnePass!=ONEPASS_MULTI ); assert( IsVirtual(pTab) || bComplex || eOnePass!=ONEPASS_OFF ); /* Keep track of the number of rows to be deleted */ @@ -465,7 +465,7 @@ void sqlite3DeleteFrom( /* If this DELETE cannot use the ONEPASS strategy, this is the ** end of the WHERE loop */ - if( eOnePass!=ONEPASS_OFF ){ + if( eOnePass!=ONEPASS_OFF && !IsVirtual(pTab) ){ addrBypass = sqlite3VdbeMakeLabel(v); }else{ sqlite3WhereEnd(pWInfo); @@ -494,7 +494,7 @@ void sqlite3DeleteFrom( */ if( eOnePass!=ONEPASS_OFF ){ assert( nKey==nPk ); /* OP_Found will use an unpacked key */ - if( aToOpen[iDataCur-iTabCur] ){ + if( !IsVirtual(pTab) && aToOpen[iDataCur-iTabCur] ){ assert( pPk!=0 || pTab->pSelect!=0 ); sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, addrBypass, iKey, nKey); VdbeCoverage(v); @@ -516,7 +516,11 @@ void sqlite3DeleteFrom( sqlite3VtabMakeWritable(pParse, pTab); sqlite3VdbeAddOp4(v, OP_VUpdate, 0, 1, iKey, pVTab, P4_VTAB); sqlite3VdbeChangeP5(v, OE_Abort); + assert( eOnePass==ONEPASS_OFF || eOnePass==ONEPASS_SINGLE ); sqlite3MayAbort(pParse); + if( eOnePass==ONEPASS_SINGLE && pParse==sqlite3ParseToplevel(pParse) ){ + pParse->isMultiWrite = 0; + } }else #endif { @@ -531,8 +535,10 @@ void sqlite3DeleteFrom( /* End of the loop over all rowids/primary-keys. */ if( eOnePass!=ONEPASS_OFF ){ - sqlite3VdbeResolveLabel(v, addrBypass); - sqlite3WhereEnd(pWInfo); + if( !IsVirtual(pTab) ){ + sqlite3VdbeResolveLabel(v, addrBypass); + sqlite3WhereEnd(pWInfo); + } }else if( pPk ){ sqlite3VdbeAddOp2(v, OP_Next, iEphCur, addrLoop+1); VdbeCoverage(v); sqlite3VdbeJumpHere(v, addrLoop); diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 0f7d3a21bf..4a1312863e 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -5668,8 +5668,15 @@ struct sqlite3_index_info { double estimatedCost; /* Estimated cost of using this index */ /* Fields below are only available in SQLite 3.8.2 and later */ sqlite3_int64 estimatedRows; /* Estimated number of rows returned */ + /* Fields below are only available in SQLite 3.8.12 and later */ + int flags; /* Mask of SQLITE_INDEX_SCAN_* flags */ }; +/* +** CAPI3REF: Virtual Table Scan Flags +*/ +#define SQLITE_INDEX_SCAN_UNIQUE 1 /* Scan visits at most 1 row */ + /* ** CAPI3REF: Virtual Table Constraint Operator Codes ** diff --git a/src/where.c b/src/where.c index dfff3ca5c4..1175496a2a 100644 --- a/src/where.c +++ b/src/where.c @@ -2832,6 +2832,7 @@ static int whereLoopAddVirtual( pIdxInfo->orderByConsumed = 0; pIdxInfo->estimatedCost = SQLITE_BIG_DBL / (double)2; pIdxInfo->estimatedRows = 25; + pIdxInfo->flags = 0; rc = vtabBestIndex(pParse, pTab, pIdxInfo); if( rc ) goto whereLoopAddVtab_exit; pIdxCons = *(struct sqlite3_index_constraint**)&pIdxInfo->aConstraint; @@ -2877,6 +2878,7 @@ static int whereLoopAddVirtual( ** (2) Multiple outputs from a single IN value will not merge ** together. */ pIdxInfo->orderByConsumed = 0; + pIdxInfo->flags &= ~SQLITE_INDEX_SCAN_UNIQUE; } } } @@ -2892,6 +2894,14 @@ static int whereLoopAddVirtual( pNew->rSetup = 0; pNew->rRun = sqlite3LogEstFromDouble(pIdxInfo->estimatedCost); pNew->nOut = sqlite3LogEst(pIdxInfo->estimatedRows); + + /* Set the WHERE_ONEROW flag if the xBestIndex() method indicated + ** that the scan will visit at most one row. Clear it otherwise. */ + if( pIdxInfo->flags & SQLITE_INDEX_SCAN_UNIQUE ){ + pNew->wsFlags |= WHERE_ONEROW; + }else{ + pNew->wsFlags &= ~WHERE_ONEROW; + } whereLoopInsert(pBuilder, pNew); if( pNew->u.vtab.needFree ){ sqlite3_free(pNew->u.vtab.idxStr); From d943b275968e38164ab0473f8688c8ef9083c0ac Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 28 Sep 2015 15:23:29 +0000 Subject: [PATCH 15/98] Update fts3 to use the onepass strategy for delete operations. FossilOrigin-Name: fffab4f70f85eeb2acbb89534064a6e397c39384 --- ext/fts3/fts3.c | 16 ++++++++++++++++ ext/fts3/fts3Int.h | 1 + ext/fts3/fts3_write.c | 13 +++++++++---- manifest | 21 +++++++++------------ manifest.uuid | 2 +- test/fts4growth.test | 4 ++-- 6 files changed, 38 insertions(+), 19 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index 6a9b507fc0..ceffb52cf4 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -1517,6 +1517,19 @@ static void fts3SetEstimatedRows(sqlite3_index_info *pIdxInfo, i64 nRow){ #endif } +/* +** Set the SQLITE_INDEX_SCAN_UNIQUE flag in pIdxInfo->flags. Unless this +** extension is currently being used by a version of SQLite too old to +** support index-info flags. In that case this function is a no-op. +*/ +static void fts3SetUniqueFlag(sqlite3_index_info *pIdxInfo){ +#if SQLITE_VERSION_NUMBER>=3008012 + if( sqlite3_libversion_number()>=3008012 ){ + pIdxInfo->flags |= SQLITE_INDEX_SCAN_UNIQUE; + } +#endif +} + /* ** Implementation of the xBestIndex method for FTS3 tables. There ** are three possible strategies, in order of preference: @@ -1607,6 +1620,9 @@ static int fts3BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ } } + /* If using a docid=? or rowid=? strategy, set the UNIQUE flag. */ + if( pInfo->idxNum==FTS3_DOCID_SEARCH ) fts3SetUniqueFlag(pInfo); + iIdx = 1; if( iCons>=0 ){ pInfo->aConstraintUsage[iCons].argvIndex = iIdx++; diff --git a/ext/fts3/fts3Int.h b/ext/fts3/fts3Int.h index 981c37deee..06bcc7202e 100644 --- a/ext/fts3/fts3Int.h +++ b/ext/fts3/fts3Int.h @@ -264,6 +264,7 @@ struct Fts3Table { int nPendingData; /* Current bytes of pending data */ sqlite_int64 iPrevDocid; /* Docid of most recently inserted document */ int iPrevLangid; /* Langid of recently inserted document */ + int bPrevDelete; /* True if last operation was a delete */ #if defined(SQLITE_DEBUG) || defined(SQLITE_COVERAGE_TEST) /* State variables used for validating that the transaction control diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index 4cd2aebf6a..73adbd3f91 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -860,10 +860,12 @@ static int fts3PendingTermsAdd( */ static int fts3PendingTermsDocid( Fts3Table *p, /* Full-text table handle */ + int bDelete, /* True if this op is a delete */ int iLangid, /* Language id of row being written */ sqlite_int64 iDocid /* Docid of row being written */ ){ assert( iLangid>=0 ); + assert( bDelete==1 || bDelete==0 ); /* TODO(shess) Explore whether partially flushing the buffer on ** forced-flush would provide better performance. I suspect that if @@ -871,7 +873,8 @@ static int fts3PendingTermsDocid( ** buffer was half empty, that would let the less frequent terms ** generate longer doclists. */ - if( iDocid<=p->iPrevDocid + if( iDocidiPrevDocid + || (iDocid==p->iPrevLangid && p->bPrevDelete==0) || p->iPrevLangid!=iLangid || p->nPendingData>p->nMaxPendingData ){ @@ -880,6 +883,7 @@ static int fts3PendingTermsDocid( } p->iPrevDocid = iDocid; p->iPrevLangid = iLangid; + p->bPrevDelete = bDelete; return SQLITE_OK; } @@ -1069,7 +1073,8 @@ static void fts3DeleteTerms( if( SQLITE_ROW==sqlite3_step(pSelect) ){ int i; int iLangid = langidFromSelect(p, pSelect); - rc = fts3PendingTermsDocid(p, iLangid, sqlite3_column_int64(pSelect, 0)); + i64 iDocid = sqlite3_column_int64(pSelect, 0); + rc = fts3PendingTermsDocid(p, 1, iLangid, iDocid); for(i=1; rc==SQLITE_OK && i<=p->nColumn; i++){ int iCol = i-1; if( p->abNotindexed[iCol]==0 ){ @@ -3512,7 +3517,7 @@ static int fts3DoRebuild(Fts3Table *p){ while( rc==SQLITE_OK && SQLITE_ROW==sqlite3_step(pStmt) ){ int iCol; int iLangid = langidFromSelect(p, pStmt); - rc = fts3PendingTermsDocid(p, iLangid, sqlite3_column_int64(pStmt, 0)); + rc = fts3PendingTermsDocid(p, 0, iLangid, sqlite3_column_int64(pStmt, 0)); memset(aSz, 0, sizeof(aSz[0]) * (p->nColumn+1)); for(iCol=0; rc==SQLITE_OK && iColnColumn; iCol++){ if( p->abNotindexed[iCol]==0 ){ @@ -5617,7 +5622,7 @@ int sqlite3Fts3UpdateMethod( } } if( rc==SQLITE_OK && (!isRemove || *pRowid!=p->iPrevDocid ) ){ - rc = fts3PendingTermsDocid(p, iLangid, *pRowid); + rc = fts3PendingTermsDocid(p, 0, iLangid, *pRowid); } if( rc==SQLITE_OK ){ assert( p->iPrevDocid==*pRowid ); diff --git a/manifest b/manifest index d8a00a1ea3..4c1ad66b3a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Changes\sto\sallow\sDELETE\soperations\son\svirtual\stables\sto\suse\sthe\sonepass\sstrategy\sunder\ssome\scircumstances. -D 2015-09-28T15:20:58.913 +C Update\sfts3\sto\suse\sthe\sonepass\sstrategy\sfor\sdelete\soperations. +D 2015-09-28T15:23:29.191 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -78,9 +78,9 @@ F ext/fts3/README.content fdc666a70d5257a64fee209f97cf89e0e6e32b51 F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers e0a8b81383ea60d0334d274fadf305ea14a8c314 F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c b04b0c57761fdba2ae562d9d9ba50c7c4a95d9ea +F ext/fts3/fts3.c 52232f39bae8320c537f1d9ffd8d58b64dfaf21e F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe -F ext/fts3/fts3Int.h 601743955ac43a0e82e6828a931c07bb3b0c95ff +F ext/fts3/fts3Int.h c84125c666ee54cef6efce6ff64abb0d0e2f4535 F ext/fts3/fts3_aux.c 9edc3655fcb287f0467d0a4b886a01c6185fe9f1 F ext/fts3/fts3_expr.c 71c063da9c2a4167fb54aec089dd5ef33a58c9cb F ext/fts3/fts3_hash.c 29b986e43f4e9dd40110eafa377dc0d63c422c60 @@ -96,7 +96,7 @@ F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 F ext/fts3/fts3_unicode.c a93f5edc0aff44ef8b06d7cb55b52026541ca145 F ext/fts3/fts3_unicode2.c c3d01968d497bd7001e7dc774ba75b372738c057 -F ext/fts3/fts3_write.c 4f005f78592a1447ca96c8475ef5342ab7dbe02a +F ext/fts3/fts3_write.c 5d7857a6a454f210e4fabc2528e8a63e6ab98078 F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/fts3/tool/fts3view.c 8e53d0190a7b3443764bbd32ad47be2bd852026d @@ -727,7 +727,7 @@ F test/fts4aa.test 10aac8e9d62c7357590acfabe3fad01e9a9ce1cb F test/fts4check.test 9d9e818fd6cb29c0e007cd6d00447739d4fde430 F test/fts4content.test abb0c77bc3da3df64fec72e00844d2257a90025d F test/fts4docid.test e33c383cfbdff0284685604d256f347a18fdbf01 -F test/fts4growth.test df10fde9f47cf5c71861e63fd8efcd573c4f7e53 +F test/fts4growth.test a73eab34dd9960d10603347fc77fefe2f9322e26 F test/fts4growth2.test 2f063be1902a73cd087355837c52fed42ac11a5d F test/fts4incr.test 4e353a0bd886ea984e56fce9e77724fc923b8d0d F test/fts4langid.test 24a6e41063b416bbdf371ff6b4476fa41c194aa7 @@ -1388,10 +1388,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 5c14d447055bb337428eb1fe0a2934abee381829 -R 3d1a8d879c965d0f75999b9c5903a435 -T *branch * vtab-onepass -T *sym-vtab-onepass * -T -sym-trunk * +P e73f919fae1833c6ffb36eddbc76d9a8d9324214 +R 164b44f729dee0c8bb93a44bcf38cdec U dan -Z 049fa8c468f3a0165cbcd245b0299bac +Z 708fbaf265cb02c74fec8f06c877c6ce diff --git a/manifest.uuid b/manifest.uuid index a16e447313..fd2328e23a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e73f919fae1833c6ffb36eddbc76d9a8d9324214 \ No newline at end of file +fffab4f70f85eeb2acbb89534064a6e397c39384 \ No newline at end of file diff --git a/test/fts4growth.test b/test/fts4growth.test index aa5f251f95..6884922afe 100644 --- a/test/fts4growth.test +++ b/test/fts4growth.test @@ -202,11 +202,11 @@ do_test 3.1.3 { delete_doc 9 8 7 } execsql { SELECT level, idx, second(end_block) FROM x3_segdir } -} {0 0 591 0 1 65 0 2 72 0 3 76} +} {0 0 591 0 1 72 0 2 76} do_test 3.1.4 { execsql { INSERT INTO x3(x3) VALUES('optimize') } execsql { SELECT level, idx, second(end_block) FROM x3_segdir } -} {0 0 412} +} {0 0 463} do_test 3.2.1 { execsql { DELETE FROM x3 } From a722821eb53c3ba81470890201c7ac1b474bb8c3 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 28 Sep 2015 17:05:22 +0000 Subject: [PATCH 16/98] Extra information provided by .wheretrace on input flags to the query planner and on the result of sqlite3WhereOkOnePass(). FossilOrigin-Name: c5566bb39c8d9b58f77380b81a873429575c7d5c --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/where.c | 10 +++++++++- 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index faf2febc41..6bcfc15a78 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\stest\scases\sto\sthe\sONEPASS\soptimization\scorruption\sproblem\sfixed\sby\sthe\nprevious\scheck-in. -D 2015-09-28T15:08:28.795 +C Extra\sinformation\sprovided\sby\s.wheretrace\son\sinput\sflags\sto\sthe\squery\splanner\nand\son\sthe\sresult\sof\ssqlite3WhereOkOnePass(). +D 2015-09-28T17:05:22.174 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -417,7 +417,7 @@ F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb F src/wal.c 18b0ed49830cf04fe2d68224b41838a73ac6cd24 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/walker.c 2e14d17f592d176b6dc879c33fbdec4fbccaa2ba -F src/where.c f2c4905e47fe80043a0c45f374f555615da365ba +F src/where.c 25d7527226d63176b3cd4880a85119cda9f83844 F src/whereInt.h 7892bb54cf9ca0ae5c7e6094491b94c9286dc647 F src/wherecode.c 7660e1ad16817a921b099af553f3e1349352d16f F src/whereexpr.c 2473e4350e30f9b55d1c6a8f66ca23c689f23f1d @@ -1388,7 +1388,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 9d057f52217e7ef9c3f3eb84117abe3365503f44 -R 075466467a3c577c7bea65d16a397b4e +P 5c14d447055bb337428eb1fe0a2934abee381829 +R afaa284829583439d3c828667e0babfd U drh -Z a775dc5a399b71fca215b8951f694541 +Z 4d08d7f777c595957317ee86b8c88bc8 diff --git a/manifest.uuid b/manifest.uuid index caba2b4da5..544e794a7a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5c14d447055bb337428eb1fe0a2934abee381829 \ No newline at end of file +c5566bb39c8d9b58f77380b81a873429575c7d5c \ No newline at end of file diff --git a/src/where.c b/src/where.c index dfff3ca5c4..e224d40b1e 100644 --- a/src/where.c +++ b/src/where.c @@ -87,6 +87,13 @@ int sqlite3WhereBreakLabel(WhereInfo *pWInfo){ */ int sqlite3WhereOkOnePass(WhereInfo *pWInfo, int *aiCur){ memcpy(aiCur, pWInfo->aiCurOnePass, sizeof(int)*2); +#ifdef WHERETRACE_ENABLED + if( sqlite3WhereTrace && pWInfo->eOnePass!=ONEPASS_OFF ){ + sqlite3DebugPrintf("%s cursors: %d %d\n", + pWInfo->eOnePass==ONEPASS_SINGLE ? "ONEPASS_SINGLE" : "ONEPASS_MULTI", + aiCur[0], aiCur[1]); + } +#endif return pWInfo->eOnePass; } @@ -4110,7 +4117,8 @@ WhereInfo *sqlite3WhereBegin( } /* Construct the WhereLoop objects */ - WHERETRACE(0xffff,("*** Optimizer Start ***\n")); + WHERETRACE(0xffff,("*** Optimizer Start *** (wctrlFlags: 0x%x)\n", + wctrlFlags)); #if defined(WHERETRACE_ENABLED) if( sqlite3WhereTrace & 0x100 ){ /* Display all terms of the WHERE clause */ int i; From 0f40037eeedde464d3548f42e95adff8411d4743 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 28 Sep 2015 20:03:49 +0000 Subject: [PATCH 17/98] Also allow UPDATE on virtual tables to use the onepass strategy. FossilOrigin-Name: 1aa27d706db9b2e21737ce4b94b47ecd12c2570f --- ext/fts3/fts3_write.c | 2 +- manifest | 18 ++--- manifest.uuid | 2 +- src/update.c | 177 ++++++++++++++++++++++++------------------ test/fts3conf.test | 10 +-- test/fts4growth.test | 4 +- 6 files changed, 121 insertions(+), 92 deletions(-) diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index 73adbd3f91..6b7d5ef2ae 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -874,7 +874,7 @@ static int fts3PendingTermsDocid( ** generate longer doclists. */ if( iDocidiPrevDocid - || (iDocid==p->iPrevLangid && p->bPrevDelete==0) + || (iDocid==p->iPrevDocid && p->bPrevDelete==0) || p->iPrevLangid!=iLangid || p->nPendingData>p->nMaxPendingData ){ diff --git a/manifest b/manifest index 4c1ad66b3a..db3cccbd97 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sfts3\sto\suse\sthe\sonepass\sstrategy\sfor\sdelete\soperations. -D 2015-09-28T15:23:29.191 +C Also\sallow\sUPDATE\son\svirtual\stables\sto\suse\sthe\sonepass\sstrategy. +D 2015-09-28T20:03:49.551 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -96,7 +96,7 @@ F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 F ext/fts3/fts3_unicode.c a93f5edc0aff44ef8b06d7cb55b52026541ca145 F ext/fts3/fts3_unicode2.c c3d01968d497bd7001e7dc774ba75b372738c057 -F ext/fts3/fts3_write.c 5d7857a6a454f210e4fabc2528e8a63e6ab98078 +F ext/fts3/fts3_write.c 6f7233a06df17084d5cd968899053731bf953f94 F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/fts3/tool/fts3view.c 8e53d0190a7b3443764bbd32ad47be2bd852026d @@ -399,7 +399,7 @@ F src/threads.c bbfb74450643cb5372a43ad4f6cffd7e9dfcecb0 F src/tokenize.c 83c6ed569423a3af83a83973b444cf7123be33a6 F src/treeview.c 154f0acc622fa3514de8777dcedf4c8a8802b4ce F src/trigger.c 322f23aad694e8f31d384dcfa386d52a48d3c52f -F src/update.c eb7ab3ff2928628692a4f14be397c95f4a681d97 +F src/update.c 779319e1d52c3dfb3b870c9acd26161b464fbe27 F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c F src/util.c fc612367108b74573c5fd13a85d0a23027f438bd F src/vacuum.c 2ddd5cad2a7b9cef7f9e431b8c7771634c6b1701 @@ -690,7 +690,7 @@ F test/fts3aux2.test 7ae2b2c13aefdf4169279a27a5f51780ce57f6ba F test/fts3b.test e93bbb653e52afde110ad53bbd793f14fe7a8984 F test/fts3c.test fc723a9cf10b397fdfc2b32e73c53c8b1ec02958 F test/fts3comp1.test a0f5b16a2df44dd0b15751787130af2183167c0c -F test/fts3conf.test ee8500c86dd58ec075e8831a1e216a79989436de +F test/fts3conf.test 92bc4cc67f948b2f53f73c8ab0ebf4be9eee92aa F test/fts3corrupt.test 2710b77983cc7789295ddbffea52c1d3b7506dbb F test/fts3corrupt2.test 6d96efae2f8a6af3eeaf283aba437e6d0e5447ba F test/fts3cov.test e0fb00d8b715ddae4a94c305992dfc3ef70353d7 @@ -727,7 +727,7 @@ F test/fts4aa.test 10aac8e9d62c7357590acfabe3fad01e9a9ce1cb F test/fts4check.test 9d9e818fd6cb29c0e007cd6d00447739d4fde430 F test/fts4content.test abb0c77bc3da3df64fec72e00844d2257a90025d F test/fts4docid.test e33c383cfbdff0284685604d256f347a18fdbf01 -F test/fts4growth.test a73eab34dd9960d10603347fc77fefe2f9322e26 +F test/fts4growth.test df10fde9f47cf5c71861e63fd8efcd573c4f7e53 F test/fts4growth2.test 2f063be1902a73cd087355837c52fed42ac11a5d F test/fts4incr.test 4e353a0bd886ea984e56fce9e77724fc923b8d0d F test/fts4langid.test 24a6e41063b416bbdf371ff6b4476fa41c194aa7 @@ -1388,7 +1388,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P e73f919fae1833c6ffb36eddbc76d9a8d9324214 -R 164b44f729dee0c8bb93a44bcf38cdec +P fffab4f70f85eeb2acbb89534064a6e397c39384 +R 57289d0ecbc93a6cd377511502833368 U dan -Z 708fbaf265cb02c74fec8f06c877c6ce +Z 186d4cd8527ef990e771b3fd7444e8fc diff --git a/manifest.uuid b/manifest.uuid index fd2328e23a..7d87d8a7db 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fffab4f70f85eeb2acbb89534064a6e397c39384 \ No newline at end of file +1aa27d706db9b2e21737ce4b94b47ecd12c2570f \ No newline at end of file diff --git a/src/update.c b/src/update.c index 94f7a4dd99..b7071ce014 100644 --- a/src/update.c +++ b/src/update.c @@ -300,29 +300,20 @@ void sqlite3Update( if( pParse->nested==0 ) sqlite3VdbeCountChanges(v); sqlite3BeginWriteOperation(pParse, 1, iDb); -#ifndef SQLITE_OMIT_VIRTUALTABLE - /* Virtual tables must be handled separately */ - if( IsVirtual(pTab) ){ - updateVirtualTable(pParse, pTabList, pTab, pChanges, pRowidExpr, aXRef, - pWhere, onError); - pWhere = 0; - pTabList = 0; - goto update_cleanup; - } -#endif - /* Allocate required registers. */ - regRowSet = ++pParse->nMem; - regOldRowid = regNewRowid = ++pParse->nMem; - if( chngPk || pTrigger || hasFK ){ - regOld = pParse->nMem + 1; + if( !IsVirtual(pTab) ){ + regRowSet = ++pParse->nMem; + regOldRowid = regNewRowid = ++pParse->nMem; + if( chngPk || pTrigger || hasFK ){ + regOld = pParse->nMem + 1; + pParse->nMem += pTab->nCol; + } + if( chngKey || pTrigger || hasFK ){ + regNewRowid = ++pParse->nMem; + } + regNew = pParse->nMem + 1; pParse->nMem += pTab->nCol; } - if( chngKey || pTrigger || hasFK ){ - regNewRowid = ++pParse->nMem; - } - regNew = pParse->nMem + 1; - pParse->nMem += pTab->nCol; /* Start the view context. */ if( isView ){ @@ -345,6 +336,15 @@ void sqlite3Update( goto update_cleanup; } +#ifndef SQLITE_OMIT_VIRTUALTABLE + /* Virtual tables must be handled separately */ + if( IsVirtual(pTab) ){ + updateVirtualTable(pParse, pTabList, pTab, pChanges, pRowidExpr, aXRef, + pWhere, onError); + goto update_cleanup; + } +#endif + /* Begin the database scan */ if( HasRowid(pTab) ){ @@ -685,21 +685,23 @@ update_cleanup: /* ** Generate code for an UPDATE of a virtual table. ** -** The strategy is that we create an ephemeral table that contains +** There are two possible strategies - the default and the special +** "onepass" strategy. Onepass is only used if the virtual table +** implementation indicates that pWhere may match at most one row. +** +** The default strategy is to create an ephemeral table that contains ** for each row to be changed: ** ** (A) The original rowid of that row. -** (B) The revised rowid for the row. (note1) +** (B) The revised rowid for the row. ** (C) The content of every column in the row. ** -** Then we loop over this ephemeral table and for each row in -** the ephemeral table call VUpdate. +** Then loop through the contents of this ephemeral table executing a +** VUpdate for each row. When finished, drop the ephemeral table. ** -** When finished, drop the ephemeral table. -** -** (note1) Actually, if we know in advance that (A) is always the same -** as (B) we only store (A), then duplicate (A) when pulling -** it out of the ephemeral table before calling VUpdate. +** The "onepass" strategy does not use an ephemeral table. Instead, it +** stores the same values (A, B and C above) in a register array and +** makes a single invocation of VUpdate. */ static void updateVirtualTable( Parse *pParse, /* The parsing context */ @@ -712,65 +714,92 @@ static void updateVirtualTable( int onError /* ON CONFLICT strategy */ ){ Vdbe *v = pParse->pVdbe; /* Virtual machine under construction */ - ExprList *pEList = 0; /* The result set of the SELECT statement */ - Select *pSelect = 0; /* The SELECT statement */ - Expr *pExpr; /* Temporary expression */ int ephemTab; /* Table holding the result of the SELECT */ int i; /* Loop counter */ - int addr; /* Address of top of loop */ - int iReg; /* First register in set passed to OP_VUpdate */ sqlite3 *db = pParse->db; /* Database connection */ const char *pVTab = (const char*)sqlite3GetVTable(db, pTab); - SelectDest dest; + WhereInfo *pWInfo; + int nArg = 2 + pTab->nCol; /* Number of arguments to VUpdate */ + int regArg; /* First register in VUpdate arg array */ + int regRec; /* Register in which to assemble record */ + int regRowid; /* Register for ephem table rowid */ + int iCsr = pSrc->a[0].iCursor; /* Cursor used for virtual table scan */ + int aDummy[2]; /* Unused arg for sqlite3WhereOkOnePass() */ + int bOnePass; /* True to use onepass strategy */ + int addr; /* Address of OP_OpenEphemeral */ + NameContext sNC; - /* Construct the SELECT statement that will find the new values for - ** all updated rows. - */ - pEList = sqlite3ExprListAppend(pParse, 0, sqlite3Expr(db, TK_ID, "_rowid_")); - if( pRowid ){ - pEList = sqlite3ExprListAppend(pParse, pEList, - sqlite3ExprDup(db, pRowid, 0)); - } - assert( pTab->iPKey<0 ); - for(i=0; inCol; i++){ - if( aXRef[i]>=0 ){ - pExpr = sqlite3ExprDup(db, pChanges->a[aXRef[i]].pExpr, 0); - }else{ - pExpr = sqlite3Expr(db, TK_ID, pTab->aCol[i].zName); - } - pEList = sqlite3ExprListAppend(pParse, pEList, pExpr); - } - pSelect = sqlite3SelectNew(pParse, pEList, pSrc, pWhere, 0, 0, 0, 0, 0, 0); - - /* Create the ephemeral table into which the update results will - ** be stored. - */ + /* Allocate nArg registers to martial the arguments to VUpdate. Then + ** create and open the ephemeral table in which the records created from + ** these arguments will be temporarily stored. */ assert( v ); ephemTab = pParse->nTab++; + addr= sqlite3VdbeAddOp2(v, OP_OpenEphemeral, ephemTab, nArg); + regArg = pParse->nMem + 1; + pParse->nMem += nArg; + regRec = ++pParse->nMem; + regRowid = ++pParse->nMem; - /* fill the ephemeral table - */ - sqlite3SelectDestInit(&dest, SRT_EphemTab, ephemTab); - sqlite3Select(pParse, pSelect, &dest); + /* Start scanning the virtual table */ + pWInfo = sqlite3WhereBegin(pParse, pSrc, pWhere, 0,0,WHERE_ONEPASS_DESIRED,0); + if( pWInfo==0 ) return; - /* Generate code to scan the ephemeral table and call VUpdate. */ - iReg = ++pParse->nMem; - pParse->nMem += pTab->nCol+1; - addr = sqlite3VdbeAddOp2(v, OP_Rewind, ephemTab, 0); VdbeCoverage(v); - sqlite3VdbeAddOp3(v, OP_Column, ephemTab, 0, iReg); - sqlite3VdbeAddOp3(v, OP_Column, ephemTab, (pRowid?1:0), iReg+1); + /* Populate the argument registers. */ + sqlite3VdbeAddOp2(v, OP_Rowid, iCsr, regArg); + if( pRowid ){ + sqlite3ExprCode(pParse, pRowid, regArg+1); + }else{ + sqlite3VdbeAddOp2(v, OP_Rowid, iCsr, regArg+1); + } for(i=0; inCol; i++){ - sqlite3VdbeAddOp3(v, OP_Column, ephemTab, i+1+(pRowid!=0), iReg+2+i); + if( aXRef[i]>=0 ){ + sqlite3ExprCode(pParse, pChanges->a[aXRef[i]].pExpr, regArg+2+i); + }else{ + sqlite3VdbeAddOp3(v, OP_VColumn, iCsr, i, regArg+2+i); + } + } + + bOnePass = sqlite3WhereOkOnePass(pWInfo, aDummy); + + if( bOnePass ){ + /* If using the onepass strategy, no-op out the OP_OpenEphemeral coded + ** above. Also, if this is a top-level parse (not a trigger), clear the + ** multi-write flag so that the VM does not open a statement journal */ + sqlite3VdbeChangeToNoop(v, addr); + if( sqlite3ParseToplevel(pParse)==pParse ){ + pParse->isMultiWrite = 0; + } + }else{ + /* Create a record from the argument register contents and insert it into + ** the ephemeral table. */ + sqlite3VdbeAddOp3(v, OP_MakeRecord, regArg, nArg, regRec); + sqlite3VdbeAddOp2(v, OP_NewRowid, ephemTab, regRowid); + sqlite3VdbeAddOp3(v, OP_Insert, ephemTab, regRec, regRowid); + } + + /* End the virtual table scan */ + sqlite3WhereEnd(pWInfo); + + if( bOnePass==0 ){ + /* Begin scannning through the ephemeral table. */ + addr = sqlite3VdbeAddOp2(v, OP_Rewind, ephemTab, 0); VdbeCoverage(v); + + /* Extract arguments from the current row of the ephemeral table and + ** invoke the VUpdate method. */ + for(i=0; inCol+2, iReg, pVTab, P4_VTAB); + sqlite3VdbeAddOp4(v, OP_VUpdate, 0, nArg, regArg, pVTab, P4_VTAB); sqlite3VdbeChangeP5(v, onError==OE_Default ? OE_Abort : onError); sqlite3MayAbort(pParse); - sqlite3VdbeAddOp2(v, OP_Next, ephemTab, addr+1); VdbeCoverage(v); - sqlite3VdbeJumpHere(v, addr); - sqlite3VdbeAddOp2(v, OP_Close, ephemTab, 0); - /* Cleanup */ - sqlite3SelectDelete(db, pSelect); + /* End of the ephemeral table scan */ + if( bOnePass==0 ){ + sqlite3VdbeAddOp2(v, OP_Next, ephemTab, addr+1); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addr); + sqlite3VdbeAddOp2(v, OP_Close, ephemTab, 0); + } } #endif /* SQLITE_OMIT_VIRTUALTABLE */ diff --git a/test/fts3conf.test b/test/fts3conf.test index e91efbefbe..543270606f 100644 --- a/test/fts3conf.test +++ b/test/fts3conf.test @@ -86,11 +86,11 @@ foreach {tn sql uses constraint data} [subst { 9 "INSERT OR IGNORE $T2" 1 0 {{a b c d} {e f g h} {i j k l} z} 10 "INSERT OR REPLACE $T2" 1 0 {{a b c d} y {i j k l} z} - 11 "UPDATE OR ROLLBACK $T3" 1 1 {{a b c d} {e f g h}} - 12 "UPDATE OR ABORT $T3" 1 1 {{a b c d} {e f g h} {i j k l}} - 13 "UPDATE OR FAIL $T3" 1 1 {{a b c d} {e f g h} {i j k l}} - 14 "UPDATE OR IGNORE $T3" 1 0 {{a b c d} {e f g h} {i j k l}} - 15 "UPDATE OR REPLACE $T3" 1 0 {{a b c d} {i j k l}} + 11 "UPDATE OR ROLLBACK $T3" 0 1 {{a b c d} {e f g h}} + 12 "UPDATE OR ABORT $T3" 0 1 {{a b c d} {e f g h} {i j k l}} + 13 "UPDATE OR FAIL $T3" 0 1 {{a b c d} {e f g h} {i j k l}} + 14 "UPDATE OR IGNORE $T3" 0 0 {{a b c d} {e f g h} {i j k l}} + 15 "UPDATE OR REPLACE $T3" 0 0 {{a b c d} {i j k l}} 16 "UPDATE OR ROLLBACK $T4" 1 1 {{a b c d} {e f g h}} 17 "UPDATE OR ABORT $T4" 1 1 {{a b c d} {e f g h} {i j k l}} diff --git a/test/fts4growth.test b/test/fts4growth.test index 6884922afe..aa5f251f95 100644 --- a/test/fts4growth.test +++ b/test/fts4growth.test @@ -202,11 +202,11 @@ do_test 3.1.3 { delete_doc 9 8 7 } execsql { SELECT level, idx, second(end_block) FROM x3_segdir } -} {0 0 591 0 1 72 0 2 76} +} {0 0 591 0 1 65 0 2 72 0 3 76} do_test 3.1.4 { execsql { INSERT INTO x3(x3) VALUES('optimize') } execsql { SELECT level, idx, second(end_block) FROM x3_segdir } -} {0 0 463} +} {0 0 412} do_test 3.2.1 { execsql { DELETE FROM x3 } From 354474ad6de3a4ee43df5f83af769669513cec02 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 29 Sep 2015 10:11:26 +0000 Subject: [PATCH 18/98] Add tests for fts3 and onepass update/delete operations. Also fix a problem with onepass updates that do not affect any rows. FossilOrigin-Name: 820c804468abff692742952de670c5d906a50956 --- manifest | 17 ++--- manifest.uuid | 2 +- src/delete.c | 8 +-- src/update.c | 12 ++-- src/wherecode.c | 2 +- test/fts4onepass.test | 147 ++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 169 insertions(+), 19 deletions(-) create mode 100644 test/fts4onepass.test diff --git a/manifest b/manifest index db3cccbd97..7c78e99294 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Also\sallow\sUPDATE\son\svirtual\stables\sto\suse\sthe\sonepass\sstrategy. -D 2015-09-28T20:03:49.551 +C Add\stests\sfor\sfts3\sand\sonepass\supdate/delete\soperations.\sAlso\sfix\sa\sproblem\swith\sonepass\supdates\sthat\sdo\snot\saffect\sany\srows. +D 2015-09-29T10:11:26.685 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -291,7 +291,7 @@ F src/complete.c addcd8160b081131005d5bc2d34adf20c1c5c92f F src/ctime.c 5a0b735dc95604766f5dac73973658eef782ee8b F src/date.c fb1c99172017dcc8e237339132c91a21a0788584 F src/dbstat.c e637e7a7ff40ef32132a418c6fdf1cfb63aa27c7 -F src/delete.c b454df59d57cb3f07118dfc68821760593fcaab3 +F src/delete.c 174b140317915e0e8c6e2eff28158eecf95c53d8 F src/expr.c 3a76afcdac925294c39903b7002ddb9e5fd29863 F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb F src/fkey.c 83e1baba999bed3144ea5a2143fc922edf51135f @@ -399,7 +399,7 @@ F src/threads.c bbfb74450643cb5372a43ad4f6cffd7e9dfcecb0 F src/tokenize.c 83c6ed569423a3af83a83973b444cf7123be33a6 F src/treeview.c 154f0acc622fa3514de8777dcedf4c8a8802b4ce F src/trigger.c 322f23aad694e8f31d384dcfa386d52a48d3c52f -F src/update.c 779319e1d52c3dfb3b870c9acd26161b464fbe27 +F src/update.c 4fb82a2440bd8d66f266ada1ef31a2fcde48bd4f F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c F src/util.c fc612367108b74573c5fd13a85d0a23027f438bd F src/vacuum.c 2ddd5cad2a7b9cef7f9e431b8c7771634c6b1701 @@ -419,7 +419,7 @@ F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/walker.c 2e14d17f592d176b6dc879c33fbdec4fbccaa2ba F src/where.c d07fb77010949be9b96e9120b4653712bf9f74ae F src/whereInt.h 7892bb54cf9ca0ae5c7e6094491b94c9286dc647 -F src/wherecode.c 7660e1ad16817a921b099af553f3e1349352d16f +F src/wherecode.c a87238178f8c300fd27afec54326ea8d0a18baa2 F src/whereexpr.c 2473e4350e30f9b55d1c6a8f66ca23c689f23f1d F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd @@ -736,6 +736,7 @@ F test/fts4merge2.test 5faa558d1b672f82b847d2a337465fa745e46891 F test/fts4merge3.test aab02a09f50fe6baaddc2e159c3eabc116d45fc7 F test/fts4merge4.test d895b1057a7798b67e03455d0fa50e9ea836c47b F test/fts4noti.test 524807f0c36d49deea7920cdd4cd687408b58849 +F test/fts4onepass.test bfca61f69c6ca74cd71e6dca12a0cdd47192fc24 F test/fts4unicode.test 27378af76394542cf490cf001d8d1505fe55f6a9 F test/full.test 6b3c8fb43c6beab6b95438c1675374b95fab245d F test/func.test ae97561957aba6ca9e3a7b8a13aac41830d701ef @@ -1388,7 +1389,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P fffab4f70f85eeb2acbb89534064a6e397c39384 -R 57289d0ecbc93a6cd377511502833368 +P 1aa27d706db9b2e21737ce4b94b47ecd12c2570f +R 906a452cbd4322b894c4cf3888c881fe U dan -Z 186d4cd8527ef990e771b3fd7444e8fc +Z 392788408df553b8d21ff2f5c84b91d4 diff --git a/manifest.uuid b/manifest.uuid index 7d87d8a7db..673713a60e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1aa27d706db9b2e21737ce4b94b47ecd12c2570f \ No newline at end of file +820c804468abff692742952de670c5d906a50956 \ No newline at end of file diff --git a/src/delete.c b/src/delete.c index 9c928f8d51..ed843c1a75 100644 --- a/src/delete.c +++ b/src/delete.c @@ -465,7 +465,7 @@ void sqlite3DeleteFrom( /* If this DELETE cannot use the ONEPASS strategy, this is the ** end of the WHERE loop */ - if( eOnePass!=ONEPASS_OFF && !IsVirtual(pTab) ){ + if( eOnePass!=ONEPASS_OFF ){ addrBypass = sqlite3VdbeMakeLabel(v); }else{ sqlite3WhereEnd(pWInfo); @@ -535,10 +535,8 @@ void sqlite3DeleteFrom( /* End of the loop over all rowids/primary-keys. */ if( eOnePass!=ONEPASS_OFF ){ - if( !IsVirtual(pTab) ){ - sqlite3VdbeResolveLabel(v, addrBypass); - sqlite3WhereEnd(pWInfo); - } + sqlite3VdbeResolveLabel(v, addrBypass); + sqlite3WhereEnd(pWInfo); }else if( pPk ){ sqlite3VdbeAddOp2(v, OP_Next, iEphCur, addrLoop+1); VdbeCoverage(v); sqlite3VdbeJumpHere(v, addrLoop); diff --git a/src/update.c b/src/update.c index b7071ce014..ebf0d6c8ea 100644 --- a/src/update.c +++ b/src/update.c @@ -777,12 +777,13 @@ static void updateVirtualTable( sqlite3VdbeAddOp3(v, OP_Insert, ephemTab, regRec, regRowid); } - /* End the virtual table scan */ - sqlite3WhereEnd(pWInfo); if( bOnePass==0 ){ + /* End the virtual table scan */ + sqlite3WhereEnd(pWInfo); + /* Begin scannning through the ephemeral table. */ - addr = sqlite3VdbeAddOp2(v, OP_Rewind, ephemTab, 0); VdbeCoverage(v); + addr = sqlite3VdbeAddOp1(v, OP_Rewind, ephemTab); VdbeCoverage(v); /* Extract arguments from the current row of the ephemeral table and ** invoke the VUpdate method. */ @@ -795,11 +796,14 @@ static void updateVirtualTable( sqlite3VdbeChangeP5(v, onError==OE_Default ? OE_Abort : onError); sqlite3MayAbort(pParse); - /* End of the ephemeral table scan */ + /* End of the ephemeral table scan. Or, if using the onepass strategy, + ** jump to here if the scan visited zero rows. */ if( bOnePass==0 ){ sqlite3VdbeAddOp2(v, OP_Next, ephemTab, addr+1); VdbeCoverage(v); sqlite3VdbeJumpHere(v, addr); sqlite3VdbeAddOp2(v, OP_Close, ephemTab, 0); + }else{ + sqlite3WhereEnd(pWInfo); } } #endif /* SQLITE_OMIT_VIRTUALTABLE */ diff --git a/src/wherecode.c b/src/wherecode.c index 77b8be4bee..f9b56e7c83 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -700,8 +700,8 @@ Bitmask sqlite3WhereCodeOneLoopStart( disableTerm(pLevel, pLoop->aLTerm[j]); } } - pLevel->op = OP_VNext; pLevel->p1 = iCur; + pLevel->op = pWInfo->eOnePass ? OP_Noop : OP_VNext; pLevel->p2 = sqlite3VdbeCurrentAddr(v); sqlite3ReleaseTempRange(pParse, iReg, nConstraint+2); sqlite3ExprCachePop(pParse); diff --git a/test/fts4onepass.test b/test/fts4onepass.test new file mode 100644 index 0000000000..d290980dc9 --- /dev/null +++ b/test/fts4onepass.test @@ -0,0 +1,147 @@ +# 2015 Sep 27 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#************************************************************************* +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +source $testdir/fts3_common.tcl +set ::testprefix fts4onepass + +# If SQLITE_ENABLE_FTS3 is defined, omit this file. +ifcapable !fts3 { + finish_test + return +} + +do_execsql_test 1.0 { + CREATE VIRTUAL TABLE ft USING fts3; + INSERT INTO ft(rowid, content) VALUES(1, '1 2 3'); + INSERT INTO ft(rowid, content) VALUES(2, '4 5 6'); + INSERT INTO ft(rowid, content) VALUES(3, '7 8 9'); +} + +#------------------------------------------------------------------------- +# Check that UPDATE and DELETE statements that feature "WHERE rowid=?" or +# or "WHERE docid=?" clauses do not use statement journals. But that other +# DELETE and UPDATE statements do. +# +# Note: "MATCH ? AND docid=?" does use a statement journal. +# +foreach {tn sql uses} { + 1.1 { DELETE FROM ft } 1 + 1.2 { DELETE FROM ft WHERE docid=? } 0 + 1.3 { DELETE FROM ft WHERE rowid=? } 0 + 1.4 { DELETE FROM ft WHERE ft MATCH '1' } 1 + 1.5 { DELETE FROM ft WHERE ft MATCH '1' AND docid=? } 1 + 1.6 { DELETE FROM ft WHERE ft MATCH '1' AND rowid=? } 1 + + 2.1 { UPDATE ft SET content='a b c' } 1 + 2.2 { UPDATE ft SET content='a b c' WHERE docid=? } 0 + 2.3 { UPDATE ft SET content='a b c' WHERE rowid=? } 0 + 2.4 { UPDATE ft SET content='a b c' WHERE ft MATCH '1' } 1 + 2.5 { UPDATE ft SET content='a b c' WHERE ft MATCH '1' AND docid=? } 1 + 2.6 { UPDATE ft SET content='a b c' WHERE ft MATCH '1' AND rowid=? } 1 +} { + do_test 1.$tn { sql_uses_stmt db $sql } $uses +} + +#------------------------------------------------------------------------- +# Check that putting a "DELETE/UPDATE ... WHERE rowid=?" statement in a +# trigger program does not prevent the VM from using a statement +# transaction. Even if the calling statement cannot hit a constraint. +# +do_execsql_test 2.0 { + CREATE TABLE t1(x); + + CREATE TRIGGER t1_ai AFTER INSERT ON t1 BEGIN + DELETE FROM ft WHERE rowid=new.x; + END; + + CREATE TRIGGER t1_ad AFTER DELETE ON t1 BEGIN + UPDATE ft SET content = 'a b c' WHERE rowid=old.x; + END; + + CREATE TRIGGER t1_bu BEFORE UPDATE ON t1 BEGIN + DELETE FROM ft WHERE rowid=old.x; + END; +} + +foreach {tn sql uses} { + 1 { INSERT INTO t1 VALUES(1) } 1 + 2 { DELETE FROM t1 WHERE x=4 } 1 + 3 { UPDATE t1 SET x=10 WHERE x=11 } 1 +} { + do_test 2.$tn { sql_uses_stmt db $sql } $uses +} + +#------------------------------------------------------------------------- +# Test that an "UPDATE ... WHERE rowid=?" works and does not corrupt the +# index when it strikes a constraint. Both inside and outside a +# transaction. +# +foreach {tn tcl1 tcl2} { + 1 {} {} + + 2 { + execsql BEGIN + } { + if {[sqlite3_get_autocommit db]==1} { error "transaction rolled back!" } + execsql COMMIT + } +} { + + do_execsql_test 3.$tn.0 { + DROP TABLE IF EXISTS ft2; + CREATE VIRTUAL TABLE ft2 USING fts4; + INSERT INTO ft2(rowid, content) VALUES(1, 'a b c'); + INSERT INTO ft2(rowid, content) VALUES(2, 'a b d'); + INSERT INTO ft2(rowid, content) VALUES(3, 'a b e'); + } + + eval $tcl1 + foreach {tn2 sql content} { + 1 { UPDATE ft2 SET docid=2 WHERE docid=1 } + { 1 {a b c} 2 {a b d} 3 {a b e} } + + 2 { + INSERT INTO ft2(rowid, content) VALUES(4, 'a b f'); + UPDATE ft2 SET docid=5 WHERE docid=4; + UPDATE ft2 SET docid=3 WHERE docid=5; + } { 1 {a b c} 2 {a b d} 3 {a b e} 5 {a b f} } + + 3 { + UPDATE ft2 SET docid=3 WHERE docid=4; -- matches 0 rows + UPDATE ft2 SET docid=2 WHERE docid=3; + } { 1 {a b c} 2 {a b d} 3 {a b e} 5 {a b f} } + + 4 { + INSERT INTO ft2(rowid, content) VALUES(4, 'a b g'); + UPDATE ft2 SET docid=-1 WHERE docid=4; + UPDATE ft2 SET docid=3 WHERE docid=-1; + } {-1 {a b g} 1 {a b c} 2 {a b d} 3 {a b e} 5 {a b f} } + + 5 { + DELETE FROM ft2 WHERE rowid=451; + DELETE FROM ft2 WHERE rowid=-1; + UPDATE ft2 SET docid = 2 WHERE docid = 1; + } {1 {a b c} 2 {a b d} 3 {a b e} 5 {a b f} } + } { + do_catchsql_test 3.$tn.$tn2.a $sql {1 {constraint failed}} + do_execsql_test 3.$tn.$tn2.b { SELECT rowid, content FROM ft2 } $content + do_execsql_test 3.$tn.$tn2.c { + INSERT INTO ft2(ft2) VALUES('integrity-check'); + } + } + eval $tcl2 +} + +finish_test + From b3deb4ea64464a104c25984a8796eb8a6153d07a Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 29 Sep 2015 11:57:20 +0000 Subject: [PATCH 19/98] Change the name of the new sqlite3_index_info.flags field to "idxFlags". Add documentation for the same to sqlite.h.in. FossilOrigin-Name: f61203bc0fb0b62e12d6270e8d9063e445a5a252 --- ext/fts3/fts3.c | 2 +- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/sqlite.h.in | 22 ++++++++++++++++++++-- src/where.c | 6 +++--- 5 files changed, 33 insertions(+), 15 deletions(-) diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index ceffb52cf4..748faefec5 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -1525,7 +1525,7 @@ static void fts3SetEstimatedRows(sqlite3_index_info *pIdxInfo, i64 nRow){ static void fts3SetUniqueFlag(sqlite3_index_info *pIdxInfo){ #if SQLITE_VERSION_NUMBER>=3008012 if( sqlite3_libversion_number()>=3008012 ){ - pIdxInfo->flags |= SQLITE_INDEX_SCAN_UNIQUE; + pIdxInfo->idxFlags |= SQLITE_INDEX_SCAN_UNIQUE; } #endif } diff --git a/manifest b/manifest index 7c78e99294..40d38d696c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\stests\sfor\sfts3\sand\sonepass\supdate/delete\soperations.\sAlso\sfix\sa\sproblem\swith\sonepass\supdates\sthat\sdo\snot\saffect\sany\srows. -D 2015-09-29T10:11:26.685 +C Change\sthe\sname\sof\sthe\snew\ssqlite3_index_info.flags\sfield\sto\s"idxFlags".\sAdd\sdocumentation\sfor\sthe\ssame\sto\ssqlite.h.in. +D 2015-09-29T11:57:20.011 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -78,7 +78,7 @@ F ext/fts3/README.content fdc666a70d5257a64fee209f97cf89e0e6e32b51 F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers e0a8b81383ea60d0334d274fadf305ea14a8c314 F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c 52232f39bae8320c537f1d9ffd8d58b64dfaf21e +F ext/fts3/fts3.c e028eb13432f108d2e22cded019fc980700e4e00 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h c84125c666ee54cef6efce6ff64abb0d0e2f4535 F ext/fts3/fts3_aux.c 9edc3655fcb287f0467d0a4b886a01c6185fe9f1 @@ -342,7 +342,7 @@ F src/resolve.c 1954a0f01bf65d78d7d559aea3d5c67f33376d91 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e F src/select.c 33230303f5f32430ee971a6fcc6a370e4a93ae1a F src/shell.c a11b20da4c6630e0e8f83c47ce36f717dd0422f0 -F src/sqlite.h.in eade8bcc0456ff4d3f7ecfbbd3c4eec117314f26 +F src/sqlite.h.in 4b76d74d69af48c534c58fb723137dc6944bdedc F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad F src/sqlite3ext.h 64350bf36833a56ad675e27392a913f417c5c308 F src/sqliteInt.h 5afc6e50402be1e0a870f28e1cd8b32eb9db590f @@ -417,7 +417,7 @@ F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb F src/wal.c 18b0ed49830cf04fe2d68224b41838a73ac6cd24 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/walker.c 2e14d17f592d176b6dc879c33fbdec4fbccaa2ba -F src/where.c d07fb77010949be9b96e9120b4653712bf9f74ae +F src/where.c 6491ebe811ee698793912f927b0fe3b662687e1b F src/whereInt.h 7892bb54cf9ca0ae5c7e6094491b94c9286dc647 F src/wherecode.c a87238178f8c300fd27afec54326ea8d0a18baa2 F src/whereexpr.c 2473e4350e30f9b55d1c6a8f66ca23c689f23f1d @@ -1389,7 +1389,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 1aa27d706db9b2e21737ce4b94b47ecd12c2570f -R 906a452cbd4322b894c4cf3888c881fe +P 820c804468abff692742952de670c5d906a50956 +R 546729b46aaa02f7503bc91f6617e820 U dan -Z 392788408df553b8d21ff2f5c84b91d4 +Z 84ab7e4ab7ab149e316240ec34018bc8 diff --git a/manifest.uuid b/manifest.uuid index 673713a60e..22a29264dc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -820c804468abff692742952de670c5d906a50956 \ No newline at end of file +f61203bc0fb0b62e12d6270e8d9063e445a5a252 \ No newline at end of file diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 4a1312863e..75e51f4b01 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -5634,13 +5634,31 @@ struct sqlite3_module { ** ^The estimatedRows value is an estimate of the number of rows that ** will be returned by the strategy. ** +** The xBestIndex method may optionally populate the idxFlags field with a +** mask of SQLITE_INDEX_SCAN_* flags. Currently there is only one such flag - +** SQLITE_INDEX_SCAN_UNIQUE. If the xBestIndex method sets this flag, SQLite +** assumes that the strategy may visit at most one row. +** +** Additionally, if xBestIndex sets the SQLITE_INDEX_SCAN_UNIQUE flag, then +** SQLite also assumes that if a call to the xUpdate() method is made as +** part of the same statement to delete or update a virtual table row and the +** implementation returns SQLITE_CONSTRAINT, then there is no need to rollback +** any database changes. In other words, if the xUpdate() returns +** SQLITE_CONSTRAINT, the database contents must be exactly as they were +** before xUpdate was called. By contrast, if SQLITE_INDEX_SCAN_UNIQUE is not +** set and xUpdate returns SQLITE_CONSTRAINT, any database changes made by +** the xUpdate method are automatically rolled back by SQLite. +** ** IMPORTANT: The estimatedRows field was added to the sqlite3_index_info ** structure for SQLite version 3.8.2. If a virtual table extension is ** used with an SQLite version earlier than 3.8.2, the results of attempting ** to read or write the estimatedRows field are undefined (but are likely ** to included crashing the application). The estimatedRows field should ** therefore only be used if [sqlite3_libversion_number()] returns a -** value greater than or equal to 3008002. +** value greater than or equal to 3008002. Similarly, the idxFlags field +** was added for version 3.8.12. It may therefore only be used if +** sqlite3_libversion_number() returns a value greater than or equal to +** 3008012. */ struct sqlite3_index_info { /* Inputs */ @@ -5669,7 +5687,7 @@ struct sqlite3_index_info { /* Fields below are only available in SQLite 3.8.2 and later */ sqlite3_int64 estimatedRows; /* Estimated number of rows returned */ /* Fields below are only available in SQLite 3.8.12 and later */ - int flags; /* Mask of SQLITE_INDEX_SCAN_* flags */ + int idxFlags; /* Mask of SQLITE_INDEX_SCAN_* flags */ }; /* diff --git a/src/where.c b/src/where.c index 1175496a2a..70774daea7 100644 --- a/src/where.c +++ b/src/where.c @@ -2832,7 +2832,7 @@ static int whereLoopAddVirtual( pIdxInfo->orderByConsumed = 0; pIdxInfo->estimatedCost = SQLITE_BIG_DBL / (double)2; pIdxInfo->estimatedRows = 25; - pIdxInfo->flags = 0; + pIdxInfo->idxFlags = 0; rc = vtabBestIndex(pParse, pTab, pIdxInfo); if( rc ) goto whereLoopAddVtab_exit; pIdxCons = *(struct sqlite3_index_constraint**)&pIdxInfo->aConstraint; @@ -2878,7 +2878,7 @@ static int whereLoopAddVirtual( ** (2) Multiple outputs from a single IN value will not merge ** together. */ pIdxInfo->orderByConsumed = 0; - pIdxInfo->flags &= ~SQLITE_INDEX_SCAN_UNIQUE; + pIdxInfo->idxFlags &= ~SQLITE_INDEX_SCAN_UNIQUE; } } } @@ -2897,7 +2897,7 @@ static int whereLoopAddVirtual( /* Set the WHERE_ONEROW flag if the xBestIndex() method indicated ** that the scan will visit at most one row. Clear it otherwise. */ - if( pIdxInfo->flags & SQLITE_INDEX_SCAN_UNIQUE ){ + if( pIdxInfo->idxFlags & SQLITE_INDEX_SCAN_UNIQUE ){ pNew->wsFlags |= WHERE_ONEROW; }else{ pNew->wsFlags &= ~WHERE_ONEROW; From 4ad09719194533b38a16766d4c4562e0707f7934 Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 29 Sep 2015 12:19:51 +0000 Subject: [PATCH 20/98] Fix an off-by-one error in test function fts5_decode(). FossilOrigin-Name: 3a9f076250d9559d8ea94ba44095ba3ddbc5542d --- ext/fts5/fts5_index.c | 2 +- manifest | 14 +++++++------- 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 b8aa52c2f8..9910c59b0a 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -5361,7 +5361,7 @@ static void fts5DecodeFunction( memset(&term, 0, sizeof(Fts5Buffer)); if( n<4 ){ - sqlite3Fts5BufferSet(&rc, &s, 8, (const u8*)"corrupt"); + sqlite3Fts5BufferSet(&rc, &s, 7, (const u8*)"corrupt"); goto decode_out; }else{ iRowidOff = fts5GetU16(&a[0]); diff --git a/manifest b/manifest index 6bcfc15a78..ae2961c2dc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Extra\sinformation\sprovided\sby\s.wheretrace\son\sinput\sflags\sto\sthe\squery\splanner\nand\son\sthe\sresult\sof\ssqlite3WhereOkOnePass(). -D 2015-09-28T17:05:22.174 +C Fix\san\soff-by-one\serror\sin\stest\sfunction\sfts5_decode(). +D 2015-09-29T12:19:51.430 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -112,7 +112,7 @@ F ext/fts5/fts5_buffer.c 64dcaf36a3ebda9e84b7c3b8788887ec325e12a4 F ext/fts5/fts5_config.c 57ee5fe71578cb494574fc0e6e51acb9a22a8695 F ext/fts5/fts5_expr.c 667faaf14a69a5683ac383acdc8d942cf32c3f93 F ext/fts5/fts5_hash.c 4bf4b99708848357b8a2b5819e509eb6d3df9246 -F ext/fts5/fts5_index.c 4fdbc0a321e3a1d73741a623d7aea4db78d6a86d +F ext/fts5/fts5_index.c c77882ab38d698d5147cef96fa67a2121d77c0b3 F ext/fts5/fts5_main.c 53116cffeb26898832ff7700cc5ebac5fe085d32 F ext/fts5/fts5_storage.c 120f7b143688b5b7710dacbd48cff211609b8059 F ext/fts5/fts5_tcl.c 6da58d6e8f42a93c4486b5ba9b187a7f995dee37 @@ -1388,7 +1388,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 5c14d447055bb337428eb1fe0a2934abee381829 -R afaa284829583439d3c828667e0babfd -U drh -Z 4d08d7f777c595957317ee86b8c88bc8 +P c5566bb39c8d9b58f77380b81a873429575c7d5c +R 8c1c5df148af89b61b9ed44613e1cccf +U dan +Z c6128292281c17956918fd20bfe641c1 diff --git a/manifest.uuid b/manifest.uuid index 544e794a7a..7b46927912 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c5566bb39c8d9b58f77380b81a873429575c7d5c \ No newline at end of file +3a9f076250d9559d8ea94ba44095ba3ddbc5542d \ No newline at end of file From 94f26a1e22cc5ffc0952948d254dc1f3b7c1d142 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 29 Sep 2015 12:32:56 +0000 Subject: [PATCH 21/98] Fix compiler warnings. FossilOrigin-Name: d1a0783854d2e9272320d9ddfa58362532f58d1a --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/update.c | 8 +++----- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 0e0acb1ea1..ded8386abb 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\slatest\strunk\schange\sinto\sthis\sbranch. -D 2015-09-29T11:59:25.306 +C Fix\scompiler\swarnings. +D 2015-09-29T12:32:56.672 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -399,7 +399,7 @@ F src/threads.c bbfb74450643cb5372a43ad4f6cffd7e9dfcecb0 F src/tokenize.c 83c6ed569423a3af83a83973b444cf7123be33a6 F src/treeview.c 154f0acc622fa3514de8777dcedf4c8a8802b4ce F src/trigger.c 322f23aad694e8f31d384dcfa386d52a48d3c52f -F src/update.c 4fb82a2440bd8d66f266ada1ef31a2fcde48bd4f +F src/update.c e0169d20524cf3663c9c6d952e61baf3c03ae797 F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c F src/util.c fc612367108b74573c5fd13a85d0a23027f438bd F src/vacuum.c 2ddd5cad2a7b9cef7f9e431b8c7771634c6b1701 @@ -1389,7 +1389,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P f61203bc0fb0b62e12d6270e8d9063e445a5a252 c5566bb39c8d9b58f77380b81a873429575c7d5c -R bc0d8f7ab7b6ff885dd78977e4d43e2a -U dan -Z 5823814221d6aa9768fead2d22b2e0e9 +P b519c0d67a8fc39d65c17eccc9300a6187bd5661 +R 3b0dc7b7710e7cf4f943bdd9f5967b17 +U drh +Z 7521a63b646e7d2736834b9d13be676e diff --git a/manifest.uuid b/manifest.uuid index 8c0cdf89ec..eeb5e662b8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -b519c0d67a8fc39d65c17eccc9300a6187bd5661 \ No newline at end of file +d1a0783854d2e9272320d9ddfa58362532f58d1a \ No newline at end of file diff --git a/src/update.c b/src/update.c index ebf0d6c8ea..c90320f0b2 100644 --- a/src/update.c +++ b/src/update.c @@ -134,9 +134,9 @@ void sqlite3Update( /* Register Allocations */ int regRowCount = 0; /* A count of rows changed */ - int regOldRowid; /* The old rowid */ - int regNewRowid; /* The new rowid */ - int regNew; /* Content of the NEW.* table in triggers */ + int regOldRowid = 0; /* The old rowid */ + int regNewRowid = 0; /* The new rowid */ + int regNew = 0; /* Content of the NEW.* table in triggers */ int regOld = 0; /* Content of OLD.* table in triggers */ int regRowSet = 0; /* Rowset of rows to be updated */ int regKey = 0; /* composite PRIMARY KEY value */ @@ -507,7 +507,6 @@ void sqlite3Update( newmask = sqlite3TriggerColmask( pParse, pTrigger, pChanges, 1, TRIGGER_BEFORE, pTab, onError ); - /*sqlite3VdbeAddOp3(v, OP_Null, 0, regNew, regNew+pTab->nCol-1);*/ for(i=0; inCol; i++){ if( i==pTab->iPKey ){ sqlite3VdbeAddOp2(v, OP_Null, 0, regNew+i); @@ -727,7 +726,6 @@ static void updateVirtualTable( int aDummy[2]; /* Unused arg for sqlite3WhereOkOnePass() */ int bOnePass; /* True to use onepass strategy */ int addr; /* Address of OP_OpenEphemeral */ - NameContext sNC; /* Allocate nArg registers to martial the arguments to VUpdate. Then ** create and open the ephemeral table in which the records created from From c149f18f4da6228c78513d164623d8accf4088a2 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 29 Sep 2015 13:25:15 +0000 Subject: [PATCH 22/98] Create the sqlite3IsToplevel(Parse*) interface to check to see if a top-level VDBE is being coded (versus a trigger) and use that interface. FossilOrigin-Name: 59662cd2b65255a30e1a420331c07c51b644621a --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/delete.c | 2 +- src/insert.c | 2 +- src/sqliteInt.h | 2 ++ src/update.c | 2 +- 6 files changed, 15 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index ded8386abb..353278a1a2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\scompiler\swarnings. -D 2015-09-29T12:32:56.672 +C Create\sthe\ssqlite3IsToplevel(Parse*)\sinterface\sto\scheck\sto\ssee\sif\sa\stop-level\nVDBE\sis\sbeing\scoded\s(versus\sa\strigger)\sand\suse\sthat\sinterface. +D 2015-09-29T13:25:15.973 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -291,7 +291,7 @@ F src/complete.c addcd8160b081131005d5bc2d34adf20c1c5c92f F src/ctime.c 5a0b735dc95604766f5dac73973658eef782ee8b F src/date.c fb1c99172017dcc8e237339132c91a21a0788584 F src/dbstat.c e637e7a7ff40ef32132a418c6fdf1cfb63aa27c7 -F src/delete.c 174b140317915e0e8c6e2eff28158eecf95c53d8 +F src/delete.c 46bb5e217f83af68574ccb613421485578c41ba8 F src/expr.c 3a76afcdac925294c39903b7002ddb9e5fd29863 F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb F src/fkey.c 83e1baba999bed3144ea5a2143fc922edf51135f @@ -300,7 +300,7 @@ F src/global.c 508e4087f7b41d688e4762dcf4d4fe28cfbc87f9 F src/hash.c 4263fbc955f26c2e8cdc0cf214bc42435aa4e4f5 F src/hash.h c8f3c31722cf3277d03713909761e152a5b81094 F src/hwtime.h d32741c8f4df852c7d959236615444e2b1063b08 -F src/insert.c 9748a37e058256eb2ead69f028ab85ebf203ad15 +F src/insert.c 81d6bf397c05b4e8ddc4af2ff6637c113ee7e37a F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d F src/legacy.c ba1863ea58c4c840335a84ec276fc2b25e22bc4e F src/lempar.c d344a95d60c24e2f490ee59db9784b1b17439012 @@ -345,7 +345,7 @@ F src/shell.c a11b20da4c6630e0e8f83c47ce36f717dd0422f0 F src/sqlite.h.in 4b76d74d69af48c534c58fb723137dc6944bdedc F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad F src/sqlite3ext.h 64350bf36833a56ad675e27392a913f417c5c308 -F src/sqliteInt.h 5afc6e50402be1e0a870f28e1cd8b32eb9db590f +F src/sqliteInt.h b6516bb2727876348b4e05aadd12237797626270 F src/sqliteLimit.h 216557999cb45f2e3578ed53ebefe228d779cb46 F src/status.c f266ad8a2892d659b74f0f50cb6a88b6e7c12179 F src/table.c 51b46b2a62d1b3a959633d593b89bab5e2c9155e @@ -399,7 +399,7 @@ F src/threads.c bbfb74450643cb5372a43ad4f6cffd7e9dfcecb0 F src/tokenize.c 83c6ed569423a3af83a83973b444cf7123be33a6 F src/treeview.c 154f0acc622fa3514de8777dcedf4c8a8802b4ce F src/trigger.c 322f23aad694e8f31d384dcfa386d52a48d3c52f -F src/update.c e0169d20524cf3663c9c6d952e61baf3c03ae797 +F src/update.c d8f0afe1a1c66b97cbd87e5236f4e71d35ab4840 F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c F src/util.c fc612367108b74573c5fd13a85d0a23027f438bd F src/vacuum.c 2ddd5cad2a7b9cef7f9e431b8c7771634c6b1701 @@ -1389,7 +1389,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P b519c0d67a8fc39d65c17eccc9300a6187bd5661 -R 3b0dc7b7710e7cf4f943bdd9f5967b17 +P d1a0783854d2e9272320d9ddfa58362532f58d1a +R a4e26d59514db031d207946929f0dada U drh -Z 7521a63b646e7d2736834b9d13be676e +Z ab43f3a6d7f071ac781590ae89cc31de diff --git a/manifest.uuid b/manifest.uuid index eeb5e662b8..906f2b5996 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d1a0783854d2e9272320d9ddfa58362532f58d1a \ No newline at end of file +59662cd2b65255a30e1a420331c07c51b644621a \ No newline at end of file diff --git a/src/delete.c b/src/delete.c index ed843c1a75..6a512017e7 100644 --- a/src/delete.c +++ b/src/delete.c @@ -518,7 +518,7 @@ void sqlite3DeleteFrom( sqlite3VdbeChangeP5(v, OE_Abort); assert( eOnePass==ONEPASS_OFF || eOnePass==ONEPASS_SINGLE ); sqlite3MayAbort(pParse); - if( eOnePass==ONEPASS_SINGLE && pParse==sqlite3ParseToplevel(pParse) ){ + if( eOnePass==ONEPASS_SINGLE && sqlite3IsToplevel(pParse) ){ pParse->isMultiWrite = 0; } }else diff --git a/src/insert.c b/src/insert.c index 53b429c1f4..3ade95e4ec 100644 --- a/src/insert.c +++ b/src/insert.c @@ -260,7 +260,7 @@ void sqlite3AutoincrementBegin(Parse *pParse){ /* This routine is never called during trigger-generation. It is ** only called from the top-level */ assert( pParse->pTriggerTab==0 ); - assert( pParse==sqlite3ParseToplevel(pParse) ); + assert( sqlite3IsToplevel(pParse) ); assert( v ); /* We failed long ago if this is not so */ for(p = pParse->pAinc; p; p = p->pNext){ diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 747f19b39a..b32cc21bbb 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -3504,6 +3504,7 @@ void sqlite3MaterializeView(Parse*, Table*, Expr*, int); void sqlite3UnlinkAndDeleteTrigger(sqlite3*,int,const char*); u32 sqlite3TriggerColmask(Parse*,Trigger*,ExprList*,int,int,Table*,int); # define sqlite3ParseToplevel(p) ((p)->pToplevel ? (p)->pToplevel : (p)) +# define sqlite3IsToplevel(p) ((p)->pToplevel==0) #else # define sqlite3TriggersExist(B,C,D,E,F) 0 # define sqlite3DeleteTrigger(A,B) @@ -3513,6 +3514,7 @@ void sqlite3MaterializeView(Parse*, Table*, Expr*, int); # define sqlite3CodeRowTriggerDirect(A,B,C,D,E,F) # define sqlite3TriggerList(X, Y) 0 # define sqlite3ParseToplevel(p) p +# define sqlite3IsToplevel(p) 1 # define sqlite3TriggerColmask(A,B,C,D,E,F,G) 0 #endif diff --git a/src/update.c b/src/update.c index c90320f0b2..ba5d0380af 100644 --- a/src/update.c +++ b/src/update.c @@ -764,7 +764,7 @@ static void updateVirtualTable( ** above. Also, if this is a top-level parse (not a trigger), clear the ** multi-write flag so that the VM does not open a statement journal */ sqlite3VdbeChangeToNoop(v, addr); - if( sqlite3ParseToplevel(pParse)==pParse ){ + if( sqlite3IsToplevel(pParse) ){ pParse->isMultiWrite = 0; } }else{ From e2b7d7a0a1dd21a3fc2d9510532dfd1fb8b07382 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 29 Sep 2015 15:50:04 +0000 Subject: [PATCH 23/98] Remove dead code, replacing with assert() statements that make sure the code really was dead. FossilOrigin-Name: 0e317dda5dfd35b742afd70dacb5bfb39aa3fc4a --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/select.c | 38 +++++++++++++++----------------------- 3 files changed, 22 insertions(+), 30 deletions(-) diff --git a/manifest b/manifest index 353278a1a2..fc874db8fe 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Create\sthe\ssqlite3IsToplevel(Parse*)\sinterface\sto\scheck\sto\ssee\sif\sa\stop-level\nVDBE\sis\sbeing\scoded\s(versus\sa\strigger)\sand\suse\sthat\sinterface. -D 2015-09-29T13:25:15.973 +C Remove\sdead\scode,\sreplacing\swith\sassert()\sstatements\sthat\smake\ssure\sthe\ncode\sreally\swas\sdead. +D 2015-09-29T15:50:04.571 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -340,7 +340,7 @@ F src/printf.c 0c4bcdd1c2e2521024f0a69cb5eb334f86b3652a F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 F src/resolve.c 1954a0f01bf65d78d7d559aea3d5c67f33376d91 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e -F src/select.c 33230303f5f32430ee971a6fcc6a370e4a93ae1a +F src/select.c e49f4af9748c9e0cc1bf864b4190aa94841c8409 F src/shell.c a11b20da4c6630e0e8f83c47ce36f717dd0422f0 F src/sqlite.h.in 4b76d74d69af48c534c58fb723137dc6944bdedc F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad @@ -1389,7 +1389,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P d1a0783854d2e9272320d9ddfa58362532f58d1a -R a4e26d59514db031d207946929f0dada +P 59662cd2b65255a30e1a420331c07c51b644621a +R cec1f3888d085a601a5cfb22d1afd716 U drh -Z ab43f3a6d7f071ac781590ae89cc31de +Z 0ae71f6c4f92a526967039eb67c1881e diff --git a/manifest.uuid b/manifest.uuid index 906f2b5996..e040f5ddfc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -59662cd2b65255a30e1a420331c07c51b644621a \ No newline at end of file +0e317dda5dfd35b742afd70dacb5bfb39aa3fc4a \ No newline at end of file diff --git a/src/select.c b/src/select.c index f410a3b329..8430a00f37 100644 --- a/src/select.c +++ b/src/select.c @@ -4221,17 +4221,9 @@ static int selectExpander(Walker *pWalker, Select *p){ */ for(i=0, pFrom=pTabList->a; inSrc; i++, pFrom++){ Table *pTab; - assert( pFrom->fg.isRecursive==0 || pFrom->pTab ); + assert( pFrom->fg.isRecursive==0 || pFrom->pTab!=0 ); if( pFrom->fg.isRecursive ) continue; - if( pFrom->pTab!=0 ){ - /* This statement has already been prepared. There is no need - ** to go further. */ - assert( i==0 ); -#ifndef SQLITE_OMIT_CTE - selectPopWith(pWalker, p); -#endif - return WRC_Prune; - } + assert( pFrom->pTab==0 ); #ifndef SQLITE_OMIT_CTE if( withExpand(pWalker, pFrom) ) return WRC_Abort; if( pFrom->pTab ) {} else @@ -4523,19 +4515,19 @@ static void selectAddSubqueryTypeInfo(Walker *pWalker, Select *p){ struct SrcList_item *pFrom; assert( p->selFlags & SF_Resolved ); - if( (p->selFlags & SF_HasTypeInfo)==0 ){ - p->selFlags |= SF_HasTypeInfo; - pParse = pWalker->pParse; - pTabList = p->pSrc; - for(i=0, pFrom=pTabList->a; inSrc; i++, pFrom++){ - Table *pTab = pFrom->pTab; - if( ALWAYS(pTab!=0) && (pTab->tabFlags & TF_Ephemeral)!=0 ){ - /* A sub-query in the FROM clause of a SELECT */ - Select *pSel = pFrom->pSelect; - if( pSel ){ - while( pSel->pPrior ) pSel = pSel->pPrior; - selectAddColumnTypeAndCollation(pParse, pTab, pSel); - } + assert( (p->selFlags & SF_HasTypeInfo)==0 ); + p->selFlags |= SF_HasTypeInfo; + pParse = pWalker->pParse; + pTabList = p->pSrc; + for(i=0, pFrom=pTabList->a; inSrc; i++, pFrom++){ + Table *pTab = pFrom->pTab; + assert( pTab!=0 ); + if( (pTab->tabFlags & TF_Ephemeral)!=0 ){ + /* A sub-query in the FROM clause of a SELECT */ + Select *pSel = pFrom->pSelect; + if( pSel ){ + while( pSel->pPrior ) pSel = pSel->pPrior; + selectAddColumnTypeAndCollation(pParse, pTab, pSel); } } } From 65c4f591bee40949a936443ce7c21ae0cc04cf1b Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 29 Sep 2015 16:41:23 +0000 Subject: [PATCH 24/98] Ensure that the xSavepoint() virtual table method is correctly invoked if there are already open savepoints (or statement transactions) the first time a virtual table is written within a transaction. FossilOrigin-Name: 77948b5eceab92a77c39d0864ac15ad453a76fd7 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vtab.c | 2 ++ test/fts3conf.test | 34 ++++++++++++++++++++++++++++++++++ 4 files changed, 44 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index ae2961c2dc..8f94f97b0e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\soff-by-one\serror\sin\stest\sfunction\sfts5_decode(). -D 2015-09-29T12:19:51.430 +C Ensure\sthat\sthe\sxSavepoint()\svirtual\stable\smethod\sis\scorrectly\sinvoked\sif\sthere\sare\salready\sopen\ssavepoints\s(or\sstatement\stransactions)\sthe\sfirst\stime\sa\svirtual\stable\sis\swritten\swithin\sa\stransaction. +D 2015-09-29T16:41:23.689 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -412,7 +412,7 @@ F src/vdbeblob.c 1d7b97115e7bbac4c318db416d2ca83fc779544a F src/vdbemem.c 19b3036aa4d676e7103b0fb5efd6327da455f915 F src/vdbesort.c f5009e7a35e3065635d8918b9a31f498a499976b F src/vdbetrace.c 8befe829faff6d9e6f6e4dee5a7d3f85cc85f1a0 -F src/vtab.c 2ecfe020c10e0a0c7b078203fdba2fae844744bc +F src/vtab.c 9a6d8818c8a2477ce547f064701b5e955b25d894 F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb F src/wal.c 18b0ed49830cf04fe2d68224b41838a73ac6cd24 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 @@ -690,7 +690,7 @@ F test/fts3aux2.test 7ae2b2c13aefdf4169279a27a5f51780ce57f6ba F test/fts3b.test e93bbb653e52afde110ad53bbd793f14fe7a8984 F test/fts3c.test fc723a9cf10b397fdfc2b32e73c53c8b1ec02958 F test/fts3comp1.test a0f5b16a2df44dd0b15751787130af2183167c0c -F test/fts3conf.test ee8500c86dd58ec075e8831a1e216a79989436de +F test/fts3conf.test 6c7faa66bfb0e90c2c073c029c08b58ea5023922 F test/fts3corrupt.test 2710b77983cc7789295ddbffea52c1d3b7506dbb F test/fts3corrupt2.test 6d96efae2f8a6af3eeaf283aba437e6d0e5447ba F test/fts3cov.test e0fb00d8b715ddae4a94c305992dfc3ef70353d7 @@ -1388,7 +1388,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P c5566bb39c8d9b58f77380b81a873429575c7d5c -R 8c1c5df148af89b61b9ed44613e1cccf +P 3a9f076250d9559d8ea94ba44095ba3ddbc5542d +R 756fa6b717967f5524da70e2a3635809 U dan -Z c6128292281c17956918fd20bfe641c1 +Z 7ea154fd75a363e5d81a988ffd47237f diff --git a/manifest.uuid b/manifest.uuid index 7b46927912..975366ad0c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3a9f076250d9559d8ea94ba44095ba3ddbc5542d \ No newline at end of file +77948b5eceab92a77c39d0864ac15ad453a76fd7 \ No newline at end of file diff --git a/src/vtab.c b/src/vtab.c index 041805ca49..cc293e8064 100644 --- a/src/vtab.c +++ b/src/vtab.c @@ -937,7 +937,9 @@ int sqlite3VtabBegin(sqlite3 *db, VTable *pVTab){ if( rc==SQLITE_OK ){ rc = pModule->xBegin(pVTab->pVtab); if( rc==SQLITE_OK ){ + int iSvpt = db->nStatement + db->nSavepoint; addToVTrans(db, pVTab); + if( iSvpt ) rc = sqlite3VtabSavepoint(db, SAVEPOINT_BEGIN, iSvpt-1); } } } diff --git a/test/fts3conf.test b/test/fts3conf.test index e91efbefbe..25c0a48b61 100644 --- a/test/fts3conf.test +++ b/test/fts3conf.test @@ -178,4 +178,38 @@ do_execsql_test 3.8 { SELECT quote(matchinfo(t3, 'na')) FROM t3 WHERE t3 MATCH 'one' } {X'0200000002000000'} +#------------------------------------------------------------------------- +# Test that the xSavepoint is invoked correctly if the first write +# operation within a transaction is to a virtual table. +# +do_catchsql_test 4.1.1 { + CREATE VIRTUAL TABLE t0 USING fts4; + BEGIN; + INSERT INTO t0(rowid, content) SELECT + 1, 'abc' UNION ALL SELECT + 2, 'def' UNION ALL SELECT + 1, 'ghi'; +} {1 {constraint failed}} +do_execsql_test 4.1.2 { + COMMIT; +} +do_execsql_test 4.1.3 { + SELECT * FROM t0 WHERE t0 MATCH 'abc'; + INSERT INTO t0(t0) VALUES('integrity-check'); +} {} + +do_execsql_test 4.2.1 { + CREATE VIRTUAL TABLE t01 USING fts4; + BEGIN; + SAVEPOINT abc; + INSERT INTO t01 VALUES('a b c'); + ROLLBACK TO abc; + COMMIT; +} +do_execsql_test 4.2.2 { + SELECT * FROM t01 WHERE t01 MATCH 'b'; + INSERT INTO t01(t01) VALUES('integrity-check'); +} {} + finish_test + From 4b92f98ccc298dfcd00c323fa912a22876a4e245 Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 29 Sep 2015 17:20:14 +0000 Subject: [PATCH 25/98] Use symbolic names XN_ROWID and XN_EXPR in place of the (-1) and (-2) magic numbers in Index.aiColumn[]. Add asserts to help verify that Index.aiColumn[] is always used correctly. Fix one place in FK processing where Index.aiColumn[] was not being used correctly. FossilOrigin-Name: 7d272aa62cd4cbbf4b5d04e3b918de27671e8301 --- manifest | 34 +++++++++++++++++----------------- manifest.uuid | 2 +- src/build.c | 8 ++++---- src/delete.c | 4 ++-- src/expr.c | 12 ++++++------ src/fkey.c | 11 ++++++++++- src/insert.c | 12 +++++++----- src/pragma.c | 2 +- src/sqliteInt.h | 6 ++++++ src/update.c | 2 +- src/vdbeblob.c | 2 +- src/where.c | 20 ++++++++++++-------- src/wherecode.c | 6 +++--- 13 files changed, 71 insertions(+), 50 deletions(-) diff --git a/manifest b/manifest index 35e142bdf3..cbc2fc7692 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\ssqlite3_index_info.idxFlags\sfield,\sallowing\sxBestIndex()\simplementations\sto\sspecify\sto\sSQLite\sthat\sa\sstrategy\smay\svisit\sat\smost\sone\srow.\sAdd\ssupport\sfor\sthis\sto\sfts3/4.\sOmit\sthe\sstatement\sjournal\sfrom\svirtual\stable\sUPDATE\sand\sDELETE\soperations\sthat\sare\sguaranteed\snot\sto\saffect\smore\sthan\sone\srow. -D 2015-09-29T16:47:53.132 +C Use\ssymbolic\snames\sXN_ROWID\sand\sXN_EXPR\sin\splace\sof\sthe\s(-1)\sand\s(-2)\nmagic\snumbers\sin\sIndex.aiColumn[].\s\sAdd\sasserts\sto\shelp\sverify\sthat\nIndex.aiColumn[]\sis\salways\sused\scorrectly.\s\sFix\sone\splace\sin\sFK\sprocessing\nwhere\sIndex.aiColumn[]\swas\snot\sbeing\sused\scorrectly. +D 2015-09-29T17:20:14.958 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -285,22 +285,22 @@ F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 F src/btree.c 164583151135a3764672c2c25aa8e4fa06bdb12b F src/btree.h 40189aefdc2b830d25c8b58fd7d56538481bfdd7 F src/btreeInt.h 8177c9ab90d772d6d2c6c517e05bed774b7c92c0 -F src/build.c 361f58b73aad7804f5706bf62d210bd9cd608041 +F src/build.c 0549b56722f15c146ca21f82a33838365c2031f0 F src/callback.c 7b44ce59674338ad48b0e84e7b72f935ea4f68b0 F src/complete.c addcd8160b081131005d5bc2d34adf20c1c5c92f F src/ctime.c 5a0b735dc95604766f5dac73973658eef782ee8b F src/date.c fb1c99172017dcc8e237339132c91a21a0788584 F src/dbstat.c e637e7a7ff40ef32132a418c6fdf1cfb63aa27c7 -F src/delete.c 46bb5e217f83af68574ccb613421485578c41ba8 -F src/expr.c 3a76afcdac925294c39903b7002ddb9e5fd29863 +F src/delete.c 35c939eb8bacc9dd8a6715964e5f69feb8c20e44 +F src/expr.c 36381822e617cb3586d4be1af2cbc3dd5f2b84eb F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb -F src/fkey.c 83e1baba999bed3144ea5a2143fc922edf51135f +F src/fkey.c 31900763094a3736a5fc887469202eb579fef2d0 F src/func.c ecdd69ec6a1e406f04cc73324be2ebbf6354197f F src/global.c 508e4087f7b41d688e4762dcf4d4fe28cfbc87f9 F src/hash.c 4263fbc955f26c2e8cdc0cf214bc42435aa4e4f5 F src/hash.h c8f3c31722cf3277d03713909761e152a5b81094 F src/hwtime.h d32741c8f4df852c7d959236615444e2b1063b08 -F src/insert.c 81d6bf397c05b4e8ddc4af2ff6637c113ee7e37a +F src/insert.c a9b7f200081fa1b482a4ccac05165e10371ae9e0 F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d F src/legacy.c ba1863ea58c4c840335a84ec276fc2b25e22bc4e F src/lempar.c d344a95d60c24e2f490ee59db9784b1b17439012 @@ -333,7 +333,7 @@ F src/parse.y f599aa5e871a493330d567ced93de696f61f48f7 F src/pcache.c 24be750c79272e0ca7b6e007bc94999700f3e5ef F src/pcache.h 9968603796240cdf83da7e7bef76edf90619cea9 F src/pcache1.c e822007159d53a7ea7aa040d6e28964ddb6de083 -F src/pragma.c 577f70c3899ee6fc2e5a4c37158c69c1c23f71e7 +F src/pragma.c 234814978bcd35bce6e2874dfb2f5b5e28e7fb38 F src/pragma.h 631a91c8b0e6ca8f051a1d8a4a0da4150e04620a F src/prepare.c 82e5db1013846a819f198336fed72c44c974e7b1 F src/printf.c 0c4bcdd1c2e2521024f0a69cb5eb334f86b3652a @@ -345,7 +345,7 @@ F src/shell.c a11b20da4c6630e0e8f83c47ce36f717dd0422f0 F src/sqlite.h.in 4b76d74d69af48c534c58fb723137dc6944bdedc F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad F src/sqlite3ext.h 64350bf36833a56ad675e27392a913f417c5c308 -F src/sqliteInt.h b6516bb2727876348b4e05aadd12237797626270 +F src/sqliteInt.h 681f38fc0decba6edcf3bad230e76fa5bf55a7bf F src/sqliteLimit.h 216557999cb45f2e3578ed53ebefe228d779cb46 F src/status.c f266ad8a2892d659b74f0f50cb6a88b6e7c12179 F src/table.c 51b46b2a62d1b3a959633d593b89bab5e2c9155e @@ -399,7 +399,7 @@ F src/threads.c bbfb74450643cb5372a43ad4f6cffd7e9dfcecb0 F src/tokenize.c 83c6ed569423a3af83a83973b444cf7123be33a6 F src/treeview.c 154f0acc622fa3514de8777dcedf4c8a8802b4ce F src/trigger.c 322f23aad694e8f31d384dcfa386d52a48d3c52f -F src/update.c d8f0afe1a1c66b97cbd87e5236f4e71d35ab4840 +F src/update.c a134027f59c7eb6e63ed18e2d5dd8ef0ce7f8ff8 F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c F src/util.c fc612367108b74573c5fd13a85d0a23027f438bd F src/vacuum.c 2ddd5cad2a7b9cef7f9e431b8c7771634c6b1701 @@ -408,7 +408,7 @@ F src/vdbe.h 4bc88bd0e06f8046ee6ab7487c0015e85ad949ad F src/vdbeInt.h 8b867eac234e28627ffcace3cd4b4b79bbec664b F src/vdbeapi.c 020681b943e77766b32ae1cddf86d7831b7374ca F src/vdbeaux.c fd00b489ab3f44f2dca1e4344faf289b7bfcf649 -F src/vdbeblob.c 1d7b97115e7bbac4c318db416d2ca83fc779544a +F src/vdbeblob.c 565fabd302f5fca3bdf3d56cac330483616a39b6 F src/vdbemem.c 19b3036aa4d676e7103b0fb5efd6327da455f915 F src/vdbesort.c f5009e7a35e3065635d8918b9a31f498a499976b F src/vdbetrace.c 8befe829faff6d9e6f6e4dee5a7d3f85cc85f1a0 @@ -417,9 +417,9 @@ F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb F src/wal.c 18b0ed49830cf04fe2d68224b41838a73ac6cd24 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/walker.c 2e14d17f592d176b6dc879c33fbdec4fbccaa2ba -F src/where.c b7f928b6b8ce091f385ba5ac2394928608431550 +F src/where.c 4c4646675e794ac71e701289edefd7cd81bac844 F src/whereInt.h 7892bb54cf9ca0ae5c7e6094491b94c9286dc647 -F src/wherecode.c a87238178f8c300fd27afec54326ea8d0a18baa2 +F src/wherecode.c a32bf1f304f6328e3eefcb82e70bd86836cff343 F src/whereexpr.c 2473e4350e30f9b55d1c6a8f66ca23c689f23f1d F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd @@ -1389,7 +1389,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 77948b5eceab92a77c39d0864ac15ad453a76fd7 0e317dda5dfd35b742afd70dacb5bfb39aa3fc4a -R d39a034a4821b5c42018f04d74a8aeb2 -U dan -Z 28a594c5d9670d5cb6f4428303834152 +P a1d08fd3d0419da8c22355d48c6d83eed6fd7e07 +R 52625b1830d3c09e89f8505fdc133a11 +U drh +Z 6b238da064de6e3b5f5d0b4365b7caf0 diff --git a/manifest.uuid b/manifest.uuid index 2b74ea5ad5..5810842471 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a1d08fd3d0419da8c22355d48c6d83eed6fd7e07 \ No newline at end of file +7d272aa62cd4cbbf4b5d04e3b918de27671e8301 \ No newline at end of file diff --git a/src/build.c b/src/build.c index c0bd81b1a0..ea89e501dc 100644 --- a/src/build.c +++ b/src/build.c @@ -3136,7 +3136,7 @@ Index *sqlite3CreateIndex( /* Analyze the list of expressions that form the terms of the index and ** report any errors. In the common case where the expression is exactly ** a table column, store that column in aiColumn[]. For general expressions, - ** populate pIndex->aColExpr and store -2 in aiColumn[]. + ** populate pIndex->aColExpr and store XN_EXPR (-2) in aiColumn[]. ** ** TODO: Issue a warning if two or more columns of the index are identical. ** TODO: Issue a warning if the table primary key is used as part of the @@ -3165,8 +3165,8 @@ Index *sqlite3CreateIndex( pListItem = &pCopy->a[i]; } } - j = -2; - pIndex->aiColumn[i] = -2; + j = XN_EXPR; + pIndex->aiColumn[i] = XN_EXPR; pIndex->uniqNotNull = 0; }else{ j = pCExpr->iColumn; @@ -3219,7 +3219,7 @@ Index *sqlite3CreateIndex( } assert( i==pIndex->nColumn ); }else{ - pIndex->aiColumn[i] = -1; + pIndex->aiColumn[i] = XN_ROWID; pIndex->azColl[i] = "BINARY"; } sqlite3DefaultRowEst(pIndex); diff --git a/src/delete.c b/src/delete.c index 6a512017e7..faef3a814e 100644 --- a/src/delete.c +++ b/src/delete.c @@ -422,7 +422,7 @@ void sqlite3DeleteFrom( /* Extract the rowid or primary key for the current row */ if( pPk ){ for(i=0; iaiColumn[i]>=(-1) ); + assert( pPk->aiColumn[i]>=0 ); sqlite3ExprCodeGetColumnOfTable(v, pTab, iTabCur, pPk->aiColumn[i], iPk+i); } @@ -858,7 +858,7 @@ int sqlite3GenerateIndexKey( for(j=0; jaiColumn[j]==pIdx->aiColumn[j] - && pPrior->aiColumn[j]>=(-1) + && pPrior->aiColumn[j]!=XN_EXPR ){ /* This column was already computed by the previous index */ continue; diff --git a/src/expr.c b/src/expr.c index 3141cd9dbd..b52e814f3c 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2443,15 +2443,15 @@ void sqlite3ExprCodeLoadIndexColumn( int regOut /* Store the index column value in this register */ ){ i16 iTabCol = pIdx->aiColumn[iIdxCol]; - if( iTabCol>=(-1) ){ + if( iTabCol==XN_EXPR ){ + assert( pIdx->aColExpr ); + assert( pIdx->aColExpr->nExpr>iIdxCol ); + pParse->iSelfTab = iTabCur; + sqlite3ExprCode(pParse, pIdx->aColExpr->a[iIdxCol].pExpr, regOut); + }else{ sqlite3ExprCodeGetColumnOfTable(pParse->pVdbe, pIdx->pTable, iTabCur, iTabCol, regOut); - return; } - assert( pIdx->aColExpr ); - assert( pIdx->aColExpr->nExpr>iIdxCol ); - pParse->iSelfTab = iTabCur; - sqlite3ExprCode(pParse, pIdx->aColExpr->a[iIdxCol].pExpr, regOut); } /* diff --git a/src/fkey.c b/src/fkey.c index a087889f4c..b55e2a9813 100644 --- a/src/fkey.c +++ b/src/fkey.c @@ -252,6 +252,8 @@ int sqlite3FkLocateIndex( char *zDfltColl; /* Def. collation for column */ char *zIdxCol; /* Name of indexed column */ + if( iCol<0 ) break; /* No foreign keys against expression indexes */ + /* If the index uses a collation sequence that is different from ** the default collation sequence for the column, this index is ** unusable. Bail out early in this case. */ @@ -404,6 +406,7 @@ static void fkLookupParent( for(i=0; iaiColumn[i]+1+regData; + assert( pIdx->aiColumn[i]>=0 ); assert( aiCol[i]!=pTab->iPKey ); if( pIdx->aiColumn[i]==pTab->iPKey ){ /* The parent key is a composite key that includes the IPK column */ @@ -612,6 +615,7 @@ static void fkScanChildren( assert( pIdx!=0 ); for(i=0; inKeyCol; i++){ i16 iCol = pIdx->aiColumn[i]; + assert( iCol>=0 ); pLeft = exprTableRegister(pParse, pTab, regData, iCol); pRight = exprTableColumn(db, pTab, pSrc->a[0].iCursor, iCol); pEq = sqlite3PExpr(pParse, TK_EQ, pLeft, pRight, 0); @@ -931,6 +935,7 @@ void sqlite3FkCheck( if( aiCol[i]==pTab->iPKey ){ aiCol[i] = -1; } + assert( pIdx==0 || pIdx->aiColumn[i]>=0 ); #ifndef SQLITE_OMIT_AUTHORIZATION /* Request permission to read the parent key columns. If the ** authorization callback returns SQLITE_IGNORE, behave as if any @@ -1062,7 +1067,10 @@ u32 sqlite3FkOldmask( Index *pIdx = 0; sqlite3FkLocateIndex(pParse, pTab, p, &pIdx, 0); if( pIdx ){ - for(i=0; inKeyCol; i++) mask |= COLUMN_MASK(pIdx->aiColumn[i]); + for(i=0; inKeyCol; i++){ + assert( pIdx->aiColumn[i]>=0 ); + mask |= COLUMN_MASK(pIdx->aiColumn[i]); + } } } } @@ -1185,6 +1193,7 @@ static Trigger *fkActionTrigger( iFromCol = aiCol ? aiCol[i] : pFKey->aCol[0].iFrom; assert( iFromCol>=0 ); assert( pIdx!=0 || (pTab->iPKey>=0 && pTab->iPKeynCol) ); + assert( pIdx==0 || pIdx->aiColumn[i]>=0 ); tToCol.z = pTab->aCol[pIdx ? pIdx->aiColumn[i] : pTab->iPKey].zName; tFromCol.z = pFKey->pFrom->aCol[iFromCol].zName; diff --git a/src/insert.c b/src/insert.c index 3ade95e4ec..785e57d02c 100644 --- a/src/insert.c +++ b/src/insert.c @@ -90,11 +90,11 @@ const char *sqlite3IndexAffinityStr(sqlite3 *db, Index *pIdx){ i16 x = pIdx->aiColumn[n]; if( x>=0 ){ pIdx->zColAff[n] = pTab->aCol[x].affinity; - }else if( x==(-1) ){ + }else if( x==XN_ROWID ){ pIdx->zColAff[n] = SQLITE_AFF_INTEGER; }else{ char aff; - assert( x==(-2) ); + assert( x==XN_EXPR ); assert( pIdx->aColExpr!=0 ); aff = sqlite3ExprAffinity(pIdx->aColExpr->a[n].pExpr); if( aff==0 ) aff = SQLITE_AFF_BLOB; @@ -1408,13 +1408,13 @@ void sqlite3GenerateConstraintChecks( for(i=0; inColumn; i++){ int iField = pIdx->aiColumn[i]; int x; - if( iField==(-2) ){ + if( iField==XN_EXPR ){ pParse->ckBase = regNewData+1; sqlite3ExprCode(pParse, pIdx->aColExpr->a[i].pExpr, regIdx+i); pParse->ckBase = 0; VdbeComment((v, "%s column %d", pIdx->zName, i)); }else{ - if( iField==(-1) || iField==pTab->iPKey ){ + if( iField==XN_ROWID || iField==pTab->iPKey ){ if( regRowid==regIdx+i ) continue; /* ROWID already in regIdx+i */ x = regNewData; regRowid = pIdx->pPartIdxWhere ? -1 : regIdx+i; @@ -1473,6 +1473,7 @@ void sqlite3GenerateConstraintChecks( ** store it in registers regR..regR+nPk-1 */ if( pIdx!=pPk ){ for(i=0; inKeyCol; i++){ + assert( pPk->aiColumn[i]>=0 ); x = sqlite3ColumnOfIndex(pIdx, pPk->aiColumn[i]); sqlite3VdbeAddOp3(v, OP_Column, iThisCur, x, regR+i); VdbeComment((v, "%s.%s", pTab->zName, @@ -1494,6 +1495,7 @@ void sqlite3GenerateConstraintChecks( for(i=0; inKeyCol; i++){ char *p4 = (char*)sqlite3LocateCollSeq(pParse, pPk->azColl[i]); x = pPk->aiColumn[i]; + assert( x>=0 ); if( i==(pPk->nKeyCol-1) ){ addrJump = addrUniqueOk; op = OP_Eq; @@ -1745,7 +1747,7 @@ static int xferCompatibleIndex(Index *pDest, Index *pSrc){ if( pSrc->aiColumn[i]!=pDest->aiColumn[i] ){ return 0; /* Different columns indexed */ } - if( pSrc->aiColumn[i]==(-2) ){ + if( pSrc->aiColumn[i]==XN_EXPR ){ assert( pSrc->aColExpr!=0 && pDest->aColExpr!=0 ); if( sqlite3ExprCompare(pSrc->aColExpr->a[i].pExpr, pDest->aColExpr->a[i].pExpr, -1)!=0 ){ diff --git a/src/pragma.c b/src/pragma.c index 1edc66daf8..e5e7e54a29 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1524,7 +1524,7 @@ void sqlite3Pragma( int kk; for(kk=0; kknKeyCol; kk++){ int iCol = pIdx->aiColumn[kk]; - assert( iCol!=(-1) && iColnCol ); + assert( iCol!=XN_ROWID && iColnCol ); if( iCol>=0 && pTab->aCol[iCol].notNull ) continue; sqlite3VdbeAddOp2(v, OP_IsNull, r1+kk, uniqOk); VdbeCoverage(v); diff --git a/src/sqliteInt.h b/src/sqliteInt.h index b32cc21bbb..6c9bb06f69 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1917,6 +1917,12 @@ struct Index { /* Return true if index X is a UNIQUE index */ #define IsUniqueIndex(X) ((X)->onError!=OE_None) +/* The Index.aiColumn[] values are normally positive integer. But +** there are some negative values that have special meaning: +*/ +#define XN_ROWID (-1) /* Indexed column is the rowid */ +#define XN_EXPR (-2) /* Indexed column is an expression */ + /* ** Each sample stored in the sqlite_stat3 table is represented in memory ** using a structure of this type. See documentation at the top of the diff --git a/src/update.c b/src/update.c index ba5d0380af..74f247bb28 100644 --- a/src/update.c +++ b/src/update.c @@ -384,7 +384,7 @@ void sqlite3Update( if( pWInfo==0 ) goto update_cleanup; okOnePass = sqlite3WhereOkOnePass(pWInfo, aiCurOnePass); for(i=0; iaiColumn[i]>=(-1) ); + assert( pPk->aiColumn[i]>=0 ); sqlite3ExprCodeGetColumnOfTable(v, pTab, iDataCur, pPk->aiColumn[i], iPk+i); } diff --git a/src/vdbeblob.c b/src/vdbeblob.c index 2cdc3edb00..30a329189e 100644 --- a/src/vdbeblob.c +++ b/src/vdbeblob.c @@ -248,7 +248,7 @@ int sqlite3_blob_open( int j; for(j=0; jnKeyCol; j++){ /* FIXME: Be smarter about indexes that use expressions */ - if( pIdx->aiColumn[j]==iCol || pIdx->aiColumn[j]==(-2) ){ + if( pIdx->aiColumn[j]==iCol || pIdx->aiColumn[j]==XN_EXPR ){ zFault = "indexed"; } } diff --git a/src/where.c b/src/where.c index 2be05a6752..af8e2f35fd 100644 --- a/src/where.c +++ b/src/where.c @@ -189,12 +189,12 @@ static WhereTerm *whereScanNext(WhereScan *pScan){ while( pScan->iEquiv<=pScan->nEquiv ){ iCur = pScan->aiCur[pScan->iEquiv-1]; iColumn = pScan->aiColumn[pScan->iEquiv-1]; - if( iColumn==(-2) && pScan->pIdxExpr==0 ) return 0; + if( iColumn==XN_EXPR && pScan->pIdxExpr==0 ) return 0; while( (pWC = pScan->pWC)!=0 ){ for(pTerm=pWC->a+k; knTerm; k++, pTerm++){ if( pTerm->leftCursor==iCur && pTerm->u.leftColumn==iColumn - && (iColumn!=(-2) + && (iColumn!=XN_EXPR || sqlite3ExprCompare(pTerm->pExpr->pLeft,pScan->pIdxExpr,iCur)==0) && (pScan->iEquiv<=1 || !ExprHasProperty(pTerm->pExpr, EP_FromJoin)) ){ @@ -288,7 +288,7 @@ static WhereTerm *whereScanInit( if( pIdx ){ j = iColumn; iColumn = pIdx->aiColumn[j]; - if( iColumn==(-2) ) pScan->pIdxExpr = pIdx->aColExpr->a[j].pExpr; + if( iColumn==XN_EXPR ) pScan->pIdxExpr = pIdx->aColExpr->a[j].pExpr; } if( pIdx && iColumn>=0 ){ pScan->idxaff = pIdx->pTable->aCol[iColumn].affinity; @@ -727,7 +727,7 @@ static void constructAutomaticIndex( } } assert( n==nKeyCol ); - pIdx->aiColumn[n] = -1; + pIdx->aiColumn[n] = XN_ROWID; pIdx->azColl[n] = "BINARY"; /* Create the automatic index */ @@ -2242,7 +2242,9 @@ static int whereLoopAddBtreeIndex( int iCol = pProbe->aiColumn[saved_nEq]; pNew->wsFlags |= WHERE_COLUMN_EQ; assert( saved_nEq==pNew->u.btree.nEq ); - if( iCol==(-1) || (iCol>0 && nInMul==0 && saved_nEq==pProbe->nKeyCol-1) ){ + if( iCol==XN_ROWID + || (iCol>0 && nInMul==0 && saved_nEq==pProbe->nKeyCol-1) + ){ if( iCol>=0 && pProbe->uniqNotNull==0 ){ pNew->wsFlags |= WHERE_UNQ_WANTED; }else{ @@ -2442,7 +2444,7 @@ static int indexMightHelpWithOrderBy( } }else if( (aColExpr = pIndex->aColExpr)!=0 ){ for(jj=0; jjnKeyCol; jj++){ - if( pIndex->aiColumn[jj]!=(-2) ) continue; + if( pIndex->aiColumn[jj]!=XN_EXPR ) continue; if( sqlite3ExprCompare(pExpr,aColExpr->a[jj].pExpr,iCursor)==0 ){ return 1; } @@ -3230,7 +3232,8 @@ static i8 wherePathSatisfiesOrderBy( nKeyCol = pIndex->nKeyCol; nColumn = pIndex->nColumn; assert( nColumn==nKeyCol+1 || !HasRowid(pIndex->pTable) ); - assert( pIndex->aiColumn[nColumn-1]==(-1) || !HasRowid(pIndex->pTable)); + assert( pIndex->aiColumn[nColumn-1]==XN_ROWID + || !HasRowid(pIndex->pTable)); isOrderDistinct = IsUniqueIndex(pIndex); } @@ -3262,7 +3265,7 @@ static i8 wherePathSatisfiesOrderBy( revIdx = pIndex->aSortOrder[j]; if( iColumn==pIndex->pTable->iPKey ) iColumn = -1; }else{ - iColumn = -1; + iColumn = XN_ROWID; revIdx = 0; } @@ -4562,6 +4565,7 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){ if( !HasRowid(pTab) ){ Index *pPk = sqlite3PrimaryKeyIndex(pTab); x = pPk->aiColumn[x]; + assert( x>=0 ); } x = sqlite3ColumnOfIndex(pIdx, x); if( x>=0 ){ diff --git a/src/wherecode.c b/src/wherecode.c index f9b56e7c83..a6c45f0321 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -46,8 +46,8 @@ static void explainAppendTerm( */ static const char *explainIndexColumnName(Index *pIdx, int i){ i = pIdx->aiColumn[i]; - if( i==(-2) ) return ""; - if( i==(-1) ) return "rowid"; + if( i==XN_EXPR ) return ""; + if( i==XN_ROWID ) return "rowid"; return pIdx->pTable->aCol[i].zName; } @@ -514,7 +514,7 @@ static int codeAllEqualityTerms( sqlite3VdbeJumpHere(v, j); for(j=0; jaiColumn[j]==(-2) ); + testcase( pIdx->aiColumn[j]==XN_EXPR ); VdbeComment((v, "%s", explainIndexColumnName(pIdx, j))); } } From d95bb39c52915024723995f01bcdb7c0ed15caba Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 30 Sep 2015 11:19:05 +0000 Subject: [PATCH 26/98] Improve error handling in shell command ".tables". FossilOrigin-Name: 31a91ee7d32af8580a170903eb857ed9222fdb0a --- manifest | 14 ++++++------- manifest.uuid | 2 +- src/shell.c | 55 +++++++++++++++++++++++++++++++++++++++++---------- 3 files changed, 53 insertions(+), 18 deletions(-) diff --git a/manifest b/manifest index cbc2fc7692..0014c03a25 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Use\ssymbolic\snames\sXN_ROWID\sand\sXN_EXPR\sin\splace\sof\sthe\s(-1)\sand\s(-2)\nmagic\snumbers\sin\sIndex.aiColumn[].\s\sAdd\sasserts\sto\shelp\sverify\sthat\nIndex.aiColumn[]\sis\salways\sused\scorrectly.\s\sFix\sone\splace\sin\sFK\sprocessing\nwhere\sIndex.aiColumn[]\swas\snot\sbeing\sused\scorrectly. -D 2015-09-29T17:20:14.958 +C Improve\serror\shandling\sin\sshell\scommand\s".tables". +D 2015-09-30T11:19:05.250 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -341,7 +341,7 @@ F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 F src/resolve.c 1954a0f01bf65d78d7d559aea3d5c67f33376d91 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e F src/select.c e49f4af9748c9e0cc1bf864b4190aa94841c8409 -F src/shell.c a11b20da4c6630e0e8f83c47ce36f717dd0422f0 +F src/shell.c dfd18e56fcb88dd79378774e9bc3246a9bd52243 F src/sqlite.h.in 4b76d74d69af48c534c58fb723137dc6944bdedc F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad F src/sqlite3ext.h 64350bf36833a56ad675e27392a913f417c5c308 @@ -1389,7 +1389,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P a1d08fd3d0419da8c22355d48c6d83eed6fd7e07 -R 52625b1830d3c09e89f8505fdc133a11 -U drh -Z 6b238da064de6e3b5f5d0b4365b7caf0 +P 7d272aa62cd4cbbf4b5d04e3b918de27671e8301 +R 182210397719a41b40c126f91ca11c51 +U dan +Z f61744228c664ef1bbc36bc13dfb9d49 diff --git a/manifest.uuid b/manifest.uuid index 5810842471..d393ee6596 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7d272aa62cd4cbbf4b5d04e3b918de27671e8301 \ No newline at end of file +31a91ee7d32af8580a170903eb857ed9222fdb0a \ No newline at end of file diff --git a/src/shell.c b/src/shell.c index 02938eb1e6..96d0ab65f7 100644 --- a/src/shell.c +++ b/src/shell.c @@ -2612,6 +2612,22 @@ static int shell_dbinfo_command(ShellState *p, int nArg, char **azArg){ return 0; } +/* +** Print the current sqlite3_errmsg() value to stderr and return 1. +*/ +static int shellDatabaseError(sqlite3 *db){ + const char *zErr = sqlite3_errmsg(db); + fprintf(stderr, "Error: %s\n", zErr); + return 1; +} + +/* +** Print an out-of-memory message to stderr and return 1. +*/ +static int shellNomemError(void){ + fprintf(stderr, "Error: out of memory\n"); + return 1; +} /* ** If an input line begins with "." then invoke this routine to @@ -3713,13 +3729,17 @@ static int do_meta_command(char *zLine, ShellState *p){ int ii; open_db(p, 0); rc = sqlite3_prepare_v2(p->db, "PRAGMA database_list", -1, &pStmt, 0); - if( rc ) return rc; + if( rc ) return shellDatabaseError(p->db); + + /* Create an SQL statement to query for the list of tables in the + ** main and all attached databases where the table name matches the + ** LIKE pattern bound to variable "?1". */ zSql = sqlite3_mprintf( "SELECT name FROM sqlite_master" " WHERE type IN ('table','view')" " AND name NOT LIKE 'sqlite_%%'" " AND name LIKE ?1"); - while( sqlite3_step(pStmt)==SQLITE_ROW ){ + while( zSql && sqlite3_step(pStmt)==SQLITE_ROW ){ const char *zDbName = (const char*)sqlite3_column_text(pStmt, 1); if( zDbName==0 || strcmp(zDbName,"main")==0 ) continue; if( strcmp(zDbName,"temp")==0 ){ @@ -3738,11 +3758,17 @@ static int do_meta_command(char *zLine, ShellState *p){ " AND name LIKE ?1", zSql, zDbName, zDbName); } } - sqlite3_finalize(pStmt); - zSql = sqlite3_mprintf("%z ORDER BY 1", zSql); - rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); + rc = sqlite3_finalize(pStmt); + if( zSql && rc==SQLITE_OK ){ + zSql = sqlite3_mprintf("%z ORDER BY 1", zSql); + if( zSql ) rc = sqlite3_prepare_v2(p->db, zSql, -1, &pStmt, 0); + } sqlite3_free(zSql); - if( rc ) return rc; + if( !zSql ) return shellNomemError(); + if( rc ) return shellDatabaseError(p->db); + + /* Run the SQL statement prepared by the above block. Store the results + ** as an array of nul-terminated strings in azResult[]. */ nRow = nAlloc = 0; azResult = 0; if( nArg>1 ){ @@ -3756,17 +3782,25 @@ static int do_meta_command(char *zLine, ShellState *p){ int n2 = nAlloc*2 + 10; azNew = sqlite3_realloc64(azResult, sizeof(azResult[0])*n2); if( azNew==0 ){ - fprintf(stderr, "Error: out of memory\n"); + rc = shellNomemError(); break; } nAlloc = n2; azResult = azNew; } azResult[nRow] = sqlite3_mprintf("%s", sqlite3_column_text(pStmt, 0)); - if( azResult[nRow] ) nRow++; + if( 0==azResult[nRow] ){ + rc = shellNomemError(); + break; + } + nRow++; } - sqlite3_finalize(pStmt); - if( nRow>0 ){ + if( sqlite3_finalize(pStmt)!=SQLITE_OK ){ + rc = shellDatabaseError(p->db); + } + + /* Pretty-print the contents of array azResult[] to the output */ + if( rc==0 && nRow>0 ){ int len, maxlen = 0; int i, j; int nPrintCol, nPrintRow; @@ -3785,6 +3819,7 @@ static int do_meta_command(char *zLine, ShellState *p){ fprintf(p->out, "\n"); } } + for(ii=0; ii Date: Wed, 30 Sep 2015 12:59:12 +0000 Subject: [PATCH 27/98] Clear the BTCF_ValidNKey flag when putting a cursor into REQUIRESEEK state. Fix for [1b266395]. FossilOrigin-Name: a6d5e4e8693bea3739c35fe9769ac9abfb9ed056 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 2 +- test/fkey1.test | 34 ++++++++++++++++++++++++++++++++++ 4 files changed, 43 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 0014c03a25..bc26811e33 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improve\serror\shandling\sin\sshell\scommand\s".tables". -D 2015-09-30T11:19:05.250 +C Clear\sthe\sBTCF_ValidNKey\sflag\swhen\sputting\sa\scursor\sinto\sREQUIRESEEK\sstate.\sFix\sfor\s[1b266395]. +D 2015-09-30T12:59:12.171 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -282,7 +282,7 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 F src/backup.c c3a9c4209439b806c44cf30daf466955727bf46c F src/bitvec.c d1f21d7d91690747881f03940584f4cc548c9d3d F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 -F src/btree.c 164583151135a3764672c2c25aa8e4fa06bdb12b +F src/btree.c dd877a85fc968c5f069d0cd133c6b420ec3112fa F src/btree.h 40189aefdc2b830d25c8b58fd7d56538481bfdd7 F src/btreeInt.h 8177c9ab90d772d6d2c6c517e05bed774b7c92c0 F src/build.c 0549b56722f15c146ca21f82a33838365c2031f0 @@ -621,7 +621,7 @@ F test/extraquick.test cb254400bd42bfb777ff675356aabf3287978f79 F test/fallocate.test 3e979af17dfa7e5e9dda5eba1a696c04fa9d47f7 F test/filectrl.test 7c13f96457435238da99aff7343ad6a3a4885787 F test/filefmt.test cb34663f126cbc2d358af552dcaf5c72769b0146 -F test/fkey1.test de5b287f6a480b36bd51e8debcf48168e26e4ed2 +F test/fkey1.test 13e3d48236a2b9f5c5ebd232eef9b3ab682a8a2c F test/fkey2.test f3d27ecba480a348c328965d154214719bb158a9 F test/fkey3.test 76d475c80b84ee7a5d062e56ccb6ea68882e2b49 F test/fkey4.test 86446017011273aad8f9a99c1a65019e7bd9ca9d @@ -1389,7 +1389,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 7d272aa62cd4cbbf4b5d04e3b918de27671e8301 -R 182210397719a41b40c126f91ca11c51 +P 31a91ee7d32af8580a170903eb857ed9222fdb0a +R 4a74a22a0c922f420238bb3d30a78646 U dan -Z f61744228c664ef1bbc36bc13dfb9d49 +Z 36f983bdf307cdff5171dc6e84fb5a56 diff --git a/manifest.uuid b/manifest.uuid index d393ee6596..fafa0fcdff 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -31a91ee7d32af8580a170903eb857ed9222fdb0a \ No newline at end of file +a6d5e4e8693bea3739c35fe9769ac9abfb9ed056 \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index c7d6fabba6..bf777aa969 100644 --- a/src/btree.c +++ b/src/btree.c @@ -661,7 +661,7 @@ static int saveCursorPosition(BtCursor *pCur){ pCur->eState = CURSOR_REQUIRESEEK; } - invalidateOverflowCache(pCur); + pCur->curFlags &= ~(BTCF_ValidNKey|BTCF_ValidOvfl|BTCF_AtLast); return rc; } diff --git a/test/fkey1.test b/test/fkey1.test index 0bd4939eb5..e10781ac52 100644 --- a/test/fkey1.test +++ b/test/fkey1.test @@ -151,4 +151,38 @@ do_execsql_test fkey1-4.2 { PRAGMA table_info="""1"; } {0 {"2} TEXT 0 {} 1 1 {"3} TEXT 0 {} 0} +#------------------------------------------------------------------------- +# +do_execsql_test fkey1-5.1 { + CREATE TABLE t11( + x INTEGER PRIMARY KEY, + parent REFERENCES t11 ON DELETE CASCADE + ); + INSERT INTO t11 VALUES (1, NULL), (2, 1), (3, 2); +} {} + +# The REPLACE part of this statement deletes the row (2, 1). Then the +# DELETE CASCADE caused by deleting that row removes the (3, 2) row. Which +# would have been the parent of the new row being inserted. Causing an +# FK violation. +# +do_catchsql_test fkey1-5.2 { + INSERT OR REPLACE INTO t11 VALUES (2, 3); +} {1 {FOREIGN KEY constraint failed}} + +# A similar test to the above. +do_execsql_test fkey1-5.3 { + CREATE TABLE Foo ( + Id INTEGER PRIMARY KEY, + ParentId INTEGER REFERENCES Foo(Id) ON DELETE CASCADE, C1 + ); + INSERT OR REPLACE INTO Foo(Id, ParentId, C1) VALUES (1, null, 'A'); + INSERT OR REPLACE INTO Foo(Id, ParentId, C1) VALUES (2, 1, 'A-2-1'); + INSERT OR REPLACE INTO Foo(Id, ParentId, C1) VALUES (3, 2, 'A-3-2'); + INSERT OR REPLACE INTO Foo(Id, ParentId, C1) VALUES (4, 3, 'A-4-3'); +} +do_catchsql_test fkey1-5.4 { + INSERT OR REPLACE INTO Foo(Id, ParentId, C1) VALUES (2, 3, 'A-2-3'); +} {1 {FOREIGN KEY constraint failed}} + finish_test From 9b5351d439f6a6ee07e1ea244d693eb2a96cd821 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 30 Sep 2015 14:19:08 +0000 Subject: [PATCH 28/98] Fix an assert() in btree.c that is only true for non-corrupt databases. FossilOrigin-Name: 29f7227ff127202c53fe7c3b6558b3c101b0a7bc --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/btree.c | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index bc26811e33..9f3656c5ac 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Clear\sthe\sBTCF_ValidNKey\sflag\swhen\sputting\sa\scursor\sinto\sREQUIRESEEK\sstate.\sFix\sfor\s[1b266395]. -D 2015-09-30T12:59:12.171 +C Fix\san\sassert()\sin\sbtree.c\sthat\sis\sonly\strue\sfor\snon-corrupt\sdatabases. +D 2015-09-30T14:19:08.486 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -282,7 +282,7 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 F src/backup.c c3a9c4209439b806c44cf30daf466955727bf46c F src/bitvec.c d1f21d7d91690747881f03940584f4cc548c9d3d F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 -F src/btree.c dd877a85fc968c5f069d0cd133c6b420ec3112fa +F src/btree.c a5a653087ae98dd743d12ae0920d5b64c5335960 F src/btree.h 40189aefdc2b830d25c8b58fd7d56538481bfdd7 F src/btreeInt.h 8177c9ab90d772d6d2c6c517e05bed774b7c92c0 F src/build.c 0549b56722f15c146ca21f82a33838365c2031f0 @@ -1389,7 +1389,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 31a91ee7d32af8580a170903eb857ed9222fdb0a -R 4a74a22a0c922f420238bb3d30a78646 -U dan -Z 36f983bdf307cdff5171dc6e84fb5a56 +P a6d5e4e8693bea3739c35fe9769ac9abfb9ed056 +R d123bfb9b25dcb8cf6d4214c017e0514 +U drh +Z b7257b8e8fb8545cc0082886f7c4483e diff --git a/manifest.uuid b/manifest.uuid index fafa0fcdff..d0ec470927 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a6d5e4e8693bea3739c35fe9769ac9abfb9ed056 \ No newline at end of file +29f7227ff127202c53fe7c3b6558b3c101b0a7bc \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index bf777aa969..1eae0ac5d2 100644 --- a/src/btree.c +++ b/src/btree.c @@ -7624,7 +7624,7 @@ static int balance_nonroot( ** by smaller than the child due to the database header, and so all the ** free space needs to be up front. */ - assert( nNew==1 ); + assert( nNew==1 || CORRUPT_DB ); rc = defragmentPage(apNew[0]); testcase( rc!=SQLITE_OK ); assert( apNew[0]->nFree == From 105865acf9644a66cc73a84dde72937b83dd5315 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 30 Sep 2015 14:30:19 +0000 Subject: [PATCH 29/98] Add a corrupt database to test/fuzzdata3.db to validate the previous check-in. FossilOrigin-Name: e796c0efb6cf17444b53af75046daf7d8fa82f78 --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/fuzzdata3.db | Bin 11842560 -> 11848704 bytes 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 9f3656c5ac..b92913e6d5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sassert()\sin\sbtree.c\sthat\sis\sonly\strue\sfor\snon-corrupt\sdatabases. -D 2015-09-30T14:19:08.486 +C Add\sa\scorrupt\sdatabase\sto\stest/fuzzdata3.db\sto\svalidate\sthe\sprevious\ncheck-in. +D 2015-09-30T14:30:19.646 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -753,7 +753,7 @@ F test/fuzz_malloc.test 328f70aaca63adf29b4c6f06505ed0cf57ca7c26 F test/fuzzcheck.c b8eb7ee40f6d28548a0b028e0676293522f3427f F test/fuzzdata1.db 7ee3227bad0e7ccdeb08a9e6822916777073c664 F test/fuzzdata2.db f03a420d3b822cc82e4f894ca957618fbe9c4973 -F test/fuzzdata3.db 1d6044c33a114007f02b6e6846f1fa232f607bfd +F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba F test/fuzzdata4.db 1882f0055fb63214d8407ddc7aca9b0b1c59af21 F test/fuzzer1.test d4c52aaf3ef923da293a2653cfab33d02f718a36 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1389,7 +1389,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P a6d5e4e8693bea3739c35fe9769ac9abfb9ed056 -R d123bfb9b25dcb8cf6d4214c017e0514 +P 29f7227ff127202c53fe7c3b6558b3c101b0a7bc +R b3d2e18288eecf437c1dfdc1db967b0d U drh -Z b7257b8e8fb8545cc0082886f7c4483e +Z 07034a5cbcc5358cdbeac30192aaba95 diff --git a/manifest.uuid b/manifest.uuid index d0ec470927..956cc32adc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -29f7227ff127202c53fe7c3b6558b3c101b0a7bc \ No newline at end of file +e796c0efb6cf17444b53af75046daf7d8fa82f78 \ No newline at end of file diff --git a/test/fuzzdata3.db b/test/fuzzdata3.db index 4ca7a23578ad0115d0003666e650c4c497146b2c..0a41fd6e37ba0b794372b5a6389978ac57664bf0 100644 GIT binary patch delta 81588 zcmcG1cU%|k#wRyw498GaF!_gc^3mh$Rw8GIEhaV1q9Bpv4#nBE& zdmJ5bbi~mKM`s*eaCF7d4MzZu?l^kj2*lA7M=u<`arD8_SDe%JYx)d#YZKrlj;uHQ z!d70(b7$)E`Tg!`R^AxsE*>l{XvcVJRlsgu5h8i4bW3(AxAbFL&aSbJ%#TM!8G5fg z(kxIc^`72|@w~Q6!o`jAJ^y0-{PKR2C5IUz<{sO^9u)P{NJ6!t zU!{w(a@Z`RxWkq z6|YV3n$D>_tQXL7Ia51?kx_Yglr9Zpcm}*APMr3phRzxd?@H3Fy96B(TW=fdVa#n#|EBf z;`~{PpjM9HrJ$fDBIxI!9f>?F-#Wo-i5)jS>-R>kjC1-&SY&6XTtJU_R4 zQ$A%)$cOxTp!7d(yfV6pkkr9%s>SYGJ$pNe^X|b=^VGedWh$=n4PJ6!dGJ(~P_+o& z34~)XAvy;;OZ=*5Fdk6X;7S$W-BEHX4-9s75w7inPpifGs9-lOzwuS5nzay>3Besb z_{r3%^RIm25=|b@`^==QZN| zTfr^dMAaS{ehQJ%IMMAy<+s5)+~*UV=jVS94izn54L-+2)n%lDsYT`W;3^*%GAzYW z!iyX$js{2uNf^HgJ`-g;x7Jme{XFRHT$RSac98#%L^;9<%{|*Yd@1yFaZYKVHBIGkyKBeuFuGW`K zoSzxurIltL;dkbRED^>|(z7ZdEet9066X0KvsG-IaIbWFfr(`ns zVhtH&;;piYPlu3+w}rfo3t`4Qaqo?gyDGk8qrs_ccgQJmYIR62mFCIS4s5m9n3c}t z)Grpx*0YI{)MN_xS9hN+=5GiYi6k5i!86z%LeJoXn%I9_H_qQ9&a(dUijYc;FkTyd zgst4&GfXaAE`@xg6Cbti(@Ns!Z<0mc55YT9^%vAp#&l%S<(0&$ycp6*I-m-@g2aaY?Wu)Dku&)H z;i3Mbl`-@po`)&)mZx@DT*fem`QrYQp-sG4AJKSWsEW;dr6|wA!EJ3(E<#?EgK%Y$ z3E|SBY=n!7vJje!P+Pb?UzCAxUeR!b&laU4oL-cM@TsC<2*(r+MVL}F2w|V11P2G# zy+!R1?kH-D@b#iL2san`BivNvhw$a1)(BUNB}JjbSwbjSEsKH?wkSfq<)$y{htR92 z55guzsO;Pvi+UlHih6=|wFotw>u*Kf5S}gSittQP7lbEyH*@H8Rl6dCc-|}uCjx4k&6i?OqHuC�gc6=C87Hn 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

Us=S%b^ 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 Cyq8P> delta 81167 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 From 5171e911f2f90c7040f8eea2c87de5dca02432ea Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 1 Oct 2015 18:31:29 +0000 Subject: [PATCH 30/98] Fix an fts3 bug causing NEAR queries on uncommitted data to malfunction. FossilOrigin-Name: 6f90839e91024e2006042f5eb7f21ca5b47a9b4a --- ext/fts3/fts3_write.c | 23 +++++++++++++++-------- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index 6b7d5ef2ae..d5a408222e 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -1322,14 +1322,19 @@ static int fts3SegReaderNext( if( fts3SegReaderIsPending(pReader) ){ Fts3HashElem *pElem = *(pReader->ppNextElem); - if( pElem==0 ){ - pReader->aNode = 0; - }else{ + sqlite3_free(pReader->aNode); + pReader->aNode = 0; + if( pElem ){ + char *aCopy; PendingList *pList = (PendingList *)fts3HashData(pElem); + int nCopy = pList->nData+1; pReader->zTerm = (char *)fts3HashKey(pElem); pReader->nTerm = fts3HashKeysize(pElem); - pReader->nNode = pReader->nDoclist = pList->nData + 1; - pReader->aNode = pReader->aDoclist = pList->aData; + aCopy = (char*)sqlite3_malloc(nCopy); + if( !aCopy ) return SQLITE_NOMEM; + memcpy(aCopy, pList->aData, nCopy); + pReader->nNode = pReader->nDoclist = nCopy; + pReader->aNode = pReader->aDoclist = aCopy; pReader->ppNextElem++; assert( pReader->aNode ); } @@ -1569,12 +1574,14 @@ int sqlite3Fts3MsrOvfl( ** second argument. */ void sqlite3Fts3SegReaderFree(Fts3SegReader *pReader){ - if( pReader && !fts3SegReaderIsPending(pReader) ){ - sqlite3_free(pReader->zTerm); + if( pReader ){ + if( !fts3SegReaderIsPending(pReader) ){ + sqlite3_free(pReader->zTerm); + } if( !fts3SegReaderIsRootOnly(pReader) ){ sqlite3_free(pReader->aNode); - sqlite3_blob_close(pReader->pBlob); } + sqlite3_blob_close(pReader->pBlob); } sqlite3_free(pReader); } diff --git a/manifest b/manifest index b92913e6d5..8cd4cfd3fd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sa\scorrupt\sdatabase\sto\stest/fuzzdata3.db\sto\svalidate\sthe\sprevious\ncheck-in. -D 2015-09-30T14:30:19.646 +C Fix\san\sfts3\sbug\scausing\sNEAR\squeries\son\suncommitted\sdata\sto\smalfunction. +D 2015-10-01T18:31:29.602 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -96,7 +96,7 @@ F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 F ext/fts3/fts3_unicode.c a93f5edc0aff44ef8b06d7cb55b52026541ca145 F ext/fts3/fts3_unicode2.c c3d01968d497bd7001e7dc774ba75b372738c057 -F ext/fts3/fts3_write.c 6f7233a06df17084d5cd968899053731bf953f94 +F ext/fts3/fts3_write.c f442223e4a1914dc1fc12b65af7e4f2c255fa47c F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/fts3/tool/fts3view.c 8e53d0190a7b3443764bbd32ad47be2bd852026d @@ -1389,7 +1389,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 29f7227ff127202c53fe7c3b6558b3c101b0a7bc -R b3d2e18288eecf437c1dfdc1db967b0d -U drh -Z 07034a5cbcc5358cdbeac30192aaba95 +P e796c0efb6cf17444b53af75046daf7d8fa82f78 +R 0cafe6c8cdead8895dc88237ddef8389 +U dan +Z 654a1b4baa598b306106df1a114a779c diff --git a/manifest.uuid b/manifest.uuid index 956cc32adc..becb519cfa 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e796c0efb6cf17444b53af75046daf7d8fa82f78 \ No newline at end of file +6f90839e91024e2006042f5eb7f21ca5b47a9b4a \ No newline at end of file From bca189d5d86fe18c54d42c35a263a9db66267d24 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 2 Oct 2015 20:04:30 +0000 Subject: [PATCH 31/98] Update fts5 to avoid using a statement journal for UPDATE and DELETE operations that affect at most a single row. FossilOrigin-Name: 5c83b9db46d61cfa76a1abed50467e2f02db0eb0 --- ext/fts5/fts5Int.h | 4 +- ext/fts5/fts5_index.c | 39 ++++++- ext/fts5/fts5_main.c | 166 ++++++++++++++++++++++-------- ext/fts5/fts5_storage.c | 101 ++++++++++-------- ext/fts5/test/fts5onepass.test | 181 +++++++++++++++++++++++++++++++++ ext/fts5/test/fts5simple.test | 41 +++++++- manifest | 21 ++-- manifest.uuid | 2 +- 8 files changed, 448 insertions(+), 107 deletions(-) create mode 100644 ext/fts5/test/fts5onepass.test diff --git a/ext/fts5/fts5Int.h b/ext/fts5/fts5Int.h index 6f6f4ed784..99b07bfb2f 100644 --- a/ext/fts5/fts5Int.h +++ b/ext/fts5/fts5Int.h @@ -370,6 +370,7 @@ int sqlite3Fts5IndexWrite( */ int sqlite3Fts5IndexBeginWrite( Fts5Index *p, /* Index to write to */ + int bDelete, /* True if current operation is a delete */ i64 iDocid /* Docid to add or remove data from */ ); @@ -526,7 +527,8 @@ int sqlite3Fts5DropAll(Fts5Config*); int sqlite3Fts5CreateTable(Fts5Config*, const char*, const char*, int, char **); int sqlite3Fts5StorageDelete(Fts5Storage *p, i64); -int sqlite3Fts5StorageInsert(Fts5Storage *p, sqlite3_value **apVal, int, i64*); +int sqlite3Fts5StorageContentInsert(Fts5Storage *p, sqlite3_value**, i64*); +int sqlite3Fts5StorageIndexInsert(Fts5Storage *p, sqlite3_value**, i64); int sqlite3Fts5StorageIntegrity(Fts5Storage *p); diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 9910c59b0a..418127a51c 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -291,7 +291,7 @@ struct Fts5Index { int nMaxPendingData; /* Max pending data before flush to disk */ int nPendingData; /* Current bytes of pending data */ i64 iWriteRowid; /* Rowid for current doc being written */ - Fts5Buffer scratch; + int bDelete; /* Current write is a delete */ /* Error state. */ int rc; /* Current error code */ @@ -1780,6 +1780,7 @@ static void fts5SegIterNext( pIter->iEndofDoclist = nList+1; sqlite3Fts5BufferSet(&p->rc, &pIter->term, strlen(zTerm), (u8*)zTerm); pIter->iLeafOffset = fts5GetVarint(pList, (u64*)&pIter->iRowid); + if( pbNewTerm ) *pbNewTerm = 1; } }else{ iOff = 0; @@ -4195,7 +4196,7 @@ static void fts5SetupPrefixIter( ** Indicate that all subsequent calls to sqlite3Fts5IndexWrite() pertain ** to the document with rowid iRowid. */ -int sqlite3Fts5IndexBeginWrite(Fts5Index *p, i64 iRowid){ +int sqlite3Fts5IndexBeginWrite(Fts5Index *p, int bDelete, i64 iRowid){ assert( p->rc==SQLITE_OK ); /* Allocate the hash table if it has not already been allocated */ @@ -4204,10 +4205,15 @@ int sqlite3Fts5IndexBeginWrite(Fts5Index *p, i64 iRowid){ } /* Flush the hash table to disk if required */ - if( iRowid<=p->iWriteRowid || (p->nPendingData > p->nMaxPendingData) ){ + if( iRowidiWriteRowid + || (iRowid==p->iWriteRowid && p->bDelete==0) + || (p->nPendingData > p->nMaxPendingData) + ){ fts5IndexFlush(p); } + p->iWriteRowid = iRowid; + p->bDelete = bDelete; return fts5IndexReturn(p); } @@ -4306,7 +4312,6 @@ int sqlite3Fts5IndexClose(Fts5Index *p){ sqlite3_finalize(p->pIdxDeleter); sqlite3_finalize(p->pIdxSelect); sqlite3Fts5HashFree(p->pHash); - sqlite3Fts5BufferFree(&p->scratch); sqlite3_free(p->zDataTbl); sqlite3_free(p); } @@ -4367,6 +4372,7 @@ int sqlite3Fts5IndexWrite( Fts5Config *pConfig = p->pConfig; assert( p->rc==SQLITE_OK ); + assert( (iCol<0)==p->bDelete ); /* Add the entry to the main terms index. */ rc = sqlite3Fts5HashWrite( @@ -5243,6 +5249,29 @@ static void fts5DecodeStructure( fts5StructureRelease(p); } +/* +** This is part of the fts5_decode() debugging aid. +** +** Arguments pBlob/nBlob contain an "averages" record. This function +** appends a human-readable representation of record to the buffer passed +** as the second argument. +*/ +static void fts5DecodeAverages( + int *pRc, /* IN/OUT: error code */ + Fts5Buffer *pBuf, + const u8 *pBlob, int nBlob +){ + int i = 0; + const char *zSpace = ""; + + while( iflags. Unless this +** extension is currently being used by a version of SQLite too old to +** support index-info flags. In that case this function is a no-op. +*/ +static void fts5SetUniqueFlag(sqlite3_index_info *pIdxInfo){ +#if SQLITE_VERSION_NUMBER>=3008012 + if( sqlite3_libversion_number()>=3008012 ){ + pIdxInfo->idxFlags |= SQLITE_INDEX_SCAN_UNIQUE; + } +#endif +} + /* ** Implementation of the xBestIndex method for FTS5 tables. Within the ** WHERE constraint, it searches for the following: @@ -546,6 +559,7 @@ static int fts5BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ bHasMatch = BitFlagTest(idxFlags, FTS5_BI_MATCH); if( BitFlagTest(idxFlags, FTS5_BI_ROWID_EQ) ){ pInfo->estimatedCost = bHasMatch ? 100.0 : 10.0; + if( bHasMatch==0 ) fts5SetUniqueFlag(pInfo); }else if( BitFlagAllTest(idxFlags, FTS5_BI_ROWID_LE|FTS5_BI_ROWID_GE) ){ pInfo->estimatedCost = bHasMatch ? 500.0 : 250000.0; }else if( BitFlagTest(idxFlags, FTS5_BI_ROWID_LE|FTS5_BI_ROWID_GE) ){ @@ -1284,15 +1298,14 @@ static void fts5SetVtabError(Fts5Table *p, const char *zFormat, ...){ */ static int fts5SpecialInsert( Fts5Table *pTab, /* Fts5 table object */ - sqlite3_value *pCmd, /* Value inserted into special column */ + const char *zCmd, /* Text inserted into table-name column */ sqlite3_value *pVal /* Value inserted into rank column */ ){ Fts5Config *pConfig = pTab->pConfig; - const char *z = (const char*)sqlite3_value_text(pCmd); int rc = SQLITE_OK; int bError = 0; - if( 0==sqlite3_stricmp("delete-all", z) ){ + if( 0==sqlite3_stricmp("delete-all", zCmd) ){ if( pConfig->eContent==FTS5_CONTENT_NORMAL ){ fts5SetVtabError(pTab, "'delete-all' may only be used with a " @@ -1302,7 +1315,7 @@ static int fts5SpecialInsert( }else{ rc = sqlite3Fts5StorageDeleteAll(pTab->pStorage); } - }else if( 0==sqlite3_stricmp("rebuild", z) ){ + }else if( 0==sqlite3_stricmp("rebuild", zCmd) ){ if( pConfig->eContent==FTS5_CONTENT_NONE ){ fts5SetVtabError(pTab, "'rebuild' may not be used with a contentless fts5 table" @@ -1311,27 +1324,27 @@ static int fts5SpecialInsert( }else{ rc = sqlite3Fts5StorageRebuild(pTab->pStorage); } - }else if( 0==sqlite3_stricmp("optimize", z) ){ + }else if( 0==sqlite3_stricmp("optimize", zCmd) ){ rc = sqlite3Fts5StorageOptimize(pTab->pStorage); - }else if( 0==sqlite3_stricmp("merge", z) ){ + }else if( 0==sqlite3_stricmp("merge", zCmd) ){ int nMerge = sqlite3_value_int(pVal); rc = sqlite3Fts5StorageMerge(pTab->pStorage, nMerge); - }else if( 0==sqlite3_stricmp("integrity-check", z) ){ + }else if( 0==sqlite3_stricmp("integrity-check", zCmd) ){ rc = sqlite3Fts5StorageIntegrity(pTab->pStorage); #ifdef SQLITE_DEBUG - }else if( 0==sqlite3_stricmp("prefix-index", z) ){ + }else if( 0==sqlite3_stricmp("prefix-index", zCmd) ){ pConfig->bPrefixIndex = sqlite3_value_int(pVal); #endif }else{ rc = sqlite3Fts5IndexLoadConfig(pTab->pIndex); if( rc==SQLITE_OK ){ - rc = sqlite3Fts5ConfigSetValue(pTab->pConfig, z, pVal, &bError); + rc = sqlite3Fts5ConfigSetValue(pTab->pConfig, zCmd, pVal, &bError); } if( rc==SQLITE_OK ){ if( bError ){ rc = SQLITE_ERROR; }else{ - rc = sqlite3Fts5StorageConfigValue(pTab->pStorage, z, pVal, 0); + rc = sqlite3Fts5StorageConfigValue(pTab->pStorage, zCmd, pVal, 0); } } } @@ -1352,10 +1365,35 @@ static int fts5SpecialDelete( return rc; } +static void fts5StorageInsert( + int *pRc, + Fts5Table *pTab, + sqlite3_value **apVal, + i64 *piRowid +){ + int rc = *pRc; + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5StorageContentInsert(pTab->pStorage, apVal, piRowid); + } + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5StorageIndexInsert(pTab->pStorage, apVal, *piRowid); + } + *pRc = rc; +} + /* ** This function is the implementation of the xUpdate callback used by ** FTS3 virtual tables. It is invoked by SQLite each time a row is to be ** inserted, updated or deleted. +** +** A delete specifies a single argument - the rowid of the row to remove. +** +** Update and insert operations pass: +** +** 1. The "old" rowid, or NULL. +** 2. The "new" rowid. +** 3. Values for each of the nCol matchable columns. +** 4. Values for the two hidden columns ( and "rank"). */ static int fts5UpdateMethod( sqlite3_vtab *pVtab, /* Virtual table handle */ @@ -1366,62 +1404,106 @@ static int fts5UpdateMethod( Fts5Table *pTab = (Fts5Table*)pVtab; Fts5Config *pConfig = pTab->pConfig; int eType0; /* value_type() of apVal[0] */ - int eConflict; /* ON CONFLICT for this DML */ int rc = SQLITE_OK; /* Return code */ /* A transaction must be open when this is called. */ assert( pTab->ts.eState==1 ); + assert( pVtab->zErrMsg==0 ); + assert( nArg==1 || nArg==(2+pConfig->nCol+2) ); + assert( nArg==1 + || sqlite3_value_type(apVal[1])==SQLITE_INTEGER + || sqlite3_value_type(apVal[1])==SQLITE_NULL + ); assert( pTab->pConfig->pzErrmsg==0 ); pTab->pConfig->pzErrmsg = &pTab->base.zErrMsg; - /* A delete specifies a single argument - the rowid of the row to remove. - ** Update and insert operations pass: - ** - ** 1. The "old" rowid, or NULL. - ** 2. The "new" rowid. - ** 3. Values for each of the nCol matchable columns. - ** 4. Values for the two hidden columns ( and "rank"). - */ + /* Put any active cursors into REQUIRE_SEEK state. */ + fts5TripCursors(pTab); eType0 = sqlite3_value_type(apVal[0]); - eConflict = sqlite3_vtab_on_conflict(pConfig->db); + if( eType0==SQLITE_NULL + && sqlite3_value_type(apVal[2+pConfig->nCol])!=SQLITE_NULL + ){ + /* A "special" INSERT op. These are handled separately. */ + const char *z = (const char*)sqlite3_value_text(apVal[2+pConfig->nCol]); + if( pConfig->eContent!=FTS5_CONTENT_NORMAL + && 0==sqlite3_stricmp("delete", z) + ){ + rc = fts5SpecialDelete(pTab, apVal, pRowid); + }else{ + rc = fts5SpecialInsert(pTab, z, apVal[2 + pConfig->nCol + 1]); + } + }else{ + /* A regular INSERT, UPDATE or DELETE statement. The trick here is that + ** any conflict on the rowid value must be detected before any + ** modifications are made to the database file. There are 4 cases: + ** + ** 1) DELETE + ** 2) UPDATE (rowid not modified) + ** 3) UPDATE (rowid modified) + ** 4) INSERT + ** + ** Cases 3 and 4 may violate the rowid constraint. + */ + int eConflict = sqlite3_vtab_on_conflict(pConfig->db); - assert( eType0==SQLITE_INTEGER || eType0==SQLITE_NULL ); - assert( pVtab->zErrMsg==0 ); - assert( (nArg==1 && eType0==SQLITE_INTEGER) || nArg==(2+pConfig->nCol+2) ); + assert( eType0==SQLITE_INTEGER || eType0==SQLITE_NULL ); + assert( nArg!=1 || eType0==SQLITE_INTEGER ); - fts5TripCursors(pTab); - if( eType0==SQLITE_INTEGER ){ - if( fts5IsContentless(pTab) ){ + /* Filter out attempts to run UPDATE or DELETE on contentless tables. + ** This is not suported. */ + if( eType0==SQLITE_INTEGER && fts5IsContentless(pTab) ){ pTab->base.zErrMsg = sqlite3_mprintf( "cannot %s contentless fts5 table: %s", (nArg>1 ? "UPDATE" : "DELETE from"), pConfig->zName ); rc = SQLITE_ERROR; - }else{ + } + + /* Case 1: DELETE */ + else if( nArg==1 ){ i64 iDel = sqlite3_value_int64(apVal[0]); /* Rowid to delete */ rc = sqlite3Fts5StorageDelete(pTab->pStorage, iDel); } - }else{ - sqlite3_value *pCmd = apVal[2 + pConfig->nCol]; - assert( nArg>1 ); - if( SQLITE_NULL!=sqlite3_value_type(pCmd) ){ - const char *z = (const char*)sqlite3_value_text(pCmd); - if( pConfig->eContent!=FTS5_CONTENT_NORMAL - && 0==sqlite3_stricmp("delete", z) + + /* Case 2: INSERT */ + else if( eType0!=SQLITE_INTEGER ){ + /* If this is a REPLACE, first remove the current entry (if any) */ + if( eConflict==SQLITE_REPLACE + && sqlite3_value_type(apVal[1])==SQLITE_INTEGER ){ - rc = fts5SpecialDelete(pTab, apVal, pRowid); - }else{ - rc = fts5SpecialInsert(pTab, pCmd, apVal[2 + pConfig->nCol + 1]); + i64 iNew = sqlite3_value_int64(apVal[1]); /* Rowid to delete */ + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iNew); } - goto update_method_out; + fts5StorageInsert(&rc, pTab, apVal, pRowid); } - } - - if( rc==SQLITE_OK && nArg>1 ){ - rc = sqlite3Fts5StorageInsert(pTab->pStorage, apVal, eConflict, pRowid); + /* Case 2: UPDATE */ + else{ + i64 iOld = sqlite3_value_int64(apVal[0]); /* Old rowid */ + i64 iNew = sqlite3_value_int64(apVal[1]); /* New rowid */ + if( iOld!=iNew ){ + if( eConflict==SQLITE_REPLACE ){ + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iNew); + } + fts5StorageInsert(&rc, pTab, apVal, pRowid); + }else{ + rc = sqlite3Fts5StorageContentInsert(pTab->pStorage, apVal, pRowid); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld); + } + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5StorageIndexInsert(pTab->pStorage, apVal, *pRowid); + } + } + }else{ + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld); + fts5StorageInsert(&rc, pTab, apVal, pRowid); + } + } } update_method_out: diff --git a/ext/fts5/fts5_storage.c b/ext/fts5/fts5_storage.c index 65c6d48a36..9f19e561b4 100644 --- a/ext/fts5/fts5_storage.c +++ b/ext/fts5/fts5_storage.c @@ -392,7 +392,7 @@ static int fts5StorageDeleteFromIndex(Fts5Storage *p, i64 iDel){ Fts5InsertCtx ctx; ctx.pStorage = p; ctx.iCol = -1; - rc = sqlite3Fts5IndexBeginWrite(p->pIndex, iDel); + rc = sqlite3Fts5IndexBeginWrite(p->pIndex, 1, iDel); for(iCol=1; rc==SQLITE_OK && iCol<=pConfig->nCol; iCol++){ if( pConfig->abUnindexed[iCol-1] ) continue; ctx.szCol = 0; @@ -549,7 +549,7 @@ int sqlite3Fts5StorageSpecialDelete( ctx.pStorage = p; ctx.iCol = -1; - rc = sqlite3Fts5IndexBeginWrite(p->pIndex, iDel); + rc = sqlite3Fts5IndexBeginWrite(p->pIndex, 1, iDel); for(iCol=0; rc==SQLITE_OK && iColnCol; iCol++){ if( pConfig->abUnindexed[iCol] ) continue; ctx.szCol = 0; @@ -639,7 +639,7 @@ int sqlite3Fts5StorageRebuild(Fts5Storage *p){ i64 iRowid = sqlite3_column_int64(pScan, 0); sqlite3Fts5BufferZero(&buf); - rc = sqlite3Fts5IndexBeginWrite(p->pIndex, iRowid); + rc = sqlite3Fts5IndexBeginWrite(p->pIndex, 0, iRowid); for(ctx.iCol=0; rc==SQLITE_OK && ctx.iColnCol; ctx.iCol++){ ctx.szCol = 0; if( pConfig->abUnindexed[ctx.iCol]==0 ){ @@ -705,58 +705,69 @@ static int fts5StorageNewRowid(Fts5Storage *p, i64 *piRowid){ } /* -** Insert a new row into the FTS table. +** Insert a new row into the FTS content table. */ -int sqlite3Fts5StorageInsert( - Fts5Storage *p, /* Storage module to write to */ - sqlite3_value **apVal, /* Array of values passed to xUpdate() */ - int eConflict, /* on conflict clause */ - i64 *piRowid /* OUT: rowid of new record */ +int sqlite3Fts5StorageContentInsert( + Fts5Storage *p, + sqlite3_value **apVal, + i64 *piRowid +){ + Fts5Config *pConfig = p->pConfig; + int rc = SQLITE_OK; + + /* Insert the new row into the %_content table. */ + if( pConfig->eContent!=FTS5_CONTENT_NORMAL ){ + if( sqlite3_value_type(apVal[1])==SQLITE_INTEGER ){ + *piRowid = sqlite3_value_int64(apVal[1]); + }else{ + rc = fts5StorageNewRowid(p, piRowid); + } + }else{ + sqlite3_stmt *pInsert = 0; /* Statement to write %_content table */ + int i; /* Counter variable */ +#if 0 + if( eConflict==SQLITE_REPLACE ){ + eStmt = FTS5_STMT_REPLACE_CONTENT; + rc = fts5StorageDeleteFromIndex(p, sqlite3_value_int64(apVal[1])); + }else{ + eStmt = FTS5_STMT_INSERT_CONTENT; + } +#endif + if( rc==SQLITE_OK ){ + rc = fts5StorageGetStmt(p, FTS5_STMT_INSERT_CONTENT, &pInsert, 0); + } + for(i=1; rc==SQLITE_OK && i<=pConfig->nCol+1; i++){ + rc = sqlite3_bind_value(pInsert, i, apVal[i]); + } + if( rc==SQLITE_OK ){ + sqlite3_step(pInsert); + rc = sqlite3_reset(pInsert); + } + *piRowid = sqlite3_last_insert_rowid(pConfig->db); + } + + return rc; +} + +/* +** Insert new entries into the FTS index and %_docsize table. +*/ +int sqlite3Fts5StorageIndexInsert( + Fts5Storage *p, + sqlite3_value **apVal, + i64 iRowid ){ Fts5Config *pConfig = p->pConfig; int rc = SQLITE_OK; /* Return code */ - sqlite3_stmt *pInsert = 0; /* Statement used to write %_content table */ - int eStmt = 0; /* Type of statement used on %_content */ - int i; /* Counter variable */ Fts5InsertCtx ctx; /* Tokenization callback context object */ Fts5Buffer buf; /* Buffer used to build up %_docsize blob */ memset(&buf, 0, sizeof(Fts5Buffer)); + ctx.pStorage = p; rc = fts5StorageLoadTotals(p, 1); - /* Insert the new row into the %_content table. */ if( rc==SQLITE_OK ){ - if( pConfig->eContent!=FTS5_CONTENT_NORMAL ){ - if( sqlite3_value_type(apVal[1])==SQLITE_INTEGER ){ - *piRowid = sqlite3_value_int64(apVal[1]); - }else{ - rc = fts5StorageNewRowid(p, piRowid); - } - }else{ - if( eConflict==SQLITE_REPLACE ){ - eStmt = FTS5_STMT_REPLACE_CONTENT; - rc = fts5StorageDeleteFromIndex(p, sqlite3_value_int64(apVal[1])); - }else{ - eStmt = FTS5_STMT_INSERT_CONTENT; - } - if( rc==SQLITE_OK ){ - rc = fts5StorageGetStmt(p, eStmt, &pInsert, 0); - } - for(i=1; rc==SQLITE_OK && i<=pConfig->nCol+1; i++){ - rc = sqlite3_bind_value(pInsert, i, apVal[i]); - } - if( rc==SQLITE_OK ){ - sqlite3_step(pInsert); - rc = sqlite3_reset(pInsert); - } - *piRowid = sqlite3_last_insert_rowid(pConfig->db); - } - } - - /* Add new entries to the FTS index */ - if( rc==SQLITE_OK ){ - rc = sqlite3Fts5IndexBeginWrite(p->pIndex, *piRowid); - ctx.pStorage = p; + rc = sqlite3Fts5IndexBeginWrite(p->pIndex, 0, iRowid); } for(ctx.iCol=0; rc==SQLITE_OK && ctx.iColnCol; ctx.iCol++){ ctx.szCol = 0; @@ -776,7 +787,7 @@ int sqlite3Fts5StorageInsert( /* Write the %_docsize record */ if( rc==SQLITE_OK ){ - rc = fts5StorageInsertDocsize(p, *piRowid, &buf); + rc = fts5StorageInsertDocsize(p, iRowid, &buf); } sqlite3_free(buf.p); diff --git a/ext/fts5/test/fts5onepass.test b/ext/fts5/test/fts5onepass.test new file mode 100644 index 0000000000..a614b780a2 --- /dev/null +++ b/ext/fts5/test/fts5onepass.test @@ -0,0 +1,181 @@ +# 2015 Sep 27 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#************************************************************************* +# + +source [file join [file dirname [info script]] fts5_common.tcl] +set testprefix fts5onepass + +# If SQLITE_ENABLE_FTS3 is defined, omit this file. +ifcapable !fts5 { + finish_test + return +} + +do_execsql_test 1.0 { + CREATE VIRTUAL TABLE ft USING fts5(content); + INSERT INTO ft(rowid, content) VALUES(1, '1 2 3'); + INSERT INTO ft(rowid, content) VALUES(2, '4 5 6'); + INSERT INTO ft(rowid, content) VALUES(3, '7 8 9'); +} + +#------------------------------------------------------------------------- +# Check that UPDATE and DELETE statements that feature "WHERE rowid=?" or +# or "WHERE rowid=?" clauses do not use statement journals. But that other +# DELETE and UPDATE statements do. +# +# Note: "MATCH ? AND rowid=?" does use a statement journal. +# +foreach {tn sql uses} { + 1.1 { DELETE FROM ft } 1 + 1.2 { DELETE FROM ft WHERE rowid=? } 0 + 1.3 { DELETE FROM ft WHERE rowid=? } 0 + 1.4 { DELETE FROM ft WHERE ft MATCH '1' } 1 + 1.5 { DELETE FROM ft WHERE ft MATCH '1' AND rowid=? } 1 + 1.6 { DELETE FROM ft WHERE ft MATCH '1' AND rowid=? } 1 + + 2.1 { UPDATE ft SET content='a b c' } 1 + 2.2 { UPDATE ft SET content='a b c' WHERE rowid=? } 0 + 2.3 { UPDATE ft SET content='a b c' WHERE rowid=? } 0 + 2.4 { UPDATE ft SET content='a b c' WHERE ft MATCH '1' } 1 + 2.5 { UPDATE ft SET content='a b c' WHERE ft MATCH '1' AND rowid=? } 1 + 2.6 { UPDATE ft SET content='a b c' WHERE ft MATCH '1' AND rowid=? } 1 +} { + do_test 1.$tn { sql_uses_stmt db $sql } $uses +} + +#------------------------------------------------------------------------- +# Check that putting a "DELETE/UPDATE ... WHERE rowid=?" statement in a +# trigger program does not prevent the VM from using a statement +# transaction. Even if the calling statement cannot hit a constraint. +# +do_execsql_test 2.0 { + CREATE TABLE t1(x); + + CREATE TRIGGER t1_ai AFTER INSERT ON t1 BEGIN + DELETE FROM ft WHERE rowid=new.x; + END; + + CREATE TRIGGER t1_ad AFTER DELETE ON t1 BEGIN + UPDATE ft SET content = 'a b c' WHERE rowid=old.x; + END; + + CREATE TRIGGER t1_bu BEFORE UPDATE ON t1 BEGIN + DELETE FROM ft WHERE rowid=old.x; + END; +} + +foreach {tn sql uses} { + 1 { INSERT INTO t1 VALUES(1) } 1 + 2 { DELETE FROM t1 WHERE x=4 } 1 + 3 { UPDATE t1 SET x=10 WHERE x=11 } 1 +} { + do_test 2.$tn { sql_uses_stmt db $sql } $uses +} + +#------------------------------------------------------------------------- +# Test that an "UPDATE ... WHERE rowid=?" works and does not corrupt the +# index when it strikes a constraint. Both inside and outside a +# transaction. +# +foreach {tn tcl1 tcl2} { + 1 {} {} + + 2 { + execsql BEGIN + } { + if {[sqlite3_get_autocommit db]==1} { error "transaction rolled back!" } + execsql COMMIT + } +} { + + do_execsql_test 3.$tn.0 { + DROP TABLE IF EXISTS ft2; + CREATE VIRTUAL TABLE ft2 USING fts5(content); + INSERT INTO ft2(rowid, content) VALUES(1, 'a b c'); + INSERT INTO ft2(rowid, content) VALUES(2, 'a b d'); + INSERT INTO ft2(rowid, content) VALUES(3, 'a b e'); + } + + eval $tcl1 + foreach {tn2 sql content} { + 1 { UPDATE ft2 SET rowid=2 WHERE rowid=1 } + { 1 {a b c} 2 {a b d} 3 {a b e} } + + 2 { + INSERT INTO ft2(rowid, content) VALUES(4, 'a b f'); + UPDATE ft2 SET rowid=5 WHERE rowid=4; + UPDATE ft2 SET rowid=3 WHERE rowid=5; + } { 1 {a b c} 2 {a b d} 3 {a b e} 5 {a b f} } + + 3 { + UPDATE ft2 SET rowid=3 WHERE rowid=4; -- matches 0 rows + UPDATE ft2 SET rowid=2 WHERE rowid=3; + } { 1 {a b c} 2 {a b d} 3 {a b e} 5 {a b f} } + + 4 { + INSERT INTO ft2(rowid, content) VALUES(4, 'a b g'); + UPDATE ft2 SET rowid=-1 WHERE rowid=4; + UPDATE ft2 SET rowid=3 WHERE rowid=-1; + } {-1 {a b g} 1 {a b c} 2 {a b d} 3 {a b e} 5 {a b f} } + + 5 { + DELETE FROM ft2 WHERE rowid=451; + DELETE FROM ft2 WHERE rowid=-1; + UPDATE ft2 SET rowid = 2 WHERE rowid = 1; + } {1 {a b c} 2 {a b d} 3 {a b e} 5 {a b f} } + } { + do_catchsql_test 3.$tn.$tn2.a $sql {1 {constraint failed}} + do_execsql_test 3.$tn.$tn2.b { SELECT rowid, content FROM ft2 } $content + + do_execsql_test 3.$tn.$tn2.c { + INSERT INTO ft2(ft2) VALUES('integrity-check'); + } + } + eval $tcl2 +} + +#------------------------------------------------------------------------- +# Check that DELETE and UPDATE operations can be done without flushing +# the in-memory hash table to disk. +# +reset_db +do_execsql_test 4.1.1 { + CREATE VIRTUAL TABLE ttt USING fts5(x); + BEGIN; + INSERT INTO ttt(rowid, x) VALUES(1, 'a b c'); + INSERT INTO ttt(rowid, x) VALUES(2, 'a b c'); + INSERT INTO ttt(rowid, x) VALUES(3, 'a b c'); + COMMIT +} +do_test 4.1.2 { fts5_level_segs ttt } {1} + +do_execsql_test 4.2.1 { + BEGIN; + DELETE FROM ttt WHERE rowid=1; + DELETE FROM ttt WHERE rowid=3; + INSERT INTO ttt(rowid, x) VALUES(4, 'd e f'); + INSERT INTO ttt(rowid, x) VALUES(5, 'd e f'); + COMMIT; +} {} +do_test 4.2.2 { fts5_level_segs ttt } {2} + + +do_execsql_test 4.3.1 { + BEGIN; + UPDATE ttt SET x = 'd e f' WHERE rowid = 2; + UPDATE ttt SET x = 'A B C' WHERE rowid = 4; + INSERT INTO ttt(rowid, x) VALUES(6, 'd e f'); + COMMIT; +} {} +do_test 4.2.2 { fts5_level_segs ttt } {3} + +finish_test + diff --git a/ext/fts5/test/fts5simple.test b/ext/fts5/test/fts5simple.test index 6a980c1b19..2fa72740dd 100644 --- a/ext/fts5/test/fts5simple.test +++ b/ext/fts5/test/fts5simple.test @@ -19,7 +19,6 @@ ifcapable !fts5 { return } -if 1 { #------------------------------------------------------------------------- # set doc "x x [string repeat {y } 50]z z" @@ -137,8 +136,6 @@ do_execsql_test 5.4 { SELECT rowid FROM tt WHERE tt MATCH 'a*'; } {1 2} -} - do_execsql_test 5.5 { DELETE FROM tt; BEGIN; @@ -184,6 +181,44 @@ do_catchsql_test 6.3 { SELECT * FROM xyz WHERE xyz MATCH NULL } {1 {fts5: syntax error near ""}} +#------------------------------------------------------------------------- + +do_execsql_test 7.1 { + CREATE VIRTUAL TABLE ft2 USING fts5(content); + INSERT INTO ft2(rowid, content) VALUES(1, 'a b c'); + INSERT INTO ft2(rowid, content) VALUES(2, 'a b d'); +} + +do_catchsql_test 7.2 { + BEGIN; + UPDATE ft2 SET rowid=2 WHERE rowid=1; +} {1 {constraint failed}} + +do_execsql_test 7.3 { + COMMIT; + INSERT INTO ft2(ft2) VALUES('integrity-check'); +} {} + +do_execsql_test 7.4 { + SELECT * FROM ft2; +} {{a b c} {a b d}} + +#------------------------------------------------------------------------- +# +reset_db +do_execsql_test 8.1 { + CREATE VIRTUAL TABLE ft2 USING fts5(content); + INSERT INTO ft2(rowid, content) VALUES(1, 'a b'); +} + +do_execsql_test 8.2 { + BEGIN; + INSERT INTO ft2(rowid, content) VALUES(4, 'a x'); +} + +do_execsql_test 8.3 { + INSERT INTO ft2(ft2) VALUES('integrity-check'); +} finish_test diff --git a/manifest b/manifest index 8cd4cfd3fd..5bb7286a31 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\san\sfts3\sbug\scausing\sNEAR\squeries\son\suncommitted\sdata\sto\smalfunction. -D 2015-10-01T18:31:29.602 +C Update\sfts5\sto\savoid\susing\sa\sstatement\sjournal\sfor\sUPDATE\sand\sDELETE\soperations\sthat\saffect\sat\smost\sa\ssingle\srow. +D 2015-10-02T20:04:30.384 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -106,15 +106,15 @@ F ext/fts3/unicode/mkunicode.tcl 95cf7ec186e48d4985e433ff8a1c89090a774252 F ext/fts3/unicode/parseunicode.tcl da577d1384810fb4e2b209bf3313074353193e95 F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 F ext/fts5/fts5.h 98f802fe41481f9d797fce496f0fefcad72c7782 -F ext/fts5/fts5Int.h 666aba8432940a8449a3bd4636e898fe906ed95d +F ext/fts5/fts5Int.h ff78a77d819a7fc04a7f8b08b0e1ce361a3395e4 F ext/fts5/fts5_aux.c 7a307760a9c57c750d043188ec0bad59f5b5ec7e F ext/fts5/fts5_buffer.c 64dcaf36a3ebda9e84b7c3b8788887ec325e12a4 F ext/fts5/fts5_config.c 57ee5fe71578cb494574fc0e6e51acb9a22a8695 F ext/fts5/fts5_expr.c 667faaf14a69a5683ac383acdc8d942cf32c3f93 F ext/fts5/fts5_hash.c 4bf4b99708848357b8a2b5819e509eb6d3df9246 -F ext/fts5/fts5_index.c c77882ab38d698d5147cef96fa67a2121d77c0b3 -F ext/fts5/fts5_main.c 53116cffeb26898832ff7700cc5ebac5fe085d32 -F ext/fts5/fts5_storage.c 120f7b143688b5b7710dacbd48cff211609b8059 +F ext/fts5/fts5_index.c 00d2593f94ede440ea274f8db21864cf41632aa3 +F ext/fts5/fts5_main.c fd9ab880963ea536cd6b043efffa4a322ccfb2b3 +F ext/fts5/fts5_storage.c df061a5caf9e50fbbd43113009b5b248362f4995 F ext/fts5/fts5_tcl.c 6da58d6e8f42a93c4486b5ba9b187a7f995dee37 F ext/fts5/fts5_test_mi.c e96be827aa8f571031e65e481251dc1981d608bf F ext/fts5/fts5_tokenize.c f380f46f341af9c9a9908e1aade685ba1eaa157a @@ -164,6 +164,7 @@ F ext/fts5/test/fts5integrity.test 29f41d2c7126c6122fbb5d54e556506456876145 F ext/fts5/test/fts5matchinfo.test 2163b0013e824bba65499da9e34ea4da41349cc2 F ext/fts5/test/fts5merge.test 8f3cdba2ec9c5e7e568246e81b700ad37f764367 F ext/fts5/test/fts5near.test b214cddb1c1f1bddf45c75af768f20145f7e71cc +F ext/fts5/test/fts5onepass.test 7ed9608e258132cb8d55e7c479b08676ad68810c F ext/fts5/test/fts5optimize.test 42741e7c085ee0a1276140a752d4407d97c2c9f5 F ext/fts5/test/fts5plan.test 6a55ecbac9890765b0e16f8c421c7e0888cfe436 F ext/fts5/test/fts5porter.test 7cdc07bef301d70eebbfa75dcaf45c3680e1d0e1 @@ -173,7 +174,7 @@ F ext/fts5/test/fts5rank.test 11dcebba31d822f7e99685b4ea2c2ae3ec0b16f1 F ext/fts5/test/fts5rebuild.test 03935f617ace91ed23a6099c7c74d905227ff29b F ext/fts5/test/fts5restart.test c17728fdea26e7d0f617d22ad5b4b2862b994c17 F ext/fts5/test/fts5rowid.test 400384798349d658eaf06aefa1e364957d5d4821 -F ext/fts5/test/fts5simple.test 967b7144644ad4b40b2526160a5adfa896864c55 +F ext/fts5/test/fts5simple.test 426c960e51e5839c8655bca723c34a05d44dcb6d F ext/fts5/test/fts5synonym.test cf88c0a56d5ea9591e3939ef1f6e294f7f2d0671 F ext/fts5/test/fts5tokenizer.test ea4df698b35cc427ebf2ba22829d0e28386d8c89 F ext/fts5/test/fts5unicode.test fbef8d8a3b4b88470536cc57604a82ca52e51841 @@ -1389,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P e796c0efb6cf17444b53af75046daf7d8fa82f78 -R 0cafe6c8cdead8895dc88237ddef8389 +P 6f90839e91024e2006042f5eb7f21ca5b47a9b4a +R c4ed86613c7c7ba1f8647ee3a7ddd45f U dan -Z 654a1b4baa598b306106df1a114a779c +Z c935b0cc17e8eaea980f1eab0035d787 diff --git a/manifest.uuid b/manifest.uuid index becb519cfa..7529743fd4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6f90839e91024e2006042f5eb7f21ca5b47a9b4a \ No newline at end of file +5c83b9db46d61cfa76a1abed50467e2f02db0eb0 \ No newline at end of file From 06f8c635ef0e90d9c618c803a6cd3eb12a3b2928 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 3 Oct 2015 12:23:18 +0000 Subject: [PATCH 32/98] Add tests for the rtree module to verify that attempts to insert non-integer primary key values or non-numeric dimensions into an rtree table are handled correctly. FossilOrigin-Name: f653fce90846b700441e8fa5f1930c1ec5e38e31 --- ext/rtree/rtree1.test | 55 +++++++++++++++++++++++++++++++++++++++++++ manifest | 12 +++++----- manifest.uuid | 2 +- 3 files changed, 62 insertions(+), 7 deletions(-) diff --git a/ext/rtree/rtree1.test b/ext/rtree/rtree1.test index 0beb16cc94..c9192de192 100644 --- a/ext/rtree/rtree1.test +++ b/ext/rtree/rtree1.test @@ -34,6 +34,11 @@ set testprefix rtree1 # # rtree-12.*: Test that on-conflict clauses are supported. # rtree-13.*: Test that bug [d2889096e7bdeac6d] has been fixed. +# rtree-14.*: Test if a non-integer is inserted into the PK column of an +# r-tree table, it is converted to an integer before being +# inserted. Also that if a non-numeric is inserted into one +# of the min/max dimension columns, it is converted to the +# required type before being inserted. # ifcapable !rtree { @@ -535,4 +540,54 @@ do_execsql_test 13.2 { SELECT * FROM r CROSS JOIN t9 WHERE id=x; } {1 1 0.0 0.0 2 2 0.0 0.0} +#------------------------------------------------------------------------- +# Test if a non-integer is inserted into the PK column of an r-tree +# table, it is converted to an integer before being inserted. Also +# that if a non-numeric is inserted into one of the min/max dimension +# columns, it is converted to the required type before being inserted. +# +do_execsql_test 14.1 { + CREATE VIRTUAL TABLE t10 USING rtree(ii, x1, x2); +} + +do_execsql_test 14.2 { + INSERT INTO t10 VALUES(NULL, 1, 2); + INSERT INTO t10 VALUES(NULL, 2, 3); + INSERT INTO t10 VALUES('4xxx', 3, 4); + INSERT INTO t10 VALUES(5.0, 4, 5); + INSERT INTO t10 VALUES(6.4, 5, 6); +} +do_execsql_test 14.3 { + SELECT * FROM t10; +} { + 1 1.0 2.0 2 2.0 3.0 4 3.0 4.0 5 4.0 5.0 6 5.0 6.0 +} + +do_execsql_test 14.4 { + DELETE FROM t10; + INSERT INTO t10 VALUES(1, 'one', 'two'); + INSERT INTO t10 VALUES(2, '52xyz', '81...'); +} +do_execsql_test 14.5 { + SELECT * FROM t10; +} { + 1 0.0 0.0 + 2 52.0 81.0 +} + +do_execsql_test 14.4 { + DROP TABLE t10; + CREATE VIRTUAL TABLE t10 USING rtree_i32(ii, x1, x2); + INSERT INTO t10 VALUES(1, 'one', 'two'); + INSERT INTO t10 VALUES(2, '52xyz', '81...'); + INSERT INTO t10 VALUES(3, 42.3, 49.9); +} +do_execsql_test 14.5 { + SELECT * FROM t10; +} { + 1 0 0 + 2 52 81 + 3 42 49 +} + finish_test diff --git a/manifest b/manifest index 5bb7286a31..e1606cc8f1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sfts5\sto\savoid\susing\sa\sstatement\sjournal\sfor\sUPDATE\sand\sDELETE\soperations\sthat\saffect\sat\smost\sa\ssingle\srow. -D 2015-10-02T20:04:30.384 +C Add\stests\sfor\sthe\srtree\smodule\sto\sverify\sthat\sattempts\sto\sinsert\snon-integer\sprimary\skey\svalues\sor\snon-numeric\sdimensions\sinto\san\srtree\stable\sare\shandled\scorrectly. +D 2015-10-03T12:23:18.660 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -236,7 +236,7 @@ F ext/rbu/test_rbu.c 2a3652241fa45d5eaa141775e4ae68c1d3582c03 F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/rtree.c 0f9b595bd0debcbedf1d7a63d0e0678d619e6c9c F ext/rtree/rtree.h 834dbcb82dc85b2481cde6a07cdadfddc99e9b9e -F ext/rtree/rtree1.test 541bbcab74613907fea08b2ecdcdd5b7aa724cc9 +F ext/rtree/rtree1.test 96a80c08440c932cd72aac50660e7af2612d2cda F ext/rtree/rtree2.test acbb3a4ce0f4fbc2c304d2b4b784cfa161856bba F ext/rtree/rtree3.test a494da55c30ee0bc9b01a91c80c81b387b22d2dc F ext/rtree/rtree4.test c8fe384f60ebd49540a5fecc990041bf452eb6e0 @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 6f90839e91024e2006042f5eb7f21ca5b47a9b4a -R c4ed86613c7c7ba1f8647ee3a7ddd45f +P 5c83b9db46d61cfa76a1abed50467e2f02db0eb0 +R 196ea698193815c30e84c4eb112a664d U dan -Z c935b0cc17e8eaea980f1eab0035d787 +Z 17a552709c7d631d9413f0310567b313 diff --git a/manifest.uuid b/manifest.uuid index 7529743fd4..df5d2154c5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5c83b9db46d61cfa76a1abed50467e2f02db0eb0 \ No newline at end of file +f653fce90846b700441e8fa5f1930c1ec5e38e31 \ No newline at end of file From a0f197b842603e30b8f47816f9a46a3533d8a942 Mon Sep 17 00:00:00 2001 From: dan Date: Sat, 3 Oct 2015 15:38:57 +0000 Subject: [PATCH 33/98] Update fts5 to support the table function syntax. "... FROM fts5_tbl WHERE fts5_tbl MATCH ?1 AND rank MATCH ?1" can now be written "FROM fts5_tbl(?1, ?2)". FossilOrigin-Name: 41d17d9e24303aed6d549ea23c62b93bf2f71691 --- ext/fts5/fts5_main.c | 6 ++++-- ext/fts5/test/fts5al.test | 14 +++++++++++++- ext/fts5/test/fts5simple.test | 21 +++++++++++++++++++++ manifest | 16 ++++++++-------- manifest.uuid | 2 +- 5 files changed, 47 insertions(+), 12 deletions(-) diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index 6954f54b8f..cabb625747 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -505,8 +505,10 @@ static int fts5BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ int omit; /* True to omit this if found */ int iConsIndex; /* Index in pInfo->aConstraint[] */ } aConstraint[] = { - {SQLITE_INDEX_CONSTRAINT_MATCH, FTS5_BI_MATCH, 1, 1, -1}, - {SQLITE_INDEX_CONSTRAINT_MATCH, FTS5_BI_RANK, 2, 1, -1}, + {SQLITE_INDEX_CONSTRAINT_MATCH|SQLITE_INDEX_CONSTRAINT_EQ, + FTS5_BI_MATCH, 1, 1, -1}, + {SQLITE_INDEX_CONSTRAINT_MATCH|SQLITE_INDEX_CONSTRAINT_EQ, + FTS5_BI_RANK, 2, 1, -1}, {SQLITE_INDEX_CONSTRAINT_EQ, FTS5_BI_ROWID_EQ, 0, 0, -1}, {SQLITE_INDEX_CONSTRAINT_LT|SQLITE_INDEX_CONSTRAINT_LE, FTS5_BI_ROWID_LE, 0, 0, -1}, diff --git a/ext/fts5/test/fts5al.test b/ext/fts5/test/fts5al.test index efad1b2069..b8f8c6ebcd 100644 --- a/ext/fts5/test/fts5al.test +++ b/ext/fts5/test/fts5al.test @@ -251,7 +251,6 @@ do_execsql_test 4.3.1 { INSERT INTO t3 VALUES('a five'); INSERT INTO t3(t3, rank) VALUES('rank', 'bm25()'); } -breakpoint do_execsql_test 4.3.2 { SELECT * FROM t3 @@ -260,6 +259,7 @@ do_execsql_test 4.3.2 { } { {a four} {a one} {a five} {a two} {a three} } + do_execsql_test 4.3.3 { SELECT *, rank FROM t3 WHERE t3 MATCH 'a' AND rank MATCH 'rowidmod(3)' @@ -268,6 +268,18 @@ do_execsql_test 4.3.3 { {a three} 0 {a one} 1 {a four} 1 {a two} 2 {a five} 2 } +do_execsql_test 4.3.4 { + SELECT * FROM t3('a', 'rowidmod(4)') ORDER BY rank ASC; +} { + {a four} {a one} {a five} {a two} {a three} +} + +do_execsql_test 4.3.5 { + SELECT *, rank FROM t3('a', 'rowidmod(3)') ORDER BY rank ASC +} { + {a three} 0 {a one} 1 {a four} 1 {a two} 2 {a five} 2 +} + do_catchsql_test 4.4.3 { SELECT *, rank FROM t3 WHERE t3 MATCH 'a' AND rank MATCH 'xyz(3)' } {1 {no such function: xyz}} diff --git a/ext/fts5/test/fts5simple.test b/ext/fts5/test/fts5simple.test index 2fa72740dd..ecdb11080c 100644 --- a/ext/fts5/test/fts5simple.test +++ b/ext/fts5/test/fts5simple.test @@ -220,5 +220,26 @@ do_execsql_test 8.3 { INSERT INTO ft2(ft2) VALUES('integrity-check'); } +#------------------------------------------------------------------------- +# Check that the "table function" syntax works. +# +reset_db +do_execsql_test 9.1 { + CREATE VIRTUAL TABLE ft2 USING fts5(content); + INSERT INTO ft2(rowid, content) VALUES(1, 'a b'); + INSERT INTO ft2(rowid, content) VALUES(2, 'a b c d'); + INSERT INTO ft2(rowid, content) VALUES(3, 'c d e f'); +} + +do_execsql_test 9.2 { + SELECT rowid FROM ft2('a'); +} {1 2} + +do_execsql_test 9.3 { + SELECT rowid FROM ft2('b AND c'); +} {2} + + + finish_test diff --git a/manifest b/manifest index e1606cc8f1..3cf342d387 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\stests\sfor\sthe\srtree\smodule\sto\sverify\sthat\sattempts\sto\sinsert\snon-integer\sprimary\skey\svalues\sor\snon-numeric\sdimensions\sinto\san\srtree\stable\sare\shandled\scorrectly. -D 2015-10-03T12:23:18.660 +C Update\sfts5\sto\ssupport\sthe\stable\sfunction\ssyntax.\s"...\sFROM\sfts5_tbl\sWHERE\sfts5_tbl\sMATCH\s?1\sAND\srank\sMATCH\s?1"\scan\snow\sbe\swritten\s"FROM\sfts5_tbl(?1,\s?2)". +D 2015-10-03T15:38:57.855 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -113,7 +113,7 @@ F ext/fts5/fts5_config.c 57ee5fe71578cb494574fc0e6e51acb9a22a8695 F ext/fts5/fts5_expr.c 667faaf14a69a5683ac383acdc8d942cf32c3f93 F ext/fts5/fts5_hash.c 4bf4b99708848357b8a2b5819e509eb6d3df9246 F ext/fts5/fts5_index.c 00d2593f94ede440ea274f8db21864cf41632aa3 -F ext/fts5/fts5_main.c fd9ab880963ea536cd6b043efffa4a322ccfb2b3 +F ext/fts5/fts5_main.c fe5243d6bbb79217394f0ec7f4f5199ddbc9e7e8 F ext/fts5/fts5_storage.c df061a5caf9e50fbbd43113009b5b248362f4995 F ext/fts5/fts5_tcl.c 6da58d6e8f42a93c4486b5ba9b187a7f995dee37 F ext/fts5/fts5_test_mi.c e96be827aa8f571031e65e481251dc1981d608bf @@ -135,7 +135,7 @@ F ext/fts5/test/fts5ah.test e592c4978622dbc4de552cd0f9395df60ac5d54c F ext/fts5/test/fts5ai.test f20e53bbf0c55bc596f1fd47f2740dae028b8f37 F ext/fts5/test/fts5aj.test 05b569f5c16ea3098fb1984eec5cf50dbdaae5d8 F ext/fts5/test/fts5ak.test 7b8c5df96df599293f920b7e5521ebc79f647592 -F ext/fts5/test/fts5al.test 5c79525671862861906fa0a848da462a8473eafb +F ext/fts5/test/fts5al.test a1b7b6393376bc2adc216527a28f5ae5594069df F ext/fts5/test/fts5alter.test 6022c61467a82aa11c70822ccad22b328dcf0d04 F ext/fts5/test/fts5auto.test caa5bcf917db11944655a2a9bd38c67c520376ca F ext/fts5/test/fts5aux.test 8c687c948cc98e9a94be014df7d518acc1b3b74f @@ -174,7 +174,7 @@ F ext/fts5/test/fts5rank.test 11dcebba31d822f7e99685b4ea2c2ae3ec0b16f1 F ext/fts5/test/fts5rebuild.test 03935f617ace91ed23a6099c7c74d905227ff29b F ext/fts5/test/fts5restart.test c17728fdea26e7d0f617d22ad5b4b2862b994c17 F ext/fts5/test/fts5rowid.test 400384798349d658eaf06aefa1e364957d5d4821 -F ext/fts5/test/fts5simple.test 426c960e51e5839c8655bca723c34a05d44dcb6d +F ext/fts5/test/fts5simple.test 06d4afbecc37f6f490a58ece4f2f7324cf2b2024 F ext/fts5/test/fts5synonym.test cf88c0a56d5ea9591e3939ef1f6e294f7f2d0671 F ext/fts5/test/fts5tokenizer.test ea4df698b35cc427ebf2ba22829d0e28386d8c89 F ext/fts5/test/fts5unicode.test fbef8d8a3b4b88470536cc57604a82ca52e51841 @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 5c83b9db46d61cfa76a1abed50467e2f02db0eb0 -R 196ea698193815c30e84c4eb112a664d +P f653fce90846b700441e8fa5f1930c1ec5e38e31 +R 2a1e06ad741b8341871247b55aface69 U dan -Z 17a552709c7d631d9413f0310567b313 +Z 2e1c3b96f1b7a9a0a6f0aa6c18cff068 diff --git a/manifest.uuid b/manifest.uuid index df5d2154c5..b69ffcc6e6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f653fce90846b700441e8fa5f1930c1ec5e38e31 \ No newline at end of file +41d17d9e24303aed6d549ea23c62b93bf2f71691 \ No newline at end of file From 2c1023df0971dbcfe7fd08525f4a746c1df7a6e7 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 5 Oct 2015 11:57:09 +0000 Subject: [PATCH 34/98] Add fts5txt2db.tcl, a tool for creating sample fts4/5 databases from text files. FossilOrigin-Name: 44f1ce30d1e446c9ee5f8bd8a62119e00356aa0e --- ext/fts5/tool/fts5txt2db.tcl | 135 +++++++++++++++++++++++++++++++++++ manifest | 11 +-- manifest.uuid | 2 +- 3 files changed, 142 insertions(+), 6 deletions(-) create mode 100644 ext/fts5/tool/fts5txt2db.tcl diff --git a/ext/fts5/tool/fts5txt2db.tcl b/ext/fts5/tool/fts5txt2db.tcl new file mode 100644 index 0000000000..23f607a801 --- /dev/null +++ b/ext/fts5/tool/fts5txt2db.tcl @@ -0,0 +1,135 @@ + + +proc usage {} { + puts stderr "$::argv0 ?OPTIONS? DATABASE FILE1..." + puts stderr "" + puts stderr "Options are" + puts stderr " -fts5" + puts stderr " -fts4" + puts stderr " -colsize " + puts stderr { +This script is designed to create fts4/5 tables with more than one column. +The -colsize option should be set to a Tcl list of integer values, one for +each column in the table. Each value is the number of tokens that will be +inserted into the column value for each row. For example, setting the -colsize +option to "5 10" creates an FTS table with 2 columns, with roughly 5 and 10 +tokens per row in each, respectively. + +Each "FILE" argument should be a text file. The contents of these text files is +split on whitespace characters to form a list of tokens. The first N1 tokens +are used for the first column of the first row, where N1 is the first element +of the -colsize list. The next N2 are used for the second column of the first +row, and so on. Rows are added to the table until the entire list of tokens +is exhausted. +} + exit -1 +} + +set O(aColsize) [list 10 10 10] +set O(tblname) t1 +set O(fts) fts5 + + +set options_with_values {-colsize} + +for {set i 0} {$i < [llength $argv]} {incr i} { + set opt [lindex $argv $i] + if {[string range $opt 0 0]!="-"} break + + if {[lsearch $options_with_values $opt]>=0} { + incr i + if {$i==[llength $argv]} usage + set val [lindex $argv $i] + } + + switch -- $opt { + -colsize { + set O(aColSize) $val + } + + -fts4 { + set O(fts) fts4 + } + + -fts5 { + set O(fts) fts5 + } + } +} + +if {$i > [llength $argv]-2} usage +set O(db) [lindex $argv $i] +set O(files) [lrange $argv [expr $i+1] end] + +foreach {k v} [lrange $argv 0 end-2] { + switch -- $k { + -colsize { + set O(aColSize) $v + } + + -colsize { + set O(aColSize) $v + } + } + +} + +sqlite3 db $O(db) +load_static_extension db fts5 + + +# Create the FTS table in the db. Return a list of the table columns. +# +proc create_table {} { + global O + set cols [list a b c d e f g h i j k l m n o p q r s t u v w x y z] + + set nCol [llength $O(aColsize)] + set cols [lrange $cols 0 [expr $nCol-1]] + + set sql "CREATE VIRTUAL TABLE IF NOT EXISTS $O(tblname) USING $O(fts) (" + append sql [join $cols ,] + append sql ");" + + db eval $sql + return $cols +} + +# Return a list of tokens from the named file. +# +proc readfile {file} { + set fd [open $file] + set data [read $fd] + close $fd + split $data +} + + +# Load all the data into a big list of tokens. +# +set tokens [list] +foreach f $O(files) { + set tokens [concat $tokens [readfile $f]] +} + +set N [llength $tokens] +set i 0 +set cols [create_table] +set sql "INSERT INTO $O(tblname) VALUES(\$[lindex $cols 0]" +foreach c [lrange $cols 1 end] { + append sql ", \$$c" +} +append sql ")" + +db eval BEGIN + while {$i < $N} { + foreach c $cols s $O(aColsize) { + set $c [lrange $tokens $i [expr $i+$s-1]] + incr i $s + } + db eval $sql + } +db eval COMMIT + + + diff --git a/manifest b/manifest index 3cf342d387..30906a1cee 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sfts5\sto\ssupport\sthe\stable\sfunction\ssyntax.\s"...\sFROM\sfts5_tbl\sWHERE\sfts5_tbl\sMATCH\s?1\sAND\srank\sMATCH\s?1"\scan\snow\sbe\swritten\s"FROM\sfts5_tbl(?1,\s?2)". -D 2015-10-03T15:38:57.855 +C Add\sfts5txt2db.tcl,\sa\stool\sfor\screating\ssample\sfts4/5\sdatabases\sfrom\stext\sfiles. +D 2015-10-05T11:57:09.832 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -183,6 +183,7 @@ F ext/fts5/test/fts5unicode3.test 35c3d02aa7acf7d43d8de3bfe32c15ba96e8928e F ext/fts5/test/fts5unindexed.test e9539d5b78c677315e7ed8ea911d4fd25437c680 F ext/fts5/test/fts5version.test 978f59541d8cef7e8591f8be2115ec5ccb863e2e F ext/fts5/test/fts5vocab.test cdf97b9678484e9bad5062edf9c9106e5c3b0c5c +F ext/fts5/tool/fts5txt2db.tcl 3d19fb8ffb234031d33d7d2151acfbc55e9cfcc4 F ext/fts5/tool/loadfts5.tcl 58e90407cc5c2b1770460119488fd7c0090d4dd3 F ext/fts5/tool/mkfts5c.tcl 5745072c7de346e18c7f491e4c3281fe8a1cfe51 F ext/fts5/tool/showfts5.tcl 9eaf6c3df352f98a2ab5ce1921dd94128ab1381d @@ -1390,7 +1391,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P f653fce90846b700441e8fa5f1930c1ec5e38e31 -R 2a1e06ad741b8341871247b55aface69 +P 41d17d9e24303aed6d549ea23c62b93bf2f71691 +R 5e8c1254946bcba6c019e513b206067f U dan -Z 2e1c3b96f1b7a9a0a6f0aa6c18cff068 +Z 56785af9a4f39d2ef982f38c897a3388 diff --git a/manifest.uuid b/manifest.uuid index b69ffcc6e6..8d0a492b28 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -41d17d9e24303aed6d549ea23c62b93bf2f71691 \ No newline at end of file +44f1ce30d1e446c9ee5f8bd8a62119e00356aa0e \ No newline at end of file From f24bebe37a546d98c60ccdb895bca6b02a91aeb7 Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 5 Oct 2015 15:39:45 +0000 Subject: [PATCH 35/98] Update fts3 so that expressions to the left and right of a NOT operator are balanced. This prevents relatively small expressions (a dozen terms or so) that are children of NOT operators from triggering the "expression tree is too large" error. FossilOrigin-Name: d6b66cd7b89fbd964f798d160a34caac0ba7347a --- ext/fts3/fts3_expr.c | 226 ++++++++++++++++++++++++------------------- manifest | 14 +-- manifest.uuid | 2 +- test/fts3expr3.test | 32 ++++++ 4 files changed, 166 insertions(+), 108 deletions(-) diff --git a/ext/fts3/fts3_expr.c b/ext/fts3/fts3_expr.c index d7cabd9919..788e5021ec 100644 --- a/ext/fts3/fts3_expr.c +++ b/ext/fts3/fts3_expr.c @@ -793,125 +793,151 @@ static int fts3ExprBalance(Fts3Expr **pp, int nMaxDepth){ rc = SQLITE_ERROR; } - if( rc==SQLITE_OK && (eType==FTSQUERY_AND || eType==FTSQUERY_OR) ){ - Fts3Expr **apLeaf; - apLeaf = (Fts3Expr **)sqlite3_malloc(sizeof(Fts3Expr *) * nMaxDepth); - if( 0==apLeaf ){ - rc = SQLITE_NOMEM; - }else{ - memset(apLeaf, 0, sizeof(Fts3Expr *) * nMaxDepth); - } - - if( rc==SQLITE_OK ){ - int i; - Fts3Expr *p; - - /* Set $p to point to the left-most leaf in the tree of eType nodes. */ - for(p=pRoot; p->eType==eType; p=p->pLeft){ - assert( p->pParent==0 || p->pParent->pLeft==p ); - assert( p->pLeft && p->pRight ); - } - - /* This loop runs once for each leaf in the tree of eType nodes. */ - while( 1 ){ - int iLvl; - Fts3Expr *pParent = p->pParent; /* Current parent of p */ - - assert( pParent==0 || pParent->pLeft==p ); - p->pParent = 0; - if( pParent ){ - pParent->pLeft = 0; - }else{ - pRoot = 0; - } - rc = fts3ExprBalance(&p, nMaxDepth-1); - if( rc!=SQLITE_OK ) break; - - for(iLvl=0; p && iLvlpLeft = apLeaf[iLvl]; - pFree->pRight = p; - pFree->pLeft->pParent = pFree; - pFree->pRight->pParent = pFree; - - p = pFree; - pFree = pFree->pParent; - p->pParent = 0; - apLeaf[iLvl] = 0; - } - } - if( p ){ - sqlite3Fts3ExprFree(p); - rc = SQLITE_TOOBIG; - break; - } - - /* If that was the last leaf node, break out of the loop */ - if( pParent==0 ) break; - - /* Set $p to point to the next leaf in the tree of eType nodes */ - for(p=pParent->pRight; p->eType==eType; p=p->pLeft); - - /* Remove pParent from the original tree. */ - assert( pParent->pParent==0 || pParent->pParent->pLeft==pParent ); - pParent->pRight->pParent = pParent->pParent; - if( pParent->pParent ){ - pParent->pParent->pLeft = pParent->pRight; - }else{ - assert( pParent==pRoot ); - pRoot = pParent->pRight; - } - - /* Link pParent into the free node list. It will be used as an - ** internal node of the new tree. */ - pParent->pParent = pFree; - pFree = pParent; + if( rc==SQLITE_OK ){ + if( (eType==FTSQUERY_AND || eType==FTSQUERY_OR) ){ + Fts3Expr **apLeaf; + apLeaf = (Fts3Expr **)sqlite3_malloc(sizeof(Fts3Expr *) * nMaxDepth); + if( 0==apLeaf ){ + rc = SQLITE_NOMEM; + }else{ + memset(apLeaf, 0, sizeof(Fts3Expr *) * nMaxDepth); } if( rc==SQLITE_OK ){ - p = 0; - for(i=0; ipParent = 0; + int i; + Fts3Expr *p; + + /* Set $p to point to the left-most leaf in the tree of eType nodes. */ + for(p=pRoot; p->eType==eType; p=p->pLeft){ + assert( p->pParent==0 || p->pParent->pLeft==p ); + assert( p->pLeft && p->pRight ); + } + + /* This loop runs once for each leaf in the tree of eType nodes. */ + while( 1 ){ + int iLvl; + Fts3Expr *pParent = p->pParent; /* Current parent of p */ + + assert( pParent==0 || pParent->pLeft==p ); + p->pParent = 0; + if( pParent ){ + pParent->pLeft = 0; + }else{ + pRoot = 0; + } + rc = fts3ExprBalance(&p, nMaxDepth-1); + if( rc!=SQLITE_OK ) break; + + for(iLvl=0; p && iLvlpLeft = apLeaf[iLvl]; pFree->pRight = p; - pFree->pLeft = apLeaf[i]; pFree->pLeft->pParent = pFree; pFree->pRight->pParent = pFree; p = pFree; pFree = pFree->pParent; p->pParent = 0; + apLeaf[iLvl] = 0; } } + if( p ){ + sqlite3Fts3ExprFree(p); + rc = SQLITE_TOOBIG; + break; + } + + /* If that was the last leaf node, break out of the loop */ + if( pParent==0 ) break; + + /* Set $p to point to the next leaf in the tree of eType nodes */ + for(p=pParent->pRight; p->eType==eType; p=p->pLeft); + + /* Remove pParent from the original tree. */ + assert( pParent->pParent==0 || pParent->pParent->pLeft==pParent ); + pParent->pRight->pParent = pParent->pParent; + if( pParent->pParent ){ + pParent->pParent->pLeft = pParent->pRight; + }else{ + assert( pParent==pRoot ); + pRoot = pParent->pRight; + } + + /* Link pParent into the free node list. It will be used as an + ** internal node of the new tree. */ + pParent->pParent = pFree; + pFree = pParent; } - pRoot = p; - }else{ - /* An error occurred. Delete the contents of the apLeaf[] array - ** and pFree list. Everything else is cleaned up by the call to - ** sqlite3Fts3ExprFree(pRoot) below. */ - Fts3Expr *pDel; - for(i=0; ipParent; - sqlite3_free(pDel); + + if( rc==SQLITE_OK ){ + p = 0; + for(i=0; ipParent = 0; + }else{ + assert( pFree!=0 ); + pFree->pRight = p; + pFree->pLeft = apLeaf[i]; + pFree->pLeft->pParent = pFree; + pFree->pRight->pParent = pFree; + + p = pFree; + pFree = pFree->pParent; + p->pParent = 0; + } + } + } + pRoot = p; + }else{ + /* An error occurred. Delete the contents of the apLeaf[] array + ** and pFree list. Everything else is cleaned up by the call to + ** sqlite3Fts3ExprFree(pRoot) below. */ + Fts3Expr *pDel; + for(i=0; ipParent; + sqlite3_free(pDel); + } } + + assert( pFree==0 ); + sqlite3_free( apLeaf ); + } + }else if( eType==FTSQUERY_NOT ){ + Fts3Expr *pLeft = pRoot->pLeft; + Fts3Expr *pRight = pRoot->pRight; + + pRoot->pLeft = 0; + pRoot->pRight = 0; + pLeft->pParent = 0; + pRight->pParent = 0; + + rc = fts3ExprBalance(&pLeft, nMaxDepth-1); + if( rc==SQLITE_OK ){ + rc = fts3ExprBalance(&pRight, nMaxDepth-1); } - assert( pFree==0 ); - sqlite3_free( apLeaf ); + if( rc!=SQLITE_OK ){ + sqlite3Fts3ExprFree(pRight); + sqlite3Fts3ExprFree(pLeft); + }else{ + assert( pLeft && pRight ); + pRoot->pLeft = pLeft; + pLeft->pParent = pRoot; + pRoot->pRight = pRight; + pRight->pParent = pRoot; + } } } - + if( rc!=SQLITE_OK ){ sqlite3Fts3ExprFree(pRoot); pRoot = 0; diff --git a/manifest b/manifest index 30906a1cee..a6a5c2b408 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sfts5txt2db.tcl,\sa\stool\sfor\screating\ssample\sfts4/5\sdatabases\sfrom\stext\sfiles. -D 2015-10-05T11:57:09.832 +C Update\sfts3\sso\sthat\sexpressions\sto\sthe\sleft\sand\sright\sof\sa\sNOT\soperator\sare\sbalanced.\sThis\sprevents\srelatively\ssmall\sexpressions\s(a\sdozen\sterms\sor\sso)\sthat\sare\schildren\sof\sNOT\soperators\sfrom\striggering\sthe\s"expression\stree\sis\stoo\slarge"\serror. +D 2015-10-05T15:39:45.681 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -82,7 +82,7 @@ F ext/fts3/fts3.c e028eb13432f108d2e22cded019fc980700e4e00 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe F ext/fts3/fts3Int.h c84125c666ee54cef6efce6ff64abb0d0e2f4535 F ext/fts3/fts3_aux.c 9edc3655fcb287f0467d0a4b886a01c6185fe9f1 -F ext/fts3/fts3_expr.c 71c063da9c2a4167fb54aec089dd5ef33a58c9cb +F ext/fts3/fts3_expr.c dfd571a24412779ac01f25c01d888c6ef7b2d0ef F ext/fts3/fts3_hash.c 29b986e43f4e9dd40110eafa377dc0d63c422c60 F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf F ext/fts3/fts3_icu.c deb46f7020d87ea7a14a433fb7a7f4bef42a9652 @@ -704,7 +704,7 @@ F test/fts3drop.test 1b906e293d6773812587b3dc458cb9e8f3f0c297 F test/fts3e.test 1f6c6ac9cc8b772ca256e6b22aaeed50c9350851 F test/fts3expr.test 3401d47b229c4504424caf362cc4ff704cad4162 F test/fts3expr2.test 18da930352e5693eaa163a3eacf96233b7290d1a -F test/fts3expr3.test 9e91b8edbcb197bf2e92161aa7696446d96dce5f +F test/fts3expr3.test c4d4a7d6327418428c96e0a3a1137c251b8dfbf8 F test/fts3expr4.test e1be1248566f43c252d4404d52914f1fc4bfa065 F test/fts3expr5.test f9abfffbf5e53d48a33e12a1e8f8ba2c551c9b49 F test/fts3fault.test da49627b280b210ebc6657f76344c7851f10ce66 @@ -1391,7 +1391,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 41d17d9e24303aed6d549ea23c62b93bf2f71691 -R 5e8c1254946bcba6c019e513b206067f +P 44f1ce30d1e446c9ee5f8bd8a62119e00356aa0e +R 0954493ffc80fb341b0df1cab997ace8 U dan -Z 56785af9a4f39d2ef982f38c897a3388 +Z 52900cdc8d31460ed8eb8d6276be0e92 diff --git a/manifest.uuid b/manifest.uuid index 8d0a492b28..a2a1d63f6e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -44f1ce30d1e446c9ee5f8bd8a62119e00356aa0e \ No newline at end of file +d6b66cd7b89fbd964f798d160a34caac0ba7347a \ No newline at end of file diff --git a/test/fts3expr3.test b/test/fts3expr3.test index a8d7319266..83c153218c 100644 --- a/test/fts3expr3.test +++ b/test/fts3expr3.test @@ -122,6 +122,8 @@ proc balanced_andor_tree {nEntry} { return $tree } +if 1 { + # Test that queries like "1 AND 2 AND 3 AND 4..." are transformed to # balanced trees by FTS. # @@ -202,5 +204,35 @@ do_faultsim_test fts3expr3-fault-1 -faults oom-* -body { faultsim_test_result [list 0 $::result] } +} + +#------------------------------------------------------------------- + +foreach {tn expr res} { + 1 {1 OR 2 OR 3 OR 4} {OR {OR {P 1} {P 2}} {OR {P 3} {P 4}}} + 2 {1 OR (2 AND 3 AND 4 AND 5)} + {OR {P 1} {AND {AND {P 2} {P 3}} {AND {P 4} {P 5}}}} + 3 {(2 AND 3 AND 4 AND 5) OR 1} + {OR {AND {AND {P 2} {P 3}} {AND {P 4} {P 5}}} {P 1}} + + 4 {1 AND (2 OR 3 OR 4 OR 5)} + {AND {P 1} {OR {OR {P 2} {P 3}} {OR {P 4} {P 5}}}} + 5 {(2 OR 3 OR 4 OR 5) AND 1} + {AND {OR {OR {P 2} {P 3}} {OR {P 4} {P 5}}} {P 1}} + + 6 {(2 OR 3 OR 4 OR 5) NOT 1} + {NOT {OR {OR {P 2} {P 3}} {OR {P 4} {P 5}}} {P 1}} + + 7 {1 NOT (2 OR 3 OR 4 OR 5)} + {NOT {P 1} {OR {OR {P 2} {P 3}} {OR {P 4} {P 5}}}} + + 8 {(1 OR 2 OR 3 OR 4) NOT (5 AND 6 AND 7 AND 8)} + {NOT {OR {OR {P 1} {P 2}} {OR {P 3} {P 4}}} {AND {AND {P 5} {P 6}} {AND {P 7} {P 8}}}} +} { + do_test 5.1.$tn { + test_fts3expr2 $expr + } $res +} + set sqlite_fts3_enable_parentheses 0 finish_test From 6f832d3dffe83401c6fe359d9bedc967f0f4282a Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 5 Oct 2015 19:41:16 +0000 Subject: [PATCH 36/98] Improve performance of prefix queries without a prefix index on fts5 tables. FossilOrigin-Name: f2f0184e9e1c9f121ee2ac864cd28c8cd8efecb5 --- ext/fts5/fts5_buffer.c | 14 +++-- ext/fts5/fts5_index.c | 136 +++++++++++++++++++++++++---------------- manifest | 14 ++--- manifest.uuid | 2 +- 4 files changed, 98 insertions(+), 68 deletions(-) diff --git a/ext/fts5/fts5_buffer.c b/ext/fts5/fts5_buffer.c index 1a7c0d0f8a..e2dbcbf141 100644 --- a/ext/fts5/fts5_buffer.c +++ b/ext/fts5/fts5_buffer.c @@ -233,13 +233,15 @@ int sqlite3Fts5PoslistWriterAppend( ){ static const i64 colmask = ((i64)(0x7FFFFFFF)) << 32; int rc = SQLITE_OK; - if( (iPos & colmask) != (pWriter->iPrev & colmask) ){ - fts5BufferAppendVarint(&rc, pBuf, 1); - fts5BufferAppendVarint(&rc, pBuf, (iPos >> 32)); - pWriter->iPrev = (iPos & colmask); + if( 0==sqlite3Fts5BufferGrow(&rc, pBuf, 5+5+5) ){ + if( (iPos & colmask) != (pWriter->iPrev & colmask) ){ + pBuf->p[pBuf->n++] = 1; + pBuf->n += sqlite3Fts5PutVarint(&pBuf->p[pBuf->n], (iPos>>32)); + pWriter->iPrev = (iPos & colmask); + } + pBuf->n += sqlite3Fts5PutVarint(&pBuf->p[pBuf->n], (iPos-pWriter->iPrev)+2); + pWriter->iPrev = iPos; } - fts5BufferAppendVarint(&rc, pBuf, (iPos - pWriter->iPrev) + 2); - pWriter->iPrev = iPos; return rc; } diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 418127a51c..490dbd7cb7 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -307,9 +307,7 @@ struct Fts5Index { }; struct Fts5DoclistIter { - u8 *a; - int n; - int i; + u8 *aEof; /* Pointer to 1 byte past end of doclist */ /* Output variables. aPoslist==0 at EOF */ i64 iRowid; @@ -3706,10 +3704,15 @@ static int fts5PoslistPrefix(const u8 *aBuf, int nMax){ return ret; } -#define fts5BufferSafeAppendBlob(pBuf, pBlob, nBlob) { \ - assert( pBuf->nSpace>=(pBuf->n+nBlob) ); \ - memcpy(&pBuf->p[pBuf->n], pBlob, nBlob); \ - pBuf->n += nBlob; \ +#define fts5BufferSafeAppendBlob(pBuf, pBlob, nBlob) { \ + assert( (pBuf)->nSpace>=((pBuf)->n+nBlob) ); \ + memcpy(&(pBuf)->p[(pBuf)->n], pBlob, nBlob); \ + (pBuf)->n += nBlob; \ +} + +#define fts5BufferSafeAppendVarint(pBuf, iVal) { \ + (pBuf)->n += sqlite3Fts5PutVarint(&(pBuf)->p[(pBuf)->n], (iVal)); \ + assert( (pBuf)->nSpace>=(pBuf)->n ); \ } /* @@ -3989,22 +3992,28 @@ static void fts5MultiIterPoslist( } static void fts5DoclistIterNext(Fts5DoclistIter *pIter){ - if( pIter->in ){ - int bDummy; - if( pIter->i ){ - i64 iDelta; - pIter->i += fts5GetVarint(&pIter->a[pIter->i], (u64*)&iDelta); - pIter->iRowid += iDelta; - }else{ - pIter->i += fts5GetVarint(&pIter->a[pIter->i], (u64*)&pIter->iRowid); - } - pIter->i += fts5GetPoslistSize( - &pIter->a[pIter->i], &pIter->nPoslist, &bDummy - ); - pIter->aPoslist = &pIter->a[pIter->i]; - pIter->i += pIter->nPoslist; - }else{ + u8 *p = pIter->aPoslist + pIter->nPoslist; + + assert( pIter->aPoslist ); + if( p>=pIter->aEof ){ pIter->aPoslist = 0; + }else{ + i64 iDelta; + + p += fts5GetVarint(p, (u64*)&iDelta); + pIter->iRowid += iDelta; + + /* Read position list size */ + if( p[0] & 0x80 ){ + int nPos; + p += fts5GetVarint32(p, nPos); + pIter->nPoslist = (nPos>>1); + }else{ + pIter->nPoslist = ((int)(p[0])) >> 1; + p++; + } + + pIter->aPoslist = p; } } @@ -4013,27 +4022,34 @@ static void fts5DoclistIterInit( Fts5DoclistIter *pIter ){ memset(pIter, 0, sizeof(*pIter)); - pIter->a = pBuf->p; - pIter->n = pBuf->n; + pIter->aPoslist = pBuf->p; + pIter->aEof = &pBuf->p[pBuf->n]; fts5DoclistIterNext(pIter); } +#if 0 /* ** Append a doclist to buffer pBuf. +** +** This function assumes that space within the buffer has already been +** allocated. */ static void fts5MergeAppendDocid( - int *pRc, /* IN/OUT: Error code */ Fts5Buffer *pBuf, /* Buffer to write to */ i64 *piLastRowid, /* IN/OUT: Previous rowid written (if any) */ i64 iRowid /* Rowid to append */ ){ - if( pBuf->n==0 ){ - fts5BufferAppendVarint(pRc, pBuf, iRowid); - }else{ - fts5BufferAppendVarint(pRc, pBuf, iRowid - *piLastRowid); - } + assert( pBuf->n!=0 || (*piLastRowid)==0 ); + fts5BufferSafeAppendVarint(pBuf, iRowid - *piLastRowid); *piLastRowid = iRowid; } +#endif + +#define fts5MergeAppendDocid(pBuf, iLastRowid, iRowid) { \ + assert( (pBuf)->n!=0 || (iLastRowid)==0 ); \ + fts5BufferSafeAppendVarint((pBuf), (iRowid) - (iLastRowid)); \ + (iLastRowid) = (iRowid); \ +} /* ** Buffers p1 and p2 contain doclists. This function merges the content @@ -4057,53 +4073,60 @@ static void fts5MergePrefixLists( memset(&out, 0, sizeof(out)); memset(&tmp, 0, sizeof(tmp)); + sqlite3Fts5BufferGrow(&p->rc, &out, p1->n + p2->n); fts5DoclistIterInit(p1, &i1); fts5DoclistIterInit(p2, &i2); while( p->rc==SQLITE_OK && (i1.aPoslist!=0 || i2.aPoslist!=0) ){ if( i2.aPoslist==0 || (i1.aPoslist && i1.iRowidrc, &out, &iLastRowid, i1.iRowid); + fts5MergeAppendDocid(&out, iLastRowid, i1.iRowid); /* WRITEPOSLISTSIZE */ - fts5BufferAppendVarint(&p->rc, &out, i1.nPoslist * 2); - fts5BufferAppendBlob(&p->rc, &out, i1.nPoslist, i1.aPoslist); + fts5BufferSafeAppendVarint(&out, i1.nPoslist * 2); + fts5BufferSafeAppendBlob(&out, i1.aPoslist, i1.nPoslist); fts5DoclistIterNext(&i1); } else if( i1.aPoslist==0 || i2.iRowid!=i1.iRowid ){ /* Copy entry from i2 */ - fts5MergeAppendDocid(&p->rc, &out, &iLastRowid, i2.iRowid); + fts5MergeAppendDocid(&out, iLastRowid, i2.iRowid); /* WRITEPOSLISTSIZE */ - fts5BufferAppendVarint(&p->rc, &out, i2.nPoslist * 2); - fts5BufferAppendBlob(&p->rc, &out, i2.nPoslist, i2.aPoslist); + fts5BufferSafeAppendVarint(&out, i2.nPoslist * 2); + fts5BufferSafeAppendBlob(&out, i2.aPoslist, i2.nPoslist); fts5DoclistIterNext(&i2); } else{ - Fts5PoslistReader r1; - Fts5PoslistReader r2; - Fts5PoslistWriter writer; + i64 iPos1 = 0; + i64 iPos2 = 0; + int iOff1 = 0; + int iOff2 = 0; + Fts5PoslistWriter writer; memset(&writer, 0, sizeof(writer)); /* Merge the two position lists. */ - fts5MergeAppendDocid(&p->rc, &out, &iLastRowid, i2.iRowid); + fts5MergeAppendDocid(&out, iLastRowid, i2.iRowid); fts5BufferZero(&tmp); - sqlite3Fts5PoslistReaderInit(-1, i1.aPoslist, i1.nPoslist, &r1); - sqlite3Fts5PoslistReaderInit(-1, i2.aPoslist, i2.nPoslist, &r2); - while( p->rc==SQLITE_OK && (r1.bEof==0 || r2.bEof==0) ){ + + sqlite3Fts5PoslistNext64(i1.aPoslist, i1.nPoslist, &iOff1, &iPos1); + sqlite3Fts5PoslistNext64(i2.aPoslist, i2.nPoslist, &iOff2, &iPos2); + + while( p->rc==SQLITE_OK && (iPos1>=0 || iPos2>=0) ){ i64 iNew; - if( r2.bEof || (r1.bEof==0 && r1.iPos=0 && iPos1rc = sqlite3Fts5PoslistWriterAppend(&tmp, &writer, iNew); } /* WRITEPOSLISTSIZE */ - fts5BufferAppendVarint(&p->rc, &out, tmp.n * 2); - fts5BufferAppendBlob(&p->rc, &out, tmp.n, tmp.p); + fts5BufferSafeAppendVarint(&out, tmp.n * 2); + fts5BufferSafeAppendBlob(&out, tmp.p, tmp.n); fts5DoclistIterNext(&i1); fts5DoclistIterNext(&i2); } @@ -4165,14 +4188,19 @@ static void fts5SetupPrefixIter( fts5BufferZero(&aBuf[i]); } } + iLastRowid = 0; } - fts5MergeAppendDocid(&p->rc, &doclist, &iLastRowid, iRowid); - fts5MultiIterPoslist(p, p1, 1, &doclist); + if( 0==sqlite3Fts5BufferGrow(&p->rc, &doclist, 9) ){ + fts5MergeAppendDocid(&doclist, iLastRowid, iRowid); + fts5MultiIterPoslist(p, p1, 1, &doclist); + } } for(i=0; irc==SQLITE_OK ){ + fts5MergePrefixLists(p, &doclist, &aBuf[i]); + } fts5BufferFree(&aBuf[i]); } fts5MultiIterFree(p, p1); diff --git a/manifest b/manifest index a6a5c2b408..5081c72572 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Update\sfts3\sso\sthat\sexpressions\sto\sthe\sleft\sand\sright\sof\sa\sNOT\soperator\sare\sbalanced.\sThis\sprevents\srelatively\ssmall\sexpressions\s(a\sdozen\sterms\sor\sso)\sthat\sare\schildren\sof\sNOT\soperators\sfrom\striggering\sthe\s"expression\stree\sis\stoo\slarge"\serror. -D 2015-10-05T15:39:45.681 +C Improve\sperformance\sof\sprefix\squeries\swithout\sa\sprefix\sindex\son\sfts5\stables. +D 2015-10-05T19:41:16.348 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -108,11 +108,11 @@ F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 F ext/fts5/fts5.h 98f802fe41481f9d797fce496f0fefcad72c7782 F ext/fts5/fts5Int.h ff78a77d819a7fc04a7f8b08b0e1ce361a3395e4 F ext/fts5/fts5_aux.c 7a307760a9c57c750d043188ec0bad59f5b5ec7e -F ext/fts5/fts5_buffer.c 64dcaf36a3ebda9e84b7c3b8788887ec325e12a4 +F ext/fts5/fts5_buffer.c 54b18497395a19dfe1d00f63a3b403e5f93d4fd1 F ext/fts5/fts5_config.c 57ee5fe71578cb494574fc0e6e51acb9a22a8695 F ext/fts5/fts5_expr.c 667faaf14a69a5683ac383acdc8d942cf32c3f93 F ext/fts5/fts5_hash.c 4bf4b99708848357b8a2b5819e509eb6d3df9246 -F ext/fts5/fts5_index.c 00d2593f94ede440ea274f8db21864cf41632aa3 +F ext/fts5/fts5_index.c ca3912a44ef5a173ef098f3454465519bd4b8e88 F ext/fts5/fts5_main.c fe5243d6bbb79217394f0ec7f4f5199ddbc9e7e8 F ext/fts5/fts5_storage.c df061a5caf9e50fbbd43113009b5b248362f4995 F ext/fts5/fts5_tcl.c 6da58d6e8f42a93c4486b5ba9b187a7f995dee37 @@ -1391,7 +1391,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 44f1ce30d1e446c9ee5f8bd8a62119e00356aa0e -R 0954493ffc80fb341b0df1cab997ace8 +P d6b66cd7b89fbd964f798d160a34caac0ba7347a +R 0053d2d2b912a0e9b79250c67681b097 U dan -Z 52900cdc8d31460ed8eb8d6276be0e92 +Z c981c12e0ed92ecd6400cdfa9ecf4084 diff --git a/manifest.uuid b/manifest.uuid index a2a1d63f6e..fcb70f5907 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d6b66cd7b89fbd964f798d160a34caac0ba7347a \ No newline at end of file +f2f0184e9e1c9f121ee2ac864cd28c8cd8efecb5 \ No newline at end of file From 8d9837acd52d5bd8212ca93c882bb4a40ef6cd76 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Tue, 6 Oct 2015 01:44:53 +0000 Subject: [PATCH 37/98] Adjustments to sqlite3MemoryBarrier() when compiling with MSVC and/or WinCE. FossilOrigin-Name: 3168326ebfa1c961d8fc6435453b02be23d910cc --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/mutex_w32.c | 5 ++++- src/sqliteInt.h | 1 + 4 files changed, 14 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 5081c72572..57806324c5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improve\sperformance\sof\sprefix\squeries\swithout\sa\sprefix\sindex\son\sfts5\stables. -D 2015-10-05T19:41:16.348 +C Adjustments\sto\ssqlite3MemoryBarrier()\swhen\scompiling\swith\sMSVC\sand/or\sWinCE. +D 2015-10-06T01:44:53.212 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -320,7 +320,7 @@ F src/mutex.c 8e45800ee78e0cd1f1f3fe8e398853307f4a085c F src/mutex.h 779d588e3b7756ec3ecf7d78cde1d84aba414f85 F src/mutex_noop.c 9d4309c075ba9cc7249e19412d3d62f7f94839c4 F src/mutex_unix.c a94b46f3f7beba307dde1b298b0f99f9c3677a93 -F src/mutex_w32.c b483d3e5914b84c82516a6a9919582f12ef3b838 +F src/mutex_w32.c 5e6fe1c298fb5a8a15aaed4161d5759311431c17 F src/notify.c 9711a7575036f0d3040ba61bc6e217f13a9888e7 F src/os.c 8fd25588eeba74068d41102d26810e216999b6c8 F src/os.h 3e57a24e2794a94d3cf2342c6d9a884888cd96bf @@ -347,7 +347,7 @@ F src/shell.c dfd18e56fcb88dd79378774e9bc3246a9bd52243 F src/sqlite.h.in 4b76d74d69af48c534c58fb723137dc6944bdedc F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad F src/sqlite3ext.h 64350bf36833a56ad675e27392a913f417c5c308 -F src/sqliteInt.h 681f38fc0decba6edcf3bad230e76fa5bf55a7bf +F src/sqliteInt.h e21cc96bc24161df7373f6b24367cf580496889d F src/sqliteLimit.h 216557999cb45f2e3578ed53ebefe228d779cb46 F src/status.c f266ad8a2892d659b74f0f50cb6a88b6e7c12179 F src/table.c 51b46b2a62d1b3a959633d593b89bab5e2c9155e @@ -1391,7 +1391,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P d6b66cd7b89fbd964f798d160a34caac0ba7347a -R 0053d2d2b912a0e9b79250c67681b097 -U dan -Z c981c12e0ed92ecd6400cdfa9ecf4084 +P f2f0184e9e1c9f121ee2ac864cd28c8cd8efecb5 +R e9c328a2763ce5ce6b257c253eecdcc8 +U mistachkin +Z 85dfdec3788a9562e3ed3a33e9d7dade diff --git a/manifest.uuid b/manifest.uuid index fcb70f5907..1515ed061b 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f2f0184e9e1c9f121ee2ac864cd28c8cd8efecb5 \ No newline at end of file +3168326ebfa1c961d8fc6435453b02be23d910cc \ No newline at end of file diff --git a/src/mutex_w32.c b/src/mutex_w32.c index 7d28e4defc..9570bdc0bf 100644 --- a/src/mutex_w32.c +++ b/src/mutex_w32.c @@ -87,7 +87,10 @@ void sqlite3MemoryBarrier(void){ SQLITE_MEMORY_BARRIER; #elif defined(__GNUC__) __sync_synchronize(); -#else +#elif !defined(SQLITE_DISABLE_INTRINSIC) && \ + defined(_MSC_VER) && _MSC_VER>=1300 + _ReadWriteBarrier(); +#elif defined(MemoryBarrier) MemoryBarrier(); #endif } diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 6c9bb06f69..15bf930618 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -196,6 +196,7 @@ # include # pragma intrinsic(_byteswap_ushort) # pragma intrinsic(_byteswap_ulong) +# pragma intrinsic(_ReadWriteBarrier) # else # include # endif From 9f1ef45f6afbea1ef46a963b25bfeb90806e0fca Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 6 Oct 2015 17:27:18 +0000 Subject: [PATCH 38/98] Fix the LIMIT and OFFSET handling for UNION ALL queries that contain a subquery with ORDER BY on the right-hand side. Fix for ticket [b65cb2c8d91f668584]. FossilOrigin-Name: 4b631364354068af95a01630469cb6fbfe8b52fd --- manifest | 15 +++-- manifest.uuid | 2 +- src/select.c | 10 +++ test/offset1.test | 161 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 180 insertions(+), 8 deletions(-) create mode 100644 test/offset1.test diff --git a/manifest b/manifest index 57806324c5..f4bc8f8a8c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Adjustments\sto\ssqlite3MemoryBarrier()\swhen\scompiling\swith\sMSVC\sand/or\sWinCE. -D 2015-10-06T01:44:53.212 +C Fix\sthe\sLIMIT\sand\sOFFSET\shandling\sfor\sUNION\sALL\squeries\sthat\scontain\sa\s\nsubquery\swith\sORDER\sBY\son\sthe\sright-hand\sside.\s\sFix\sfor\sticket\n[b65cb2c8d91f668584]. +D 2015-10-06T17:27:18.737 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -342,7 +342,7 @@ F src/printf.c 0c4bcdd1c2e2521024f0a69cb5eb334f86b3652a F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 F src/resolve.c 1954a0f01bf65d78d7d559aea3d5c67f33376d91 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e -F src/select.c e49f4af9748c9e0cc1bf864b4190aa94841c8409 +F src/select.c 8fb8cb0230aed9b12b3582ddc366ffbc549041d7 F src/shell.c dfd18e56fcb88dd79378774e9bc3246a9bd52243 F src/sqlite.h.in 4b76d74d69af48c534c58fb723137dc6944bdedc F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad @@ -900,6 +900,7 @@ F test/notify3.test 10ff25cde502e72a92053a2f215d64bece4ef934 F test/notnull.test f8fcf58669ddba79274daa2770d61dfad8274f62 F test/null.test 0dcce4f04284ec66108c503327ad6d224c0752b3 F test/numcast.test 5d126f7f581432e86a90d1e35cac625164aec4a1 +F test/offset1.test f06b83657bcf26f9ce805e67450e189e282143b2 F test/openv2.test 0d3040974bf402e19b7df4b783e447289d7ab394 F test/orderby1.test 870e150450437d3980badbde3d0166b81d9e33f6 F test/orderby2.test bc11009f7cd99d96b1b11e57b199b00633eb5b04 @@ -1391,7 +1392,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P f2f0184e9e1c9f121ee2ac864cd28c8cd8efecb5 -R e9c328a2763ce5ce6b257c253eecdcc8 -U mistachkin -Z 85dfdec3788a9562e3ed3a33e9d7dade +P 3168326ebfa1c961d8fc6435453b02be23d910cc +R 3e47dd30d61b7e1fff555418e15c6a1d +U drh +Z e6b33681aca5812f13faee0e253c4fc3 diff --git a/manifest.uuid b/manifest.uuid index 1515ed061b..b73745c378 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3168326ebfa1c961d8fc6435453b02be23d910cc \ No newline at end of file +4b631364354068af95a01630469cb6fbfe8b52fd \ No newline at end of file diff --git a/src/select.c b/src/select.c index 8430a00f37..c6c722cbc5 100644 --- a/src/select.c +++ b/src/select.c @@ -2273,6 +2273,16 @@ static int multiSelect( if( p->iLimit ){ addr = sqlite3VdbeAddOp1(v, OP_IfNot, p->iLimit); VdbeCoverage(v); VdbeComment((v, "Jump ahead if LIMIT reached")); + if( p->iOffset ){ + int addr2; + sqlite3VdbeAddOp3(v, OP_Add, p->iLimit, p->iOffset, p->iOffset+1); + addr2 = sqlite3VdbeAddOp1(v, OP_IfPos, p->iOffset); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_SCopy, p->iLimit, p->iOffset+1); + sqlite3VdbeJumpHere(v, addr2); + addr2 = sqlite3VdbeAddOp1(v, OP_IfPos, p->iLimit); VdbeCoverage(v); + sqlite3VdbeAddOp2(v, OP_Integer, -1, p->iOffset+1); + sqlite3VdbeJumpHere(v, addr2); + } } explainSetInteger(iSub2, pParse->iNextSelectId); rc = sqlite3Select(pParse, p, &dest); diff --git a/test/offset1.test b/test/offset1.test new file mode 100644 index 0000000000..91dc0b00a1 --- /dev/null +++ b/test/offset1.test @@ -0,0 +1,161 @@ +# 2015-10-06 +# +# 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 test cases for the [b65cb2c8d91f6685841d7d1e13b6] +# bug: Correct handling of LIMIT and OFFSET on a UNION ALL query where +# the right-hand SELECT contains an ORDER BY in a subquery. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl + +ifcapable !compound { + finish_test + return +} + +do_execsql_test offset1-1.1 { + CREATE TABLE t1(a,b); + INSERT INTO t1 VALUES(1,'a'),(2,'b'),(3,'c'),(4,'d'),(5,'e'); + CREATE TABLE t2(x,y); + INSERT INTO t2 VALUES(8,'y'),(9,'z'),(6,'w'),(7,'x'); + SELECT count(*) FROM t1, t2; +} {20} + +do_execsql_test offset1-1.2.0 { + SELECT a, b FROM t1 + UNION ALL + SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) + LIMIT 3 OFFSET 0; +} {1 a 2 b 3 c} +do_execsql_test offset1-1.2.1 { + SELECT a, b FROM t1 + UNION ALL + SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) + LIMIT 3 OFFSET 1; +} {2 b 3 c 4 d} +do_execsql_test offset1-1.2.2 { + SELECT a, b FROM t1 + UNION ALL + SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) + LIMIT 3 OFFSET 2; +} {3 c 4 d 5 e} +do_execsql_test offset1-1.2.3 { + SELECT a, b FROM t1 + UNION ALL + SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) + LIMIT 3 OFFSET 3; +} {4 d 5 e 6 w} +do_execsql_test offset1-1.2.4 { + SELECT a, b FROM t1 + UNION ALL + SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) + LIMIT 3 OFFSET 4; +} {5 e 6 w 7 x} +do_execsql_test offset1-1.2.5 { + SELECT a, b FROM t1 + UNION ALL + SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) + LIMIT 3 OFFSET 5; +} {6 w 7 x 8 y} +do_execsql_test offset1-1.2.6 { + SELECT a, b FROM t1 + UNION ALL + SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) + LIMIT 3 OFFSET 6; +} {7 x 8 y 9 z} +do_execsql_test offset1-1.2.7 { + SELECT a, b FROM t1 + UNION ALL + SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) + LIMIT 3 OFFSET 7; +} {8 y 9 z} +do_execsql_test offset1-1.2.8 { + SELECT a, b FROM t1 + UNION ALL + SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) + LIMIT 3 OFFSET 8; +} {9 z} +do_execsql_test offset1-1.2.9 { + SELECT a, b FROM t1 + UNION ALL + SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) + LIMIT 3 OFFSET 9; +} {} + +do_execsql_test offset1-1.3.0 { + SELECT * FROM t1 LIMIT 0; +} {} + +do_execsql_test offset1-1.4.0 { + SELECT a, b FROM t1 + UNION ALL + SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) + LIMIT 0 OFFSET 1; +} {} +do_execsql_test offset1-1.4.1 { + SELECT a, b FROM t1 + UNION ALL + SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) + LIMIT 1 OFFSET 1; +} {2 b} +do_execsql_test offset1-1.4.2 { + SELECT a, b FROM t1 + UNION ALL + SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) + LIMIT 2 OFFSET 1; +} {2 b 3 c} +do_execsql_test offset1-1.4.3 { + SELECT a, b FROM t1 + UNION ALL + SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) + LIMIT 3 OFFSET 1; +} {2 b 3 c 4 d} +do_execsql_test offset1-1.4.4 { + SELECT a, b FROM t1 + UNION ALL + SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) + LIMIT 4 OFFSET 1; +} {2 b 3 c 4 d 5 e} +do_execsql_test offset1-1.4.5 { + SELECT a, b FROM t1 + UNION ALL + SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) + LIMIT 5 OFFSET 1; +} {2 b 3 c 4 d 5 e 6 w} +do_execsql_test offset1-1.4.6 { + SELECT a, b FROM t1 + UNION ALL + SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) + LIMIT 6 OFFSET 1; +} {2 b 3 c 4 d 5 e 6 w 7 x} +do_execsql_test offset1-1.4.7 { + SELECT a, b FROM t1 + UNION ALL + SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) + LIMIT 7 OFFSET 1; +} {2 b 3 c 4 d 5 e 6 w 7 x 8 y} +do_execsql_test offset1-1.4.8 { + SELECT a, b FROM t1 + UNION ALL + SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) + LIMIT 8 OFFSET 1; +} {2 b 3 c 4 d 5 e 6 w 7 x 8 y 9 z} +do_execsql_test offset1-1.4.9 { + SELECT a, b FROM t1 + UNION ALL + SELECT * FROM (SELECT x, y FROM t2 ORDER BY y) + LIMIT 9 OFFSET 1; +} {2 b 3 c 4 d 5 e 6 w 7 x 8 y 9 z} + + + +finish_test From a2507137f337255ccc708b7bfcda1ac54181fbcf Mon Sep 17 00:00:00 2001 From: dan Date: Tue, 6 Oct 2015 20:53:26 +0000 Subject: [PATCH 39/98] Optimizations for fts5 expressions that filter on column. More still to come. FossilOrigin-Name: bf1607ac155018573ca40fb58aca62c5fea7e60b --- ext/fts5/fts5Int.h | 20 ++++- ext/fts5/fts5_expr.c | 11 +-- ext/fts5/fts5_index.c | 136 ++++++++++++++++++++++++++++++---- ext/fts5/fts5_vocab.c | 2 +- ext/fts5/test/fts5prefix.test | 83 +++++++++++++++++++++ ext/fts5/test/fts5simple.test | 11 +++ manifest | 24 +++--- manifest.uuid | 2 +- 8 files changed, 249 insertions(+), 40 deletions(-) diff --git a/ext/fts5/fts5Int.h b/ext/fts5/fts5Int.h index 99b07bfb2f..3ab8dcdc93 100644 --- a/ext/fts5/fts5Int.h +++ b/ext/fts5/fts5Int.h @@ -81,6 +81,20 @@ extern int sqlite3_fts5_may_be_corrupt; #endif typedef struct Fts5Global Fts5Global; +typedef struct Fts5ExprColset Fts5ExprColset; + +/* If a NEAR() clump or phrase may only match a specific set of columns, +** then an object of the following type is used to record the set of columns. +** Each entry in the aiCol[] array is a column that may be matched. +** +** This object is used by fts5_expr.c and fts5_index.c. +*/ +struct Fts5ExprColset { + int nCol; + int aiCol[1]; +}; + + /************************************************************************** ** Interface to code in fts5_config.c. fts5_config.c contains contains code @@ -305,7 +319,7 @@ int sqlite3Fts5IndexClose(Fts5Index *p); /* ** for( -** pIter = sqlite3Fts5IndexQuery(p, "token", 5, 0); +** sqlite3Fts5IndexQuery(p, "token", 5, 0, 0, &pIter); ** 0==sqlite3Fts5IterEof(pIter); ** sqlite3Fts5IterNext(pIter) ** ){ @@ -321,7 +335,8 @@ int sqlite3Fts5IndexQuery( Fts5Index *p, /* FTS index to query */ const char *pToken, int nToken, /* Token (or prefix) to query for */ int flags, /* Mask of FTS5INDEX_QUERY_X flags */ - Fts5IndexIter **ppIter + Fts5ExprColset *pColset, /* Match these columns only */ + Fts5IndexIter **ppIter /* OUT: New iterator object */ ); /* @@ -567,7 +582,6 @@ typedef struct Fts5Parse Fts5Parse; typedef struct Fts5Token Fts5Token; typedef struct Fts5ExprPhrase Fts5ExprPhrase; typedef struct Fts5ExprNearset Fts5ExprNearset; -typedef struct Fts5ExprColset Fts5ExprColset; struct Fts5Token { const char *p; /* Token text (not NULL terminated) */ diff --git a/ext/fts5/fts5_expr.c b/ext/fts5/fts5_expr.c index 559f0db82b..9b0c262301 100644 --- a/ext/fts5/fts5_expr.c +++ b/ext/fts5/fts5_expr.c @@ -89,16 +89,6 @@ struct Fts5ExprPhrase { Fts5ExprTerm aTerm[1]; /* Terms that make up this phrase */ }; -/* -** If a NEAR() clump may only match a specific set of columns, then -** Fts5ExprNearset.pColset points to an object of the following type. -** Each entry in the aiCol[] array -*/ -struct Fts5ExprColset { - int nCol; - int aiCol[1]; -}; - /* ** One or more phrases that must appear within a certain token distance of ** each other within each matching document. @@ -1002,6 +992,7 @@ static int fts5ExprNearInitAll( pExpr->pIndex, p->zTerm, strlen(p->zTerm), (pTerm->bPrefix ? FTS5INDEX_QUERY_PREFIX : 0) | (pExpr->bDesc ? FTS5INDEX_QUERY_DESC : 0), + pNear->pColset, &p->pIter ); assert( rc==SQLITE_OK || p->pIter==0 ); diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 490dbd7cb7..46aff77728 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -3942,12 +3942,81 @@ int sqlite3Fts5IndexMerge(Fts5Index *p, int nMerge){ static void fts5PoslistCallback( Fts5Index *p, - void *pCtx, + void *pContext, const u8 *pChunk, int nChunk ){ assert_nc( nChunk>=0 ); if( nChunk>0 ){ - fts5BufferAppendBlob(&p->rc, (Fts5Buffer*)pCtx, nChunk, pChunk); + fts5BufferAppendBlob(&p->rc, (Fts5Buffer*)pContext, nChunk, pChunk); + } +} + +typedef struct PoslistCallbackCtx PoslistCallbackCtx; +struct PoslistCallbackCtx { + Fts5Buffer *pBuf; /* Append to this buffer */ + Fts5ExprColset *pColset; /* Restrict matches to this column */ + int eState; /* See above */ +}; + +/* +** TODO: Make this more efficient! +*/ +static int fts5IndexColsetTest(Fts5ExprColset *pColset, int iCol){ + int i; + for(i=0; inCol; i++){ + if( pColset->aiCol[i]==iCol ) return 1; + } + return 0; +} + +static void fts5PoslistFilterCallback( + Fts5Index *p, + void *pContext, + const u8 *pChunk, int nChunk +){ + PoslistCallbackCtx *pCtx = (PoslistCallbackCtx*)pContext; + assert_nc( nChunk>=0 ); + if( nChunk>0 ){ + /* Search through to find the first varint with value 1. This is the + ** start of the next columns hits. */ + int i = 0; + int iStart = 0; + + if( pCtx->eState==2 ){ + int iCol; + fts5IndexGetVarint32(pChunk, i, iCol); + if( fts5IndexColsetTest(pCtx->pColset, iCol) ){ + pCtx->eState = 1; + fts5BufferAppendVarint(&p->rc, pCtx->pBuf, 1); + }else{ + pCtx->eState = 0; + } + } + + do { + while( ieState ){ + fts5BufferAppendBlob(&p->rc, pCtx->pBuf, i-iStart, &pChunk[iStart]); + } + if( i=nChunk ){ + pCtx->eState = 2; + }else{ + fts5IndexGetVarint32(pChunk, i, iCol); + pCtx->eState = fts5IndexColsetTest(pCtx->pColset, iCol); + if( pCtx->eState ){ + fts5BufferAppendBlob(&p->rc, pCtx->pBuf, i-iStart, &pChunk[iStart]); + iStart = i; + } + } + } + }while( irc. It is assumed ** no error has already occurred when this function is called. */ -static void fts5MultiIterPoslist( +static int fts5MultiIterPoslist( Fts5Index *p, Fts5IndexIter *pMulti, + Fts5ExprColset *pColset, int bSz, /* Append a size field before the data */ Fts5Buffer *pBuf ){ if( p->rc==SQLITE_OK ){ + int iSz; + int iData; + Fts5SegIter *pSeg = &pMulti->aSeg[ pMulti->aFirst[1].iFirst ]; assert( fts5MultiIterEof(p, pMulti)==0 ); if( bSz ){ /* WRITEPOSLISTSIZE */ + iSz = pBuf->n; fts5BufferAppendVarint(&p->rc, pBuf, pSeg->nPos*2); + iData = pBuf->n; + } + + fts5SegiterPoslist(p, pSeg, pColset, pBuf); + + if( bSz && pColset ){ + int nActual = pBuf->n - iData; + if( nActual!=pSeg->nPos ){ + /* WRITEPOSLISTSIZE */ + if( nActual==0 ){ + return 1; + }else{ + int nReq = sqlite3Fts5GetVarintLen((u32)(nActual*2)); + while( iSz<(iData-nReq) ){ pBuf->p[iSz++] = 0x80; } + sqlite3Fts5PutVarint(&pBuf->p[iSz], nActual*2); + } + } } - fts5SegiterPoslist(p, pSeg, pBuf); } + + return 0; } static void fts5DoclistIterNext(Fts5DoclistIter *pIter){ @@ -4149,7 +4251,8 @@ static void fts5SetupPrefixIter( int bDesc, /* True for "ORDER BY rowid DESC" */ const u8 *pToken, /* Buffer containing prefix to match */ int nToken, /* Size of buffer pToken in bytes */ - Fts5IndexIter **ppIter /* OUT: New iterator */ + Fts5ExprColset *pColset, /* Restrict matches to these columns */ + Fts5IndexIter **ppIter /* OUT: New iterator */ ){ Fts5Structure *pStruct; Fts5Buffer *aBuf; @@ -4192,8 +4295,14 @@ static void fts5SetupPrefixIter( } if( 0==sqlite3Fts5BufferGrow(&p->rc, &doclist, 9) ){ - fts5MergeAppendDocid(&doclist, iLastRowid, iRowid); - fts5MultiIterPoslist(p, p1, 1, &doclist); + int iSave = doclist.n; + assert( doclist.n!=0 || iLastRowid==0 ); + fts5BufferSafeAppendVarint(&doclist, iRowid - iLastRowid); + if( fts5MultiIterPoslist(p, p1, pColset, 1, &doclist) ){ + doclist.n = iSave; + }else{ + iLastRowid = iRowid; + } } } @@ -4427,6 +4536,7 @@ int sqlite3Fts5IndexQuery( Fts5Index *p, /* FTS index to query */ const char *pToken, int nToken, /* Token (or prefix) to query for */ int flags, /* Mask of FTS5INDEX_QUERY_X flags */ + Fts5ExprColset *pColset, /* Match these columns only */ Fts5IndexIter **ppIter /* OUT: New iterator object */ ){ Fts5Config *pConfig = p->pConfig; @@ -4470,7 +4580,7 @@ int sqlite3Fts5IndexQuery( }else{ int bDesc = (flags & FTS5INDEX_QUERY_DESC)!=0; buf.p[0] = FTS5_MAIN_PREFIX; - fts5SetupPrefixIter(p, bDesc, buf.p, nToken+1, &pRet); + fts5SetupPrefixIter(p, bDesc, buf.p, nToken+1, pColset, &pRet); } if( p->rc ){ @@ -4572,7 +4682,7 @@ int sqlite3Fts5IterPoslist( *pp = &pSeg->pLeaf->p[pSeg->iLeafOffset]; }else{ fts5BufferZero(&pIter->poslist); - fts5SegiterPoslist(pIter->pIndex, pSeg, &pIter->poslist); + fts5SegiterPoslist(pIter->pIndex, pSeg, 0, &pIter->poslist); *pp = pIter->poslist.p; } return fts5IndexReturn(pIter->pIndex); @@ -4588,7 +4698,7 @@ int sqlite3Fts5IterPoslistBuffer(Fts5IndexIter *pIter, Fts5Buffer *pBuf){ assert( p->rc==SQLITE_OK ); fts5BufferZero(pBuf); - fts5MultiIterPoslist(p, pIter, 0, pBuf); + fts5MultiIterPoslist(p, pIter, 0, 0, pBuf); return fts5IndexReturn(p); } @@ -4763,7 +4873,7 @@ static int fts5QueryCksum( ){ u64 cksum = *pCksum; Fts5IndexIter *pIdxIter = 0; - int rc = sqlite3Fts5IndexQuery(p, z, n, flags, &pIdxIter); + int rc = sqlite3Fts5IndexQuery(p, z, n, flags, 0, &pIdxIter); while( rc==SQLITE_OK && 0==sqlite3Fts5IterEof(pIdxIter) ){ i64 dummy; @@ -5137,7 +5247,7 @@ int sqlite3Fts5IndexIntegrityCheck(Fts5Index *p, u64 cksum){ fts5TestTerm(p, &term, z, n, cksum2, &cksum3); poslist.n = 0; - fts5MultiIterPoslist(p, pIter, 0, &poslist); + fts5MultiIterPoslist(p, pIter, 0, 0, &poslist); while( 0==sqlite3Fts5PoslistNext64(poslist.p, poslist.n, &iOff, &iPos) ){ int iCol = FTS5_POS2COLUMN(iPos); int iTokOff = FTS5_POS2OFFSET(iPos); diff --git a/ext/fts5/fts5_vocab.c b/ext/fts5/fts5_vocab.c index bdf2e36b63..1f80adc372 100644 --- a/ext/fts5/fts5_vocab.c +++ b/ext/fts5/fts5_vocab.c @@ -402,7 +402,7 @@ static int fts5VocabFilterMethod( const int flags = FTS5INDEX_QUERY_SCAN; fts5VocabResetCursor(pCsr); - rc = sqlite3Fts5IndexQuery(pCsr->pIndex, 0, 0, flags, &pCsr->pIter); + rc = sqlite3Fts5IndexQuery(pCsr->pIndex, 0, 0, flags, 0, &pCsr->pIter); if( rc==SQLITE_OK ){ rc = fts5VocabNextMethod(pCursor); } diff --git a/ext/fts5/test/fts5prefix.test b/ext/fts5/test/fts5prefix.test index 076ecaa09b..f4fcc4bfa3 100644 --- a/ext/fts5/test/fts5prefix.test +++ b/ext/fts5/test/fts5prefix.test @@ -62,6 +62,89 @@ foreach {tn q res} { do_execsql_test 2.3.$tn $q $res } +#------------------------------------------------------------------------- +# Check that prefix queries with: +# +# * a column filter, and +# * no prefix index. +# +# work Ok. +# +do_execsql_test 3.0 { + CREATE VIRTUAL TABLE t3 USING fts5(a, b, c); + INSERT INTO t3(t3, rank) VALUES('pgsz', 32); + BEGIN; + INSERT INTO t3 VALUES('acb ccc bba', 'cca bba bca', 'bbc ccc bca'); -- 1 + INSERT INTO t3 VALUES('cbb cac cab', 'abb aac bba', 'aab ccc cac'); -- 2 + INSERT INTO t3 VALUES('aac bcb aac', 'acb bcb caa', 'aca bab bca'); -- 3 + INSERT INTO t3 VALUES('aab ccb ccc', 'aca cba cca', 'aca aac cbb'); -- 4 + INSERT INTO t3 VALUES('bac aab bab', 'ccb bac cba', 'acb aba abb'); -- 5 + INSERT INTO t3 VALUES('bab abc ccb', 'acb cba abb', 'cbb aaa cab'); -- 6 + INSERT INTO t3 VALUES('cbb bbc baa', 'aab aca baa', 'bcc cca aca'); -- 7 + INSERT INTO t3 VALUES('abc bba abb', 'cac abc cba', 'acc aac cac'); -- 8 + INSERT INTO t3 VALUES('bbc bbc cab', 'bcb ccb cba', 'bcc cac acb'); -- 9 + COMMIT; +} + +foreach {tn match res} { + 1 "a : c*" {1 2 4 6 7 9} + 2 "b : c*" {1 3 4 5 6 8 9} + 3 "c : c*" {1 2 4 6 7 8 9} + 4 "a : b*" {1 3 5 6 7 8 9} + 5 "b : b*" {1 2 3 5 7 9} + 6 "c : b*" {1 3 7 9} + 7 "a : a*" {1 3 4 5 6 8} + 8 "b : a*" {2 3 4 6 7 8} + 9 "c : a*" {2 3 4 5 6 7 8 9} +} { + do_execsql_test 3.1.$tn { + SELECT rowid FROM t3($match) + } $res +} + +do_test 3.2 { + expr srand(0) + execsql { DELETE FROM t3 } + for {set i 0} {$i < 1000} {incr i} { + set a [fts5_rnddoc 3] + set b [fts5_rnddoc 8] + set c [fts5_rnddoc 20] + execsql { INSERT INTO t3 VALUES($a, $b, $c) } + } + execsql { INSERT INTO t3(t3) VALUES('integrity-check') } +} {} + +proc gmatch {col pattern} { + expr {[lsearch -glob $col $pattern]>=0} +} +db func gmatch gmatch + +for {set x 0} {$x<2} {incr x} { + foreach {tn pattern} { + 1 {xa*} + 2 {xb*} + 3 {xc*} + 4 {xd*} + 5 {xe*} + 6 {xf*} + 7 {xg*} + 8 {xh*} + 9 {xi*} + 10 {xj*} + } { + foreach col {b} { + set res [db eval "SELECT rowid FROM t3 WHERE gmatch($col, '$pattern')"] + set query "$col : $pattern" + do_execsql_test 3.3.$x.$tn.$col { + SELECT rowid FROM t3($query); + } $res + } + } + execsql { INSERT INTO t3(t3) VALUES('optimize') } + execsql { INSERT INTO t3(t3) VALUES('integrity-check') } +} + finish_test + diff --git a/ext/fts5/test/fts5simple.test b/ext/fts5/test/fts5simple.test index ecdb11080c..77407f5e2c 100644 --- a/ext/fts5/test/fts5simple.test +++ b/ext/fts5/test/fts5simple.test @@ -239,6 +239,17 @@ do_execsql_test 9.3 { SELECT rowid FROM ft2('b AND c'); } {2} +#------------------------------------------------------------------------- +# +do_execsql_test 10.0 { + CREATE VIRTUAL TABLE t3 USING fts5(a, b, c); + INSERT INTO t3 VALUES('bac aab bab', 'c bac c', 'acb aba abb'); -- 1 + INSERT INTO t3 VALUES('bab abc c', 'acb c abb', 'c aaa c'); -- 2 +} + +do_execsql_test 10.1 { + SELECT rowid FROM t3('c: c*'); +} {2} finish_test diff --git a/manifest b/manifest index f4bc8f8a8c..b5fce18292 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sLIMIT\sand\sOFFSET\shandling\sfor\sUNION\sALL\squeries\sthat\scontain\sa\s\nsubquery\swith\sORDER\sBY\son\sthe\sright-hand\sside.\s\sFix\sfor\sticket\n[b65cb2c8d91f668584]. -D 2015-10-06T17:27:18.737 +C Optimizations\sfor\sfts5\sexpressions\sthat\sfilter\son\scolumn.\sMore\sstill\sto\scome. +D 2015-10-06T20:53:26.753 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -106,13 +106,13 @@ F ext/fts3/unicode/mkunicode.tcl 95cf7ec186e48d4985e433ff8a1c89090a774252 F ext/fts3/unicode/parseunicode.tcl da577d1384810fb4e2b209bf3313074353193e95 F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 F ext/fts5/fts5.h 98f802fe41481f9d797fce496f0fefcad72c7782 -F ext/fts5/fts5Int.h ff78a77d819a7fc04a7f8b08b0e1ce361a3395e4 +F ext/fts5/fts5Int.h eba5b20f1049a8908f867ff1b59299f49bb392a4 F ext/fts5/fts5_aux.c 7a307760a9c57c750d043188ec0bad59f5b5ec7e F ext/fts5/fts5_buffer.c 54b18497395a19dfe1d00f63a3b403e5f93d4fd1 F ext/fts5/fts5_config.c 57ee5fe71578cb494574fc0e6e51acb9a22a8695 -F ext/fts5/fts5_expr.c 667faaf14a69a5683ac383acdc8d942cf32c3f93 +F ext/fts5/fts5_expr.c bd2618ceaaadadbc8a4792ba977b393d2d1d3a08 F ext/fts5/fts5_hash.c 4bf4b99708848357b8a2b5819e509eb6d3df9246 -F ext/fts5/fts5_index.c ca3912a44ef5a173ef098f3454465519bd4b8e88 +F ext/fts5/fts5_index.c 11687c48902238e1fedb0bb8e1e8b5b8f6d82e1c F ext/fts5/fts5_main.c fe5243d6bbb79217394f0ec7f4f5199ddbc9e7e8 F ext/fts5/fts5_storage.c df061a5caf9e50fbbd43113009b5b248362f4995 F ext/fts5/fts5_tcl.c 6da58d6e8f42a93c4486b5ba9b187a7f995dee37 @@ -120,7 +120,7 @@ F ext/fts5/fts5_test_mi.c e96be827aa8f571031e65e481251dc1981d608bf F ext/fts5/fts5_tokenize.c f380f46f341af9c9a9908e1aade685ba1eaa157a F ext/fts5/fts5_unicode2.c 78273fbd588d1d9bd0a7e4e0ccc9207348bae33c F ext/fts5/fts5_varint.c 3f86ce09cab152e3d45490d7586b7ed2e40c13f1 -F ext/fts5/fts5_vocab.c 4622e0b7d84a488a1585aaa56eb214ee67a988bc +F ext/fts5/fts5_vocab.c 17320c476a5296ee475ab616d95fd10515bacfec F ext/fts5/fts5parse.y 833db1101b78c0c47686ab1b84918e38c36e9452 F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba F ext/fts5/test/fts5_common.tcl b6e6a40ef5d069c8e86ca4fbad491e1195485dbc @@ -169,12 +169,12 @@ F ext/fts5/test/fts5optimize.test 42741e7c085ee0a1276140a752d4407d97c2c9f5 F ext/fts5/test/fts5plan.test 6a55ecbac9890765b0e16f8c421c7e0888cfe436 F ext/fts5/test/fts5porter.test 7cdc07bef301d70eebbfa75dcaf45c3680e1d0e1 F ext/fts5/test/fts5porter2.test 2e65633d58a1c525d5af0f6c01e5a59155bb3487 -F ext/fts5/test/fts5prefix.test 552a462f0e8595676611f41643de217fb4ac2808 +F ext/fts5/test/fts5prefix.test 5d4fd42696789843ff98a62f4b84e3f66ecad9d6 F ext/fts5/test/fts5rank.test 11dcebba31d822f7e99685b4ea2c2ae3ec0b16f1 F ext/fts5/test/fts5rebuild.test 03935f617ace91ed23a6099c7c74d905227ff29b F ext/fts5/test/fts5restart.test c17728fdea26e7d0f617d22ad5b4b2862b994c17 F ext/fts5/test/fts5rowid.test 400384798349d658eaf06aefa1e364957d5d4821 -F ext/fts5/test/fts5simple.test 06d4afbecc37f6f490a58ece4f2f7324cf2b2024 +F ext/fts5/test/fts5simple.test 84d22123e0a7584f1ffb6efcd37eee46f317ab90 F ext/fts5/test/fts5synonym.test cf88c0a56d5ea9591e3939ef1f6e294f7f2d0671 F ext/fts5/test/fts5tokenizer.test ea4df698b35cc427ebf2ba22829d0e28386d8c89 F ext/fts5/test/fts5unicode.test fbef8d8a3b4b88470536cc57604a82ca52e51841 @@ -1392,7 +1392,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 3168326ebfa1c961d8fc6435453b02be23d910cc -R 3e47dd30d61b7e1fff555418e15c6a1d -U drh -Z e6b33681aca5812f13faee0e253c4fc3 +P 4b631364354068af95a01630469cb6fbfe8b52fd +R 8d25a208807a117d422df371476abd9e +U dan +Z f7ba9c7b6fd75653c93e200489a4e473 diff --git a/manifest.uuid b/manifest.uuid index b73745c378..709fd4d260 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4b631364354068af95a01630469cb6fbfe8b52fd \ No newline at end of file +bf1607ac155018573ca40fb58aca62c5fea7e60b \ No newline at end of file From 8b0cf38a12157db112d5fcd3c17074d4f8cdd84d Mon Sep 17 00:00:00 2001 From: drh Date: Tue, 6 Oct 2015 21:07:06 +0000 Subject: [PATCH 40/98] Simplifications to the VDBE bytecode that handles LIMIT and OFFSET. FossilOrigin-Name: 041df7c2f14b95868a08090354ebb3308050790e --- manifest | 18 +++++++++--------- manifest.uuid | 2 +- src/pragma.c | 11 ++++++----- src/select.c | 28 ++++++++-------------------- src/vdbe.c | 40 +++++++++++++++++++++++----------------- 5 files changed, 47 insertions(+), 52 deletions(-) diff --git a/manifest b/manifest index b5fce18292..3a6b97649f 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Optimizations\sfor\sfts5\sexpressions\sthat\sfilter\son\scolumn.\sMore\sstill\sto\scome. -D 2015-10-06T20:53:26.753 +C Simplifications\sto\sthe\sVDBE\sbytecode\sthat\shandles\sLIMIT\sand\sOFFSET. +D 2015-10-06T21:07:06.319 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -335,14 +335,14 @@ F src/parse.y f599aa5e871a493330d567ced93de696f61f48f7 F src/pcache.c 24be750c79272e0ca7b6e007bc94999700f3e5ef F src/pcache.h 9968603796240cdf83da7e7bef76edf90619cea9 F src/pcache1.c e822007159d53a7ea7aa040d6e28964ddb6de083 -F src/pragma.c 234814978bcd35bce6e2874dfb2f5b5e28e7fb38 +F src/pragma.c dcfe3a35d2de935feeaba1455528b4a5c4f1208c F src/pragma.h 631a91c8b0e6ca8f051a1d8a4a0da4150e04620a F src/prepare.c 82e5db1013846a819f198336fed72c44c974e7b1 F src/printf.c 0c4bcdd1c2e2521024f0a69cb5eb334f86b3652a F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 F src/resolve.c 1954a0f01bf65d78d7d559aea3d5c67f33376d91 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e -F src/select.c 8fb8cb0230aed9b12b3582ddc366ffbc549041d7 +F src/select.c 2c4bfdf7c797df9b43121ed7850bf939b6f27405 F src/shell.c dfd18e56fcb88dd79378774e9bc3246a9bd52243 F src/sqlite.h.in 4b76d74d69af48c534c58fb723137dc6944bdedc F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad @@ -405,7 +405,7 @@ F src/update.c a134027f59c7eb6e63ed18e2d5dd8ef0ce7f8ff8 F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c F src/util.c fc612367108b74573c5fd13a85d0a23027f438bd F src/vacuum.c 2ddd5cad2a7b9cef7f9e431b8c7771634c6b1701 -F src/vdbe.c 5048103aa6bc9c01bf1a4620729256d1e873bb6c +F src/vdbe.c d263ec6b29d8e8e8178235b8403a00ccb48748d0 F src/vdbe.h 4bc88bd0e06f8046ee6ab7487c0015e85ad949ad F src/vdbeInt.h 8b867eac234e28627ffcace3cd4b4b79bbec664b F src/vdbeapi.c 020681b943e77766b32ae1cddf86d7831b7374ca @@ -1392,7 +1392,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 4b631364354068af95a01630469cb6fbfe8b52fd -R 8d25a208807a117d422df371476abd9e -U dan -Z f7ba9c7b6fd75653c93e200489a4e473 +P bf1607ac155018573ca40fb58aca62c5fea7e60b +R f75f4370adf88bb173a9ed2d414ba858 +U drh +Z 3f5b7bfbaf5afcf9be7e111589aea155 diff --git a/manifest.uuid b/manifest.uuid index 709fd4d260..9a61b499bb 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bf1607ac155018573ca40fb58aca62c5fea7e60b \ No newline at end of file +041df7c2f14b95868a08090354ebb3308050790e \ No newline at end of file diff --git a/src/pragma.c b/src/pragma.c index e5e7e54a29..64614a7ebc 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -1361,8 +1361,9 @@ void sqlite3Pragma( */ static const int iLn = VDBE_OFFSET_LINENO(2); static const VdbeOpList endCode[] = { - { OP_IfNeg, 1, 0, 0}, /* 0 */ - { OP_String8, 0, 3, 0}, /* 1 */ + { OP_AddImm, 1, 0, 0}, /* 0 */ + { OP_If, 1, 0, 0}, /* 1 */ + { OP_String8, 0, 3, 0}, /* 2 */ { OP_ResultRow, 3, 1, 0}, }; @@ -1563,9 +1564,9 @@ void sqlite3Pragma( } } addr = sqlite3VdbeAddOpList(v, ArraySize(endCode), endCode, iLn); - sqlite3VdbeChangeP3(v, addr, -mxErr); - sqlite3VdbeJumpHere(v, addr); - sqlite3VdbeChangeP4(v, addr+1, "ok", P4_STATIC); + sqlite3VdbeChangeP2(v, addr, -mxErr); + sqlite3VdbeJumpHere(v, addr+1); + sqlite3VdbeChangeP4(v, addr+2, "ok", P4_STATIC); } break; #endif /* SQLITE_OMIT_INTEGRITY_CHECK */ diff --git a/src/select.c b/src/select.c index c6c722cbc5..548030fb14 100644 --- a/src/select.c +++ b/src/select.c @@ -579,7 +579,7 @@ static void pushOntoSorter( }else{ iLimit = pSelect->iLimit; } - addr = sqlite3VdbeAddOp3(v, OP_IfNotZero, iLimit, 0, -1); VdbeCoverage(v); + addr = sqlite3VdbeAddOp3(v, OP_IfNotZero, iLimit, 0, 1); VdbeCoverage(v); sqlite3VdbeAddOp1(v, OP_Last, pSort->iECursor); sqlite3VdbeAddOp1(v, OP_Delete, pSort->iECursor); sqlite3VdbeJumpHere(v, addr); @@ -595,11 +595,8 @@ static void codeOffset( int iContinue /* Jump here to skip the current record */ ){ if( iOffset>0 ){ - int addr; - addr = sqlite3VdbeAddOp3(v, OP_IfNeg, iOffset, 0, -1); VdbeCoverage(v); - sqlite3VdbeGoto(v, iContinue); - VdbeComment((v, "skip OFFSET records")); - sqlite3VdbeJumpHere(v, addr); + sqlite3VdbeAddOp3(v, OP_IfPos, iOffset, iContinue, 1); VdbeCoverage(v); + VdbeComment((v, "OFFSET")); } } @@ -1815,7 +1812,7 @@ static void computeLimitRegisters(Parse *pParse, Select *p, int iBreak){ Vdbe *v = 0; int iLimit = 0; int iOffset; - int addr1, n; + int n; if( p->iLimit ) return; /* @@ -1850,14 +1847,10 @@ static void computeLimitRegisters(Parse *pParse, Select *p, int iBreak){ sqlite3ExprCode(pParse, p->pOffset, iOffset); sqlite3VdbeAddOp1(v, OP_MustBeInt, iOffset); VdbeCoverage(v); VdbeComment((v, "OFFSET counter")); - addr1 = sqlite3VdbeAddOp1(v, OP_IfPos, iOffset); VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Integer, 0, iOffset); - sqlite3VdbeJumpHere(v, addr1); + sqlite3VdbeAddOp3(v, OP_SetIfNotPos, iOffset, iOffset, 0); sqlite3VdbeAddOp3(v, OP_Add, iLimit, iOffset, iOffset+1); VdbeComment((v, "LIMIT+OFFSET")); - addr1 = sqlite3VdbeAddOp1(v, OP_IfPos, iLimit); VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Integer, -1, iOffset+1); - sqlite3VdbeJumpHere(v, addr1); + sqlite3VdbeAddOp3(v, OP_SetIfNotPos, iLimit, iOffset+1, -1); } } } @@ -2274,14 +2267,9 @@ static int multiSelect( addr = sqlite3VdbeAddOp1(v, OP_IfNot, p->iLimit); VdbeCoverage(v); VdbeComment((v, "Jump ahead if LIMIT reached")); if( p->iOffset ){ - int addr2; + sqlite3VdbeAddOp3(v, OP_SetIfNotPos, p->iOffset, p->iOffset, 0); sqlite3VdbeAddOp3(v, OP_Add, p->iLimit, p->iOffset, p->iOffset+1); - addr2 = sqlite3VdbeAddOp1(v, OP_IfPos, p->iOffset); VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_SCopy, p->iLimit, p->iOffset+1); - sqlite3VdbeJumpHere(v, addr2); - addr2 = sqlite3VdbeAddOp1(v, OP_IfPos, p->iLimit); VdbeCoverage(v); - sqlite3VdbeAddOp2(v, OP_Integer, -1, p->iOffset+1); - sqlite3VdbeJumpHere(v, addr2); + sqlite3VdbeAddOp3(v, OP_SetIfNotPos, p->iLimit, p->iOffset+1, -1); } } explainSetInteger(iSub2, pParse->iNextSelectId); diff --git a/src/vdbe.c b/src/vdbe.c index 23338879c5..6dfe52c4eb 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -5671,12 +5671,12 @@ case OP_MemMax: { /* in2 */ } #endif /* SQLITE_OMIT_AUTOINCREMENT */ -/* Opcode: IfPos P1 P2 * * * -** Synopsis: if r[P1]>0 goto P2 +/* Opcode: IfPos P1 P2 P3 * * +** Synopsis: if r[P1]>0 then r[P1]-=P3, goto P2 ** ** Register P1 must contain an integer. -** If the value of register P1 is 1 or greater, jump to P2 and -** add the literal value P3 to register P1. +** If the value of register P1 is 1 or greater, subtrace P3 from the +** value in P1 and jump to P2. ** ** If the initial value of register P1 is less than 1, then the ** value is unchanged and control passes through to the next instruction. @@ -5685,38 +5685,44 @@ case OP_IfPos: { /* jump, in1 */ pIn1 = &aMem[pOp->p1]; assert( pIn1->flags&MEM_Int ); VdbeBranchTaken( pIn1->u.i>0, 2); - if( pIn1->u.i>0 ) goto jump_to_p2; + if( pIn1->u.i>0 ){ + pIn1->u.i -= pOp->p3; + goto jump_to_p2; + } break; } -/* Opcode: IfNeg P1 P2 P3 * * -** Synopsis: r[P1]+=P3, if r[P1]<0 goto P2 +/* Opcode: SetIfNotPos P1 P2 P3 * * +** Synopsis: if r[P1]<=0 then r[P2]=P3 ** -** Register P1 must contain an integer. Add literal P3 to the value in -** register P1 then if the value of register P1 is less than zero, jump to P2. +** Register P1 must contain an integer. +** If the value of register P1 is not positive (if it is less than 1) then +** set the value of register P2 to be the integer P3. */ -case OP_IfNeg: { /* jump, in1 */ +case OP_SetIfNotPos: { /* in1, in2 */ pIn1 = &aMem[pOp->p1]; assert( pIn1->flags&MEM_Int ); - pIn1->u.i += pOp->p3; - VdbeBranchTaken(pIn1->u.i<0, 2); - if( pIn1->u.i<0 ) goto jump_to_p2; + if( pIn1->u.i<=0 ){ + pOut = out2Prerelease(p, pOp); + pOut->u.i = pOp->p3; + } break; } /* Opcode: IfNotZero P1 P2 P3 * * -** Synopsis: if r[P1]!=0 then r[P1]+=P3, goto P2 +** Synopsis: if r[P1]!=0 then r[P1]-=P3, goto P2 ** ** Register P1 must contain an integer. If the content of register P1 is -** initially nonzero, then add P3 to P1 and jump to P2. If register P1 is -** initially zero, leave it unchanged and fall through. +** initially nonzero, then subtrace P3 from the value in register P1 and +** jump to P2. If register P1 is initially zero, leave it unchanged +** and fall through. */ case OP_IfNotZero: { /* jump, in1 */ pIn1 = &aMem[pOp->p1]; assert( pIn1->flags&MEM_Int ); VdbeBranchTaken(pIn1->u.i<0, 2); if( pIn1->u.i ){ - pIn1->u.i += pOp->p3; + pIn1->u.i -= pOp->p3; goto jump_to_p2; } break; From 91a3ecb0adbc7a31f52f658c5c0ad8da1211aa55 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Tue, 6 Oct 2015 21:49:55 +0000 Subject: [PATCH 41/98] Fix typo in comments. No changes to code. FossilOrigin-Name: a05f903c64edeba8a9748aad68f5981943e68b3c --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/vdbe.c | 4 ++-- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/manifest b/manifest index 3a6b97649f..94ed523dd1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Simplifications\sto\sthe\sVDBE\sbytecode\sthat\shandles\sLIMIT\sand\sOFFSET. -D 2015-10-06T21:07:06.319 +C Fix\stypo\sin\scomments.\s\sNo\schanges\sto\scode. +D 2015-10-06T21:49:55.351 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -405,7 +405,7 @@ F src/update.c a134027f59c7eb6e63ed18e2d5dd8ef0ce7f8ff8 F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c F src/util.c fc612367108b74573c5fd13a85d0a23027f438bd F src/vacuum.c 2ddd5cad2a7b9cef7f9e431b8c7771634c6b1701 -F src/vdbe.c d263ec6b29d8e8e8178235b8403a00ccb48748d0 +F src/vdbe.c 1e0bf8d6a2308ce916d444ef399921407fd5d972 F src/vdbe.h 4bc88bd0e06f8046ee6ab7487c0015e85ad949ad F src/vdbeInt.h 8b867eac234e28627ffcace3cd4b4b79bbec664b F src/vdbeapi.c 020681b943e77766b32ae1cddf86d7831b7374ca @@ -1392,7 +1392,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P bf1607ac155018573ca40fb58aca62c5fea7e60b -R f75f4370adf88bb173a9ed2d414ba858 -U drh -Z 3f5b7bfbaf5afcf9be7e111589aea155 +P 041df7c2f14b95868a08090354ebb3308050790e +R 72391e64c737a55be96785cd3a34723b +U mistachkin +Z 9b5c49931764975f112a79c84d53a6bb diff --git a/manifest.uuid b/manifest.uuid index 9a61b499bb..54924d9b33 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -041df7c2f14b95868a08090354ebb3308050790e \ No newline at end of file +a05f903c64edeba8a9748aad68f5981943e68b3c \ No newline at end of file diff --git a/src/vdbe.c b/src/vdbe.c index 6dfe52c4eb..455befeafb 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -5675,7 +5675,7 @@ case OP_MemMax: { /* in2 */ ** Synopsis: if r[P1]>0 then r[P1]-=P3, goto P2 ** ** Register P1 must contain an integer. -** If the value of register P1 is 1 or greater, subtrace P3 from the +** If the value of register P1 is 1 or greater, subtract P3 from the ** value in P1 and jump to P2. ** ** If the initial value of register P1 is less than 1, then the @@ -5713,7 +5713,7 @@ case OP_SetIfNotPos: { /* in1, in2 */ ** Synopsis: if r[P1]!=0 then r[P1]-=P3, goto P2 ** ** Register P1 must contain an integer. If the content of register P1 is -** initially nonzero, then subtrace P3 from the value in register P1 and +** initially nonzero, then subtract P3 from the value in register P1 and ** jump to P2. If register P1 is initially zero, leave it unchanged ** and fall through. */ From ee3814878549729b37b51927564783e3e8dcf8ef Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 7 Oct 2015 00:35:18 +0000 Subject: [PATCH 42/98] Remove three obsolete and unused files from tool/ FossilOrigin-Name: 0abd65294e6e8db68e7ce6724f02f17ba1cb3422 --- manifest | 15 +++--- manifest.uuid | 2 +- tool/diffdb.c | 44 ------------------ tool/opcodeDoc.awk | 23 --------- tool/space_used.tcl | 111 -------------------------------------------- 5 files changed, 7 insertions(+), 188 deletions(-) delete mode 100644 tool/diffdb.c delete mode 100644 tool/opcodeDoc.awk delete mode 100644 tool/space_used.tcl diff --git a/manifest b/manifest index 94ed523dd1..662c7dfb6d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\stypo\sin\scomments.\s\sNo\schanges\sto\scode. -D 2015-10-06T21:49:55.351 +C Remove\sthree\sobsolete\sand\sunused\sfiles\sfrom\stool/ +D 2015-10-07T00:35:18.445 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -1339,7 +1339,6 @@ F test/zerodamage.test cf6748bad89553cc1632be51a6f54e487e4039ac F tool/build-all-msvc.bat 761d8c82a1a529261291812732a853a1b4256d85 x F tool/build-shell.sh 950f47c6174f1eea171319438b93ba67ff5bf367 F tool/checkSpacing.c 810e51703529a204fc4e1eb060e9ab663e3c06d2 -F tool/diffdb.c 7524b1b5df217c20cd0431f6789851a4e0cb191b F tool/extract.c 054069d81b095fbdc189a6f5d4466e40380505e2 F tool/fast_vacuum.c 5ba0d6f5963a0a63bdc42840f678bad75b2ebce1 F tool/fragck.tcl 5265a95126abcf6ab357f7efa544787e5963f439 @@ -1363,7 +1362,6 @@ F tool/mksqlite3internalh.tcl eb994013e833359137eb53a55acdad0b5ae1049b F tool/mkvsix.tcl bbe57cd9ae11c6cc70319241101ef8d2b8c3765b F tool/offsets.c fe4262fdfa378e8f5499a42136d17bf3b98f6091 F tool/omittest.tcl 34d7ac01fe4fd18e3637f64abe12c40eca0f6b97 -F tool/opcodeDoc.awk b3a2a3d5d3075b8bd90b7afe24283efdd586659c F tool/pagesig.c ff0ca355fd3c2398e933da5e22439bbff89b803b F tool/restore_jrnl.tcl 6957a34f8f1f0f8285e07536225ec3b292a9024a F tool/rollback-test.c 9fc98427d1e23e84429d7e6d07d9094fbdec65a5 @@ -1373,7 +1371,6 @@ F tool/showlocks.c 9920bcc64f58378ff1118caead34147201f48c68 F tool/showstat4.c 9515faa8ec176599d4a8288293ba8ec61f7b728a F tool/showwal.c 85cb36d4fe3e93e2fbd63e786e0d1ce42d0c4fad F tool/soak1.tcl 8d407956e1a45b485a8e072470a3e629a27037fe -F tool/space_used.tcl f714c41a59e326b8b9042f415b628b561bafa06b F tool/spaceanal.tcl 93c1fdc9733c525b17a2024c7df193daa002e037 F tool/speedtest.tcl 06c76698485ccf597b9e7dbb1ac70706eb873355 F tool/speedtest16.c c8a9c793df96db7e4933f0852abb7a03d48f2e81 @@ -1392,7 +1389,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 041df7c2f14b95868a08090354ebb3308050790e -R 72391e64c737a55be96785cd3a34723b -U mistachkin -Z 9b5c49931764975f112a79c84d53a6bb +P a05f903c64edeba8a9748aad68f5981943e68b3c +R d4529eb5d734c0707e0a910200ff6fc6 +U drh +Z 8d61b7e9a6e9a2f3b2856a04c9b6debc diff --git a/manifest.uuid b/manifest.uuid index 54924d9b33..c3e287c668 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a05f903c64edeba8a9748aad68f5981943e68b3c \ No newline at end of file +0abd65294e6e8db68e7ce6724f02f17ba1cb3422 \ No newline at end of file diff --git a/tool/diffdb.c b/tool/diffdb.c deleted file mode 100644 index 0537d38723..0000000000 --- a/tool/diffdb.c +++ /dev/null @@ -1,44 +0,0 @@ -/* -** A utility for printing the differences between two SQLite database files. -*/ -#include -#include -#include -#include -#include -#include -#include - - -#define PAGESIZE 1024 -static int db1 = -1; -static int db2 = -1; - -int main(int argc, char **argv){ - int iPg; - unsigned char a1[PAGESIZE], a2[PAGESIZE]; - if( argc!=3 ){ - fprintf(stderr,"Usage: %s FILENAME FILENAME\n", argv[0]); - exit(1); - } - db1 = open(argv[1], O_RDONLY); - if( db1<0 ){ - fprintf(stderr,"%s: can't open %s\n", argv[0], argv[1]); - exit(1); - } - db2 = open(argv[2], O_RDONLY); - if( db2<0 ){ - fprintf(stderr,"%s: can't open %s\n", argv[0], argv[2]); - exit(1); - } - iPg = 1; - while( read(db1, a1, PAGESIZE)==PAGESIZE && read(db2,a2,PAGESIZE)==PAGESIZE ){ - if( memcmp(a1,a2,PAGESIZE) ){ - printf("Page %d\n", iPg); - } - iPg++; - } - printf("%d pages checked\n", iPg-1); - close(db1); - close(db2); -} diff --git a/tool/opcodeDoc.awk b/tool/opcodeDoc.awk deleted file mode 100644 index 492010624f..0000000000 --- a/tool/opcodeDoc.awk +++ /dev/null @@ -1,23 +0,0 @@ -# -# Extract opcode documentation for sqliteVdbe.c and generate HTML -# -BEGIN { - print "" - print "

    SQLite Virtual Database Engine Opcodes

    " - print "" -} -/ Opcode: /,/\*\// { - if( $2=="Opcode:" ){ - printf "\n\n" - }else if( NF>1 ){ - sub(/^ *\*\* /,"") - gsub(/" -} diff --git a/tool/space_used.tcl b/tool/space_used.tcl deleted file mode 100644 index 2044aa38c5..0000000000 --- a/tool/space_used.tcl +++ /dev/null @@ -1,111 +0,0 @@ -# Run this TCL script using "testfixture" in order get a report that shows -# how much disk space is used by a particular data to actually store data -# versus how much space is unused. -# - -# Get the name of the database to analyze -# -if {[llength $argv]!=1} { - puts stderr "Usage: $argv0 database-name" - exit 1 -} -set file_to_analyze [lindex $argv 0] - -# Open the database -# -sqlite db [lindex $argv 0] -set DB [btree_open [lindex $argv 0]] - -# Output the schema for the generated report -# -puts \ -{BEGIN; -CREATE TABLE space_used( - name clob, -- Name of a table or index in the database file - is_index boolean, -- TRUE if it is an index, false for a table - payload int, -- Total amount of data stored in this table or index - pri_pages int, -- Number of primary pages used - ovfl_pages int, -- Number of overflow pages used - pri_unused int, -- Number of unused bytes on primary pages - ovfl_unused int -- Number of unused bytes on overflow pages -);} - -# This query will be used to find the root page number for every index and -# table in the database. -# -set sql { - SELECT name, type, rootpage FROM sqlite_master - UNION ALL - SELECT 'sqlite_master', 'table', 2 - ORDER BY 1 -} - -# Initialize variables used for summary statistics. -# -set total_size 0 -set total_primary 0 -set total_overflow 0 -set total_unused_primary 0 -set total_unused_ovfl 0 - -# Analyze every table in the database, one at a time. -# -foreach {name type rootpage} [db eval $sql] { - set cursor [btree_cursor $DB $rootpage 0] - set go [btree_first $cursor] - set size 0 - catch {unset pg_used} - set unused_ovfl 0 - set n_overflow 0 - while {$go==0} { - set payload [btree_payload_size $cursor] - incr size $payload - set stat [btree_cursor_dump $cursor] - set pgno [lindex $stat 0] - set freebytes [lindex $stat 4] - set pg_used($pgno) $freebytes - if {$payload>238} { - set n [expr {($payload-238+1019)/1020}] - incr n_overflow $n - incr unused_ovfl [expr {$n*1020+238-$payload}] - } - set go [btree_next $cursor] - } - btree_close_cursor $cursor - set n_primary [llength [array names pg_used]] - set unused_primary 0 - foreach x [array names pg_used] {incr unused_primary $pg_used($x)} - regsub -all ' $name '' name - puts -nonewline "INSERT INTO space_used VALUES('$name'" - puts -nonewline ",[expr {$type=="index"}]" - puts ",$size,$n_primary,$n_overflow,$unused_primary,$unused_ovfl);" - incr total_size $size - incr total_primary $n_primary - incr total_overflow $n_overflow - incr total_unused_primary $unused_primary - incr total_unused_ovfl $unused_ovfl -} - -# Output summary statistics: -# -puts "-- Total payload size: $total_size" -puts "-- Total pages used: $total_primary primary and $total_overflow overflow" -set file_pgcnt [expr {[file size [lindex $argv 0]]/1024}] -puts -nonewline "-- Total unused bytes on primary pages: $total_unused_primary" -if {$total_primary>0} { - set upp [expr {$total_unused_primary/$total_primary}] - puts " (avg $upp bytes/page)" -} else { - puts "" -} -puts -nonewline "-- Total unused bytes on overflow pages: $total_unused_ovfl" -if {$total_overflow>0} { - set upp [expr {$total_unused_ovfl/$total_overflow}] - puts " (avg $upp bytes/page)" -} else { - puts "" -} -set n_free [expr {$file_pgcnt-$total_primary-$total_overflow}] -if {$n_free>0} {incr n_free -1} -puts "-- Total pages on freelist: $n_free" -puts "COMMIT;" From b15393b8d5efbae17b68a1e5d92e9b9f4473f76f Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 7 Oct 2015 02:52:09 +0000 Subject: [PATCH 43/98] Change mkopcodeh.awk into tool/mkopcodeh.tcl. FossilOrigin-Name: ed0ebc460b54939862e3bddee2bb9bcb9f69c747 --- Makefile.in | 4 +- Makefile.msc | 4 +- main.mk | 4 +- manifest | 21 +++-- manifest.uuid | 2 +- mkopcodeh.awk | 228 -------------------------------------------- tool/mkopcodeh.tcl | 230 +++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 249 insertions(+), 244 deletions(-) delete mode 100644 mkopcodeh.awk create mode 100644 tool/mkopcodeh.tcl diff --git a/Makefile.in b/Makefile.in index 5c78abde94..20c8420d34 100644 --- a/Makefile.in +++ b/Makefile.in @@ -902,8 +902,8 @@ tclsqlite3$(TEXE): tclsqlite-shell.lo libsqlite3.la opcodes.c: opcodes.h $(TOP)/mkopcodec.awk $(NAWK) -f $(TOP)/mkopcodec.awk opcodes.h >opcodes.c -opcodes.h: parse.h $(TOP)/src/vdbe.c $(TOP)/mkopcodeh.awk - cat parse.h $(TOP)/src/vdbe.c | $(NAWK) -f $(TOP)/mkopcodeh.awk >opcodes.h +opcodes.h: parse.h $(TOP)/src/vdbe.c $(TOP)/tool/mkopcodeh.tcl + cat parse.h $(TOP)/src/vdbe.c | $(TCLSH_CMD) $(TOP)/tool/mkopcodeh.tcl >opcodes.h # Rules to build parse.c and parse.h - the outputs of lemon. # diff --git a/Makefile.msc b/Makefile.msc index 678b547fed..124761757d 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -1575,8 +1575,8 @@ tclsqlite3.exe: tclsqlite-shell.lo $(SQLITE3C) $(LIBRESOBJS) opcodes.c: opcodes.h $(TOP)\mkopcodec.awk $(NAWK) -f $(TOP)\mkopcodec.awk opcodes.h > opcodes.c -opcodes.h: parse.h $(TOP)\src\vdbe.c $(TOP)\mkopcodeh.awk - type parse.h $(TOP)\src\vdbe.c | $(NAWK) -f $(TOP)\mkopcodeh.awk > opcodes.h +opcodes.h: parse.h $(TOP)\src\vdbe.c $(TOP)\tool\mkopcodeh.tcl + type parse.h $(TOP)\src\vdbe.c | $(TCLSH_CMD) $(TOP)\tool\mkopcodeh.awk > opcodes.h # Rules to build parse.c and parse.h - the outputs of lemon. # diff --git a/main.mk b/main.mk index cded12e5a3..cc413faca2 100644 --- a/main.mk +++ b/main.mk @@ -582,9 +582,9 @@ tclsqlite.o: $(TOP)/src/tclsqlite.c $(HDR) opcodes.c: opcodes.h $(TOP)/mkopcodec.awk $(NAWK) -f $(TOP)/mkopcodec.awk opcodes.h >opcodes.c -opcodes.h: parse.h $(TOP)/src/vdbe.c $(TOP)/mkopcodeh.awk +opcodes.h: parse.h $(TOP)/src/vdbe.c $(TOP)/tool/mkopcodeh.tcl cat parse.h $(TOP)/src/vdbe.c | \ - $(NAWK) -f $(TOP)/mkopcodeh.awk >opcodes.h + tclsh $(TOP)/tool/mkopcodeh.tcl >opcodes.h # Rules to build parse.c and parse.h - the outputs of lemon. # diff --git a/manifest b/manifest index 662c7dfb6d..1a4dd94095 100644 --- a/manifest +++ b/manifest @@ -1,9 +1,9 @@ -C Remove\sthree\sobsolete\sand\sunused\sfiles\sfrom\stool/ -D 2015-10-07T00:35:18.445 +C Change\smkopcodeh.awk\sinto\stool/mkopcodeh.tcl. +D 2015-10-07T02:52:09.315 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f -F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 +F Makefile.in dd1f363468240142a5be1c9d58014dc9b8eae2f4 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 -F Makefile.msc b9054642ab305be4174d8b0433c9951c2839701d +F Makefile.msc 8fb99d7b4e8b2e812a2360b8356d956d26e0e953 F Makefile.vxworks e1b65dea203f054e71653415bd8f96dcaed47858 F README.md 8ecc12493ff9f820cdea6520a9016001cb2e59b7 F VERSION ccfc4d1576dbfdeece0a4372a2e6a2e37d3e7975 @@ -263,9 +263,8 @@ F ext/userauth/userauth.c 5fa3bdb492f481bbc1709fc83c91ebd13460c69e F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk 151fcaba704fdeeb0a1941857ef6e1d6216732d8 +F main.mk 9fe51a296a2550282db357d2b3825cc32fbc455b F mkopcodec.awk c2ff431854d702cdd2d779c9c0d1f58fa16fa4ea -F mkopcodeh.awk 0e7f04a8eb90f92259e47d80110e4e98d7ce337a F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 @@ -1352,6 +1351,7 @@ F tool/loadfts.c c3c64e4d5e90e8ba41159232c2189dba4be7b862 F tool/logest.c eef612f8adf4d0993dafed0416064cf50d5d33c6 F tool/mkautoconfamal.sh d1a2da0e15b2ed33d60af35c7e9d483f13a8eb9f F tool/mkkeywordhash.c dfff09dbbfaf950e89af294f48f902181b144670 +F tool/mkopcodeh.tcl e04177031532b7aa9379ded50e820231ac4abd6e F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e F tool/mkpragmatab.tcl 84af2b180484323a2ea22a2279e8bd9e3e1e492e F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 @@ -1389,7 +1389,10 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P a05f903c64edeba8a9748aad68f5981943e68b3c -R d4529eb5d734c0707e0a910200ff6fc6 +P 0abd65294e6e8db68e7ce6724f02f17ba1cb3422 +R 33730b016d975e72f95dcd99735ce552 +T *branch * omit-awk +T *sym-omit-awk * +T -sym-trunk * U drh -Z 8d61b7e9a6e9a2f3b2856a04c9b6debc +Z 05cb2395dd6fc47d133085b2716a644b diff --git a/manifest.uuid b/manifest.uuid index c3e287c668..7bf1ca41d8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0abd65294e6e8db68e7ce6724f02f17ba1cb3422 \ No newline at end of file +ed0ebc460b54939862e3bddee2bb9bcb9f69c747 \ No newline at end of file diff --git a/mkopcodeh.awk b/mkopcodeh.awk deleted file mode 100644 index 474ae4f3b4..0000000000 --- a/mkopcodeh.awk +++ /dev/null @@ -1,228 +0,0 @@ -#!/usr/bin/awk -f -# -# Generate the file opcodes.h. -# -# This AWK script scans a concatenation of the parse.h output file from the -# parser and the vdbe.c source file in order to generate the opcodes numbers -# for all opcodes. -# -# The lines of the vdbe.c that we are interested in are of the form: -# -# case OP_aaaa: /* same as TK_bbbbb */ -# -# The TK_ comment is optional. If it is present, then the value assigned to -# the OP_ is the same as the TK_ value. If missing, the OP_ value is assigned -# a small integer that is different from every other OP_ value. -# -# We go to the trouble of making some OP_ values the same as TK_ values -# as an optimization. During parsing, things like expression operators -# are coded with TK_ values such as TK_ADD, TK_DIVIDE, and so forth. Later -# during code generation, we need to generate corresponding opcodes like -# OP_Add and OP_Divide. By making TK_ADD==OP_Add and TK_DIVIDE==OP_Divide, -# code to translate from one to the other is avoided. This makes the -# code generator run (infinitesimally) faster and more importantly it makes -# the library footprint smaller. -# -# This script also scans for lines of the form: -# -# case OP_aaaa: /* jump, in1, in2, in3, out2-prerelease, out3 */ -# -# When such comments are found on an opcode, it means that certain -# properties apply to that opcode. Set corresponding flags using the -# OPFLG_INITIALIZER macro. -# - - -# Remember the TK_ values from the parse.h file -/^#define TK_/ { - tk[$2] = 0+$3 # tk[x] holds the numeric value for TK symbol X -} - -# Find "/* Opcode: " lines in the vdbe.c file. Each one introduces -# a new opcode. Remember which parameters are used. -/^.. Opcode: / { - currentOp = "OP_" $3 - m = 0 - for(i=4; i<=NF; i++){ - x = $i - if( x=="P1" ) m += 1 - if( x=="P2" ) m += 2 - if( x=="P3" ) m += 4 - if( x=="P4" ) m += 8 - if( x=="P5" ) m += 16 - } - paramused[currentOp] = m -} - -# Find "** Synopsis: " lines that follow Opcode: -/^.. Synopsis: / { - if( currentOp ){ - x = $3 - for(i=4; i<=NF; i++){ - x = x " " $i - } - synopsis[currentOp] = x - } -} - -# Scan for "case OP_aaaa:" lines in the vdbe.c file -/^case OP_/ { - name = $2 - sub(/:/,"",name) - sub("\r","",name) - op[name] = -1 # op[x] holds the numeric value for OP symbol x - jump[name] = 0 - in1[name] = 0 - in2[name] = 0 - in3[name] = 0 - out2[name] = 0 - out3[name] = 0 - for(i=3; i=0 ) continue; - if( name=="OP_Transaction" \ - || name=="OP_AutoCommit" \ - || name=="OP_Savepoint" \ - || name=="OP_Checkpoint" \ - || name=="OP_Vacuum" \ - || name=="OP_JournalMode" \ - || name=="OP_VUpdate" \ - || name=="OP_VFilter" \ - || name=="OP_Next" \ - || name=="OP_NextIfOpen" \ - || name=="OP_SorterNext" \ - || name=="OP_Prev" \ - || name=="OP_PrevIfOpen" \ - ){ - cnt++ - while( used[cnt] ) cnt++ - op[name] = cnt - used[cnt] = 1 - def[cnt] = name - } - } - - # Generate the numeric values for opcodes - for(i=0; i=0} { + incr cnt + while {[info exists used($cnt)]} {incr cnt} + set op($name) $cnt + set used($cnt) 1 + set def($cnt) $name + } +} + +# Generate the numeric values for remaining opcodes +# +for {set i 0} {$i<$nOp} {incr i} { + set name $order($i) + if {$op($name)<0} { + incr cnt + while {[info exists used($cnt)]} {incr cnt} + set op($name) $cnt + set used($cnt) 1 + set def($cnt) $name + } +} +set max $cnt +for {set i 1} {$i<=$nOp} {incr i} { + if {![info exists used($i)]} { + set def($i) "OP_NotUsed_$i" + } + set name $def($i) + puts -nonewline [format {#define %-16s %3d} $name $i] + set com {} + if {[info exists sameas($i)]} { + set com "same as $sameas($i)" + } + if {[info exists synopsis($name)]} { + set x $synopsis($name) + if {$com==""} { + set com "synopsis: $x" + } else { + append com ", synopsis: $x" + } + } + if {$com!=""} { + puts -nonewline [format " /* %-42s */" $com] + } + puts "" +} + +# Generate the bitvectors: +# +set bv(0) 0 +for {set i 1} {$i<=$max} {incr i} { + set name $def($i) + if {[info exists jump($name)] && $jump($name)} {set a0 1} {set a0 0} + if {[info exists in1($name)] && $in1($name)} {set a1 2} {set a1 0} + if {[info exists in2($name)] && $in2($name)} {set a2 4} {set a2 0} + if {[info exists in3($name)] && $in3($name)} {set a3 8} {set a3 0} + if {[info exists out2($name)] && $out2($name)} {set a4 16} {set a4 0} + if {[info exists out3($name)] && $out3($name)} {set a5 32} {set a5 0} + set bv($i) [expr {$a0+$a1+$a2+$a3+$a4+$a5}] +} +puts "" +puts "/* Properties such as \"out2\" or \"jump\" that are specified in" +puts "** comments following the \"case\" for each opcode in the vdbe.c" +puts "** are encoded into bitvectors as follows:" +puts "*/" +puts "#define OPFLG_JUMP 0x0001 /* jump: P2 holds jmp target */" +puts "#define OPFLG_IN1 0x0002 /* in1: P1 is an input */" +puts "#define OPFLG_IN2 0x0004 /* in2: P2 is an input */" +puts "#define OPFLG_IN3 0x0008 /* in3: P3 is an input */" +puts "#define OPFLG_OUT2 0x0010 /* out2: P2 is an output */" +puts "#define OPFLG_OUT3 0x0020 /* out3: P3 is an output */" +puts "#define OPFLG_INITIALIZER \173\\" +for {set i 0} {$i<=$max} {incr i} { + if {$i%8==0} { + puts -nonewline [format "/* %3d */" $i] + } + puts -nonewline [format " 0x%02x," $bv($i)] + if {$i%8==7} { + puts "\\" + } +} +puts "\175" From 6bd7456edd405cf5db4e54079a3516eab3875e16 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Wed, 7 Oct 2015 03:07:41 +0000 Subject: [PATCH 44/98] When running tests on Tcl 8.6 under Windows, skip tests 'uri-1.12.*' due to a change in Tcl behavior related to NTFS ADS (alternate data streams). FossilOrigin-Name: 8a0a2aa5a6df3d7b5995457b57f051e39d6cf9e9 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/uri.test | 8 ++++++++ 3 files changed, 16 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 662c7dfb6d..dc0bcca20a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sthree\sobsolete\sand\sunused\sfiles\sfrom\stool/ -D 2015-10-07T00:35:18.445 +C When\srunning\stests\son\sTcl\s8.6\sunder\sWindows,\sskip\stests\s'uri-1.12.*'\sdue\sto\sa\schange\sin\sTcl\sbehavior\srelated\sto\sNTFS\sADS\s(alternate\sdata\sstreams). +D 2015-10-07T03:07:41.412 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -1243,7 +1243,7 @@ F test/unique2.test 3674e9f2a3f1fbbfd4772ac74b7a97090d0f77d2 F test/unixexcl.test cd6c765f75e50e8e2c2ba763149e5d340ea19825 F test/unordered.test ca7adce0419e4ca0c50f039885e76ed2c531eda8 F test/update.test 6c68446b8a0a33d522a7c72b320934596a2d7d32 -F test/uri.test 23662b7b61958b0f0e47082de7d06341ccf85d5b +F test/uri.test 1864342401046f8741d6040da9dbc6fbd3c032a1 F test/userauth01.test e740a2697a7b40d7c5003a7d7edaee16acd349a9 F test/utf16align.test 54cd35a27c005a9b6e7815d887718780b6a462ae F test/vacuum.test ce91c39f7f91a4273bf620efad21086b5aa6ef1d @@ -1389,7 +1389,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P a05f903c64edeba8a9748aad68f5981943e68b3c -R d4529eb5d734c0707e0a910200ff6fc6 -U drh -Z 8d61b7e9a6e9a2f3b2856a04c9b6debc +P 0abd65294e6e8db68e7ce6724f02f17ba1cb3422 +R 5358569f2baa63663f07678b869229da +U mistachkin +Z e72fb6725790034f4f337251024aae57 diff --git a/manifest.uuid b/manifest.uuid index c3e287c668..2ae93081f2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0abd65294e6e8db68e7ce6724f02f17ba1cb3422 \ No newline at end of file +8a0a2aa5a6df3d7b5995457b57f051e39d6cf9e9 \ No newline at end of file diff --git a/test/uri.test b/test/uri.test index dd78783ddd..3acb3baa92 100644 --- a/test/uri.test +++ b/test/uri.test @@ -63,6 +63,14 @@ foreach {tn uri file} { # if {$tn>14} break + # + # NOTE: When running on Tcl 8.6 (or higher?) on Windows, a colon within + # the file name no longer tries to access an alternate data stream + # (ADS) named "test.db" for the "http" file, causing some spurious + # failures of this test. + # + if {$tn==12 && $::tcl_version>=8.6} break + # # NOTE: On Windows, we need to account for the fact that the current # directory does not start with a forward slash. From 6418ffab8272dce0584e5d4f7d1e2039a2af8961 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Wed, 7 Oct 2015 04:20:34 +0000 Subject: [PATCH 45/98] Fix a typo in the previous check-in. FossilOrigin-Name: 80027709c3ba2a8c9bda4d37779f65104be1045c --- manifest | 12 ++++++------ manifest.uuid | 2 +- test/uri.test | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index dc0bcca20a..6c17fe9621 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C When\srunning\stests\son\sTcl\s8.6\sunder\sWindows,\sskip\stests\s'uri-1.12.*'\sdue\sto\sa\schange\sin\sTcl\sbehavior\srelated\sto\sNTFS\sADS\s(alternate\sdata\sstreams). -D 2015-10-07T03:07:41.412 +C Fix\sa\stypo\sin\sthe\sprevious\scheck-in. +D 2015-10-07T04:20:34.157 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -1243,7 +1243,7 @@ F test/unique2.test 3674e9f2a3f1fbbfd4772ac74b7a97090d0f77d2 F test/unixexcl.test cd6c765f75e50e8e2c2ba763149e5d340ea19825 F test/unordered.test ca7adce0419e4ca0c50f039885e76ed2c531eda8 F test/update.test 6c68446b8a0a33d522a7c72b320934596a2d7d32 -F test/uri.test 1864342401046f8741d6040da9dbc6fbd3c032a1 +F test/uri.test 6630ecbdea2aac10df3c89dbae2243f4c2c353e4 F test/userauth01.test e740a2697a7b40d7c5003a7d7edaee16acd349a9 F test/utf16align.test 54cd35a27c005a9b6e7815d887718780b6a462ae F test/vacuum.test ce91c39f7f91a4273bf620efad21086b5aa6ef1d @@ -1389,7 +1389,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 0abd65294e6e8db68e7ce6724f02f17ba1cb3422 -R 5358569f2baa63663f07678b869229da +P 8a0a2aa5a6df3d7b5995457b57f051e39d6cf9e9 +R 836bac276dc589a367243d9338c8814b U mistachkin -Z e72fb6725790034f4f337251024aae57 +Z 346e5b00d67d042049be71228aef2eb1 diff --git a/manifest.uuid b/manifest.uuid index 2ae93081f2..ae04b786ae 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8a0a2aa5a6df3d7b5995457b57f051e39d6cf9e9 \ No newline at end of file +80027709c3ba2a8c9bda4d37779f65104be1045c \ No newline at end of file diff --git a/test/uri.test b/test/uri.test index 3acb3baa92..a0a88d2263 100644 --- a/test/uri.test +++ b/test/uri.test @@ -69,7 +69,7 @@ foreach {tn uri file} { # (ADS) named "test.db" for the "http" file, causing some spurious # failures of this test. # - if {$tn==12 && $::tcl_version>=8.6} break + if {$tn==12 && $::tcl_version>=8.6} continue # # NOTE: On Windows, we need to account for the fact that the current From 92099b07538056868a65f5c13ea87e4795c7d769 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 7 Oct 2015 09:02:50 +0000 Subject: [PATCH 46/98] Add further tests for fts5 prefix queries. FossilOrigin-Name: accdc98b1291f07b802fd23f3ebc7dbc02ba09d3 --- ext/fts5/fts5Int.h | 12 ++++---- ext/fts5/fts5_expr.c | 28 +++++++++--------- ext/fts5/fts5_index.c | 12 ++++---- ext/fts5/fts5parse.y | 4 +-- ext/fts5/test/fts5prefix.test | 55 +++++++++++++++++++++++++++++++++-- manifest | 22 +++++++------- manifest.uuid | 2 +- 7 files changed, 93 insertions(+), 42 deletions(-) diff --git a/ext/fts5/fts5Int.h b/ext/fts5/fts5Int.h index 3ab8dcdc93..53df5dbf5a 100644 --- a/ext/fts5/fts5Int.h +++ b/ext/fts5/fts5Int.h @@ -81,7 +81,7 @@ extern int sqlite3_fts5_may_be_corrupt; #endif typedef struct Fts5Global Fts5Global; -typedef struct Fts5ExprColset Fts5ExprColset; +typedef struct Fts5Colset Fts5Colset; /* If a NEAR() clump or phrase may only match a specific set of columns, ** then an object of the following type is used to record the set of columns. @@ -89,7 +89,7 @@ typedef struct Fts5ExprColset Fts5ExprColset; ** ** This object is used by fts5_expr.c and fts5_index.c. */ -struct Fts5ExprColset { +struct Fts5Colset { int nCol; int aiCol[1]; }; @@ -335,7 +335,7 @@ int sqlite3Fts5IndexQuery( Fts5Index *p, /* FTS index to query */ const char *pToken, int nToken, /* Token (or prefix) to query for */ int flags, /* Mask of FTS5INDEX_QUERY_X flags */ - Fts5ExprColset *pColset, /* Match these columns only */ + Fts5Colset *pColset, /* Match these columns only */ Fts5IndexIter **ppIter /* OUT: New iterator object */ ); @@ -649,9 +649,9 @@ Fts5ExprNearset *sqlite3Fts5ParseNearset( Fts5ExprPhrase* ); -Fts5ExprColset *sqlite3Fts5ParseColset( +Fts5Colset *sqlite3Fts5ParseColset( Fts5Parse*, - Fts5ExprColset*, + Fts5Colset*, Fts5Token * ); @@ -660,7 +660,7 @@ void sqlite3Fts5ParseNearsetFree(Fts5ExprNearset*); void sqlite3Fts5ParseNodeFree(Fts5ExprNode*); void sqlite3Fts5ParseSetDistance(Fts5Parse*, Fts5ExprNearset*, Fts5Token*); -void sqlite3Fts5ParseSetColset(Fts5Parse*, Fts5ExprNearset*, Fts5ExprColset*); +void sqlite3Fts5ParseSetColset(Fts5Parse*, Fts5ExprNearset*, Fts5Colset*); void sqlite3Fts5ParseFinished(Fts5Parse *pParse, Fts5ExprNode *p); void sqlite3Fts5ParseNear(Fts5Parse *pParse, Fts5Token*); diff --git a/ext/fts5/fts5_expr.c b/ext/fts5/fts5_expr.c index 9b0c262301..c90a2e4708 100644 --- a/ext/fts5/fts5_expr.c +++ b/ext/fts5/fts5_expr.c @@ -95,7 +95,7 @@ struct Fts5ExprPhrase { */ struct Fts5ExprNearset { int nNear; /* NEAR parameter */ - Fts5ExprColset *pColset; /* Columns to search (NULL -> all columns) */ + Fts5Colset *pColset; /* Columns to search (NULL -> all columns) */ int nPhrase; /* Number of entries in aPhrase[] array */ Fts5ExprPhrase *apPhrase[1]; /* Array of phrase pointers */ }; @@ -266,7 +266,7 @@ void sqlite3Fts5ExprFree(Fts5Expr *p){ } } -static int fts5ExprColsetTest(Fts5ExprColset *pColset, int iCol){ +static int fts5ExprColsetTest(Fts5Colset *pColset, int iCol){ int i; for(i=0; inCol; i++){ if( pColset->aiCol[i]==iCol ) return 1; @@ -395,7 +395,7 @@ static int fts5ExprSynonymPoslist( */ static int fts5ExprPhraseIsMatch( Fts5ExprNode *pNode, /* Node pPhrase belongs to */ - Fts5ExprColset *pColset, /* Restrict matches to these columns */ + Fts5Colset *pColset, /* Restrict matches to these columns */ Fts5ExprPhrase *pPhrase, /* Phrase object to initialize */ int *pbMatch /* OUT: Set to true if really a match */ ){ @@ -795,7 +795,7 @@ static int fts5ExprExtractCol( } static int fts5ExprExtractColset ( - Fts5ExprColset *pColset, /* Colset to filter on */ + Fts5Colset *pColset, /* Colset to filter on */ const u8 *pPos, int nPos, /* Position list */ Fts5Buffer *pBuf /* Output buffer */ ){ @@ -858,7 +858,7 @@ static int fts5ExprTokenTest( Fts5ExprNearset *pNear = pNode->pNear; Fts5ExprPhrase *pPhrase = pNear->apPhrase[0]; Fts5IndexIter *pIter = pPhrase->aTerm[0].pIter; - Fts5ExprColset *pColset = pNear->pColset; + Fts5Colset *pColset = pNear->pColset; const u8 *pPos; int nPos; int rc; @@ -1745,25 +1745,25 @@ void sqlite3Fts5ParseSetDistance( /* ** The second argument passed to this function may be NULL, or it may be -** an existing Fts5ExprColset object. This function returns a pointer to +** an existing Fts5Colset object. This function returns a pointer to ** a new colset object containing the contents of (p) with new value column ** number iCol appended. ** ** If an OOM error occurs, store an error code in pParse and return NULL. ** The old colset object (if any) is not freed in this case. */ -static Fts5ExprColset *fts5ParseColset( +static Fts5Colset *fts5ParseColset( Fts5Parse *pParse, /* Store SQLITE_NOMEM here if required */ - Fts5ExprColset *p, /* Existing colset object */ + Fts5Colset *p, /* Existing colset object */ int iCol /* New column to add to colset object */ ){ int nCol = p ? p->nCol : 0; /* Num. columns already in colset object */ - Fts5ExprColset *pNew; /* New colset object to return */ + Fts5Colset *pNew; /* New colset object to return */ assert( pParse->rc==SQLITE_OK ); assert( iCol>=0 && iColpConfig->nCol ); - pNew = sqlite3_realloc(p, sizeof(Fts5ExprColset) + sizeof(int)*nCol); + pNew = sqlite3_realloc(p, sizeof(Fts5Colset) + sizeof(int)*nCol); if( pNew==0 ){ pParse->rc = SQLITE_NOMEM; }else{ @@ -1788,12 +1788,12 @@ static Fts5ExprColset *fts5ParseColset( return pNew; } -Fts5ExprColset *sqlite3Fts5ParseColset( +Fts5Colset *sqlite3Fts5ParseColset( Fts5Parse *pParse, /* Store SQLITE_NOMEM here if required */ - Fts5ExprColset *pColset, /* Existing colset object */ + Fts5Colset *pColset, /* Existing colset object */ Fts5Token *p ){ - Fts5ExprColset *pRet = 0; + Fts5Colset *pRet = 0; int iCol; char *z; /* Dequoted copy of token p */ @@ -1823,7 +1823,7 @@ Fts5ExprColset *sqlite3Fts5ParseColset( void sqlite3Fts5ParseSetColset( Fts5Parse *pParse, Fts5ExprNearset *pNear, - Fts5ExprColset *pColset + Fts5Colset *pColset ){ if( pNear ){ pNear->pColset = pColset; diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 46aff77728..d06a069f8a 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -3954,14 +3954,14 @@ static void fts5PoslistCallback( typedef struct PoslistCallbackCtx PoslistCallbackCtx; struct PoslistCallbackCtx { Fts5Buffer *pBuf; /* Append to this buffer */ - Fts5ExprColset *pColset; /* Restrict matches to this column */ + Fts5Colset *pColset; /* Restrict matches to this column */ int eState; /* See above */ }; /* ** TODO: Make this more efficient! */ -static int fts5IndexColsetTest(Fts5ExprColset *pColset, int iCol){ +static int fts5IndexColsetTest(Fts5Colset *pColset, int iCol){ int i; for(i=0; inCol; i++){ if( pColset->aiCol[i]==iCol ) return 1; @@ -4029,7 +4029,7 @@ static void fts5PoslistFilterCallback( static void fts5SegiterPoslist( Fts5Index *p, Fts5SegIter *pSeg, - Fts5ExprColset *pColset, + Fts5Colset *pColset, Fts5Buffer *pBuf ){ if( pColset==0 ){ @@ -4055,7 +4055,7 @@ static void fts5SegiterPoslist( static int fts5MultiIterPoslist( Fts5Index *p, Fts5IndexIter *pMulti, - Fts5ExprColset *pColset, + Fts5Colset *pColset, int bSz, /* Append a size field before the data */ Fts5Buffer *pBuf ){ @@ -4251,7 +4251,7 @@ static void fts5SetupPrefixIter( int bDesc, /* True for "ORDER BY rowid DESC" */ const u8 *pToken, /* Buffer containing prefix to match */ int nToken, /* Size of buffer pToken in bytes */ - Fts5ExprColset *pColset, /* Restrict matches to these columns */ + Fts5Colset *pColset, /* Restrict matches to these columns */ Fts5IndexIter **ppIter /* OUT: New iterator */ ){ Fts5Structure *pStruct; @@ -4536,7 +4536,7 @@ int sqlite3Fts5IndexQuery( Fts5Index *p, /* FTS index to query */ const char *pToken, int nToken, /* Token (or prefix) to query for */ int flags, /* Mask of FTS5INDEX_QUERY_X flags */ - Fts5ExprColset *pColset, /* Match these columns only */ + Fts5Colset *pColset, /* Match these columns only */ Fts5IndexIter **ppIter /* OUT: New iterator object */ ){ Fts5Config *pConfig = p->pConfig; diff --git a/ext/fts5/fts5parse.y b/ext/fts5/fts5parse.y index c880dc92cb..e872908229 100644 --- a/ext/fts5/fts5parse.y +++ b/ext/fts5/fts5parse.y @@ -101,9 +101,9 @@ cnearset(A) ::= colset(X) COLON nearset(Y). { A = sqlite3Fts5ParseNode(pParse, FTS5_STRING, 0, 0, Y); } -%type colset {Fts5ExprColset*} +%type colset {Fts5Colset*} %destructor colset { sqlite3_free($$); } -%type colsetlist {Fts5ExprColset*} +%type colsetlist {Fts5Colset*} %destructor colsetlist { sqlite3_free($$); } colset(A) ::= LCP colsetlist(X) RCP. { A = X; } diff --git a/ext/fts5/test/fts5prefix.test b/ext/fts5/test/fts5prefix.test index f4fcc4bfa3..9da7821a54 100644 --- a/ext/fts5/test/fts5prefix.test +++ b/ext/fts5/test/fts5prefix.test @@ -119,6 +119,22 @@ proc gmatch {col pattern} { } db func gmatch gmatch +proc ghl {col pattern} { + foreach t $col { + if {[string match $pattern $t]} { + lappend res "*$t*" + } else { + lappend res $t + } + } + set res +} +db func ghl ghl + +set COLS(a) 0 +set COLS(b) 1 +set COLS(c) 2 + for {set x 0} {$x<2} {incr x} { foreach {tn pattern} { 1 {xa*} @@ -132,12 +148,47 @@ for {set x 0} {$x<2} {incr x} { 9 {xi*} 10 {xj*} } { - foreach col {b} { + foreach col {a b c} { + + # Check that the list of returned rowids is correct. + # set res [db eval "SELECT rowid FROM t3 WHERE gmatch($col, '$pattern')"] set query "$col : $pattern" - do_execsql_test 3.3.$x.$tn.$col { + do_execsql_test 3.3.$x.$tn.$col.rowid { SELECT rowid FROM t3($query); } $res + + # Check that the highlight() function works. + # + set res [db eval \ + "SELECT ghl($col, '$pattern') FROM t3 WHERE gmatch($col, '$pattern')" + ] + set idx $COLS($col) + do_execsql_test 3.3.$x.$tn.$col.highlight { + SELECT highlight(t3, $idx, '*', '*') FROM t3($query); + } $res + } + + foreach colset {{a b} {b c} {c a} {a c} {b a}} { + # Check that the list of returned rowids is correct. + # + foreach {col1 col2} $colset {} + set expr "gmatch($col1, '$pattern') OR gmatch($col2, '$pattern')" + set res [db eval "SELECT rowid FROM t3 WHERE $expr"] + set query "{$colset} : $pattern" + do_execsql_test 3.3.$x.$tn.{$colset}.rowid { + SELECT rowid FROM t3($query); + } $res + + set resq "SELECT ghl($col1, '$pattern'), ghl($col2, '$pattern')" + append resq " FROM t3 WHERE $expr" + set res [db eval $resq] + set idx1 $COLS($col1) + set idx2 $COLS($col2) + do_execsql_test 3.3.$x.$tn.{$colset}.highlight { + SELECT highlight(t3, $idx1, '*', '*'), highlight(t3, $idx2, '*', '*') + FROM t3($query) + } $res } } execsql { INSERT INTO t3(t3) VALUES('optimize') } diff --git a/manifest b/manifest index 6c17fe9621..88bb54c2ce 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\stypo\sin\sthe\sprevious\scheck-in. -D 2015-10-07T04:20:34.157 +C Add\sfurther\stests\sfor\sfts5\sprefix\squeries. +D 2015-10-07T09:02:50.876 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -106,13 +106,13 @@ F ext/fts3/unicode/mkunicode.tcl 95cf7ec186e48d4985e433ff8a1c89090a774252 F ext/fts3/unicode/parseunicode.tcl da577d1384810fb4e2b209bf3313074353193e95 F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 F ext/fts5/fts5.h 98f802fe41481f9d797fce496f0fefcad72c7782 -F ext/fts5/fts5Int.h eba5b20f1049a8908f867ff1b59299f49bb392a4 +F ext/fts5/fts5Int.h 93ff3f2ae0789abc10c6832c32273db30024ead8 F ext/fts5/fts5_aux.c 7a307760a9c57c750d043188ec0bad59f5b5ec7e F ext/fts5/fts5_buffer.c 54b18497395a19dfe1d00f63a3b403e5f93d4fd1 F ext/fts5/fts5_config.c 57ee5fe71578cb494574fc0e6e51acb9a22a8695 -F ext/fts5/fts5_expr.c bd2618ceaaadadbc8a4792ba977b393d2d1d3a08 +F ext/fts5/fts5_expr.c 2054e550e75cffa117557c9416210c425934436d F ext/fts5/fts5_hash.c 4bf4b99708848357b8a2b5819e509eb6d3df9246 -F ext/fts5/fts5_index.c 11687c48902238e1fedb0bb8e1e8b5b8f6d82e1c +F ext/fts5/fts5_index.c f1465ed954973390363b1cc22a4644e4630c78a1 F ext/fts5/fts5_main.c fe5243d6bbb79217394f0ec7f4f5199ddbc9e7e8 F ext/fts5/fts5_storage.c df061a5caf9e50fbbd43113009b5b248362f4995 F ext/fts5/fts5_tcl.c 6da58d6e8f42a93c4486b5ba9b187a7f995dee37 @@ -121,7 +121,7 @@ F ext/fts5/fts5_tokenize.c f380f46f341af9c9a9908e1aade685ba1eaa157a F ext/fts5/fts5_unicode2.c 78273fbd588d1d9bd0a7e4e0ccc9207348bae33c F ext/fts5/fts5_varint.c 3f86ce09cab152e3d45490d7586b7ed2e40c13f1 F ext/fts5/fts5_vocab.c 17320c476a5296ee475ab616d95fd10515bacfec -F ext/fts5/fts5parse.y 833db1101b78c0c47686ab1b84918e38c36e9452 +F ext/fts5/fts5parse.y 38ab0ea7280a122f86f53b2264741422dd2424a0 F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba F ext/fts5/test/fts5_common.tcl b6e6a40ef5d069c8e86ca4fbad491e1195485dbc F ext/fts5/test/fts5aa.test 4804f237005bb4ba8ea4a76120d8011ebcb5d611 @@ -169,7 +169,7 @@ F ext/fts5/test/fts5optimize.test 42741e7c085ee0a1276140a752d4407d97c2c9f5 F ext/fts5/test/fts5plan.test 6a55ecbac9890765b0e16f8c421c7e0888cfe436 F ext/fts5/test/fts5porter.test 7cdc07bef301d70eebbfa75dcaf45c3680e1d0e1 F ext/fts5/test/fts5porter2.test 2e65633d58a1c525d5af0f6c01e5a59155bb3487 -F ext/fts5/test/fts5prefix.test 5d4fd42696789843ff98a62f4b84e3f66ecad9d6 +F ext/fts5/test/fts5prefix.test ad3069f099ff593a2196422244fa218f8942dfb9 F ext/fts5/test/fts5rank.test 11dcebba31d822f7e99685b4ea2c2ae3ec0b16f1 F ext/fts5/test/fts5rebuild.test 03935f617ace91ed23a6099c7c74d905227ff29b F ext/fts5/test/fts5restart.test c17728fdea26e7d0f617d22ad5b4b2862b994c17 @@ -1389,7 +1389,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 8a0a2aa5a6df3d7b5995457b57f051e39d6cf9e9 -R 836bac276dc589a367243d9338c8814b -U mistachkin -Z 346e5b00d67d042049be71228aef2eb1 +P 80027709c3ba2a8c9bda4d37779f65104be1045c +R 52e545b8d6eb2ff6aa406abf9ffb76aa +U dan +Z 301081fc00e6f67555fe939cedef1345 diff --git a/manifest.uuid b/manifest.uuid index ae04b786ae..903a16db23 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -80027709c3ba2a8c9bda4d37779f65104be1045c \ No newline at end of file +accdc98b1291f07b802fd23f3ebc7dbc02ba09d3 \ No newline at end of file From 7651e0a43969cd7e8f524a300cdf8abd094a2a4b Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 7 Oct 2015 12:11:36 +0000 Subject: [PATCH 47/98] Convert the mkopcodec.awk script into tool/mkopcodec.tcl. FossilOrigin-Name: 1506cb33fcf61e2ef97b35b99e58fbf21f4f5496 --- Makefile.in | 4 ++-- Makefile.msc | 4 ++-- main.mk | 4 ++-- manifest | 21 +++++++++---------- manifest.uuid | 2 +- mkopcodec.awk | 50 ---------------------------------------------- tool/mkopcodec.tcl | 50 ++++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 66 insertions(+), 69 deletions(-) delete mode 100644 mkopcodec.awk create mode 100644 tool/mkopcodec.tcl diff --git a/Makefile.in b/Makefile.in index 20c8420d34..b78dbac1a2 100644 --- a/Makefile.in +++ b/Makefile.in @@ -899,8 +899,8 @@ tclsqlite3$(TEXE): tclsqlite-shell.lo libsqlite3.la # Rules to build opcodes.c and opcodes.h # -opcodes.c: opcodes.h $(TOP)/mkopcodec.awk - $(NAWK) -f $(TOP)/mkopcodec.awk opcodes.h >opcodes.c +opcodes.c: opcodes.h $(TOP)/tool/mkopcodec.tcl + $(TCLSH_CMD) $(TOP)/tool/mkopcodec.tcl opcodes.h >opcodes.c opcodes.h: parse.h $(TOP)/src/vdbe.c $(TOP)/tool/mkopcodeh.tcl cat parse.h $(TOP)/src/vdbe.c | $(TCLSH_CMD) $(TOP)/tool/mkopcodeh.tcl >opcodes.h diff --git a/Makefile.msc b/Makefile.msc index 124761757d..d21bab0d8e 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -1572,8 +1572,8 @@ tclsqlite3.exe: tclsqlite-shell.lo $(SQLITE3C) $(LIBRESOBJS) # Rules to build opcodes.c and opcodes.h # -opcodes.c: opcodes.h $(TOP)\mkopcodec.awk - $(NAWK) -f $(TOP)\mkopcodec.awk opcodes.h > opcodes.c +opcodes.c: opcodes.h $(TOP)\tool\mkopcodec.tcl + $(TCLSH_CMD) $(TOP)\tool\mkopcodec.tcl opcodes.h > opcodes.c opcodes.h: parse.h $(TOP)\src\vdbe.c $(TOP)\tool\mkopcodeh.tcl type parse.h $(TOP)\src\vdbe.c | $(TCLSH_CMD) $(TOP)\tool\mkopcodeh.awk > opcodes.h diff --git a/main.mk b/main.mk index cc413faca2..9c7abf7277 100644 --- a/main.mk +++ b/main.mk @@ -579,8 +579,8 @@ tclsqlite.o: $(TOP)/src/tclsqlite.c $(HDR) # Rules to build opcodes.c and opcodes.h # -opcodes.c: opcodes.h $(TOP)/mkopcodec.awk - $(NAWK) -f $(TOP)/mkopcodec.awk opcodes.h >opcodes.c +opcodes.c: opcodes.h $(TOP)/tool/mkopcodec.tcl + tclsh $(TOP)/tool/mkopcodec.tcl opcodes.h >opcodes.c opcodes.h: parse.h $(TOP)/src/vdbe.c $(TOP)/tool/mkopcodeh.tcl cat parse.h $(TOP)/src/vdbe.c | \ diff --git a/manifest b/manifest index 1a4dd94095..b54e68ae0a 100644 --- a/manifest +++ b/manifest @@ -1,9 +1,9 @@ -C Change\smkopcodeh.awk\sinto\stool/mkopcodeh.tcl. -D 2015-10-07T02:52:09.315 +C Convert\sthe\smkopcodec.awk\sscript\sinto\stool/mkopcodec.tcl. +D 2015-10-07T12:11:36.664 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f -F Makefile.in dd1f363468240142a5be1c9d58014dc9b8eae2f4 +F Makefile.in da829ae5a1f60e3ff7d76a979628ce4a1bfc5d7d F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 -F Makefile.msc 8fb99d7b4e8b2e812a2360b8356d956d26e0e953 +F Makefile.msc 5ae4a363bc7cfbd18814e077f67bb418e6e3378d F Makefile.vxworks e1b65dea203f054e71653415bd8f96dcaed47858 F README.md 8ecc12493ff9f820cdea6520a9016001cb2e59b7 F VERSION ccfc4d1576dbfdeece0a4372a2e6a2e37d3e7975 @@ -263,8 +263,7 @@ F ext/userauth/userauth.c 5fa3bdb492f481bbc1709fc83c91ebd13460c69e F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk 9fe51a296a2550282db357d2b3825cc32fbc455b -F mkopcodec.awk c2ff431854d702cdd2d779c9c0d1f58fa16fa4ea +F main.mk b67cb215800e4602744db3c6abdb77aac8adbf5e F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 @@ -1351,6 +1350,7 @@ F tool/loadfts.c c3c64e4d5e90e8ba41159232c2189dba4be7b862 F tool/logest.c eef612f8adf4d0993dafed0416064cf50d5d33c6 F tool/mkautoconfamal.sh d1a2da0e15b2ed33d60af35c7e9d483f13a8eb9f F tool/mkkeywordhash.c dfff09dbbfaf950e89af294f48f902181b144670 +F tool/mkopcodec.tcl edde8adc42621b5e598127f8cdc6d52cfe21f52b F tool/mkopcodeh.tcl e04177031532b7aa9379ded50e820231ac4abd6e F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e F tool/mkpragmatab.tcl 84af2b180484323a2ea22a2279e8bd9e3e1e492e @@ -1389,10 +1389,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 0abd65294e6e8db68e7ce6724f02f17ba1cb3422 -R 33730b016d975e72f95dcd99735ce552 -T *branch * omit-awk -T *sym-omit-awk * -T -sym-trunk * +P ed0ebc460b54939862e3bddee2bb9bcb9f69c747 +R 725a0812f70e1ffeb50dd24066c3fbf1 U drh -Z 05cb2395dd6fc47d133085b2716a644b +Z a24c1f360278b392b8819db30361ce0f diff --git a/manifest.uuid b/manifest.uuid index 7bf1ca41d8..3254b996cd 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ed0ebc460b54939862e3bddee2bb9bcb9f69c747 \ No newline at end of file +1506cb33fcf61e2ef97b35b99e58fbf21f4f5496 \ No newline at end of file diff --git a/mkopcodec.awk b/mkopcodec.awk deleted file mode 100644 index de19068c20..0000000000 --- a/mkopcodec.awk +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/awk -f -# -# This AWK script scans the opcodes.h file (which is itself generated by -# another awk script) and uses the information gleaned to create the -# opcodes.c source file. -# -# Opcodes.c contains strings which are the symbolic names for the various -# opcodes used by the VDBE. These strings are used when disassembling a -# VDBE program during tracing or as a result of the EXPLAIN keyword. -# -BEGIN { - print "/* Automatically generated. Do not edit */" - print "/* See the mkopcodec.awk script for details. */" - printf "#if !defined(SQLITE_OMIT_EXPLAIN)" - printf " || defined(VDBE_PROFILE)" - print " || defined(SQLITE_DEBUG)" - print "#if defined(SQLITE_ENABLE_EXPLAIN_COMMENTS) || defined(SQLITE_DEBUG)" - print "# define OpHelp(X) \"\\0\" X" - print "#else" - print "# define OpHelp(X)" - print "#endif" - print "const char *sqlite3OpcodeName(int i){" - print " static const char *const azName[] = { \"?\"," - mx = 0 -} -/^.define OP_/ { - sub("OP_","",$2) - i = $3+0 - label[i] = $2 - if( mx Date: Wed, 7 Oct 2015 12:21:14 +0000 Subject: [PATCH 48/98] Change the addopcodes.awk script into tool/addopcodes.tcl. FossilOrigin-Name: 8bbf37142ef2759274668f6da114b5c8072e42db --- Makefile.in | 4 ++-- Makefile.msc | 4 ++-- addopcodes.awk | 34 ---------------------------------- main.mk | 4 ++-- manifest | 18 +++++++++--------- manifest.uuid | 2 +- tool/addopcodes.tcl | 45 +++++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 61 insertions(+), 50 deletions(-) delete mode 100644 addopcodes.awk create mode 100644 tool/addopcodes.tcl diff --git a/Makefile.in b/Makefile.in index b78dbac1a2..eae80ece5e 100644 --- a/Makefile.in +++ b/Makefile.in @@ -909,12 +909,12 @@ opcodes.h: parse.h $(TOP)/src/vdbe.c $(TOP)/tool/mkopcodeh.tcl # parse.h: parse.c -parse.c: $(TOP)/src/parse.y lemon$(BEXE) $(TOP)/addopcodes.awk +parse.c: $(TOP)/src/parse.y lemon$(BEXE) $(TOP)/tool/addopcodes.tcl cp $(TOP)/src/parse.y . rm -f parse.h ./lemon$(BEXE) $(OPT_FEATURE_FLAGS) $(OPTS) parse.y mv parse.h parse.h.temp - $(NAWK) -f $(TOP)/addopcodes.awk parse.h.temp >parse.h + $(TCLSH_CMD) $(TOP)/tool/addopcodes.tcl parse.h.temp >parse.h sqlite3.h: $(TOP)/src/sqlite.h.in $(TOP)/manifest.uuid $(TOP)/VERSION $(TCLSH_CMD) $(TOP)/tool/mksqlite3h.tcl $(TOP) >sqlite3.h diff --git a/Makefile.msc b/Makefile.msc index d21bab0d8e..785c65cb71 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -1582,12 +1582,12 @@ opcodes.h: parse.h $(TOP)\src\vdbe.c $(TOP)\tool\mkopcodeh.tcl # parse.h: parse.c -parse.c: $(TOP)\src\parse.y lemon.exe $(TOP)\addopcodes.awk +parse.c: $(TOP)\src\parse.y lemon.exe $(TOP)\tool\addopcodes.tcl del /Q parse.y parse.h parse.h.temp 2>NUL copy $(TOP)\src\parse.y . .\lemon.exe $(REQ_FEATURE_FLAGS) $(OPT_FEATURE_FLAGS) $(OPTS) parse.y move parse.h parse.h.temp - $(NAWK) -f $(TOP)\addopcodes.awk parse.h.temp > parse.h + $(TCLSH_CMD) $(TOP)\tool\addopcodes.tcl parse.h.temp > parse.h sqlite3.h: $(TOP)\src\sqlite.h.in $(TOP)\manifest.uuid $(TOP)\VERSION $(TCLSH_CMD) $(TOP)\tool\mksqlite3h.tcl $(TOP:\=/) > sqlite3.h diff --git a/addopcodes.awk b/addopcodes.awk deleted file mode 100644 index dcd31eff84..0000000000 --- a/addopcodes.awk +++ /dev/null @@ -1,34 +0,0 @@ -#!/usr/bin/awk -# -# This script appends additional token codes to the end of the -# parse.h file that lemon generates. These extra token codes are -# not used by the parser. But they are used by the tokenizer and/or -# the code generator. -# -# -BEGIN { - max = 0 -} -/^#define TK_/ { - print $0 - if( max<$3 ) max = $3 -} -END { - printf "#define TK_%-29s %4d\n", "TO_TEXT", ++max - printf "#define TK_%-29s %4d\n", "TO_BLOB", ++max - printf "#define TK_%-29s %4d\n", "TO_NUMERIC", ++max - printf "#define TK_%-29s %4d\n", "TO_INT", ++max - printf "#define TK_%-29s %4d\n", "TO_REAL", ++max - printf "#define TK_%-29s %4d\n", "ISNOT", ++max - printf "#define TK_%-29s %4d\n", "END_OF_FILE", ++max - printf "#define TK_%-29s %4d\n", "ILLEGAL", ++max - printf "#define TK_%-29s %4d\n", "SPACE", ++max - printf "#define TK_%-29s %4d\n", "UNCLOSED_STRING", ++max - printf "#define TK_%-29s %4d\n", "FUNCTION", ++max - printf "#define TK_%-29s %4d\n", "COLUMN", ++max - printf "#define TK_%-29s %4d\n", "AGG_FUNCTION", ++max - printf "#define TK_%-29s %4d\n", "AGG_COLUMN", ++max - printf "#define TK_%-29s %4d\n", "UMINUS", ++max - printf "#define TK_%-29s %4d\n", "UPLUS", ++max - printf "#define TK_%-29s %4d\n", "REGISTER", ++max -} diff --git a/main.mk b/main.mk index 9c7abf7277..f3c1d2aabd 100644 --- a/main.mk +++ b/main.mk @@ -590,12 +590,12 @@ opcodes.h: parse.h $(TOP)/src/vdbe.c $(TOP)/tool/mkopcodeh.tcl # parse.h: parse.c -parse.c: $(TOP)/src/parse.y lemon $(TOP)/addopcodes.awk +parse.c: $(TOP)/src/parse.y lemon $(TOP)/tool/addopcodes.tcl cp $(TOP)/src/parse.y . rm -f parse.h ./lemon -s $(OPTS) parse.y mv parse.h parse.h.temp - $(NAWK) -f $(TOP)/addopcodes.awk parse.h.temp >parse.h + tclsh $(TOP)/tool/addopcodes.tcl parse.h.temp >parse.h sqlite3.h: $(TOP)/src/sqlite.h.in $(TOP)/manifest.uuid $(TOP)/VERSION $(TOP)/ext/rtree/sqlite3rtree.h tclsh $(TOP)/tool/mksqlite3h.tcl $(TOP) >sqlite3.h diff --git a/manifest b/manifest index b54e68ae0a..a38c009e00 100644 --- a/manifest +++ b/manifest @@ -1,14 +1,13 @@ -C Convert\sthe\smkopcodec.awk\sscript\sinto\stool/mkopcodec.tcl. -D 2015-10-07T12:11:36.664 +C Change\sthe\saddopcodes.awk\sscript\sinto\stool/addopcodes.tcl. +D 2015-10-07T12:21:14.000 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f -F Makefile.in da829ae5a1f60e3ff7d76a979628ce4a1bfc5d7d +F Makefile.in b33d44230974d2d5ea2f0599855c5e36bd79b90a F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 -F Makefile.msc 5ae4a363bc7cfbd18814e077f67bb418e6e3378d +F Makefile.msc b7d8a7efbbf38cee57bfc81d11ca28c42122ff81 F Makefile.vxworks e1b65dea203f054e71653415bd8f96dcaed47858 F README.md 8ecc12493ff9f820cdea6520a9016001cb2e59b7 F VERSION ccfc4d1576dbfdeece0a4372a2e6a2e37d3e7975 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 -F addopcodes.awk 9eb448a552d5c0185cf62c463f9c173cedae3811 F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90 F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2 @@ -263,7 +262,7 @@ F ext/userauth/userauth.c 5fa3bdb492f481bbc1709fc83c91ebd13460c69e F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk b67cb215800e4602744db3c6abdb77aac8adbf5e +F main.mk 1cb544e1b1943b8b6452a811869b3baee5bfcb13 F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 @@ -1334,6 +1333,7 @@ F test/without_rowid6.test 1f99644e6508447fb050f73697350c7ceca3392e F test/wordcount.c 9915e06cb33d8ca8109b8700791afe80d305afda F test/zeroblob.test 3857870fe681b8185654414a9bccfde80b62a0fa F test/zerodamage.test cf6748bad89553cc1632be51a6f54e487e4039ac +F tool/addopcodes.tcl 7cc82ecca456a6b3148abf492b0419b83140881a F tool/build-all-msvc.bat 761d8c82a1a529261291812732a853a1b4256d85 x F tool/build-shell.sh 950f47c6174f1eea171319438b93ba67ff5bf367 F tool/checkSpacing.c 810e51703529a204fc4e1eb060e9ab663e3c06d2 @@ -1389,7 +1389,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P ed0ebc460b54939862e3bddee2bb9bcb9f69c747 -R 725a0812f70e1ffeb50dd24066c3fbf1 +P 1506cb33fcf61e2ef97b35b99e58fbf21f4f5496 +R d8eeb7e51eba4dfb24803600079d2858 U drh -Z a24c1f360278b392b8819db30361ce0f +Z f02ffe1dfbcccf71e8c30b4fbe822892 diff --git a/manifest.uuid b/manifest.uuid index 3254b996cd..95ca593f47 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1506cb33fcf61e2ef97b35b99e58fbf21f4f5496 \ No newline at end of file +8bbf37142ef2759274668f6da114b5c8072e42db \ No newline at end of file diff --git a/tool/addopcodes.tcl b/tool/addopcodes.tcl new file mode 100644 index 0000000000..46675cb258 --- /dev/null +++ b/tool/addopcodes.tcl @@ -0,0 +1,45 @@ +#!/usr/bin/tclsh +# +# This script appends additional token codes to the end of the +# parse.h file that lemon generates. These extra token codes are +# not used by the parser. But they are used by the tokenizer and/or +# the code generator. +# +# +set in [open [lindex $argv 0] rb] +set max 0 +while {![eof $in]} { + set line [gets $in] + if {[regexp {^#define TK_} $line]} { + puts $line + set x [lindex $line 2] + if {$x>$max} {set max $x} + } +} +close $in + +# The following are the extra token codes to be added +# +set extras { + TO_TEXT + TO_BLOB + TO_NUMERIC + TO_INT + TO_REAL + ISNOT + END_OF_FILE + ILLEGAL + SPACE + UNCLOSED_STRING + FUNCTION + COLUMN + AGG_FUNCTION + AGG_COLUMN + UMINUS + UPLUS + REGISTER +} +foreach x $extras { + incr max + puts [format "#define TK_%-29s %4d" $x $max] +} From 48cc9a31e12d3ac1acd927515d8d79cbbdbfe1e0 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 7 Oct 2015 12:36:42 +0000 Subject: [PATCH 49/98] Convert the tool/tostr.awk script into tool/tostr.tcl. Remove two obsolete Makefiles. Purge NAWK from the configure script and from unix makefiles. There are still two uses of NAWK in Makefile.msc. FossilOrigin-Name: 5b6775215327a89232f5059653747a18e83b8b4b --- Makefile.arm-wince-mingw32ce-gcc | 138 ------- Makefile.in | 5 +- Makefile.linux-gcc | 5 - Makefile.msc | 2 +- Makefile.vxworks | 673 ------------------------------- configure | 72 +--- configure.ac | 1 - main.mk | 5 +- manifest | 26 +- manifest.uuid | 2 +- tool/tostr.awk | 9 - tool/tostr.tcl | 12 + 12 files changed, 42 insertions(+), 908 deletions(-) delete mode 100644 Makefile.arm-wince-mingw32ce-gcc delete mode 100644 Makefile.vxworks delete mode 100644 tool/tostr.awk create mode 100644 tool/tostr.tcl diff --git a/Makefile.arm-wince-mingw32ce-gcc b/Makefile.arm-wince-mingw32ce-gcc deleted file mode 100644 index 323b7ea482..0000000000 --- a/Makefile.arm-wince-mingw32ce-gcc +++ /dev/null @@ -1,138 +0,0 @@ -#!/usr/make -# -# Makefile for SQLITE -# -# This is a template makefile for SQLite. Most people prefer to -# use the autoconf generated "configure" script to generate the -# makefile automatically. But that does not work for everybody -# and in every situation. If you are having problems with the -# "configure" script, you might want to try this makefile as an -# alternative. Create a copy of this file, edit the parameters -# below and type "make". -# - -#### The directory where to find the mingw32ce tools -MINGW32CE = /opt/mingw32ce/bin - -#### The target prefix of the mingw32ce tools -TARGET = arm-wince-mingw32ce - -#### The toplevel directory of the source tree. This is the directory -# that contains this "Makefile.in" and the "configure.in" script. -# -TOP = ../sqlite - -#### C Compiler and options for use in building executables that -# will run on the platform that is doing the build. -# -BCC = gcc -g -O2 -#BCC = /opt/ancic/bin/c89 -0 - -#### If the target operating system supports the "usleep()" system -# call, then define the HAVE_USLEEP macro for all C modules. -# -USLEEP = -#USLEEP = -DHAVE_USLEEP=1 - -#### If you want the SQLite library to be safe for use within a -# multi-threaded program, then define the following macro -# appropriately: -# -THREADSAFE = -DTHREADSAFE=1 -#THREADSAFE = -DTHREADSAFE=0 - -#### Specify any extra linker options needed to make the library -# thread safe -# -#THREADLIB = -lpthread -THREADLIB = - -#### Specify any extra libraries needed to access required functions. -# -#TLIBS = -lrt # fdatasync on Solaris 8 -TLIBS = - -#### Leave SQLITE_DEBUG undefined for maximum speed. Use SQLITE_DEBUG=1 -# to check for memory leaks. Use SQLITE_DEBUG=2 to print a log of all -# malloc()s and free()s in order to track down memory leaks. -# -# SQLite uses some expensive assert() statements in the inner loop. -# You can make the library go almost twice as fast if you compile -# with -DNDEBUG=1 -# -#OPTS = -DSQLITE_DEBUG=2 -#OPTS = -DSQLITE_DEBUG=1 -#OPTS = -OPTS = -DNDEBUG=1 -DSQLITE_OS_WIN=1 -D_WIN32_WCE=1 -#OPTS += -DHAVE_FDATASYNC=1 - -#### The suffix to add to executable files. ".exe" for windows. -# Nothing for unix. -# -EXE = .exe -#EXE = - -#### C Compile and options for use in building executables that -# will run on the target platform. This is usually the same -# as BCC, unless you are cross-compiling. -# -#TCC = gcc -O6 -#TCC = gcc -g -O0 -Wall -#TCC = gcc -g -O0 -Wall -fprofile-arcs -ftest-coverage -#TCC = /opt/mingw/bin/i386-mingw32-gcc -O6 -TCC = $(MINGW32CE)/$(TARGET)-gcc -O2 -#TCC = /opt/ansic/bin/c89 -O +z -Wl,-a,archive - -#### Tools used to build a static library. -# -#AR = ar cr -#AR = /opt/mingw/bin/i386-mingw32-ar cr -AR = $(MINGW32CE)/$(TARGET)-ar cr -#RANLIB = ranlib -#RANLIB = /opt/mingw/bin/i386-mingw32-ranlib -RANLIB = $(MINGW32CE)/$(TARGET)-ranlib - -#MKSHLIB = gcc -shared -#SO = so -#SHPREFIX = lib -MKSHLIB = $(MINGW32CE)/$(TARGET)-gcc -shared -SO = dll -SHPREFIX = - -#### Extra compiler options needed for programs that use the TCL library. -# -#TCL_FLAGS = -#TCL_FLAGS = -DSTATIC_BUILD=1 -TCL_FLAGS = -I/home/drh/tcltk/8.5linux -#TCL_FLAGS = -I/home/drh/tcltk/8.5win -DSTATIC_BUILD=1 -#TCL_FLAGS = -I/home/drh/tcltk/8.3hpux - -#### Linker options needed to link against the TCL library. -# -#LIBTCL = -ltcl -lm -ldl -LIBTCL = /home/drh/tcltk/8.5linux/libtcl8.5g.a -lm -ldl -#LIBTCL = /home/drh/tcltk/8.5win/libtcl85s.a -lmsvcrt -#LIBTCL = /home/drh/tcltk/8.3hpux/libtcl8.3.a -ldld -lm -lc - -#### Additional objects for SQLite library when TCL support is enabled. -TCLOBJ = -#TCLOBJ = tclsqlite.o - -#### Compiler options needed for programs that use the readline() library. -# -READLINE_FLAGS = -#READLINE_FLAGS = -DHAVE_READLINE=1 -I/usr/include/readline - -#### Linker options needed by programs using readline() must link against. -# -LIBREADLINE = -#LIBREADLINE = -static -lreadline -ltermcap - -#### Which "awk" program provides nawk compatibilty -# -# NAWK = nawk -NAWK = awk - -# You should not have to change anything below this line -############################################################################### -include $(TOP)/main.mk diff --git a/Makefile.in b/Makefile.in index eae80ece5e..9d50a7f264 100644 --- a/Makefile.in +++ b/Makefile.in @@ -155,9 +155,6 @@ LTCOMPILE = $(LIBTOOL) --mode=compile --tag=CC $(TCC) $(LTCOMPILE_EXTRAS) LTLINK = $(LIBTOOL) --mode=link $(TCC) $(LTCOMPILE_EXTRAS) @LDFLAGS@ $(LTLINK_EXTRAS) LTINSTALL = $(LIBTOOL) --mode=install $(INSTALL) -# nawk compatible awk. -NAWK = @AWK@ - # You should not have to change anything below this line ############################################################################### @@ -1096,7 +1093,7 @@ sqlite3_analyzer.c: sqlite3.c $(TOP)/src/tclsqlite.c $(TOP)/tool/spaceanal.tcl cat sqlite3.c $(TOP)/src/tclsqlite.c >> $@ echo "static const char *tclsh_main_loop(void){" >> $@ echo "static const char *zMainloop = " >> $@ - $(NAWK) -f $(TOP)/tool/tostr.awk $(TOP)/tool/spaceanal.tcl >> $@ + $(TCLSH_CMD) $(TOP)/tool/tostr.tcl $(TOP)/tool/spaceanal.tcl >> $@ echo "; return zMainloop; }" >> $@ sqlite3_analyzer$(TEXE): sqlite3_analyzer.c diff --git a/Makefile.linux-gcc b/Makefile.linux-gcc index 1c9f24f4ba..1491a4b02a 100644 --- a/Makefile.linux-gcc +++ b/Makefile.linux-gcc @@ -118,11 +118,6 @@ READLINE_FLAGS = LIBREADLINE = #LIBREADLINE = -static -lreadline -ltermcap -#### Which "awk" program provides nawk compatibilty -# -# NAWK = nawk -NAWK = awk - # You should not have to change anything below this line ############################################################################### include $(TOP)/main.mk diff --git a/Makefile.msc b/Makefile.msc index 785c65cb71..71b5fc8cc9 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -1774,7 +1774,7 @@ sqlite3_analyzer.c: $(SQLITE3C) $(TOP)\src\tclsqlite.c $(TOP)\tool\spaceanal.tcl copy $@ + $(SQLITE3C) + $(TOP)\src\tclsqlite.c $@ echo static const char *tclsh_main_loop(void){ >> $@ echo static const char *zMainloop = >> $@ - $(NAWK) -f $(TOP)\tool\tostr.awk $(TOP)\tool\spaceanal.tcl >> $@ + $(TCLSH_CMD) $(TOP)\tool\tostr.tcl $(TOP)\tool\spaceanal.tcl >> $@ echo ; return zMainloop; } >> $@ sqlite3_analyzer.exe: sqlite3_analyzer.c $(LIBRESOBJS) diff --git a/Makefile.vxworks b/Makefile.vxworks deleted file mode 100644 index 706261fc00..0000000000 --- a/Makefile.vxworks +++ /dev/null @@ -1,673 +0,0 @@ -#!/usr/make -# -# Makefile for SQLITE on VxWorks - -ifeq ($(FORCPU),) - FORCPU = SH32gnule -endif - -TOOL_FAMILY = gnu - -include $(WIND_USR)/tool/gnu/make.$(FORCPU) - -#### The toplevel directory of the source tree. This is the directory -# that contains this "Makefile.in" and the "configure.in" script. -# -TOP = . - -#### C Compiler and options for use in building executables that -# will run on the platform that is doing the build. -# -BCC = gcc -g -O2 -#BCC = /opt/ancic/bin/c89 -0 - -#### If the target operating system supports the "usleep()" system -# call, then define the HAVE_USLEEP macro for all C modules. -# -USLEEP = -#USLEEP = -DHAVE_USLEEP=1 - -#### If you want the SQLite library to be safe for use within a -# multi-threaded program, then define the following macro -# appropriately: -# -THREADSAFE = -DSQLITE_THREADSAFE=1 -#THREADSAFE = -DSQLITE_THREADSAFE=0 - -#### Specify any extra linker options needed to make the library -# thread safe -# -#THREADLIB = -lpthread -THREADLIB = - -#### Specify any extra libraries needed to access required functions. -# -ifeq ($(CPU),SH32) - # for SH4 shared library - TLIBS_SHARED += -L$(WIND_USR)/lib/sh/SH32/commonle/PIC -else - # for all other CPUs shared library - TLIBS_SHARED += $(LD_LINK_PATH_ATEND) $(LD_PARTIAL_LAST_FLAGS) -endif -# for static library -TLIBS += $(LD_LINK_PATH_ATEND) $(LD_PARTIAL_LAST_FLAGS) - -#### Leave SQLITE_DEBUG undefined for maximum speed. Use SQLITE_DEBUG=1 -# to check for memory leaks. Use SQLITE_DEBUG=2 to print a log of all -# malloc()s and free()s in order to track down memory leaks. -# -# SQLite uses some expensive assert() statements in the inner loop. -# You can make the library go almost twice as fast if you compile -# with -DNDEBUG=1 -# -#OPTS = -DSQLITE_DEBUG=2 -#OPTS = -DSQLITE_DEBUG=1 -#OPTS = -OPTS = -DNDEBUG=1 -DSQLITE_OS_UNIX=1 $(THREADSAFE) -OPTS += -DSQLITE_OMIT_LOAD_EXTENSION=1 -OPTS += -DSQLITE_ENABLE_LOCKING_STYLE=1 -OPTS += -DSQLITE_THREAD_OVERRIDE_LOCK=0 -OPTS += -DSQLITE_ENABLE_COLUMN_METADATA=1 -OPTS += -DHAVE_FDATASYNC=1 - -#### The suffix to add to executable files. ".exe" for windows. -# Nothing for unix. -# -EXE = .vxe -#EXE = - -#### C Compile and options for use in building executables that -# will run on the target platform. This is usually the same -# as BCC, unless you are cross-compiling. -# -#TCC = gcc -O6 -#TCC = gcc -g -O0 -Wall -#TCC = gcc -g -O0 -Wall -fprofile-arcs -ftest-coverage -#TCC = /opt/mingw/bin/i386-mingw32-gcc -O6 -TCC = $(CC) $(DEFINE_CC) -O2 -g -mrtp $(CC_ARCH_SPEC) -D_REENTRANT=1 -D_VX_CPU=_VX_$(CPU) -D_VX_TOOL_FAMILY=$(TOOL_FAMILY) -D_VX_TOOL=$(TOOL) -TCC += -I$(WIND_USR)/h -I$(WIND_USR)/h/wrn/coreip -#TCC = /opt/ansic/bin/c89 -O +z -Wl,-a,archive - -#TCC_SHARED = $(TCC) -fPIC -TCC_SHARED = $(TCC) - -#### Tools used to build a static library. -# -#ARX = ar cr -#ARX = /opt/mingw/bin/i386-mingw32-ar cr -AR += cr -#RANLIB = ranlib -#RANLIB = /opt/mingw/bin/i386-mingw32-ranlib - -#MKSHLIB = gcc -shared -#SO = so -#SHPREFIX = lib -MKSHLIB = $(CC) $(DEFINE_CC) -mrtp -shared $(CC_ARCH_SPEC) -D_VX_CPU=_VX_$(CPU) -D_VX_TOOL_FAMILY=$(TOOL_FAMILY) -D_VX_TOOL=$(TOOL) -SO = so -SHPREFIX = lib - -#### Extra compiler options needed for programs that use the TCL library. -# -#TCL_FLAGS = -#TCL_FLAGS = -DSTATIC_BUILD=1 -TCL_FLAGS = -I/home/drh/tcltk/8.5linux -#TCL_FLAGS = -I/home/drh/tcltk/8.5win -DSTATIC_BUILD=1 -#TCL_FLAGS = -I/home/drh/tcltk/8.3hpux - -#### Linker options needed to link against the TCL library. -# -#LIBTCL = -ltcl -lm -ldl -LIBTCL = /home/drh/tcltk/8.5linux/libtcl8.5g.a -lm -ldl -#LIBTCL = /home/drh/tcltk/8.5win/libtcl85s.a -lmsvcrt -#LIBTCL = /home/drh/tcltk/8.3hpux/libtcl8.3.a -ldld -lm -lc - -#### Additional objects for SQLite library when TCL support is enabled. -TCLOBJ = -#TCLOBJ = tclsqlite.o - -#### Compiler options needed for programs that use the readline() library. -# -READLINE_FLAGS = -#READLINE_FLAGS = -DHAVE_READLINE=1 -I/usr/include/readline - -#### Linker options needed by programs using readline() must link against. -# -LIBREADLINE = -#LIBREADLINE = -static -lreadline -ltermcap - -#### Which "awk" program provides nawk compatibilty -# -# NAWK = nawk -NAWK = awk - - -#### Pasted and adapted main.mk file -############################################################################### -# The following macros should be defined before this script is -# invoked: -# -# TOP The toplevel directory of the source tree. This is the -# directory that contains this "Makefile.in" and the -# "configure.in" script. -# -# BCC C Compiler and options for use in building executables that -# will run on the platform that is doing the build. -# -# THREADLIB Specify any extra linker options needed to make the library -# thread safe -# -# OPTS Extra compiler command-line options. -# -# EXE The suffix to add to executable files. ".exe" for windows -# and "" for Unix. -# -# TCC C Compiler and options for use in building executables that -# will run on the target platform. This is usually the same -# as BCC, unless you are cross-compiling. -# -# AR Tools used to build a static library. -# RANLIB -# -# TCL_FLAGS Extra compiler options needed for programs that use the -# TCL library. -# -# LIBTCL Linker options needed to link against the TCL library. -# -# READLINE_FLAGS Compiler options needed for programs that use the -# readline() library. -# -# LIBREADLINE Linker options needed by programs using readline() must -# link against. -# -# NAWK Nawk compatible awk program. Older (obsolete?) solaris -# systems need this to avoid using the original AT&T AWK. -# -# Once the macros above are defined, the rest of this make script will -# build the SQLite library and testing tools. -################################################################################ - -# This is how we compile -# -TCCX = $(TCC) $(OPTS) -I. -I$(TOP)/src -I$(TOP) -TCCX_SHARED = $(TCC_SHARED) $(OPTS) -I. -I$(TOP)/src -I$(TOP) \ - -I$(TOP)/ext/rtree -I$(TOP)/ext/icu -I$(TOP)/ext/fts3 \ - -I$(TOP)/ext/async - -# Object files for the SQLite library. -# -LIBOBJ+= alter.o analyze.o attach.o auth.o \ - backup.o bitvec.o btmutex.o btree.o build.o \ - callback.o complete.o date.o delete.o expr.o fault.o \ - fts3.o fts3_expr.o fts3_hash.o fts3_icu.o fts3_porter.o \ - fts3_tokenizer.o fts3_tokenizer1.o \ - func.o global.o hash.o \ - icu.o insert.o journal.o legacy.o loadext.o \ - main.o malloc.o mem0.o mem1.o mem2.o mem3.o mem5.o \ - memjournal.o \ - mutex.o mutex_noop.o mutex_unix.o mutex_w32.o \ - notify.o opcodes.o os.o os_unix.o os_win.o \ - pager.o parse.o pcache.o pcache1.o pragma.o prepare.o printf.o \ - random.o resolve.o rowset.o rtree.o select.o status.o \ - table.o tokenize.o trigger.o \ - update.o util.o vacuum.o \ - vdbe.o vdbeapi.o vdbeaux.o vdbeblob.o vdbemem.o \ - walker.o where.o utf.o vtab.o - - - -# All of the source code files. -# -SRC = \ - $(TOP)/src/alter.c \ - $(TOP)/src/analyze.c \ - $(TOP)/src/attach.c \ - $(TOP)/src/auth.c \ - $(TOP)/src/backup.c \ - $(TOP)/src/bitvec.c \ - $(TOP)/src/btmutex.c \ - $(TOP)/src/btree.c \ - $(TOP)/src/btree.h \ - $(TOP)/src/btreeInt.h \ - $(TOP)/src/build.c \ - $(TOP)/src/callback.c \ - $(TOP)/src/complete.c \ - $(TOP)/src/ctime.c \ - $(TOP)/src/date.c \ - $(TOP)/src/delete.c \ - $(TOP)/src/expr.c \ - $(TOP)/src/fault.c \ - $(TOP)/src/func.c \ - $(TOP)/src/global.c \ - $(TOP)/src/hash.c \ - $(TOP)/src/hash.h \ - $(TOP)/src/hwtime.h \ - $(TOP)/src/insert.c \ - $(TOP)/src/journal.c \ - $(TOP)/src/legacy.c \ - $(TOP)/src/loadext.c \ - $(TOP)/src/main.c \ - $(TOP)/src/malloc.c \ - $(TOP)/src/mem0.c \ - $(TOP)/src/mem1.c \ - $(TOP)/src/mem2.c \ - $(TOP)/src/mem3.c \ - $(TOP)/src/mem5.c \ - $(TOP)/src/memjournal.c \ - $(TOP)/src/msvc.h \ - $(TOP)/src/mutex.c \ - $(TOP)/src/mutex.h \ - $(TOP)/src/mutex_noop.c \ - $(TOP)/src/mutex_unix.c \ - $(TOP)/src/mutex_w32.c \ - $(TOP)/src/notify.c \ - $(TOP)/src/os.c \ - $(TOP)/src/os.h \ - $(TOP)/src/os_common.h \ - $(TOP)/src/os_setup.h \ - $(TOP)/src/os_unix.c \ - $(TOP)/src/os_win.c \ - $(TOP)/src/os_win.h \ - $(TOP)/src/pager.c \ - $(TOP)/src/pager.h \ - $(TOP)/src/parse.y \ - $(TOP)/src/pcache.c \ - $(TOP)/src/pcache.h \ - $(TOP)/src/pcache1.c \ - $(TOP)/src/pragma.c \ - $(TOP)/src/prepare.c \ - $(TOP)/src/printf.c \ - $(TOP)/src/random.c \ - $(TOP)/src/resolve.c \ - $(TOP)/src/rowset.c \ - $(TOP)/src/select.c \ - $(TOP)/src/status.c \ - $(TOP)/src/shell.c \ - $(TOP)/src/sqlite.h.in \ - $(TOP)/src/sqlite3ext.h \ - $(TOP)/src/sqliteInt.h \ - $(TOP)/src/sqliteLimit.h \ - $(TOP)/src/table.c \ - $(TOP)/src/tclsqlite.c \ - $(TOP)/src/tokenize.c \ - $(TOP)/src/trigger.c \ - $(TOP)/src/utf.c \ - $(TOP)/src/update.c \ - $(TOP)/src/util.c \ - $(TOP)/src/vacuum.c \ - $(TOP)/src/vdbe.c \ - $(TOP)/src/vdbe.h \ - $(TOP)/src/vdbeapi.c \ - $(TOP)/src/vdbeaux.c \ - $(TOP)/src/vdbeblob.c \ - $(TOP)/src/vdbemem.c \ - $(TOP)/src/vdbeInt.h \ - $(TOP)/src/vtab.c \ - $(TOP)/src/walker.c \ - $(TOP)/src/where.c - -# Source code for extensions -# -SRC += \ - $(TOP)/ext/fts1/fts1.c \ - $(TOP)/ext/fts1/fts1.h \ - $(TOP)/ext/fts1/fts1_hash.c \ - $(TOP)/ext/fts1/fts1_hash.h \ - $(TOP)/ext/fts1/fts1_porter.c \ - $(TOP)/ext/fts1/fts1_tokenizer.h \ - $(TOP)/ext/fts1/fts1_tokenizer1.c -SRC += \ - $(TOP)/ext/fts2/fts2.c \ - $(TOP)/ext/fts2/fts2.h \ - $(TOP)/ext/fts2/fts2_hash.c \ - $(TOP)/ext/fts2/fts2_hash.h \ - $(TOP)/ext/fts2/fts2_icu.c \ - $(TOP)/ext/fts2/fts2_porter.c \ - $(TOP)/ext/fts2/fts2_tokenizer.h \ - $(TOP)/ext/fts2/fts2_tokenizer.c \ - $(TOP)/ext/fts2/fts2_tokenizer1.c -SRC += \ - $(TOP)/ext/fts3/fts3.c \ - $(TOP)/ext/fts3/fts3.h \ - $(TOP)/ext/fts3/fts3_expr.c \ - $(TOP)/ext/fts3/fts3_expr.h \ - $(TOP)/ext/fts3/fts3_hash.c \ - $(TOP)/ext/fts3/fts3_hash.h \ - $(TOP)/ext/fts3/fts3_icu.c \ - $(TOP)/ext/fts3/fts3_porter.c \ - $(TOP)/ext/fts3/fts3_tokenizer.h \ - $(TOP)/ext/fts3/fts3_tokenizer.c \ - $(TOP)/ext/fts3/fts3_tokenizer1.c -SRC += \ - $(TOP)/ext/icu/sqliteicu.h \ - $(TOP)/ext/icu/icu.c -SRC += \ - $(TOP)/ext/rtree/rtree.h \ - $(TOP)/ext/rtree/rtree.c - - -# Generated source code files -# -SRC += \ - keywordhash.h \ - opcodes.c \ - opcodes.h \ - parse.c \ - parse.h \ - sqlite3.h - - -# Source code to the test files. -# -TESTSRC = \ - $(TOP)/src/test1.c \ - $(TOP)/src/test2.c \ - $(TOP)/src/test3.c \ - $(TOP)/src/test4.c \ - $(TOP)/src/test5.c \ - $(TOP)/src/test6.c \ - $(TOP)/src/test7.c \ - $(TOP)/src/test8.c \ - $(TOP)/src/test9.c \ - $(TOP)/src/test_autoext.c \ - $(TOP)/src/test_async.c \ - $(TOP)/src/test_backup.c \ - $(TOP)/src/test_btree.c \ - $(TOP)/src/test_config.c \ - $(TOP)/src/test_devsym.c \ - $(TOP)/src/test_func.c \ - $(TOP)/src/test_hexio.c \ - $(TOP)/src/test_journal.c \ - $(TOP)/src/test_malloc.c \ - $(TOP)/src/test_md5.c \ - $(TOP)/src/test_mutex.c \ - $(TOP)/src/test_onefile.c \ - $(TOP)/src/test_osinst.c \ - $(TOP)/src/test_pcache.c \ - $(TOP)/src/test_schema.c \ - $(TOP)/src/test_server.c \ - $(TOP)/src/test_tclvar.c \ - $(TOP)/src/test_thread.c \ - $(TOP)/src/test_vfs.c \ - $(TOP)/src/test_wsd.c \ - -#TESTSRC += $(TOP)/ext/fts2/fts2_tokenizer.c -#TESTSRC += $(TOP)/ext/fts3/fts3_tokenizer.c - -TESTSRC2 = \ - $(TOP)/src/attach.c $(TOP)/src/backup.c $(TOP)/src/btree.c \ - $(TOP)/src/build.c $(TOP)/src/ctime.c $(TOP)/src/date.c \ - $(TOP)/src/expr.c $(TOP)/src/func.c $(TOP)/src/insert.c $(TOP)/src/os.c \ - $(TOP)/src/os_unix.c $(TOP)/src/os_win.c \ - $(TOP)/src/pager.c $(TOP)/src/pragma.c $(TOP)/src/prepare.c \ - $(TOP)/src/printf.c $(TOP)/src/random.c $(TOP)/src/pcache.c \ - $(TOP)/src/pcache1.c $(TOP)/src/select.c $(TOP)/src/tokenize.c \ - $(TOP)/src/utf.c $(TOP)/src/util.c $(TOP)/src/vdbeapi.c $(TOP)/src/vdbeaux.c \ - $(TOP)/src/vdbe.c $(TOP)/src/vdbemem.c $(TOP)/src/where.c parse.c \ - $(TOP)/ext/fts3/fts3.c $(TOP)/ext/fts3/fts3_expr.c \ - $(TOP)/ext/fts3/fts3_tokenizer.c \ - $(TOP)/ext/async/sqlite3async.c - -# Header files used by all library source files. -# -HDR = \ - $(TOP)/src/btree.h \ - $(TOP)/src/btreeInt.h \ - $(TOP)/src/hash.h \ - $(TOP)/src/hwtime.h \ - keywordhash.h \ - $(TOP)/src/msvc.h \ - $(TOP)/src/mutex.h \ - opcodes.h \ - $(TOP)/src/os.h \ - $(TOP)/src/os_common.h \ - $(TOP)/src/os_setup.h \ - $(TOP)/src/os_win.h \ - $(TOP)/src/pager.h \ - $(TOP)/src/pcache.h \ - parse.h \ - sqlite3.h \ - $(TOP)/src/sqlite3ext.h \ - $(TOP)/src/sqliteInt.h \ - $(TOP)/src/sqliteLimit.h \ - $(TOP)/src/vdbe.h \ - $(TOP)/src/vdbeInt.h - -# Header files used by extensions -# -EXTHDR += \ - $(TOP)/ext/fts1/fts1.h \ - $(TOP)/ext/fts1/fts1_hash.h \ - $(TOP)/ext/fts1/fts1_tokenizer.h -EXTHDR += \ - $(TOP)/ext/fts2/fts2.h \ - $(TOP)/ext/fts2/fts2_hash.h \ - $(TOP)/ext/fts2/fts2_tokenizer.h -EXTHDR += \ - $(TOP)/ext/fts3/fts3.h \ - $(TOP)/ext/fts3/fts3_expr.h \ - $(TOP)/ext/fts3/fts3_hash.h \ - $(TOP)/ext/fts3/fts3_tokenizer.h -EXTHDR += \ - $(TOP)/ext/rtree/rtree.h -EXTHDR += \ - $(TOP)/ext/icu/sqliteicu.h - -# This is the default Makefile target. The objects listed here -# are what get build when you type just "make" with no arguments. -# -all: sqlite3.h libsqlite3.a sqlite3$(EXE) - -libsqlite3.a: $(LIBOBJ) - $(AR) libsqlite3.a $(LIBOBJ) - $(RANLIB) libsqlite3.a - -$(SHPREFIX)sqlite3.$(SO): $(LIBOBJ) - $(MKSHLIB) -o $(SHPREFIX)sqlite3.$(SO) $(LIBOBJ) $(TLIBS_SHARED) - -sqlite3$(EXE): $(TOP)/src/shell.c libsqlite3.a sqlite3.h - $(TCCX) $(READLINE_FLAGS) -o sqlite3$(EXE) \ - $(TOP)/src/shell.c \ - $(LIBREADLINE) $(TLIBS) $(THREADLIB) -L. -lsqlite3 - -# This target creates a directory named "tsrc" and fills it with -# copies of all of the C source code and header files needed to -# build on the target system. Some of the C source code and header -# files are automatically generated. This target takes care of -# all that automatic generation. -# -target_source: $(SRC) - rm -rf tsrc - mkdir tsrc - cp -f $(SRC) tsrc - rm tsrc/sqlite.h.in tsrc/parse.y - touch target_source - -sqlite3.c: target_source $(TOP)/tool/mksqlite3c.tcl - tclsh $(TOP)/tool/mksqlite3c.tcl - cp sqlite3.c tclsqlite3.c - cat $(TOP)/src/tclsqlite.c >>tclsqlite3.c - -fts2amal.c: target_source $(TOP)/ext/fts2/mkfts2amal.tcl - tclsh $(TOP)/ext/fts2/mkfts2amal.tcl - -fts3amal.c: target_source $(TOP)/ext/fts3/mkfts3amal.tcl - tclsh $(TOP)/ext/fts3/mkfts3amal.tcl - -# Rules to build the LEMON compiler generator -# -lemon: $(TOP)/tool/lemon.c $(TOP)/src/lempar.c - $(BCC) -o lemon $(TOP)/tool/lemon.c - cp $(TOP)/src/lempar.c . - -# Rules to build individual *.o files from generated *.c files. This -# applies to: -# -# parse.o -# opcodes.o -# -%.o: %.c $(HDR) - $(TCCX_SHARED) -c $< - -# Rules to build individual *.o files from files in the src directory. -# -%.o: $(TOP)/src/%.c $(HDR) - $(TCCX_SHARED) -c $< - -tclsqlite.o: $(TOP)/src/tclsqlite.c $(HDR) - $(TCCX_SHARED) $(TCL_FLAGS) -c $(TOP)/src/tclsqlite.c - - - -# Rules to build opcodes.c and opcodes.h -# -opcodes.c: opcodes.h $(TOP)/mkopcodec.awk - $(NAWK) -f $(TOP)/mkopcodec.awk opcodes.h >opcodes.c - -opcodes.h: parse.h $(TOP)/src/vdbe.c $(TOP)/mkopcodeh.awk - cat parse.h $(TOP)/src/vdbe.c | \ - $(NAWK) -f $(TOP)/mkopcodeh.awk >opcodes.h - -# Rules to build parse.c and parse.h - the outputs of lemon. -# -parse.h: parse.c - -parse.c: $(TOP)/src/parse.y lemon $(TOP)/addopcodes.awk - cp $(TOP)/src/parse.y . - rm -f parse.h - ./lemon $(OPTS) parse.y - mv parse.h parse.h.temp - awk -f $(TOP)/addopcodes.awk parse.h.temp >parse.h - -sqlite3.h: $(TOP)/src/sqlite.h.in - sed -e s/--VERS--/`cat ${TOP}/VERSION`/ \ - -e s/--VERSION-NUMBER--/`cat ${TOP}/VERSION | sed 's/[^0-9]/ /g' | $(NAWK) '{printf "%d%03d%03d",$$1,$$2,$$3}'`/ \ - $(TOP)/src/sqlite.h.in >sqlite3.h - -keywordhash.h: $(TOP)/tool/mkkeywordhash.c - $(BCC) -o mkkeywordhash $(OPTS) $(TOP)/tool/mkkeywordhash.c - ./mkkeywordhash >keywordhash.h - - - -# Rules to build the extension objects. -# -icu.o: $(TOP)/ext/icu/icu.c $(HDR) $(EXTHDR) - $(TCCX_SHARED) -DSQLITE_CORE -c $(TOP)/ext/icu/icu.c - -fts2.o: $(TOP)/ext/fts2/fts2.c $(HDR) $(EXTHDR) - $(TCCX_SHARED) -DSQLITE_CORE -c $(TOP)/ext/fts2/fts2.c - -fts2_hash.o: $(TOP)/ext/fts2/fts2_hash.c $(HDR) $(EXTHDR) - $(TCCX_SHARED) -DSQLITE_CORE -c $(TOP)/ext/fts2/fts2_hash.c - -fts2_icu.o: $(TOP)/ext/fts2/fts2_icu.c $(HDR) $(EXTHDR) - $(TCCX_SHARED) -DSQLITE_CORE -c $(TOP)/ext/fts2/fts2_icu.c - -fts2_porter.o: $(TOP)/ext/fts2/fts2_porter.c $(HDR) $(EXTHDR) - $(TCCX_SHARED) -DSQLITE_CORE -c $(TOP)/ext/fts2/fts2_porter.c - -fts2_tokenizer.o: $(TOP)/ext/fts2/fts2_tokenizer.c $(HDR) $(EXTHDR) - $(TCCX_SHARED) -DSQLITE_CORE -c $(TOP)/ext/fts2/fts2_tokenizer.c - -fts2_tokenizer1.o: $(TOP)/ext/fts2/fts2_tokenizer1.c $(HDR) $(EXTHDR) - $(TCCX_SHARED) -DSQLITE_CORE -c $(TOP)/ext/fts2/fts2_tokenizer1.c - -fts3.o: $(TOP)/ext/fts3/fts3.c $(HDR) $(EXTHDR) - $(TCCX_SHARED) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3.c - -fts3_expr.o: $(TOP)/ext/fts3/fts3_expr.c $(HDR) $(EXTHDR) - $(TCCX_SHARED) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3_expr.c - -fts3_hash.o: $(TOP)/ext/fts3/fts3_hash.c $(HDR) $(EXTHDR) - $(TCCX_SHARED) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3_hash.c - -fts3_icu.o: $(TOP)/ext/fts3/fts3_icu.c $(HDR) $(EXTHDR) - $(TCCX_SHARED) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3_icu.c - -fts3_porter.o: $(TOP)/ext/fts3/fts3_porter.c $(HDR) $(EXTHDR) - $(TCCX_SHARED) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3_porter.c - -fts3_tokenizer.o: $(TOP)/ext/fts3/fts3_tokenizer.c $(HDR) $(EXTHDR) - $(TCCX_SHARED) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3_tokenizer.c - -fts3_tokenizer1.o: $(TOP)/ext/fts3/fts3_tokenizer1.c $(HDR) $(EXTHDR) - $(TCCX_SHARED) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3_tokenizer1.c - -rtree.o: $(TOP)/ext/rtree/rtree.c $(HDR) $(EXTHDR) - $(TCCX_SHARED) -DSQLITE_CORE -c $(TOP)/ext/rtree/rtree.c - - -# Rules for building test programs and for running tests -# -tclsqlite3: $(TOP)/src/tclsqlite.c libsqlite3.a - $(TCCX_SHARED) $(TCL_FLAGS) -DTCLSH=1 -o tclsqlite3 \ - $(TOP)/src/tclsqlite.c libsqlite3.a $(LIBTCL) $(THREADLIB) - - -# Rules to build the 'testfixture' application. -# -TESTFIXTURE_FLAGS = -DTCLSH=1 -DSQLITE_TEST=1 -DSQLITE_CRASH_TEST=1 -TESTFIXTURE_FLAGS += -DSQLITE_SERVER=1 -DSQLITE_PRIVATE="" -DSQLITE_CORE - -testfixture$(EXE): $(TESTSRC2) libsqlite3.a $(TESTSRC) $(TOP)/src/tclsqlite.c - $(TCCX) $(TCL_FLAGS) $(TESTFIXTURE_FLAGS) \ - $(TESTSRC) $(TESTSRC2) $(TOP)/src/tclsqlite.c \ - -o testfixture$(EXE) $(LIBTCL) $(THREADLIB) libsqlite3.a - -amalgamation-testfixture$(EXE): sqlite3.c $(TESTSRC) $(TOP)/src/tclsqlite.c - $(TCCX) $(TCL_FLAGS) $(TESTFIXTURE_FLAGS) \ - $(TESTSRC) $(TOP)/src/tclsqlite.c sqlite3.c \ - -o testfixture$(EXE) $(LIBTCL) $(THREADLIB) - -fts3-testfixture$(EXE): sqlite3.c fts3amal.c $(TESTSRC) $(TOP)/src/tclsqlite.c - $(TCCX) $(TCL_FLAGS) $(TESTFIXTURE_FLAGS) \ - -DSQLITE_ENABLE_FTS3=1 \ - $(TESTSRC) $(TOP)/src/tclsqlite.c sqlite3.c fts3amal.c \ - -o testfixture$(EXE) $(LIBTCL) $(THREADLIB) - -fulltest: testfixture$(EXE) sqlite3$(EXE) - ./testfixture$(EXE) $(TOP)/test/all.test - -soaktest: testfixture$(EXE) sqlite3$(EXE) - ./testfixture$(EXE) $(TOP)/test/all.test -soak=1 - -fulltestonly: testfixture$(EXE) sqlite3$(EXE) - ./testfixture$(EXE) $(TOP)/test/full.test - -test: testfixture$(EXE) sqlite3$(EXE) - ./testfixture$(EXE) $(TOP)/test/veryquick.test - -sqlite3_analyzer$(EXE): $(TOP)/src/tclsqlite.c sqlite3.c $(TESTSRC) \ - $(TOP)/tool/spaceanal.tcl - sed \ - -e '/^#/d' \ - -e 's,\\,\\\\,g' \ - -e 's,",\\",g' \ - -e 's,^,",' \ - -e 's,$$,\\n",' \ - $(TOP)/tool/spaceanal.tcl >spaceanal_tcl.h - $(TCCX) $(TCL_FLAGS) $(TESTFIXTURE_FLAGS) \ - -DTCLSH=2 -DSQLITE_TEST=1 -DSQLITE_DEBUG=1 -DSQLITE_PRIVATE="" \ - $(TESTSRC) $(TOP)/src/tclsqlite.c sqlite3.c \ - -o sqlite3_analyzer$(EXE) \ - $(LIBTCL) $(THREADLIB) - -TEST_EXTENSION = $(SHPREFIX)testloadext.$(SO) -$(TEST_EXTENSION): $(TOP)/src/test_loadext.c - $(MKSHLIB) $(TOP)/src/test_loadext.c -o $(TEST_EXTENSION) - -extensiontest: testfixture$(EXE) $(TEST_EXTENSION) - ./testfixture$(EXE) $(TOP)/test/loadext.test - -clean: - rm -f *.o sqlite3$(EXE) libsqlite3.a sqlite3.h opcodes.* - rm -f lemon lempar.c parse.* sqlite*.tar.gz mkkeywordhash keywordhash.h - rm -f $(PUBLISH) - rm -f *.da *.bb *.bbg gmon.out - rm -rf quota2a quota2b quota2c - rm -rf tsrc target_source - rm -f testloadext.dll libtestloadext.so - rm -f sqlite3.c fts?amal.c tclsqlite3.c - rm -f sqlite3rc.h - rm -f shell.c sqlite3ext.h - rm -f $(SHPREFIX)sqlite3.$(SO) diff --git a/configure b/configure index 2969759f3c..2660574834 100755 --- a/configure +++ b/configure @@ -803,7 +803,6 @@ VERSION program_prefix TCLLIBDIR TCLSH_CMD -AWK INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM @@ -3911,13 +3910,13 @@ if ${lt_cv_nm_interface+:} false; then : else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:3914: $ac_compile\"" >&5) + (eval echo "\"\$as_me:3913: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 - (eval echo "\"\$as_me:3917: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval echo "\"\$as_me:3916: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 - (eval echo "\"\$as_me:3920: output\"" >&5) + (eval echo "\"\$as_me:3919: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" @@ -5123,7 +5122,7 @@ ia64-*-hpux*) ;; *-*-irix6*) # Find out which ABI we are using. - echo '#line 5126 "configure"' > conftest.$ac_ext + echo '#line 5125 "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? @@ -6648,11 +6647,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:6651: $lt_compile\"" >&5) + (eval echo "\"\$as_me:6650: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:6655: \$? = $ac_status" >&5 + echo "$as_me:6654: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -6987,11 +6986,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:6990: $lt_compile\"" >&5) + (eval echo "\"\$as_me:6989: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:6994: \$? = $ac_status" >&5 + echo "$as_me:6993: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -7092,11 +7091,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:7095: $lt_compile\"" >&5) + (eval echo "\"\$as_me:7094: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:7099: \$? = $ac_status" >&5 + echo "$as_me:7098: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -7147,11 +7146,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:7150: $lt_compile\"" >&5) + (eval echo "\"\$as_me:7149: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:7154: \$? = $ac_status" >&5 + echo "$as_me:7153: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -9527,7 +9526,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 9530 "configure" +#line 9529 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -9623,7 +9622,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 9626 "configure" +#line 9625 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -9943,48 +9942,6 @@ test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' -for ac_prog in gawk mawk nawk awk -do - # Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_AWK+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$AWK"; then - ac_cv_prog_AWK="$AWK" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_AWK="$ac_prog" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -AWK=$ac_cv_prog_AWK -if test -n "$AWK"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 -$as_echo "$AWK" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - - test -n "$AWK" && break -done - ######### # Enable large file support (if special flags are necessary) @@ -11885,7 +11842,6 @@ gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' -AWK='$AWK' test -n "\$AWK" || AWK=awk _ACEOF diff --git a/configure.ac b/configure.ac index 92d9b47b39..ef6d51d0b8 100644 --- a/configure.ac +++ b/configure.ac @@ -90,7 +90,6 @@ fi # AC_PROG_LIBTOOL AC_PROG_INSTALL -AC_PROG_AWK ######### # Enable large file support (if special flags are necessary) diff --git a/main.mk b/main.mk index f3c1d2aabd..2397713c96 100644 --- a/main.mk +++ b/main.mk @@ -35,9 +35,6 @@ # LIBREADLINE Linker options needed by programs using readline() must # link against. # -# NAWK Nawk compatible awk program. Older (obsolete?) solaris -# systems need this to avoid using the original AT&T AWK. -# # Once the macros above are defined, the rest of this make script will # build the SQLite library and testing tools. ################################################################################ @@ -701,7 +698,7 @@ sqlite3_analyzer.c: sqlite3.c $(TOP)/src/tclsqlite.c $(TOP)/tool/spaceanal.tcl cat sqlite3.c $(TOP)/src/tclsqlite.c >> $@ echo "static const char *tclsh_main_loop(void){" >> $@ echo "static const char *zMainloop = " >> $@ - $(NAWK) -f $(TOP)/tool/tostr.awk $(TOP)/tool/spaceanal.tcl >> $@ + tclsh $(TOP)/tool/tostr.tcl $(TOP)/tool/spaceanal.tcl >> $@ echo "; return zMainloop; }" >> $@ sqlite3_analyzer$(EXE): sqlite3_analyzer.c diff --git a/manifest b/manifest index a38c009e00..e48c25ca0f 100644 --- a/manifest +++ b/manifest @@ -1,10 +1,8 @@ -C Change\sthe\saddopcodes.awk\sscript\sinto\stool/addopcodes.tcl. -D 2015-10-07T12:21:14.000 -F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f -F Makefile.in b33d44230974d2d5ea2f0599855c5e36bd79b90a -F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 -F Makefile.msc b7d8a7efbbf38cee57bfc81d11ca28c42122ff81 -F Makefile.vxworks e1b65dea203f054e71653415bd8f96dcaed47858 +C Convert\sthe\stool/tostr.awk\sscript\sinto\stool/tostr.tcl.\s\sRemove\stwo\sobsolete\nMakefiles.\s\sPurge\sNAWK\sfrom\sthe\sconfigure\sscript\sand\sfrom\sunix\smakefiles.\nThere\sare\sstill\stwo\suses\sof\sNAWK\sin\sMakefile.msc. +D 2015-10-07T12:36:42.935 +F Makefile.in 2a247c733c2dd6fab703df04dd009b26413956f5 +F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 +F Makefile.msc 17ce18bb7e9ca2ad3abed9b0a1fcbef3fbe8f307 F README.md 8ecc12493ff9f820cdea6520a9016001cb2e59b7 F VERSION ccfc4d1576dbfdeece0a4372a2e6a2e37d3e7975 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 @@ -37,8 +35,8 @@ F autoconf/tea/win/rules.vc c511f222b80064096b705dbeb97060ee1d6b6d63 F config.guess 226d9a188c6196f3033ffc651cbc9dcee1a42977 F config.h.in 42b71ad3fe21c9e88fa59e8458ca1a6bc72eb0c0 F config.sub 9ebe4c3b3dab6431ece34f16828b594fb420da55 -F configure 2f61915a1bdfbc589244334401cf97d3401e6a39 x -F configure.ac 713de38000413e469188db2cb85bed759b56f322 +F configure 8f9f13f9a371bea36bc5b8818bbd56e4e8ba200d x +F configure.ac 27a3ebbfe43aab82319c68aa0a11377bbfe29246 F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad F doc/lemon.html 334dbf6621b8fb8790297ec1abf3cfa4621709d1 F doc/pager-invariants.txt 27fed9a70ddad2088750c4a2b493b63853da2710 @@ -262,7 +260,7 @@ F ext/userauth/userauth.c 5fa3bdb492f481bbc1709fc83c91ebd13460c69e F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk 1cb544e1b1943b8b6452a811869b3baee5bfcb13 +F main.mk fdc70f6d0d018b97f351a8fa12db6b10d9baaffc F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 @@ -1382,14 +1380,14 @@ F tool/sqldiff.c b318efc2eaf7a7fac4d281a0ce736193cb2506df F tool/stack_usage.tcl f8e71b92cdb099a147dad572375595eae55eca43 F tool/symbols-mingw.sh 4dbcea7e74768305384c9fd2ed2b41bbf9f0414d F tool/symbols.sh fec58532668296d7c7dc48be9c87f75ccdb5814f -F tool/tostr.awk 11760e1b94a5d3dcd42378f3cc18544c06cfa576 +F tool/tostr.tcl 96022f35ada2194f6f8ccf6fd95809e90ed277c4 F tool/varint.c 5d94cb5003db9dbbcbcc5df08d66f16071aee003 F tool/vdbe-compress.tcl 5926c71f9c12d2ab73ef35c29376e756eb68361c F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 1506cb33fcf61e2ef97b35b99e58fbf21f4f5496 -R d8eeb7e51eba4dfb24803600079d2858 +P 8bbf37142ef2759274668f6da114b5c8072e42db +R 07b752064456f02ed0865632d443e697 U drh -Z f02ffe1dfbcccf71e8c30b4fbe822892 +Z 7087d810f3111cb2f52748462bb8f6e3 diff --git a/manifest.uuid b/manifest.uuid index 95ca593f47..7f24566eb2 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8bbf37142ef2759274668f6da114b5c8072e42db \ No newline at end of file +5b6775215327a89232f5059653747a18e83b8b4b \ No newline at end of file diff --git a/tool/tostr.awk b/tool/tostr.awk deleted file mode 100644 index 83c6cc1a50..0000000000 --- a/tool/tostr.awk +++ /dev/null @@ -1,9 +0,0 @@ -#!/usr/bin/awk -# -# Convert input text into a C string -# -{ - gsub(/\\/,"\\\\"); - gsub(/\"/,"\\\""); - print "\"" $0 "\\n\""; -} diff --git a/tool/tostr.tcl b/tool/tostr.tcl new file mode 100644 index 0000000000..cb06ee947f --- /dev/null +++ b/tool/tostr.tcl @@ -0,0 +1,12 @@ +#!/usr/bin/tcl +# +# Convert input text into a C string +# +set in [open [lindex $argv 0] rb] +while {![eof $in]} { + set line [gets $in] + if {[eof $in]} break; + set x [string map "\\\\ \\\\\\\\ \\\" \\\\\"" $line] + puts "\"$x\\n\"" +} +close $in From d46cc33131e6179b88e770635d9de8d1684c0b10 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 7 Oct 2015 13:24:27 +0000 Subject: [PATCH 50/98] Add tests for fts5 phrase queries with column filters. FossilOrigin-Name: f20f9f813f00cefcd427e506a09b0b973c782e3f --- ext/fts5/fts5Int.h | 9 +++ ext/fts5/fts5_buffer.c | 6 +- ext/fts5/fts5_index.c | 16 ++--- ext/fts5/test/fts5phrase.test | 119 ++++++++++++++++++++++++++++++++++ manifest | 17 ++--- manifest.uuid | 2 +- 6 files changed, 145 insertions(+), 24 deletions(-) create mode 100644 ext/fts5/test/fts5phrase.test diff --git a/ext/fts5/fts5Int.h b/ext/fts5/fts5Int.h index 53df5dbf5a..ce066f2aa8 100644 --- a/ext/fts5/fts5Int.h +++ b/ext/fts5/fts5Int.h @@ -450,6 +450,15 @@ int sqlite3Fts5PutVarint(unsigned char *p, u64 v); #define fts5GetVarint32(a,b) sqlite3Fts5GetVarint32(a,(u32*)&b) #define fts5GetVarint sqlite3Fts5GetVarint +#define fts5FastGetVarint32(a, iOff, nVal) { \ + nVal = (a)[iOff++]; \ + if( nVal & 0x80 ){ \ + iOff--; \ + iOff += fts5GetVarint32(&(a)[iOff], nVal); \ + } \ +} + + /* ** End of interface to code in fts5_varint.c. **************************************************************************/ diff --git a/ext/fts5/fts5_buffer.c b/ext/fts5/fts5_buffer.c index e2dbcbf141..0cbade2190 100644 --- a/ext/fts5/fts5_buffer.c +++ b/ext/fts5/fts5_buffer.c @@ -185,11 +185,11 @@ int sqlite3Fts5PoslistNext64( }else{ i64 iOff = *piOff; int iVal; - i += fts5GetVarint32(&a[i], iVal); + fts5FastGetVarint32(a, i, iVal); if( iVal==1 ){ - i += fts5GetVarint32(&a[i], iVal); + fts5FastGetVarint32(a, i, iVal); iOff = ((i64)iVal) << 32; - i += fts5GetVarint32(&a[i], iVal); + fts5FastGetVarint32(a, i, iVal); } *piOff = iOff + (iVal-2); *pi = i; diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index d06a069f8a..e1d13f1215 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -1939,14 +1939,6 @@ static void fts5SegIterLoadDlidx(Fts5Index *p, Fts5SegIter *pIter){ pIter->pDlidx = fts5DlidxIterInit(p, bRev, iSeg, pIter->iTermLeafPgno); } -#define fts5IndexGetVarint32(a, iOff, nVal) { \ - nVal = (a)[iOff++]; \ - if( nVal & 0x80 ){ \ - iOff--; \ - iOff += fts5GetVarint32(&(a)[iOff], nVal); \ - } \ -} - #define fts5IndexSkipVarint(a, iOff) { \ int iEnd = iOff+9; \ while( (a[iOff++] & 0x80) && iOffeState==2 ){ int iCol; - fts5IndexGetVarint32(pChunk, i, iCol); + fts5FastGetVarint32(pChunk, i, iCol); if( fts5IndexColsetTest(pCtx->pColset, iCol) ){ pCtx->eState = 1; fts5BufferAppendVarint(&p->rc, pCtx->pBuf, 1); @@ -4008,7 +4000,7 @@ static void fts5PoslistFilterCallback( if( i>=nChunk ){ pCtx->eState = 2; }else{ - fts5IndexGetVarint32(pChunk, i, iCol); + fts5FastGetVarint32(pChunk, i, iCol); pCtx->eState = fts5IndexColsetTest(pCtx->pColset, iCol); if( pCtx->eState ){ fts5BufferAppendBlob(&p->rc, pCtx->pBuf, i-iStart, &pChunk[iStart]); diff --git a/ext/fts5/test/fts5phrase.test b/ext/fts5/test/fts5phrase.test new file mode 100644 index 0000000000..6dac684e83 --- /dev/null +++ b/ext/fts5/test/fts5phrase.test @@ -0,0 +1,119 @@ +# 2014 Jan 08 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# Tests focused on phrase queries. +# + +source [file join [file dirname [info script]] fts5_common.tcl] +set testprefix fts5phrase + +# If SQLITE_ENABLE_FTS5 is defined, omit this file. +ifcapable !fts5 { + finish_test + return +} + +do_execsql_test 1.0 { + CREATE VIRTUAL TABLE t3 USING fts5(a, b, c); + INSERT INTO t3 VALUES('d e a', 'd i j j f', 'i j i e b f h'); -- 1 + INSERT INTO t3 VALUES('g a e', 'f g i g a', 'h d g i g h c'); -- 2 + INSERT INTO t3 VALUES('e a d', 'e i h a f', 'c e h i f b i'); -- 3 + INSERT INTO t3 VALUES('a g c', 'd j d j c', 'c d f j i g j'); -- 4 + INSERT INTO t3 VALUES('b c b', 'j g c d f', 'j c j d g f b'); -- 5 + INSERT INTO t3 VALUES('j a d', 'e b i h h', 'c c f g d i d'); -- 6 + INSERT INTO t3 VALUES('a d f', 'h g i i i', 'e a g c i f b'); -- 7 + INSERT INTO t3 VALUES('g f d', 'f c g b j', 'b b h h h j j'); -- 8 + INSERT INTO t3 VALUES('f h g', 'c j f g j', 'd h d f e b h'); -- 9 + INSERT INTO t3 VALUES('f h d', 'c i a d b', 'g b j b a d e'); -- 10 + INSERT INTO t3 VALUES('j h h', 'j i h a g', 'd e i e a g j'); -- 11 + INSERT INTO t3 VALUES('a b e', 'h g a g c', 'h c a a d e g'); -- 12 + INSERT INTO t3 VALUES('a j g', 'i h i f i', 'a g h j g i b'); -- 13 + INSERT INTO t3 VALUES('j h e', 'f e d i e', 'i d c f e d c'); -- 14 + INSERT INTO t3 VALUES('d j d', 'd b i a c', 'g d h i d b e'); -- 15 + INSERT INTO t3 VALUES('h j e', 'e b b c f', 'j a f g h d j'); -- 16 + INSERT INTO t3 VALUES('c b j', 'c a b a i', 'h f i d a d c'); -- 17 + INSERT INTO t3 VALUES('e e d', 'i d f c c', 'g i d a f e a'); -- 18 + INSERT INTO t3 VALUES('e i g', 'e a b i h', 'i f d d a d f'); -- 19 + INSERT INTO t3 VALUES('h g f', 'b h h j d', 'i f d e g j a'); -- 20 + INSERT INTO t3 VALUES('e h f', 'j c b c f', 'j a j g h a c'); -- 21 + INSERT INTO t3 VALUES('d c h', 'b g i c e', 'i i c d e h i'); -- 22 + INSERT INTO t3 VALUES('a h i', 'a g d f f', 'e f i i b b h'); -- 23 + INSERT INTO t3 VALUES('d d g', 'c c b c g', 'g c h e b c e'); -- 24 + INSERT INTO t3 VALUES('a b b', 'b f a d i', 'd a h a b c i'); -- 25 + INSERT INTO t3 VALUES('a f d', 'a j e a h', 'j i h j a i f'); -- 26 + INSERT INTO t3 VALUES('d j d', 'h a d i a', 'h h f j h g a'); -- 27 + INSERT INTO t3 VALUES('g a e', 'd g f a g', 'i d b c g g j'); -- 28 + INSERT INTO t3 VALUES('j e h', 'g h j h g', 'd a e j a a h'); -- 29 + INSERT INTO t3 VALUES('e j e', 'g e j g c', 'f c e b e e a'); -- 30 + INSERT INTO t3 VALUES('h f f', 'i j g e c', 'j j f c a i j'); -- 31 + INSERT INTO t3 VALUES('a g c', 'c g d b i', 'g h c b a a f'); -- 32 + INSERT INTO t3 VALUES('c h i', 'j d h e e', 'a h i d c c j'); -- 33 + INSERT INTO t3 VALUES('d a c', 'e d d b j', 'c e b b h i h'); -- 34 + INSERT INTO t3 VALUES('d f h', 'c a f c c', 'j b b c c j f'); -- 35 + INSERT INTO t3 VALUES('b g h', 'g c c c f', 'c g c f h e e'); -- 36 + INSERT INTO t3 VALUES('f e a', 'b h f j h', 'j g h f d g f'); -- 37 + INSERT INTO t3 VALUES('h f a', 'a e i j g', 'f d a f d f c'); -- 38 + INSERT INTO t3 VALUES('f i c', 'f i i i i', 'e c f d h j f'); -- 39 + INSERT INTO t3 VALUES('h h d', 'd i e d i', 'd f e i a h a'); -- 40 + INSERT INTO t3 VALUES('f g c', 'd a f c h', 'b b g j c e g'); -- 41 + INSERT INTO t3 VALUES('h i h', 'h d j d e', 'e d b b i e g'); -- 42 + INSERT INTO t3 VALUES('b h i', 'j e i d a', 'j j h e e c a'); -- 43 + INSERT INTO t3 VALUES('g i g', 'f c c f d', 'a c i c a d a'); -- 44 + INSERT INTO t3 VALUES('c c f', 'a b j d b', 'c a e g f e c'); -- 45 + INSERT INTO t3 VALUES('d h j', 'g c b j d', 'e a h f h j g'); -- 46 + INSERT INTO t3 VALUES('a a d', 'j e j a i', 'i d c f f f b'); -- 47 + INSERT INTO t3 VALUES('b g j', 'e c i h f', 'd d h b g a d'); -- 48 + INSERT INTO t3 VALUES('c i a', 'a c c c c', 'e h i e h i e'); -- 49 + INSERT INTO t3 VALUES('f f c', 'f f b i i', 'f f a j e c i'); -- 50 +} + +proc pmatch {col expr} { + return [expr {[string first $expr $col]>=0}] +} +db func pmatch pmatch + +foreach {tn cols tokens} { + 1 a "c c" + 2 b "c c" + 3 c "c c" + 4 {a b c} "c c" + 5 {a b c} "b h" + 6 {a b} "b h" + 7 {a c} "b h" + 8 {c a} "b h" + 9 {c} "i e" + 10 {b} "i e" + 11 {a} "i e" +} { + set fts "{$cols}:[join $tokens +]" + set where [list] + foreach c $cols { lappend where "pmatch($c, '$tokens')" } + set where [join $where " OR "] + + set res [db eval "SELECT rowid FROM t3 WHERE $where"] + do_execsql_test "1.$tn.$fts->([llength $res] rows)" { + SELECT rowid FROM t3($fts) + } $res +} + +do_execsql_test 2.0 { + SELECT rowid, + highlight(t3, 0, '*', '*'), + highlight(t3, 1, '*', '*'), + highlight(t3, 2, '*', '*') + FROM t3('a:f+f') +} { + 31 {h *f f*} {i j g e c} {j j f c a i j} + 50 {*f f* c} {f f b i i} {f f a j e c i} +} + +finish_test + diff --git a/manifest b/manifest index 88bb54c2ce..d82dcc4f32 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sfurther\stests\sfor\sfts5\sprefix\squeries. -D 2015-10-07T09:02:50.876 +C Add\stests\sfor\sfts5\sphrase\squeries\swith\scolumn\sfilters. +D 2015-10-07T13:24:27.688 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -106,13 +106,13 @@ F ext/fts3/unicode/mkunicode.tcl 95cf7ec186e48d4985e433ff8a1c89090a774252 F ext/fts3/unicode/parseunicode.tcl da577d1384810fb4e2b209bf3313074353193e95 F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 F ext/fts5/fts5.h 98f802fe41481f9d797fce496f0fefcad72c7782 -F ext/fts5/fts5Int.h 93ff3f2ae0789abc10c6832c32273db30024ead8 +F ext/fts5/fts5Int.h ed6c05b803e0bacf85228a8d255853e89796f6f5 F ext/fts5/fts5_aux.c 7a307760a9c57c750d043188ec0bad59f5b5ec7e -F ext/fts5/fts5_buffer.c 54b18497395a19dfe1d00f63a3b403e5f93d4fd1 +F ext/fts5/fts5_buffer.c 195f6f05599129aa8a2d88257f474c39edbc27c8 F ext/fts5/fts5_config.c 57ee5fe71578cb494574fc0e6e51acb9a22a8695 F ext/fts5/fts5_expr.c 2054e550e75cffa117557c9416210c425934436d F ext/fts5/fts5_hash.c 4bf4b99708848357b8a2b5819e509eb6d3df9246 -F ext/fts5/fts5_index.c f1465ed954973390363b1cc22a4644e4630c78a1 +F ext/fts5/fts5_index.c 3bc8a522f2e0c7e588dfc6da78dd11a5869005e3 F ext/fts5/fts5_main.c fe5243d6bbb79217394f0ec7f4f5199ddbc9e7e8 F ext/fts5/fts5_storage.c df061a5caf9e50fbbd43113009b5b248362f4995 F ext/fts5/fts5_tcl.c 6da58d6e8f42a93c4486b5ba9b187a7f995dee37 @@ -166,6 +166,7 @@ F ext/fts5/test/fts5merge.test 8f3cdba2ec9c5e7e568246e81b700ad37f764367 F ext/fts5/test/fts5near.test b214cddb1c1f1bddf45c75af768f20145f7e71cc F ext/fts5/test/fts5onepass.test 7ed9608e258132cb8d55e7c479b08676ad68810c F ext/fts5/test/fts5optimize.test 42741e7c085ee0a1276140a752d4407d97c2c9f5 +F ext/fts5/test/fts5phrase.test f6d1d464da5beb25dc56277aa4f1d6102f0d9a2f F ext/fts5/test/fts5plan.test 6a55ecbac9890765b0e16f8c421c7e0888cfe436 F ext/fts5/test/fts5porter.test 7cdc07bef301d70eebbfa75dcaf45c3680e1d0e1 F ext/fts5/test/fts5porter2.test 2e65633d58a1c525d5af0f6c01e5a59155bb3487 @@ -1389,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 80027709c3ba2a8c9bda4d37779f65104be1045c -R 52e545b8d6eb2ff6aa406abf9ffb76aa +P accdc98b1291f07b802fd23f3ebc7dbc02ba09d3 +R 849224c9a19364ffbe4ccc562bb10fe7 U dan -Z 301081fc00e6f67555fe939cedef1345 +Z 80e2525dbe861d7d6f96bf60c658b288 diff --git a/manifest.uuid b/manifest.uuid index 903a16db23..dc4e1e9953 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -accdc98b1291f07b802fd23f3ebc7dbc02ba09d3 \ No newline at end of file +f20f9f813f00cefcd427e506a09b0b973c782e3f \ No newline at end of file From 1dcc97cd3a825d80628ab2b4076bba3917f4095f Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 7 Oct 2015 16:14:18 +0000 Subject: [PATCH 51/98] Adjustments to spellfix2.test so that it works reliably on mac. FossilOrigin-Name: d591e860d3d7c61637b4b07989bf176cb337db2c --- manifest | 14 +++++------ manifest.uuid | 2 +- test/spellfix2.test | 58 +++++++++++++++++++++++---------------------- 3 files changed, 38 insertions(+), 36 deletions(-) diff --git a/manifest b/manifest index d82dcc4f32..de5762bf9d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\stests\sfor\sfts5\sphrase\squeries\swith\scolumn\sfilters. -D 2015-10-07T13:24:27.688 +C Adjustments\sto\sspellfix2.test\sso\sthat\sit\sworks\sreliably\son\smac. +D 2015-10-07T16:14:18.747 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -1033,7 +1033,7 @@ F test/speed4p.explain 6b5f104ebeb34a038b2f714150f51d01143e59aa F test/speed4p.test 0e51908951677de5a969b723e03a27a1c45db38b F test/speedtest1.c 857439869d1cb4db35e1c720ee9c2756eb9ea2a0 F test/spellfix.test 0597065ff57042df1f138e6a2611ae19c2698135 -F test/spellfix2.test 1ff48bb65b6198d21674ae24d19bb136e547585a +F test/spellfix2.test dfc8f519a3fc204cb2dfa8b4f29821ae90f6f8c3 F test/sqldiff1.test 8f6bc7c6a5b3585d350d779c6078869ba402f8f5 F test/sqllimits1.test 89b3d5aad05b99f707ee3786bdd4416dccf83304 F test/stat.test 8de91498c99f5298b303f70f1d1f3b9557af91bf @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P accdc98b1291f07b802fd23f3ebc7dbc02ba09d3 -R 849224c9a19364ffbe4ccc562bb10fe7 -U dan -Z 80e2525dbe861d7d6f96bf60c658b288 +P f20f9f813f00cefcd427e506a09b0b973c782e3f +R 5c72368b779571d25566b43efcab6857 +U drh +Z 9286de7475387911171425dc1c43ba95 diff --git a/manifest.uuid b/manifest.uuid index dc4e1e9953..fbc538a962 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f20f9f813f00cefcd427e506a09b0b973c782e3f \ No newline at end of file +d591e860d3d7c61637b4b07989bf176cb337db2c \ No newline at end of file diff --git a/test/spellfix2.test b/test/spellfix2.test index e9d6c693b2..d1a13284ea 100644 --- a/test/spellfix2.test +++ b/test/spellfix2.test @@ -76,40 +76,42 @@ do_execsql_test 1.5 { do_execsql_test 1.6 { SELECT word, distance, matchlen FROM demo - WHERE word MATCH 'amstedam*' AND distance <= 100; + WHERE word MATCH 'amstedam*' AND distance <= 100 + ORDER BY distance, word; } { - amsterdam 100 9 amsterdamh 100 9 - amsterdamm 100 9 amsterdamn 100 9 - amsterdama 100 9 amsterdame 100 9 - amsterdami 100 9 amsterdamo 100 9 - amsterdamu 100 9 amsterdamy 100 9 - amsterdammetje 100 9 amsterdamania 100 9 - amsterdamb 100 9 amsterdamf 100 9 - amsterdamp 100 9 amsterdamv 100 9 - amsterdamw 100 9 amsterdamweg 100 9 - amsterdamc 100 9 amsterdamg 100 9 - amsterdamj 100 9 amsterdamk 100 9 - amsterdamq 100 9 amsterdams 100 9 - amsterdamx 100 9 amsterdamz 100 9 - amsterdamsestraat 100 9 amsterdamd 100 9 - amsterdamt 100 9 amsterdaml 100 9 - amsterdamlaan 100 9 amsterdamr 100 9 + amsterdam 100 9 amsterdama 100 9 + amsterdamania 100 9 amsterdamb 100 9 + amsterdamc 100 9 amsterdamd 100 9 + amsterdame 100 9 amsterdamf 100 9 + amsterdamg 100 9 amsterdamh 100 9 + amsterdami 100 9 amsterdamj 100 9 + amsterdamk 100 9 amsterdaml 100 9 + amsterdamlaan 100 9 amsterdamm 100 9 + amsterdammetje 100 9 amsterdamn 100 9 + amsterdamo 100 9 amsterdamp 100 9 + amsterdamq 100 9 amsterdamr 100 9 + amsterdams 100 9 amsterdamsestraat 100 9 + amsterdamt 100 9 amsterdamu 100 9 + amsterdamv 100 9 amsterdamw 100 9 + amsterdamweg 100 9 amsterdamx 100 9 + amsterdamy 100 9 amsterdamz 100 9 } do_execsql_test 1.7 { SELECT word, distance, matchlen FROM demo - WHERE word MATCH 'amstedam*' AND distance <= 100 AND top=20; + WHERE word MATCH 'amstedam*' AND distance <= 100 AND top=20 + ORDER BY distance, word; } { - amsterdam 100 9 amsterdamh 100 9 - amsterdamm 100 9 amsterdamn 100 9 - amsterdama 100 9 amsterdame 100 9 - amsterdami 100 9 amsterdamo 100 9 - amsterdamu 100 9 amsterdamy 100 9 - amsterdammetje 100 9 amsterdamania 100 9 - amsterdamb 100 9 amsterdamf 100 9 - amsterdamp 100 9 amsterdamv 100 9 - amsterdamw 100 9 amsterdamweg 100 9 - amsterdamc 100 9 amsterdamg 100 9 + amsterdam 100 9 amsterdama 100 9 + amsterdamania 100 9 amsterdamb 100 9 + amsterdamc 100 9 amsterdame 100 9 + amsterdamf 100 9 amsterdamg 100 9 + amsterdamh 100 9 amsterdami 100 9 + amsterdamm 100 9 amsterdammetje 100 9 + amsterdamn 100 9 amsterdamo 100 9 + amsterdamp 100 9 amsterdamu 100 9 + amsterdamv 100 9 amsterdamw 100 9 + amsterdamweg 100 9 amsterdamy 100 9 } From 22c7cca21faf79e0e949dbc77350c57822a5f773 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 7 Oct 2015 17:01:22 +0000 Subject: [PATCH 52/98] Allow the subsitute character (codepoint 26 - 0x1A) to appear in fts5 barewords. FossilOrigin-Name: baec1b96cb64a6a6317143a8df841e502afe3914 --- ext/fts5/fts5_buffer.c | 3 ++- ext/fts5/fts5_index.c | 4 ++-- ext/fts5/test/fts5simple.test | 30 ++++++++++++++++++++++++++++++ manifest | 18 +++++++++--------- manifest.uuid | 2 +- 5 files changed, 44 insertions(+), 13 deletions(-) diff --git a/ext/fts5/fts5_buffer.c b/ext/fts5/fts5_buffer.c index 0cbade2190..e7e8d6d663 100644 --- a/ext/fts5/fts5_buffer.c +++ b/ext/fts5/fts5_buffer.c @@ -292,11 +292,12 @@ char *sqlite3Fts5Strndup(int *pRc, const char *pIn, int nIn){ ** * The 52 upper and lower case ASCII characters, and ** * The 10 integer ASCII characters. ** * The underscore character "_" (0x5F). +** * The unicode "subsitute" character (0x1A). */ int sqlite3Fts5IsBareword(char t){ u8 aBareword[128] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 .. 0x0F */ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 .. 0x1F */ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, /* 0x10 .. 0x1F */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 .. 0x2F */ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, /* 0x30 .. 0x3F */ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x40 .. 0x4F */ diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index e1d13f1215..5b2914ab49 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -4687,10 +4687,10 @@ int sqlite3Fts5IterPoslist( */ int sqlite3Fts5IterPoslistBuffer(Fts5IndexIter *pIter, Fts5Buffer *pBuf){ Fts5Index *p = pIter->pIndex; - + Fts5SegIter *pSeg = &pIter->aSeg[ pIter->aFirst[1].iFirst ]; assert( p->rc==SQLITE_OK ); fts5BufferZero(pBuf); - fts5MultiIterPoslist(p, pIter, 0, 0, pBuf); + fts5SegiterPoslist(p, pSeg, 0, pBuf); return fts5IndexReturn(p); } diff --git a/ext/fts5/test/fts5simple.test b/ext/fts5/test/fts5simple.test index 77407f5e2c..67fc494435 100644 --- a/ext/fts5/test/fts5simple.test +++ b/ext/fts5/test/fts5simple.test @@ -251,6 +251,36 @@ do_execsql_test 10.1 { SELECT rowid FROM t3('c: c*'); } {2} +#------------------------------------------------------------------------- +# Test that character 0x1A is allowed in fts5 barewords. +# +do_test 11.0 { + execsql "CREATE VIRTUAL TABLE t4 USING fts5(x, tokenize=\"ascii tokenchars '\x1A'\")" + execsql " + INSERT INTO t4 VALUES('a b c \x1A'); + INSERT INTO t4 VALUES('a b c d\x1A'); + INSERT INTO t4 VALUES('a b c \x1Ad'); + INSERT INTO t4 VALUES('a b c d'); + " +} {} + +do_test 11.1 { + execsql "SELECT rowid FROM t4('\x1A')" +} {1} +do_test 11.2 { + execsql "SELECT rowid FROM t4('\x1A*')" +} {1 3} +do_test 11.3 { + execsql "SELECT rowid FROM t4('d\x1A')" +} {2} + +do_test 11.4 { + catchsql "SELECT rowid FROM t4('d\x1B')" +} {/fts5: syntax error/} +do_test 11.5 { + catchsql "SELECT rowid FROM t4('d\x19')" +} {/fts5: syntax error/} + finish_test diff --git a/manifest b/manifest index de5762bf9d..364d23070b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Adjustments\sto\sspellfix2.test\sso\sthat\sit\sworks\sreliably\son\smac. -D 2015-10-07T16:14:18.747 +C Allow\sthe\ssubsitute\scharacter\s(codepoint\s26\s-\s0x1A)\sto\sappear\sin\sfts5\sbarewords. +D 2015-10-07T17:01:22.560 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -108,11 +108,11 @@ F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 F ext/fts5/fts5.h 98f802fe41481f9d797fce496f0fefcad72c7782 F ext/fts5/fts5Int.h ed6c05b803e0bacf85228a8d255853e89796f6f5 F ext/fts5/fts5_aux.c 7a307760a9c57c750d043188ec0bad59f5b5ec7e -F ext/fts5/fts5_buffer.c 195f6f05599129aa8a2d88257f474c39edbc27c8 +F ext/fts5/fts5_buffer.c b2fb69c1ee3378956c0d9ee964d61b59d296afaf F ext/fts5/fts5_config.c 57ee5fe71578cb494574fc0e6e51acb9a22a8695 F ext/fts5/fts5_expr.c 2054e550e75cffa117557c9416210c425934436d F ext/fts5/fts5_hash.c 4bf4b99708848357b8a2b5819e509eb6d3df9246 -F ext/fts5/fts5_index.c 3bc8a522f2e0c7e588dfc6da78dd11a5869005e3 +F ext/fts5/fts5_index.c 6b818dd5b68237d5d0f7723795a329f0fb2e9987 F ext/fts5/fts5_main.c fe5243d6bbb79217394f0ec7f4f5199ddbc9e7e8 F ext/fts5/fts5_storage.c df061a5caf9e50fbbd43113009b5b248362f4995 F ext/fts5/fts5_tcl.c 6da58d6e8f42a93c4486b5ba9b187a7f995dee37 @@ -175,7 +175,7 @@ F ext/fts5/test/fts5rank.test 11dcebba31d822f7e99685b4ea2c2ae3ec0b16f1 F ext/fts5/test/fts5rebuild.test 03935f617ace91ed23a6099c7c74d905227ff29b F ext/fts5/test/fts5restart.test c17728fdea26e7d0f617d22ad5b4b2862b994c17 F ext/fts5/test/fts5rowid.test 400384798349d658eaf06aefa1e364957d5d4821 -F ext/fts5/test/fts5simple.test 84d22123e0a7584f1ffb6efcd37eee46f317ab90 +F ext/fts5/test/fts5simple.test 85bbb268e01d2e3527d70a7fa511ddc3bba2ccc0 F ext/fts5/test/fts5synonym.test cf88c0a56d5ea9591e3939ef1f6e294f7f2d0671 F ext/fts5/test/fts5tokenizer.test ea4df698b35cc427ebf2ba22829d0e28386d8c89 F ext/fts5/test/fts5unicode.test fbef8d8a3b4b88470536cc57604a82ca52e51841 @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P f20f9f813f00cefcd427e506a09b0b973c782e3f -R 5c72368b779571d25566b43efcab6857 -U drh -Z 9286de7475387911171425dc1c43ba95 +P d591e860d3d7c61637b4b07989bf176cb337db2c +R 4054948498db600c620d7cf47f4149f2 +U dan +Z db95020d457f0e85944d65c1e34b0155 diff --git a/manifest.uuid b/manifest.uuid index fbc538a962..08cc59d84d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d591e860d3d7c61637b4b07989bf176cb337db2c \ No newline at end of file +baec1b96cb64a6a6317143a8df841e502afe3914 \ No newline at end of file From 08114efde482c3d8170bb5388269c722c8c5a9ca Mon Sep 17 00:00:00 2001 From: mistachkin Date: Wed, 7 Oct 2015 17:06:17 +0000 Subject: [PATCH 53/98] Fix harmless compiler warning in FTS5. FossilOrigin-Name: 13adcd038fc20dd1b6f344f79b449b4034f8f8f2 --- ext/fts5/fts5_main.c | 1 - manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index cabb625747..644d323233 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -1508,7 +1508,6 @@ static int fts5UpdateMethod( } } - update_method_out: pTab->pConfig->pzErrmsg = 0; return rc; } diff --git a/manifest b/manifest index 364d23070b..3b569407f9 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Allow\sthe\ssubsitute\scharacter\s(codepoint\s26\s-\s0x1A)\sto\sappear\sin\sfts5\sbarewords. -D 2015-10-07T17:01:22.560 +C Fix\sharmless\scompiler\swarning\sin\sFTS5. +D 2015-10-07T17:06:17.479 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -113,7 +113,7 @@ F ext/fts5/fts5_config.c 57ee5fe71578cb494574fc0e6e51acb9a22a8695 F ext/fts5/fts5_expr.c 2054e550e75cffa117557c9416210c425934436d F ext/fts5/fts5_hash.c 4bf4b99708848357b8a2b5819e509eb6d3df9246 F ext/fts5/fts5_index.c 6b818dd5b68237d5d0f7723795a329f0fb2e9987 -F ext/fts5/fts5_main.c fe5243d6bbb79217394f0ec7f4f5199ddbc9e7e8 +F ext/fts5/fts5_main.c aa96828990274927e2b404e0b6e60f9ae1274254 F ext/fts5/fts5_storage.c df061a5caf9e50fbbd43113009b5b248362f4995 F ext/fts5/fts5_tcl.c 6da58d6e8f42a93c4486b5ba9b187a7f995dee37 F ext/fts5/fts5_test_mi.c e96be827aa8f571031e65e481251dc1981d608bf @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P d591e860d3d7c61637b4b07989bf176cb337db2c -R 4054948498db600c620d7cf47f4149f2 -U dan -Z db95020d457f0e85944d65c1e34b0155 +P baec1b96cb64a6a6317143a8df841e502afe3914 +R 450be658799fba4e5ff2cf0a8c0976d8 +U mistachkin +Z d352d6bcf527145b85d125184e9bb23e diff --git a/manifest.uuid b/manifest.uuid index 08cc59d84d..f85da3f615 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -baec1b96cb64a6a6317143a8df841e502afe3914 \ No newline at end of file +13adcd038fc20dd1b6f344f79b449b4034f8f8f2 \ No newline at end of file From 98e713bb8d8870ecf9bf18c6cc1d791d888f2963 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 7 Oct 2015 19:06:21 +0000 Subject: [PATCH 54/98] Further optimizations for fts5 prefix queries without a prefix index. FossilOrigin-Name: 83dc1ff7fa010715ca7f406a572f4ee444a967d7 --- ext/fts5/fts5_index.c | 44 ++++++++++++++++++++----------------------- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 28 insertions(+), 32 deletions(-) diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 5b2914ab49..ec9ed3b921 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -313,6 +313,7 @@ struct Fts5DoclistIter { i64 iRowid; u8 *aPoslist; int nPoslist; + int nSize; }; /* @@ -4048,7 +4049,6 @@ static int fts5MultiIterPoslist( Fts5Index *p, Fts5IndexIter *pMulti, Fts5Colset *pColset, - int bSz, /* Append a size field before the data */ Fts5Buffer *pBuf ){ if( p->rc==SQLITE_OK ){ @@ -4058,16 +4058,14 @@ static int fts5MultiIterPoslist( Fts5SegIter *pSeg = &pMulti->aSeg[ pMulti->aFirst[1].iFirst ]; assert( fts5MultiIterEof(p, pMulti)==0 ); - if( bSz ){ - /* WRITEPOSLISTSIZE */ - iSz = pBuf->n; - fts5BufferAppendVarint(&p->rc, pBuf, pSeg->nPos*2); - iData = pBuf->n; - } + /* WRITEPOSLISTSIZE */ + iSz = pBuf->n; + fts5BufferSafeAppendVarint(pBuf, pSeg->nPos*2); + iData = pBuf->n; fts5SegiterPoslist(p, pSeg, pColset, pBuf); - if( bSz && pColset ){ + if( pColset ){ int nActual = pBuf->n - iData; if( nActual!=pSeg->nPos ){ /* WRITEPOSLISTSIZE */ @@ -4086,7 +4084,7 @@ static int fts5MultiIterPoslist( } static void fts5DoclistIterNext(Fts5DoclistIter *pIter){ - u8 *p = pIter->aPoslist + pIter->nPoslist; + u8 *p = pIter->aPoslist + pIter->nSize + pIter->nPoslist; assert( pIter->aPoslist ); if( p>=pIter->aEof ){ @@ -4100,11 +4098,11 @@ static void fts5DoclistIterNext(Fts5DoclistIter *pIter){ /* Read position list size */ if( p[0] & 0x80 ){ int nPos; - p += fts5GetVarint32(p, nPos); + pIter->nSize = fts5GetVarint32(p, nPos); pIter->nPoslist = (nPos>>1); }else{ pIter->nPoslist = ((int)(p[0])) >> 1; - p++; + pIter->nSize = 1; } pIter->aPoslist = p; @@ -4174,17 +4172,13 @@ static void fts5MergePrefixLists( if( i2.aPoslist==0 || (i1.aPoslist && i1.iRowidrc==SQLITE_OK && (iPos1>=0 || iPos2>=0) ){ i64 iNew; if( iPos2<0 || (iPos1>=0 && iPos1rc = sqlite3Fts5PoslistWriterAppend(&tmp, &writer, iNew); @@ -4290,7 +4286,7 @@ static void fts5SetupPrefixIter( int iSave = doclist.n; assert( doclist.n!=0 || iLastRowid==0 ); fts5BufferSafeAppendVarint(&doclist, iRowid - iLastRowid); - if( fts5MultiIterPoslist(p, p1, pColset, 1, &doclist) ){ + if( fts5MultiIterPoslist(p, p1, pColset, &doclist) ){ doclist.n = iSave; }else{ iLastRowid = iRowid; @@ -5239,7 +5235,7 @@ int sqlite3Fts5IndexIntegrityCheck(Fts5Index *p, u64 cksum){ fts5TestTerm(p, &term, z, n, cksum2, &cksum3); poslist.n = 0; - fts5MultiIterPoslist(p, pIter, 0, 0, &poslist); + fts5SegiterPoslist(p, &pIter->aSeg[pIter->aFirst[1].iFirst] , 0, &poslist); while( 0==sqlite3Fts5PoslistNext64(poslist.p, poslist.n, &iOff, &iPos) ){ int iCol = FTS5_POS2COLUMN(iPos); int iTokOff = FTS5_POS2OFFSET(iPos); diff --git a/manifest b/manifest index 3b569407f9..3b1dbcf4a3 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sharmless\scompiler\swarning\sin\sFTS5. -D 2015-10-07T17:06:17.479 +C Further\soptimizations\sfor\sfts5\sprefix\squeries\swithout\sa\sprefix\sindex. +D 2015-10-07T19:06:21.871 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -112,7 +112,7 @@ F ext/fts5/fts5_buffer.c b2fb69c1ee3378956c0d9ee964d61b59d296afaf F ext/fts5/fts5_config.c 57ee5fe71578cb494574fc0e6e51acb9a22a8695 F ext/fts5/fts5_expr.c 2054e550e75cffa117557c9416210c425934436d F ext/fts5/fts5_hash.c 4bf4b99708848357b8a2b5819e509eb6d3df9246 -F ext/fts5/fts5_index.c 6b818dd5b68237d5d0f7723795a329f0fb2e9987 +F ext/fts5/fts5_index.c e03217c37f344f79673be385de6b03f732291000 F ext/fts5/fts5_main.c aa96828990274927e2b404e0b6e60f9ae1274254 F ext/fts5/fts5_storage.c df061a5caf9e50fbbd43113009b5b248362f4995 F ext/fts5/fts5_tcl.c 6da58d6e8f42a93c4486b5ba9b187a7f995dee37 @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P baec1b96cb64a6a6317143a8df841e502afe3914 -R 450be658799fba4e5ff2cf0a8c0976d8 -U mistachkin -Z d352d6bcf527145b85d125184e9bb23e +P 13adcd038fc20dd1b6f344f79b449b4034f8f8f2 +R daa87d323013657b7e115de7ca0f256c +U dan +Z 2a38bec14f47e4ff1536197bd0ad1f10 diff --git a/manifest.uuid b/manifest.uuid index f85da3f615..64c8e6c95f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -13adcd038fc20dd1b6f344f79b449b4034f8f8f2 \ No newline at end of file +83dc1ff7fa010715ca7f406a572f4ee444a967d7 \ No newline at end of file From d7fd6aa4ba568e33e9879f94a8542fba0d7be828 Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 8 Oct 2015 02:44:42 +0000 Subject: [PATCH 55/98] Remove two unused lines of code - discovered by scan-build. FossilOrigin-Name: 77b707b77496a08703fe9405e8e4521a4e5b419e --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/vtab.c | 2 +- src/whereexpr.c | 1 - 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 3b1dbcf4a3..773704bd6c 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Further\soptimizations\sfor\sfts5\sprefix\squeries\swithout\sa\sprefix\sindex. -D 2015-10-07T19:06:21.871 +C Remove\stwo\sunused\slines\sof\scode\s-\sdiscovered\sby\sscan-build. +D 2015-10-08T02:44:42.485 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -415,7 +415,7 @@ F src/vdbeblob.c 565fabd302f5fca3bdf3d56cac330483616a39b6 F src/vdbemem.c 19b3036aa4d676e7103b0fb5efd6327da455f915 F src/vdbesort.c f5009e7a35e3065635d8918b9a31f498a499976b F src/vdbetrace.c 8befe829faff6d9e6f6e4dee5a7d3f85cc85f1a0 -F src/vtab.c 9a6d8818c8a2477ce547f064701b5e955b25d894 +F src/vtab.c 2a8b44aa372c33f6154208e7a7f6c44254549806 F src/vxworks.h c18586c8edc1bddbc15c004fa16aeb1e1342b4fb F src/wal.c 18b0ed49830cf04fe2d68224b41838a73ac6cd24 F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 @@ -423,7 +423,7 @@ F src/walker.c 2e14d17f592d176b6dc879c33fbdec4fbccaa2ba F src/where.c 4c4646675e794ac71e701289edefd7cd81bac844 F src/whereInt.h 7892bb54cf9ca0ae5c7e6094491b94c9286dc647 F src/wherecode.c a32bf1f304f6328e3eefcb82e70bd86836cff343 -F src/whereexpr.c 2473e4350e30f9b55d1c6a8f66ca23c689f23f1d +F src/whereexpr.c e63244ca06c503e5f3c5b7f3c9aea0db826089ed F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2 @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 13adcd038fc20dd1b6f344f79b449b4034f8f8f2 -R daa87d323013657b7e115de7ca0f256c -U dan -Z 2a38bec14f47e4ff1536197bd0ad1f10 +P 83dc1ff7fa010715ca7f406a572f4ee444a967d7 +R 23aa9f023fe3604f2c01d6814f9077e1 +U drh +Z 20dd7ef754329d35cfe6df88eb2905f9 diff --git a/manifest.uuid b/manifest.uuid index 64c8e6c95f..f50ffd68a4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -83dc1ff7fa010715ca7f406a572f4ee444a967d7 \ No newline at end of file +77b707b77496a08703fe9405e8e4521a4e5b419e \ No newline at end of file diff --git a/src/vtab.c b/src/vtab.c index cc293e8064..6054df3d71 100644 --- a/src/vtab.c +++ b/src/vtab.c @@ -1145,7 +1145,7 @@ int sqlite3VtabEponymousTableInit(Parse *pParse, Module *pMod){ */ void sqlite3VtabEponymousTableClear(sqlite3 *db, Module *pMod){ Table *pTab = pMod->pEpoTab; - if( (pTab = pMod->pEpoTab)!=0 ){ + if( pTab!=0 ){ sqlite3DeleteColumnNames(db, pTab); sqlite3VtabClear(db, pTab); sqlite3DbFree(db, pTab); diff --git a/src/whereexpr.c b/src/whereexpr.c index dff425d0ea..fadde79010 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -950,7 +950,6 @@ static void exprAnalyze( pNew = pTerm; } exprCommute(pParse, pDup); - pLeft = sqlite3ExprSkipCollate(pDup->pLeft); pNew->leftCursor = iCur; pNew->u.leftColumn = iColumn; testcase( (prereqLeft | extraRight) != prereqLeft ); From b2682eb14b19c0c075595f72a083bdbc3e78d168 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Thu, 8 Oct 2015 17:35:51 +0000 Subject: [PATCH 56/98] In the RBU extension, use MoveFile() instead of rename() on Windows CE. FossilOrigin-Name: df9ef61f1ba2e3a3420fae84e3eaa2e0e235bc28 --- ext/rbu/sqlite3rbu.c | 59 ++++++++++++++++++++++++++++++++++++++++++-- manifest | 14 +++++------ manifest.uuid | 2 +- 3 files changed, 65 insertions(+), 10 deletions(-) diff --git a/ext/rbu/sqlite3rbu.c b/ext/rbu/sqlite3rbu.c index d76d2f4ccd..4c38e14c9e 100644 --- a/ext/rbu/sqlite3rbu.c +++ b/ext/rbu/sqlite3rbu.c @@ -89,6 +89,10 @@ #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_RBU) #include "sqlite3rbu.h" +#if defined(_WIN32_WCE) +#include "windows.h" +#endif + /* Maximum number of prepared UPDATE statements held by this module */ #define SQLITE_RBU_UPDATE_CACHESIZE 16 @@ -2382,6 +2386,30 @@ static void rbuLockDatabase(sqlite3rbu *p){ } } +#if defined(_WIN32_WCE) +static LPWSTR rbuWinUtf8ToUnicode(const char *zFilename){ + int nChar; + LPWSTR zWideFilename; + + nChar = MultiByteToWideChar(CP_UTF8, 0, zFilename, -1, NULL, 0); + if( nChar==0 ){ + return 0; + } + zWideFilename = sqlite3_malloc( nChar*sizeof(zWideFilename[0]) ); + if( zWideFilename==0 ){ + return 0; + } + memset(zWideFilename, 0, nChar*sizeof(zWideFilename[0])); + nChar = MultiByteToWideChar(CP_UTF8, 0, zFilename, -1, zWideFilename, + nChar); + if( nChar==0 ){ + sqlite3_free(zWideFilename); + zWideFilename = 0; + } + return zWideFilename; +} +#endif + /* ** The RBU handle is currently in RBU_STAGE_OAL state, with a SHARED lock ** on the database file. This proc moves the *-oal file to the *-wal path, @@ -2416,10 +2444,37 @@ static void rbuMoveOalFile(sqlite3rbu *p){ rbuObjIterFinalize(&p->objiter); sqlite3_close(p->dbMain); sqlite3_close(p->dbRbu); + p->dbMain = 0; + p->dbRbu = 0; + +#if defined(_WIN32_WCE) + { + LPWSTR zWideOal; + LPWSTR zWideWal; + + zWideOal = rbuWinUtf8ToUnicode(zOal); + if( zWideOal ){ + zWideWal = rbuWinUtf8ToUnicode(zWal); + if( zWideWal ){ + if( MoveFileW(zWideOal, zWideWal) ){ + p->rc = SQLITE_OK; + }else{ + p->rc = SQLITE_IOERR; + } + sqlite3_free(zWideWal); + }else{ + p->rc = SQLITE_IOERR_NOMEM; + } + sqlite3_free(zWideOal); + }else{ + p->rc = SQLITE_IOERR_NOMEM; + } + } +#else p->rc = rename(zOal, zWal) ? SQLITE_IOERR : SQLITE_OK; +#endif + if( p->rc==SQLITE_OK ){ - p->dbMain = 0; - p->dbRbu = 0; rbuOpenDatabase(p); rbuSetupCheckpoint(p, 0); } diff --git a/manifest b/manifest index 773704bd6c..21a3f451d2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\stwo\sunused\slines\sof\scode\s-\sdiscovered\sby\sscan-build. -D 2015-10-08T02:44:42.485 +C In\sthe\sRBU\sextension,\suse\sMoveFile()\sinstead\sof\srename()\son\sWindows\sCE. +D 2015-10-08T17:35:51.419 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -232,7 +232,7 @@ F ext/rbu/rbufault.test cc0be8d5d392d98b0c2d6a51be377ea989250a89 F ext/rbu/rbufault2.test 9a7f19edd6ea35c4c9f807d8a3db0a03a5670c06 F ext/rbu/rbufts.test 828cd689da825f0a7b7c53ffc1f6f7fdb6fa5bda F ext/rbu/rbusave.test 0f43b6686084f426ddd040b878426452fd2c2f48 -F ext/rbu/sqlite3rbu.c 4ba82bd850aa012f73c31dd242d570f18c9cc35a +F ext/rbu/sqlite3rbu.c ea47de615e911b3a69a8e7fb3be3866298403a25 F ext/rbu/sqlite3rbu.h 5357f070cd8c0bcad459b620651ec1656859e4d0 F ext/rbu/test_rbu.c 2a3652241fa45d5eaa141775e4ae68c1d3582c03 F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 83dc1ff7fa010715ca7f406a572f4ee444a967d7 -R 23aa9f023fe3604f2c01d6814f9077e1 -U drh -Z 20dd7ef754329d35cfe6df88eb2905f9 +P 77b707b77496a08703fe9405e8e4521a4e5b419e +R eb5e353b0e8d7971537e54b62cea0233 +U mistachkin +Z 4af6b4774e4af64194b7825912a990a6 diff --git a/manifest.uuid b/manifest.uuid index f50ffd68a4..2d8861387e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -77b707b77496a08703fe9405e8e4521a4e5b419e \ No newline at end of file +df9ef61f1ba2e3a3420fae84e3eaa2e0e235bc28 \ No newline at end of file From 50065656f7d038d8b1796edb83ecaa5347da5a1d Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 8 Oct 2015 19:29:18 +0000 Subject: [PATCH 57/98] First attempt to add json1 and fts5 to the amalgamation. This check-in does not compile. FossilOrigin-Name: d820a1bd1b8dd702d1b3a099af393530cc5a5d51 --- Makefile.in | 36 ++++++++++++++++++++---------------- Makefile.msc | 35 +++++++++++++++++++---------------- ext/fts5/fts5_main.c | 28 ++++++++++++++++------------ ext/fts5/tool/mkfts5c.tcl | 8 ++------ ext/misc/json1.c | 2 ++ main.mk | 35 ++++++++++++++++++----------------- manifest | 35 +++++++++++++++++++---------------- manifest.uuid | 2 +- src/ctime.c | 6 ++++++ src/main.c | 9 ++++++++- src/shell.c | 7 ------- tool/mksqlite3c.tcl | 2 ++ tool/mksqlite3h.tcl | 1 + 13 files changed, 114 insertions(+), 92 deletions(-) diff --git a/Makefile.in b/Makefile.in index 5c78abde94..f78d6cf092 100644 --- a/Makefile.in +++ b/Makefile.in @@ -346,7 +346,10 @@ SRC += \ $(TOP)/ext/rtree/rtree.c SRC += \ $(TOP)/ext/rbu/sqlite3rbu.h \ - $(TOP)/ext/rbu/sqlite3rbu.c + $(TOP)/ext/rbu/sqlite3rbu.c\ +SRC += \ + $(TOP)/ext/misc/json1.c + # Generated source code files @@ -541,16 +544,16 @@ FUZZDATA = \ $(TOP)/test/fuzzdata3.db \ $(TOP)/test/fuzzdata4.db -# Extra arguments for including json1 in the build of tools -# -JSON1_DEP = $(TOP)/ext/misc/json1.c sqlite3ext.h -JSON1_OPT = -DSQLITE_SHELL_JSON1 -DSQLITE_CORE -JSON1_SRC = $(TOP)/ext/misc/json1.c - # Standard options to testfixture # TESTOPTS = --verbose=file --output=test-out.txt +# Extra compiler options for various shell tools +# +SHELL_OPT = -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS5 +FUZZERSHELL_OPT = -DSQLITE_ENABLE_JSON1 +FUZZCHECK_OPT = -DSQLITE_ENABLE_JSON1 + # This is the default Makefile target. The objects listed here # are what get build when you type just "make" with no arguments. # @@ -573,20 +576,20 @@ libtclsqlite3.la: tclsqlite.lo libsqlite3.la -version-info "8:6:8" \ -avoid-version -sqlite3$(TEXE): $(TOP)/src/shell.c libsqlite3.la sqlite3.h $(JSON1_DEP) - $(LTLINK) $(READLINE_FLAGS) $(JSON1_OPT) -o $@ \ - $(TOP)/src/shell.c $(JSON1_SRC) libsqlite3.la \ +sqlite3$(TEXE): $(TOP)/src/shell.c libsqlite3.la sqlite3.h + $(LTLINK) $(READLINE_FLAGS) $(SHELL_OPT) -o $@ \ + $(TOP)/src/shell.c libsqlite3.la \ $(LIBREADLINE) $(TLIBS) -rpath "$(libdir)" sqldiff$(TEXE): $(TOP)/tool/sqldiff.c sqlite3.c sqlite3.h $(LTLINK) -o $@ $(TOP)/tool/sqldiff.c sqlite3.c $(TLIBS) -fuzzershell$(TEXE): $(TOP)/tool/fuzzershell.c sqlite3.c sqlite3.h $(JSON1_DEP) - $(LTLINK) -o $@ $(JSON1_OPT) \ - $(TOP)/tool/fuzzershell.c $(JSON1_SRC) sqlite3.c $(TLIBS) +fuzzershell$(TEXE): $(TOP)/tool/fuzzershell.c sqlite3.c sqlite3.h + $(LTLINK) -o $@ $(FUZZERSHELL_OPT) \ + $(TOP)/tool/fuzzershell.c sqlite3.c $(TLIBS) -fuzzcheck$(TEXE): $(TOP)/test/fuzzcheck.c sqlite3.c sqlite3.h $(JSON1_DEP) - $(LTLINK) -o $@ $(JSON1_OPT) $(TOP)/test/fuzzcheck.c $(JSON1_SRC) sqlite3.c $(TLIBS) +fuzzcheck$(TEXE): $(TOP)/test/fuzzcheck.c sqlite3.c sqlite3.h + $(LTLINK) -o $@ $(FUZZCHECK_OPT) $(TOP)/test/fuzzcheck.c sqlite3.c $(TLIBS) mptester$(TEXE): sqlite3.c $(TOP)/mptest/mptest.c $(LTLINK) -o $@ -I. $(TOP)/mptest/mptest.c sqlite3.c \ @@ -612,13 +615,14 @@ mptest: mptester$(TEXE) # files are automatically generated. This target takes care of # all that automatic generation. # -.target_source: $(SRC) $(TOP)/tool/vdbe-compress.tcl +.target_source: $(SRC) $(TOP)/tool/vdbe-compress.tcl fts5.c rm -rf tsrc mkdir tsrc cp -f $(SRC) tsrc rm tsrc/sqlite.h.in tsrc/parse.y $(TCLSH_CMD) $(TOP)/tool/vdbe-compress.tcl $(OPTS) vdbe.new mv vdbe.new tsrc/vdbe.c + cp fts5.c fts5.h tsrc touch .target_source sqlite3.c: .target_source $(TOP)/tool/mksqlite3c.tcl diff --git a/Makefile.msc b/Makefile.msc index 678b547fed..5419071ca9 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -388,11 +388,11 @@ CORE_LINK_OPTS = /DEF:sqlite3.def # These are additional compiler options used for the shell executable. # -!IFNDEF SHELL_COMPILE_OPTS +!IFNDEF SHELL_OPT !IF $(DYNAMIC_SHELL)!=0 -SHELL_COMPILE_OPTS = -DSQLITE_SHELL_JSON1 $(SHELL_CCONV_OPTS) -DSQLITE_API=__declspec(dllimport) +SHELL_OPT = -DSQLITE_SHELL_JSON1 $(SHELL_CCONV_OPTS) -DSQLITE_API=__declspec(dllimport) !ELSE -SHELL_COMPILE_OPTS = -DSQLITE_SHELL_JSON1 $(SHELL_CCONV_OPTS) +SHELL_OPT = -DSQLITE_SHELL_JSON1 $(SHELL_CCONV_OPTS) !ENDIF !ENDIF @@ -1008,7 +1008,8 @@ SRC4 = \ $(TOP)\ext\rtree\rtree.h \ $(TOP)\ext\rtree\rtree.c \ $(TOP)\ext\rbu\sqlite3rbu.h \ - $(TOP)\ext\rbu\sqlite3rbu.c + $(TOP)\ext\rbu\sqlite3rbu.c \ + $(TOP)\ext\misc\json1.c # Generated source code files @@ -1210,11 +1211,11 @@ FUZZDATA = \ $(TOP)\test\fuzzdata3.db \ $(TOP)\test\fuzzdata4.db -# Extra arguments for including json1 in the build of tools +# Extra compiler options for various shell tools # -JSON1_DEP = sqlite3ext.h $(TOP)\ext\misc\json1.c -JSON1_OPT = -DSQLITE_ENABLE_JSON1 -DSQLITE_CORE -JSON1_SRC = $(TOP)\ext\misc\json1.c +SHELL_OPT += -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS5 +FUZZERSHELL_OPT = -DSQLITE_ENABLE_JSON1 +FUZZCHECK_OPT = -DSQLITE_ENABLE_JSON1 # Standard options to testfixture # @@ -1231,19 +1232,19 @@ libsqlite3.lib: $(LIBOBJ) libtclsqlite3.lib: tclsqlite.lo libsqlite3.lib $(LTLIB) $(LTLIBOPTS) $(LTLIBPATHS) /OUT:$@ tclsqlite.lo libsqlite3.lib $(LIBTCL:tcl=tclstub) $(TLIBS) -sqlite3.exe: $(TOP)\src\shell.c $(JSON1_DEP) $(SHELL_CORE_DEP) $(LIBRESOBJS) sqlite3.h - $(LTLINK) $(SHELL_COMPILE_OPTS) $(JSON1_OPT) $(READLINE_FLAGS) $(TOP)\src\shell.c $(JSON1_SRC) \ +sqlite3.exe: $(TOP)\src\shell.c $(SHELL_CORE_DEP) $(LIBRESOBJS) sqlite3.h + $(LTLINK) $(SHELL_COMPILE_OPTS) $(SHELL_OPT) $(READLINE_FLAGS) $(TOP)\src\shell.c \ /link /pdb:sqlite3sh.pdb $(LTLINKOPTS) $(SHELL_LINK_OPTS) $(LTLIBPATHS) $(LIBRESOBJS) $(LIBREADLINE) $(LTLIBS) $(TLIBS) sqldiff.exe: $(TOP)\tool\sqldiff.c sqlite3.c sqlite3.h $(LTLINK) $(NO_WARN) $(TOP)\tool\sqldiff.c sqlite3.c -fuzzershell.exe: $(TOP)\tool\fuzzershell.c sqlite3.c sqlite3.h $(JSON1_DEP) - $(LTLINK) $(NO_WARN) $(JSON1_OPT) \ - $(TOP)\tool\fuzzershell.c $(JSON1_SRC) sqlite3.c +fuzzershell.exe: $(TOP)\tool\fuzzershell.c sqlite3.c sqlite3.h + $(LTLINK) $(NO_WARN) $(FUZZERSHELL_OPT) \ + $(TOP)\tool\fuzzershell.c sqlite3.c -fuzzcheck.exe: $(TOP)\test\fuzzcheck.c sqlite3.c sqlite3.h $(JSON1_DEP) - $(LTLINK) $(NO_WARN) $(JSON1_OPT) $(TOP)\test\fuzzcheck.c $(JSON1_SRC) sqlite3.c +fuzzcheck.exe: $(TOP)\test\fuzzcheck.c sqlite3.c sqlite3.h + $(LTLINK) $(NO_WARN) $(FUZZCHECK_OPT) $(TOP)\test\fuzzcheck.c sqlite3.c mptester.exe: $(TOP)\mptest\mptest.c $(SHELL_CORE_DEP) $(LIBRESOBJS) sqlite3.h $(LTLINK) $(NO_WARN) $(SHELL_COMPILE_OPTS) $(TOP)\mptest\mptest.c \ @@ -1269,7 +1270,7 @@ mptest: mptester.exe # files are automatically generated. This target takes care of # all that automatic generation. # -.target_source: $(SRC) $(TOP)\tool\vdbe-compress.tcl +.target_source: $(SRC) $(TOP)\tool\vdbe-compress.tcl fts5.c -rmdir /Q/S tsrc 2>NUL -mkdir tsrc for %i in ($(SRC1)) do copy /Y %i tsrc @@ -1277,6 +1278,8 @@ mptest: mptester.exe for %i in ($(SRC3)) do copy /Y %i tsrc for %i in ($(SRC4)) do copy /Y %i tsrc for %i in ($(SRC5)) do copy /Y %i tsrc + copy /Y fts5.c tsrc + copy /Y fts5.h tsrc del /Q tsrc\sqlite.h.in tsrc\parse.y 2>NUL $(TCLSH_CMD) $(TOP)\tool\vdbe-compress.tcl $(OPTS) < tsrc\vdbe.c > vdbe.new move vdbe.new tsrc\vdbe.c diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index 644d323233..2c1a5ade1c 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -2393,14 +2393,7 @@ static void fts5SourceIdFunc( sqlite3_result_text(pCtx, "--FTS5-SOURCE-ID--", -1, SQLITE_TRANSIENT); } -#ifdef _WIN32 -__declspec(dllexport) -#endif -int sqlite3_fts5_init( - sqlite3 *db, - char **pzErrMsg, - const sqlite3_api_routines *pApi -){ +int sqlite3Fts5Init(sqlite3 *db){ static const sqlite3_module fts5Mod = { /* iVersion */ 2, /* xCreate */ fts5CreateMethod, @@ -2430,8 +2423,6 @@ int sqlite3_fts5_init( int rc; Fts5Global *pGlobal = 0; - SQLITE_EXTENSION_INIT2(pApi); - pGlobal = (Fts5Global*)sqlite3_malloc(sizeof(Fts5Global)); if( pGlobal==0 ){ rc = SQLITE_NOMEM; @@ -2471,7 +2462,20 @@ int sqlite3_fts_init( char **pzErrMsg, const sqlite3_api_routines *pApi ){ - return sqlite3_fts5_init(db, pzErrMsg, pApi); + SQLITE_EXTENSION_INIT2(pApi); + (void)pzErrMsg; /* Unused parameter */ + return sqlite3FtsInit(db); } - +#ifdef _WIN32 +__declspec(dllexport) +#endif +int sqlite3_fts5_init( + sqlite3 *db, + char **pzErrMsg, + const sqlite3_api_routines *pApi +){ + SQLITE_EXTENSION_INIT2(pApi); + (void)pzErrMsg; /* Unused parameter */ + return sqlite3FtsInit(db); +} diff --git a/ext/fts5/tool/mkfts5c.tcl b/ext/fts5/tool/mkfts5c.tcl index f5cf5197e2..478fd7c01d 100644 --- a/ext/fts5/tool/mkfts5c.tcl +++ b/ext/fts5/tool/mkfts5c.tcl @@ -24,7 +24,7 @@ set G(src) [string map [list %dir% $srcdir] { set G(hdr) { -#if !defined(SQLITE_TEST) || defined(SQLITE_ENABLE_FTS5) +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS5) #if !defined(NDEBUG) && !defined(SQLITE_DEBUG) # define NDEBUG 1 @@ -37,7 +37,7 @@ set G(hdr) { set G(footer) { -#endif /* !defined(SQLITE_TEST) || defined(SQLITE_ENABLE_FTS5) */ +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS5) */ } #------------------------------------------------------------------------- @@ -107,7 +107,3 @@ proc fts5c_close {} { fts5c_init fts5.c foreach f $G(src) { fts5c_printfile $f } fts5c_close - - - - diff --git a/ext/misc/json1.c b/ext/misc/json1.c index 77857f5447..f6fb2eafec 100644 --- a/ext/misc/json1.c +++ b/ext/misc/json1.c @@ -21,6 +21,7 @@ ** This implementation parses JSON text at 250 MB/s, so it is hard to see ** how JSONB might improve on that.) */ +#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_JSON1) #if !defined(_SQLITEINT_H_) #include "sqlite3ext.h" #endif @@ -2007,3 +2008,4 @@ int sqlite3_json_init( (void)pzErrMsg; /* Unused parameter */ return sqlite3Json1Init(db); } +#endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_JSON1) */ diff --git a/main.mk b/main.mk index cded12e5a3..95903b978e 100644 --- a/main.mk +++ b/main.mk @@ -225,10 +225,11 @@ SRC += \ SRC += \ $(TOP)/ext/userauth/userauth.c \ $(TOP)/ext/userauth/sqlite3userauth.h - SRC += \ $(TOP)/ext/rbu/sqlite3rbu.c \ $(TOP)/ext/rbu/sqlite3rbu.h +SRC += \ + $(TOP)/ext/misc/json1.c # FTS5 things @@ -451,16 +452,16 @@ FUZZDATA = \ $(TOP)/test/fuzzdata3.db \ $(TOP)/test/fuzzdata4.db -# Extra arguments for including json1 in the build of tools -# -JSON1_DEP = $(TOP)/ext/misc/json1.c sqlite3ext.h -JSON1_OPT = -DSQLITE_SHELL_JSON1 -DSQLITE_CORE -JSON1_SRC = $(TOP)/ext/misc/json1.c - # Standard options to testfixture # TESTOPTS = --verbose=file --output=test-out.txt +# Extra compiler options for various shell tools +# +SHELL_OPT = -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS5 +FUZZERSHELL_OPT = -DSQLITE_ENABLE_JSON1 +FUZZCHECK_OPT = -DSQLITE_ENABLE_JSON1 + # This is the default Makefile target. The objects listed here # are what get build when you type just "make" with no arguments. # @@ -470,24 +471,23 @@ libsqlite3.a: $(LIBOBJ) $(AR) libsqlite3.a $(LIBOBJ) $(RANLIB) libsqlite3.a -sqlite3$(EXE): $(TOP)/src/shell.c libsqlite3.a sqlite3.h $(JSON1_DEP) - $(TCCX) $(READLINE_FLAGS) $(JSON1_OPT) -o sqlite3$(EXE) \ - $(TOP)/src/shell.c $(JSON1_SRC) \ - libsqlite3.a $(LIBREADLINE) $(TLIBS) $(THREADLIB) +sqlite3$(EXE): $(TOP)/src/shell.c libsqlite3.a sqlite3.h + $(TCCX) $(READLINE_FLAGS) -o sqlite3$(EXE) $(SHELL_OPT) \ + $(TOP)/src/shell.c libsqlite3.a $(LIBREADLINE) $(TLIBS) $(THREADLIB) sqldiff$(EXE): $(TOP)/tool/sqldiff.c sqlite3.c sqlite3.h $(TCCX) -o sqldiff$(EXE) -DSQLITE_THREADSAFE=0 \ $(TOP)/tool/sqldiff.c sqlite3.c $(TLIBS) $(THREADLIB) -fuzzershell$(EXE): $(TOP)/tool/fuzzershell.c sqlite3.c sqlite3.h $(JSON1_DEP) +fuzzershell$(EXE): $(TOP)/tool/fuzzershell.c sqlite3.c sqlite3.h $(TCCX) -o fuzzershell$(EXE) -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION \ - $(JSON1_OPT) $(TOP)/tool/fuzzershell.c $(JSON1_SRC) sqlite3.c \ + $(FUZZERSHELL_OPT) $(TOP)/tool/fuzzershell.c sqlite3.c \ $(TLIBS) $(THREADLIB) -fuzzcheck$(EXE): $(TOP)/test/fuzzcheck.c sqlite3.c sqlite3.h $(JSON1_DEP) +fuzzcheck$(EXE): $(TOP)/test/fuzzcheck.c sqlite3.c sqlite3.h $(TCCX) -o fuzzcheck$(EXE) -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION \ - -DSQLITE_ENABLE_MEMSYS5 $(JSON1_OPT) \ - $(TOP)/test/fuzzcheck.c $(JSON1_SRC) sqlite3.c $(TLIBS) $(THREADLIB) + -DSQLITE_ENABLE_MEMSYS5 $(FUZZCHECK_OPT) \ + $(TOP)/test/fuzzcheck.c sqlite3.c $(TLIBS) $(THREADLIB) mptester$(EXE): sqlite3.c $(TOP)/mptest/mptest.c $(TCCX) -o $@ -I. $(TOP)/mptest/mptest.c sqlite3.c \ @@ -515,13 +515,14 @@ sqlite3.o: sqlite3.c # files are automatically generated. This target takes care of # all that automatic generation. # -target_source: $(SRC) $(TOP)/tool/vdbe-compress.tcl +target_source: $(SRC) $(TOP)/tool/vdbe-compress.tcl fts5.c rm -rf tsrc mkdir tsrc cp -f $(SRC) tsrc rm tsrc/sqlite.h.in tsrc/parse.y tclsh $(TOP)/tool/vdbe-compress.tcl $(OPTS) vdbe.new mv vdbe.new tsrc/vdbe.c + cp fts5.c fts5.h tsrc touch target_source sqlite3.c: target_source $(TOP)/tool/mksqlite3c.tcl diff --git a/manifest b/manifest index 773704bd6c..634fb674be 100644 --- a/manifest +++ b/manifest @@ -1,9 +1,9 @@ -C Remove\stwo\sunused\slines\sof\scode\s-\sdiscovered\sby\sscan-build. -D 2015-10-08T02:44:42.485 +C First\sattempt\sto\sadd\sjson1\sand\sfts5\sto\sthe\samalgamation.\s\sThis\scheck-in\sdoes\nnot\scompile. +D 2015-10-08T19:29:18.974 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f -F Makefile.in 2143eeef6d0cc26006ae5fc4bb242a4a8b973412 +F Makefile.in 336f9494810fe361b59aa4e0c5cd41fc64d83323 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 -F Makefile.msc b9054642ab305be4174d8b0433c9951c2839701d +F Makefile.msc f95e14e549addbf22304f6c01901b600aea10a6d F Makefile.vxworks e1b65dea203f054e71653415bd8f96dcaed47858 F README.md 8ecc12493ff9f820cdea6520a9016001cb2e59b7 F VERSION ccfc4d1576dbfdeece0a4372a2e6a2e37d3e7975 @@ -113,7 +113,7 @@ F ext/fts5/fts5_config.c 57ee5fe71578cb494574fc0e6e51acb9a22a8695 F ext/fts5/fts5_expr.c 2054e550e75cffa117557c9416210c425934436d F ext/fts5/fts5_hash.c 4bf4b99708848357b8a2b5819e509eb6d3df9246 F ext/fts5/fts5_index.c e03217c37f344f79673be385de6b03f732291000 -F ext/fts5/fts5_main.c aa96828990274927e2b404e0b6e60f9ae1274254 +F ext/fts5/fts5_main.c 1ae4d7ecfc2c27b3738f511113a804057e16341c F ext/fts5/fts5_storage.c df061a5caf9e50fbbd43113009b5b248362f4995 F ext/fts5/fts5_tcl.c 6da58d6e8f42a93c4486b5ba9b187a7f995dee37 F ext/fts5/fts5_test_mi.c e96be827aa8f571031e65e481251dc1981d608bf @@ -186,7 +186,7 @@ F ext/fts5/test/fts5version.test 978f59541d8cef7e8591f8be2115ec5ccb863e2e F ext/fts5/test/fts5vocab.test cdf97b9678484e9bad5062edf9c9106e5c3b0c5c F ext/fts5/tool/fts5txt2db.tcl 3d19fb8ffb234031d33d7d2151acfbc55e9cfcc4 F ext/fts5/tool/loadfts5.tcl 58e90407cc5c2b1770460119488fd7c0090d4dd3 -F ext/fts5/tool/mkfts5c.tcl 5745072c7de346e18c7f491e4c3281fe8a1cfe51 +F ext/fts5/tool/mkfts5c.tcl 1df2d86c4f9675e9cdb70b4ff5a53e57aca8a5c0 F ext/fts5/tool/showfts5.tcl 9eaf6c3df352f98a2ab5ce1921dd94128ab1381d F ext/icu/README.txt d9fbbad0c2f647c3fdf715fc9fd64af53aedfc43 F ext/icu/icu.c b2732aef0b076e4276d9b39b5a33cec7a05e1413 @@ -198,7 +198,7 @@ F ext/misc/eval.c f971962e92ebb8b0a4e6b62949463ee454d88fa2 F ext/misc/fileio.c d4171c815d6543a9edef8308aab2951413cd8d0f F ext/misc/fuzzer.c 4c84635c71c26cfa7c2e5848cf49fe2d2cfcd767 F ext/misc/ieee754.c b0362167289170627659e84173f5d2e8fee8566e -F ext/misc/json1.c 263cac0292302b7cf7ecb2e8bd698a50d1aedecc +F ext/misc/json1.c e1822098b8131133f24800bda551c56877244ceb F ext/misc/nextchar.c 35c8b8baacb96d92abbb34a83a997b797075b342 F ext/misc/percentile.c bcbee3c061b884eccb80e21651daaae8e1e43c63 F ext/misc/regexp.c af92cdaa5058fcec1451e49becc7ba44dba023dc @@ -264,7 +264,7 @@ F ext/userauth/userauth.c 5fa3bdb492f481bbc1709fc83c91ebd13460c69e F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk 151fcaba704fdeeb0a1941857ef6e1d6216732d8 +F main.mk 40bed4c4b5719ee1aef9ce24eddd8bb50db9dd99 F mkopcodec.awk c2ff431854d702cdd2d779c9c0d1f58fa16fa4ea F mkopcodeh.awk 0e7f04a8eb90f92259e47d80110e4e98d7ce337a F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 @@ -291,7 +291,7 @@ F src/btreeInt.h 8177c9ab90d772d6d2c6c517e05bed774b7c92c0 F src/build.c 0549b56722f15c146ca21f82a33838365c2031f0 F src/callback.c 7b44ce59674338ad48b0e84e7b72f935ea4f68b0 F src/complete.c addcd8160b081131005d5bc2d34adf20c1c5c92f -F src/ctime.c 5a0b735dc95604766f5dac73973658eef782ee8b +F src/ctime.c 509ef9c64d1321f42448f111da86400b1799218a F src/date.c fb1c99172017dcc8e237339132c91a21a0788584 F src/dbstat.c e637e7a7ff40ef32132a418c6fdf1cfb63aa27c7 F src/delete.c 35c939eb8bacc9dd8a6715964e5f69feb8c20e44 @@ -308,7 +308,7 @@ F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d F src/legacy.c ba1863ea58c4c840335a84ec276fc2b25e22bc4e F src/lempar.c d344a95d60c24e2f490ee59db9784b1b17439012 F src/loadext.c f0b66d28e377fd6c6d36cc9d92df1ff251ebee44 -F src/main.c c80ea19ec71609ccbec21f334fbcf475bb6af2fc +F src/main.c 286aa6485809e43b9df8be708e728e007cfb8e5f F src/malloc.c 3a37ce6979a40f499d8cea9e9ab4e8517854d35d F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c abe6ee469b6c5a35c7f22bfeb9c9bac664a1c987 @@ -344,7 +344,7 @@ F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 F src/resolve.c 1954a0f01bf65d78d7d559aea3d5c67f33376d91 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e F src/select.c 2c4bfdf7c797df9b43121ed7850bf939b6f27405 -F src/shell.c dfd18e56fcb88dd79378774e9bc3246a9bd52243 +F src/shell.c d25df04168d6ba5a4fa05bdbf859df667f9eb621 F src/sqlite.h.in 4b76d74d69af48c534c58fb723137dc6944bdedc F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad F src/sqlite3ext.h 64350bf36833a56ad675e27392a913f417c5c308 @@ -1357,8 +1357,8 @@ F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e F tool/mkpragmatab.tcl 84af2b180484323a2ea22a2279e8bd9e3e1e492e F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 F tool/mksqlite3c-noext.tcl 87240b09c20042999b41d5fabe091b7111287835 -F tool/mksqlite3c.tcl 421ecbd437d8cd7123e67430ee8146218396680d -F tool/mksqlite3h.tcl 44730d586c9031638cdd2eb443b801c0d2dbd9f8 +F tool/mksqlite3c.tcl f38527a5125ada6705601d6665065a3bdf38ec64 +F tool/mksqlite3h.tcl e3ac3f23897d86cb8f5f5df92e91643229fcc8d1 F tool/mksqlite3internalh.tcl eb994013e833359137eb53a55acdad0b5ae1049b F tool/mkvsix.tcl bbe57cd9ae11c6cc70319241101ef8d2b8c3765b F tool/offsets.c fe4262fdfa378e8f5499a42136d17bf3b98f6091 @@ -1390,7 +1390,10 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 83dc1ff7fa010715ca7f406a572f4ee444a967d7 -R 23aa9f023fe3604f2c01d6814f9077e1 +P 77b707b77496a08703fe9405e8e4521a4e5b419e +R b36b15e9683569a33dbd7dbda8478407 +T *branch * amalg-json1-fts5 +T *sym-amalg-json1-fts5 * +T -sym-trunk * U drh -Z 20dd7ef754329d35cfe6df88eb2905f9 +Z 77663aaa3c104357ac781d9ff8201195 diff --git a/manifest.uuid b/manifest.uuid index f50ffd68a4..016a3c8fab 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -77b707b77496a08703fe9405e8e4521a4e5b419e \ No newline at end of file +d820a1bd1b8dd702d1b3a099af393530cc5a5d51 \ No newline at end of file diff --git a/src/ctime.c b/src/ctime.c index 9503214f50..17dd710bc3 100644 --- a/src/ctime.c +++ b/src/ctime.c @@ -96,12 +96,18 @@ static const char * const azCompileOpt[] = { #if SQLITE_ENABLE_FTS4 "ENABLE_FTS4", #endif +#if SQLITE_ENABLE_FTS5 + "ENABLE_FTS5", +#endif #if SQLITE_ENABLE_ICU "ENABLE_ICU", #endif #if SQLITE_ENABLE_IOTRACE "ENABLE_IOTRACE", #endif +#if SQLITE_ENABLE_JSON1 + "ENABLE_JSON1", +#endif #if SQLITE_ENABLE_LOAD_EXTENSION "ENABLE_LOAD_EXTENSION", #endif diff --git a/src/main.c b/src/main.c index fa374c7012..43d2efcfe2 100644 --- a/src/main.c +++ b/src/main.c @@ -2872,12 +2872,19 @@ static int openDatabase( } #endif -#ifdef SQLITE_ENABLE_FTS3 +#ifdef SQLITE_ENABLE_FTS3 /* automatically defined by SQLITE_ENABLE_FTS4 */ if( !db->mallocFailed && rc==SQLITE_OK ){ rc = sqlite3Fts3Init(db); } #endif +#ifdef SQLITE_ENABLE_FTS5 + if( !db->mallocFailed && rc==SQLITE_OK ){ + extern int sqlite3Fts5Init(sqlite3*); + rc = sqlite3Fts5Init(db); + } +#endif + #ifdef SQLITE_ENABLE_ICU if( !db->mallocFailed && rc==SQLITE_OK ){ rc = sqlite3IcuInit(db); diff --git a/src/shell.c b/src/shell.c index 96d0ab65f7..f79087122c 100644 --- a/src/shell.c +++ b/src/shell.c @@ -4654,13 +4654,6 @@ int SQLITE_CDECL main(int argc, char **argv){ } data.out = stdout; -#ifdef SQLITE_SHELL_JSON1 - { - extern int sqlite3_json_init(sqlite3*); - sqlite3_auto_extension((void(*)(void))sqlite3_json_init); - } -#endif - /* Go ahead and open the database file if it already exists. If the ** file does not exist, delay opening it. This prevents empty database ** files from being created if a user mistypes the database name argument diff --git a/tool/mksqlite3c.tcl b/tool/mksqlite3c.tcl index e52b036612..ce808faa91 100644 --- a/tool/mksqlite3c.tcl +++ b/tool/mksqlite3c.tcl @@ -378,6 +378,8 @@ foreach file { fts3_icu.c sqlite3rbu.c dbstat.c + json1.c + fts5.c } { copy_file tsrc/$file } diff --git a/tool/mksqlite3h.tcl b/tool/mksqlite3h.tcl index cabce1f50b..2fe2157387 100644 --- a/tool/mksqlite3h.tcl +++ b/tool/mksqlite3h.tcl @@ -71,6 +71,7 @@ fconfigure stdout -translation lf set filelist [subst { $TOP/src/sqlite.h.in $TOP/ext/rtree/sqlite3rtree.h + $TOP/ext/fts5/fts5.h }] # These are the functions that accept a variable number of arguments. They From 056d7acf25756c5c3f0f02697aafda64c7c247da Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 8 Oct 2015 20:11:42 +0000 Subject: [PATCH 58/98] Fix a couple of errors in fts5 compilation. This branch still does not build with -Wall -Werror. FossilOrigin-Name: e9e76e12812b9b42b1142246b71cea98e26903aa --- ext/fts5/fts5_main.c | 4 ++-- ext/fts5/fts5_tcl.c | 1 - manifest | 21 +++++++++------------ manifest.uuid | 2 +- src/main.c | 8 +++++++- 5 files changed, 19 insertions(+), 17 deletions(-) diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index 2c1a5ade1c..b5f00297eb 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -2464,7 +2464,7 @@ int sqlite3_fts_init( ){ SQLITE_EXTENSION_INIT2(pApi); (void)pzErrMsg; /* Unused parameter */ - return sqlite3FtsInit(db); + return sqlite3Fts5Init(db); } #ifdef _WIN32 @@ -2477,5 +2477,5 @@ int sqlite3_fts5_init( ){ SQLITE_EXTENSION_INIT2(pApi); (void)pzErrMsg; /* Unused parameter */ - return sqlite3FtsInit(db); + return sqlite3Fts5Init(db); } diff --git a/ext/fts5/fts5_tcl.c b/ext/fts5/fts5_tcl.c index 21ce5f7bde..b470c557d3 100644 --- a/ext/fts5/fts5_tcl.c +++ b/ext/fts5/fts5_tcl.c @@ -976,7 +976,6 @@ static int f5tTokenHash( int objc, Tcl_Obj *CONST objv[] ){ - int bOld = sqlite3_fts5_may_be_corrupt; char *z; int n; unsigned int iVal; diff --git a/manifest b/manifest index 634fb674be..4ce209944b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C First\sattempt\sto\sadd\sjson1\sand\sfts5\sto\sthe\samalgamation.\s\sThis\scheck-in\sdoes\nnot\scompile. -D 2015-10-08T19:29:18.974 +C Fix\sa\scouple\sof\serrors\sin\sfts5\scompilation.\sThis\sbranch\sstill\sdoes\snot\sbuild\swith\s-Wall\s-Werror. +D 2015-10-08T20:11:42.088 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 336f9494810fe361b59aa4e0c5cd41fc64d83323 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -113,9 +113,9 @@ F ext/fts5/fts5_config.c 57ee5fe71578cb494574fc0e6e51acb9a22a8695 F ext/fts5/fts5_expr.c 2054e550e75cffa117557c9416210c425934436d F ext/fts5/fts5_hash.c 4bf4b99708848357b8a2b5819e509eb6d3df9246 F ext/fts5/fts5_index.c e03217c37f344f79673be385de6b03f732291000 -F ext/fts5/fts5_main.c 1ae4d7ecfc2c27b3738f511113a804057e16341c +F ext/fts5/fts5_main.c 77721fed36cf17c881a9f718e779d2bf33edf021 F ext/fts5/fts5_storage.c df061a5caf9e50fbbd43113009b5b248362f4995 -F ext/fts5/fts5_tcl.c 6da58d6e8f42a93c4486b5ba9b187a7f995dee37 +F ext/fts5/fts5_tcl.c 3bf445e66de32137d4693694ff7b1fd6074e32bd F ext/fts5/fts5_test_mi.c e96be827aa8f571031e65e481251dc1981d608bf F ext/fts5/fts5_tokenize.c f380f46f341af9c9a9908e1aade685ba1eaa157a F ext/fts5/fts5_unicode2.c 78273fbd588d1d9bd0a7e4e0ccc9207348bae33c @@ -308,7 +308,7 @@ F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d F src/legacy.c ba1863ea58c4c840335a84ec276fc2b25e22bc4e F src/lempar.c d344a95d60c24e2f490ee59db9784b1b17439012 F src/loadext.c f0b66d28e377fd6c6d36cc9d92df1ff251ebee44 -F src/main.c 286aa6485809e43b9df8be708e728e007cfb8e5f +F src/main.c 1bd3839327e6657ebb722085f02d9d5a48c4cd60 F src/malloc.c 3a37ce6979a40f499d8cea9e9ab4e8517854d35d F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c abe6ee469b6c5a35c7f22bfeb9c9bac664a1c987 @@ -1390,10 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 77b707b77496a08703fe9405e8e4521a4e5b419e -R b36b15e9683569a33dbd7dbda8478407 -T *branch * amalg-json1-fts5 -T *sym-amalg-json1-fts5 * -T -sym-trunk * -U drh -Z 77663aaa3c104357ac781d9ff8201195 +P d820a1bd1b8dd702d1b3a099af393530cc5a5d51 +R 96d02cbeb876e62b710d9e30b09e4a10 +U dan +Z ddb12ebcaa75b3e69205da1ca3e77d04 diff --git a/manifest.uuid b/manifest.uuid index 016a3c8fab..76345e06d3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -d820a1bd1b8dd702d1b3a099af393530cc5a5d51 \ No newline at end of file +e9e76e12812b9b42b1142246b71cea98e26903aa \ No newline at end of file diff --git a/src/main.c b/src/main.c index 43d2efcfe2..afdcfe4f21 100644 --- a/src/main.c +++ b/src/main.c @@ -2638,6 +2638,13 @@ int sqlite3ParseUri( return rc; } +#ifdef SQLITE_ENABLE_FTS5 +#ifdef SQLITE_AMALGAMATION +static int sqlite3Fts5Init(sqlite3*); +#else +extern int sqlite3Fts5Init(sqlite3*); +#endif +#endif /* ** This routine does the work of opening a database on behalf of @@ -2880,7 +2887,6 @@ static int openDatabase( #ifdef SQLITE_ENABLE_FTS5 if( !db->mallocFailed && rc==SQLITE_OK ){ - extern int sqlite3Fts5Init(sqlite3*); rc = sqlite3Fts5Init(db); } #endif From 351ccb382552ef6209c6c6ea3005adc6c4c32288 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 8 Oct 2015 20:28:33 +0000 Subject: [PATCH 59/98] Fix two more warnings in fts5 code. FossilOrigin-Name: 5343e601fb6f0f24f4e4d5d442f7b5b074734143 --- ext/fts5/fts5_aux.c | 2 +- ext/fts5/fts5parse.y | 1 + manifest | 14 +++++++------- manifest.uuid | 2 +- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/ext/fts5/fts5_aux.c b/ext/fts5/fts5_aux.c index 2e33d5132f..ad581bba77 100644 --- a/ext/fts5/fts5_aux.c +++ b/ext/fts5/fts5_aux.c @@ -13,7 +13,7 @@ #include "fts5Int.h" -#include +#include /* amalgamator: keep */ /* ** Object used to iterate through all "coalesced phrase instances" in diff --git a/ext/fts5/fts5parse.y b/ext/fts5/fts5parse.y index e872908229..065af77053 100644 --- a/ext/fts5/fts5parse.y +++ b/ext/fts5/fts5parse.y @@ -67,6 +67,7 @@ %left COLON. input ::= expr(X). { sqlite3Fts5ParseFinished(pParse, X); } +%destructor input { (void)pParse; } %type cnearset {Fts5ExprNode*} %type expr {Fts5ExprNode*} diff --git a/manifest b/manifest index 4ce209944b..34515a68de 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\scouple\sof\serrors\sin\sfts5\scompilation.\sThis\sbranch\sstill\sdoes\snot\sbuild\swith\s-Wall\s-Werror. -D 2015-10-08T20:11:42.088 +C Fix\stwo\smore\swarnings\sin\sfts5\scode. +D 2015-10-08T20:28:33.424 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 336f9494810fe361b59aa4e0c5cd41fc64d83323 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -107,7 +107,7 @@ F ext/fts3/unicode/parseunicode.tcl da577d1384810fb4e2b209bf3313074353193e95 F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 F ext/fts5/fts5.h 98f802fe41481f9d797fce496f0fefcad72c7782 F ext/fts5/fts5Int.h ed6c05b803e0bacf85228a8d255853e89796f6f5 -F ext/fts5/fts5_aux.c 7a307760a9c57c750d043188ec0bad59f5b5ec7e +F ext/fts5/fts5_aux.c b09aa27dcdaa3d50a30be433fddaa48a50aa827b F ext/fts5/fts5_buffer.c b2fb69c1ee3378956c0d9ee964d61b59d296afaf F ext/fts5/fts5_config.c 57ee5fe71578cb494574fc0e6e51acb9a22a8695 F ext/fts5/fts5_expr.c 2054e550e75cffa117557c9416210c425934436d @@ -121,7 +121,7 @@ F ext/fts5/fts5_tokenize.c f380f46f341af9c9a9908e1aade685ba1eaa157a F ext/fts5/fts5_unicode2.c 78273fbd588d1d9bd0a7e4e0ccc9207348bae33c F ext/fts5/fts5_varint.c 3f86ce09cab152e3d45490d7586b7ed2e40c13f1 F ext/fts5/fts5_vocab.c 17320c476a5296ee475ab616d95fd10515bacfec -F ext/fts5/fts5parse.y 38ab0ea7280a122f86f53b2264741422dd2424a0 +F ext/fts5/fts5parse.y e83dca6028e3309178d05b5bd920e372dc295d35 F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba F ext/fts5/test/fts5_common.tcl b6e6a40ef5d069c8e86ca4fbad491e1195485dbc F ext/fts5/test/fts5aa.test 4804f237005bb4ba8ea4a76120d8011ebcb5d611 @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P d820a1bd1b8dd702d1b3a099af393530cc5a5d51 -R 96d02cbeb876e62b710d9e30b09e4a10 +P e9e76e12812b9b42b1142246b71cea98e26903aa +R 3ea307db4af2caf63f312c7ebd57ad22 U dan -Z ddb12ebcaa75b3e69205da1ca3e77d04 +Z bfe83218c323cc99da5efd4c0ac84f4a diff --git a/manifest.uuid b/manifest.uuid index 76345e06d3..54fe4e7ce6 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -e9e76e12812b9b42b1142246b71cea98e26903aa \ No newline at end of file +5343e601fb6f0f24f4e4d5d442f7b5b074734143 \ No newline at end of file From 56eac2689769ebcc3ef64fef94111eeed84c558b Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 8 Oct 2015 20:40:18 +0000 Subject: [PATCH 60/98] Fix further fts5 compilation issues. FossilOrigin-Name: 0d7f301fb03c8546a5dbce5d061a1d74e3c86bcf --- ext/fts5/fts5_expr.c | 9 +++++++++ ext/fts5/fts5_main.c | 2 ++ ext/fts5/tool/mkfts5c.tcl | 2 +- main.mk | 7 +++---- manifest | 18 +++++++++--------- manifest.uuid | 2 +- 6 files changed, 25 insertions(+), 15 deletions(-) diff --git a/ext/fts5/fts5_expr.c b/ext/fts5/fts5_expr.c index c90a2e4708..96c02c04cf 100644 --- a/ext/fts5/fts5_expr.c +++ b/ext/fts5/fts5_expr.c @@ -32,6 +32,10 @@ typedef struct Fts5ExprTerm Fts5ExprTerm; void *sqlite3Fts5ParserAlloc(void *(*mallocProc)(u64)); void sqlite3Fts5ParserFree(void*, void (*freeProc)(void*)); void sqlite3Fts5Parser(void*, int, Fts5Token, Fts5Parse*); +#ifndef NDEBUG +void sqlite3Fts5ParserTrace(FILE*, char*); +#endif + struct Fts5Expr { Fts5Index *pIndex; @@ -2276,6 +2280,11 @@ int sqlite3Fts5ExprInit(Fts5Global *pGlobal, sqlite3 *db){ rc = sqlite3_create_function(db, p->z, -1, SQLITE_UTF8, pCtx, p->x, 0, 0); } + /* Avoid a warning indicating that sqlite3Fts5ParserTrace() is unused */ +#ifndef NDEBUG + (void)sqlite3Fts5ParserTrace; +#endif + return rc; } diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index b5f00297eb..5aebc97fde 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -2454,6 +2454,7 @@ int sqlite3Fts5Init(sqlite3 *db){ return rc; } +#ifndef SQLITE_CORE #ifdef _WIN32 __declspec(dllexport) #endif @@ -2466,6 +2467,7 @@ int sqlite3_fts_init( (void)pzErrMsg; /* Unused parameter */ return sqlite3Fts5Init(db); } +#endif #ifdef _WIN32 __declspec(dllexport) diff --git a/ext/fts5/tool/mkfts5c.tcl b/ext/fts5/tool/mkfts5c.tcl index 478fd7c01d..5a5eeae0af 100644 --- a/ext/fts5/tool/mkfts5c.tcl +++ b/ext/fts5/tool/mkfts5c.tcl @@ -7,6 +7,7 @@ set G(src) [string map [list %dir% $srcdir] { %dir%/fts5.h %dir%/fts5Int.h fts5parse.h + fts5parse.c %dir%/fts5_aux.c %dir%/fts5_buffer.c %dir%/fts5_config.c @@ -19,7 +20,6 @@ set G(src) [string map [list %dir% $srcdir] { %dir%/fts5_unicode2.c %dir%/fts5_varint.c %dir%/fts5_vocab.c - fts5parse.c }] set G(hdr) { diff --git a/main.mk b/main.mk index 95903b978e..72e52d1061 100644 --- a/main.mk +++ b/main.mk @@ -332,8 +332,7 @@ TESTSRC += \ $(TOP)/ext/misc/wholenumber.c \ $(TOP)/ext/misc/vfslog.c \ $(TOP)/ext/fts5/fts5_tcl.c \ - $(TOP)/ext/fts5/fts5_test_mi.c \ - fts5.c + $(TOP)/ext/fts5/fts5_test_mi.c #TESTSRC += $(TOP)/ext/fts2/fts2_tokenizer.c @@ -718,9 +717,9 @@ testfixture$(EXE): $(TESTSRC2) libsqlite3.a $(TESTSRC) $(TOP)/src/tclsqlite.c $(TESTSRC) $(TESTSRC2) $(TOP)/src/tclsqlite.c \ -o testfixture$(EXE) $(LIBTCL) libsqlite3.a $(THREADLIB) -amalgamation-testfixture$(EXE): sqlite3.c fts5.c $(TESTSRC) $(TOP)/src/tclsqlite.c +amalgamation-testfixture$(EXE): sqlite3.c $(TESTSRC) $(TOP)/src/tclsqlite.c $(TCCX) $(TCL_FLAGS) -DTCLSH=1 $(TESTFIXTURE_FLAGS) \ - $(TESTSRC) $(TOP)/src/tclsqlite.c sqlite3.c fts5.c \ + $(TESTSRC) $(TOP)/src/tclsqlite.c sqlite3.c \ -o testfixture$(EXE) $(LIBTCL) $(THREADLIB) fts3-testfixture$(EXE): sqlite3.c fts3amal.c $(TESTSRC) $(TOP)/src/tclsqlite.c diff --git a/manifest b/manifest index 34515a68de..f6e22b3a23 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\stwo\smore\swarnings\sin\sfts5\scode. -D 2015-10-08T20:28:33.424 +C Fix\sfurther\sfts5\scompilation\sissues. +D 2015-10-08T20:40:18.323 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 336f9494810fe361b59aa4e0c5cd41fc64d83323 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -110,10 +110,10 @@ F ext/fts5/fts5Int.h ed6c05b803e0bacf85228a8d255853e89796f6f5 F ext/fts5/fts5_aux.c b09aa27dcdaa3d50a30be433fddaa48a50aa827b F ext/fts5/fts5_buffer.c b2fb69c1ee3378956c0d9ee964d61b59d296afaf F ext/fts5/fts5_config.c 57ee5fe71578cb494574fc0e6e51acb9a22a8695 -F ext/fts5/fts5_expr.c 2054e550e75cffa117557c9416210c425934436d +F ext/fts5/fts5_expr.c d3a56928f8afdd2dca9126f8406f20b9831e4265 F ext/fts5/fts5_hash.c 4bf4b99708848357b8a2b5819e509eb6d3df9246 F ext/fts5/fts5_index.c e03217c37f344f79673be385de6b03f732291000 -F ext/fts5/fts5_main.c 77721fed36cf17c881a9f718e779d2bf33edf021 +F ext/fts5/fts5_main.c d159079e618399f9b531ad1fe32772cff307ea91 F ext/fts5/fts5_storage.c df061a5caf9e50fbbd43113009b5b248362f4995 F ext/fts5/fts5_tcl.c 3bf445e66de32137d4693694ff7b1fd6074e32bd F ext/fts5/fts5_test_mi.c e96be827aa8f571031e65e481251dc1981d608bf @@ -186,7 +186,7 @@ F ext/fts5/test/fts5version.test 978f59541d8cef7e8591f8be2115ec5ccb863e2e F ext/fts5/test/fts5vocab.test cdf97b9678484e9bad5062edf9c9106e5c3b0c5c F ext/fts5/tool/fts5txt2db.tcl 3d19fb8ffb234031d33d7d2151acfbc55e9cfcc4 F ext/fts5/tool/loadfts5.tcl 58e90407cc5c2b1770460119488fd7c0090d4dd3 -F ext/fts5/tool/mkfts5c.tcl 1df2d86c4f9675e9cdb70b4ff5a53e57aca8a5c0 +F ext/fts5/tool/mkfts5c.tcl 52a2bae4dd05ca2c635d7f744e7dd684a1401570 F ext/fts5/tool/showfts5.tcl 9eaf6c3df352f98a2ab5ce1921dd94128ab1381d F ext/icu/README.txt d9fbbad0c2f647c3fdf715fc9fd64af53aedfc43 F ext/icu/icu.c b2732aef0b076e4276d9b39b5a33cec7a05e1413 @@ -264,7 +264,7 @@ F ext/userauth/userauth.c 5fa3bdb492f481bbc1709fc83c91ebd13460c69e F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk 40bed4c4b5719ee1aef9ce24eddd8bb50db9dd99 +F main.mk f890212d1fb0dc1dccbf29ca073e25049a035f9c F mkopcodec.awk c2ff431854d702cdd2d779c9c0d1f58fa16fa4ea F mkopcodeh.awk 0e7f04a8eb90f92259e47d80110e4e98d7ce337a F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P e9e76e12812b9b42b1142246b71cea98e26903aa -R 3ea307db4af2caf63f312c7ebd57ad22 +P 5343e601fb6f0f24f4e4d5d442f7b5b074734143 +R a5d6a1bbd24ea26e1ba62ab9db596efb U dan -Z bfe83218c323cc99da5efd4c0ac84f4a +Z 4d77dbaecef082f61a7a492bc89aab25 diff --git a/manifest.uuid b/manifest.uuid index 54fe4e7ce6..7c72947b42 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5343e601fb6f0f24f4e4d5d442f7b5b074734143 \ No newline at end of file +0d7f301fb03c8546a5dbce5d061a1d74e3c86bcf \ No newline at end of file From 23fda8242c75e5aa0ca1f40de8d9944b7614d0c9 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 8 Oct 2015 21:00:46 +0000 Subject: [PATCH 61/98] Further tweaks to main.mk so that fts5 builds as part of testfixture. FossilOrigin-Name: 97e11b79a52fb1c57f0afd2dbd6ee66cf00a922d --- ext/fts5/fts5_expr.c | 1 + main.mk | 3 ++- manifest | 14 +++++++------- manifest.uuid | 2 +- 4 files changed, 11 insertions(+), 9 deletions(-) diff --git a/ext/fts5/fts5_expr.c b/ext/fts5/fts5_expr.c index 96c02c04cf..02351478a0 100644 --- a/ext/fts5/fts5_expr.c +++ b/ext/fts5/fts5_expr.c @@ -33,6 +33,7 @@ void *sqlite3Fts5ParserAlloc(void *(*mallocProc)(u64)); void sqlite3Fts5ParserFree(void*, void (*freeProc)(void*)); void sqlite3Fts5Parser(void*, int, Fts5Token, Fts5Parse*); #ifndef NDEBUG +#include void sqlite3Fts5ParserTrace(FILE*, char*); #endif diff --git a/main.mk b/main.mk index 72e52d1061..07ffd811a9 100644 --- a/main.mk +++ b/main.mk @@ -379,7 +379,8 @@ TESTSRC2 = \ $(TOP)/ext/fts3/fts3_expr.c \ $(TOP)/ext/fts3/fts3_tokenizer.c \ $(TOP)/ext/fts3/fts3_write.c \ - $(TOP)/ext/async/sqlite3async.c + $(TOP)/ext/async/sqlite3async.c \ + $(FTS5_SRC) # Header files used by all library source files. # diff --git a/manifest b/manifest index f6e22b3a23..e6109a2036 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sfurther\sfts5\scompilation\sissues. -D 2015-10-08T20:40:18.323 +C Further\stweaks\sto\smain.mk\sso\sthat\sfts5\sbuilds\sas\spart\sof\stestfixture. +D 2015-10-08T21:00:46.491 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 336f9494810fe361b59aa4e0c5cd41fc64d83323 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -110,7 +110,7 @@ F ext/fts5/fts5Int.h ed6c05b803e0bacf85228a8d255853e89796f6f5 F ext/fts5/fts5_aux.c b09aa27dcdaa3d50a30be433fddaa48a50aa827b F ext/fts5/fts5_buffer.c b2fb69c1ee3378956c0d9ee964d61b59d296afaf F ext/fts5/fts5_config.c 57ee5fe71578cb494574fc0e6e51acb9a22a8695 -F ext/fts5/fts5_expr.c d3a56928f8afdd2dca9126f8406f20b9831e4265 +F ext/fts5/fts5_expr.c 1df899afed24c9c6195eea1780dcc56fcd1d1139 F ext/fts5/fts5_hash.c 4bf4b99708848357b8a2b5819e509eb6d3df9246 F ext/fts5/fts5_index.c e03217c37f344f79673be385de6b03f732291000 F ext/fts5/fts5_main.c d159079e618399f9b531ad1fe32772cff307ea91 @@ -264,7 +264,7 @@ F ext/userauth/userauth.c 5fa3bdb492f481bbc1709fc83c91ebd13460c69e F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk f890212d1fb0dc1dccbf29ca073e25049a035f9c +F main.mk cabb44ec58598504aa60a73d0c7b2ed7867a5314 F mkopcodec.awk c2ff431854d702cdd2d779c9c0d1f58fa16fa4ea F mkopcodeh.awk 0e7f04a8eb90f92259e47d80110e4e98d7ce337a F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 5343e601fb6f0f24f4e4d5d442f7b5b074734143 -R a5d6a1bbd24ea26e1ba62ab9db596efb +P 0d7f301fb03c8546a5dbce5d061a1d74e3c86bcf +R e1f9fdfa53cf5660ea6f21bb4b74b6a9 U dan -Z 4d77dbaecef082f61a7a492bc89aab25 +Z e14f76d968001b7f399b579a0b72354e diff --git a/manifest.uuid b/manifest.uuid index 7c72947b42..d3267fc349 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0d7f301fb03c8546a5dbce5d061a1d74e3c86bcf \ No newline at end of file +97e11b79a52fb1c57f0afd2dbd6ee66cf00a922d \ No newline at end of file From d3b90a2e419f8fea7be84139a48964ca13e9e634 Mon Sep 17 00:00:00 2001 From: dan Date: Thu, 8 Oct 2015 21:02:29 +0000 Subject: [PATCH 62/98] Remove calls to "load_static_extension" from fts5 test scripts. FossilOrigin-Name: 53dd7c4c65842c5c9ed3e84edd62e24f2c9be15b --- ext/fts5/test/fts5_common.tcl | 1 - ext/fts5/test/fts5fault6.test | 2 -- manifest | 14 +++++++------- manifest.uuid | 2 +- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/ext/fts5/test/fts5_common.tcl b/ext/fts5/test/fts5_common.tcl index 5eba1296ad..2c64b3b9a4 100644 --- a/ext/fts5/test/fts5_common.tcl +++ b/ext/fts5/test/fts5_common.tcl @@ -17,7 +17,6 @@ source $testdir/tester.tcl catch { sqlite3_fts5_may_be_corrupt 0 - append G(perm:dbconfig) "; load_static_extension \$::dbhandle fts5" reset_db } diff --git a/ext/fts5/test/fts5fault6.test b/ext/fts5/test/fts5fault6.test index c79cf7ab70..118761fab5 100644 --- a/ext/fts5/test/fts5fault6.test +++ b/ext/fts5/test/fts5fault6.test @@ -284,8 +284,6 @@ breakpoint do_faultsim_test 6 -faults oom* -prep { sqlite_orig db test.db sqlite3_db_config_lookaside db 0 0 0 -} -body { - load_static_extension db fts5 } -test { faultsim_test_result {0 {}} {1 {initialization of fts5 failed: }} if {$testrc==0} { diff --git a/manifest b/manifest index e6109a2036..db74889816 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Further\stweaks\sto\smain.mk\sso\sthat\sfts5\sbuilds\sas\spart\sof\stestfixture. -D 2015-10-08T21:00:46.491 +C Remove\scalls\sto\s"load_static_extension"\sfrom\sfts5\stest\sscripts. +D 2015-10-08T21:02:29.524 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 336f9494810fe361b59aa4e0c5cd41fc64d83323 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -123,7 +123,7 @@ F ext/fts5/fts5_varint.c 3f86ce09cab152e3d45490d7586b7ed2e40c13f1 F ext/fts5/fts5_vocab.c 17320c476a5296ee475ab616d95fd10515bacfec F ext/fts5/fts5parse.y e83dca6028e3309178d05b5bd920e372dc295d35 F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba -F ext/fts5/test/fts5_common.tcl b6e6a40ef5d069c8e86ca4fbad491e1195485dbc +F ext/fts5/test/fts5_common.tcl 51f7ef3af444b89c6f6ce3896a0ac349ff4e996d F ext/fts5/test/fts5aa.test 4804f237005bb4ba8ea4a76120d8011ebcb5d611 F ext/fts5/test/fts5ab.test 6fe3a56731d15978afbb74ae51b355fc9310f2ad F ext/fts5/test/fts5ac.test 9737992d08c56bfd4803e933744d2d764e23795c @@ -156,7 +156,7 @@ F ext/fts5/test/fts5fault2.test 28c36c843bb39ae855ba79827417ecc37f114341 F ext/fts5/test/fts5fault3.test d6e9577d4312e331a913c72931bf131704efc8f3 F ext/fts5/test/fts5fault4.test 762991d526ee67c2b374351a17248097ea38bee7 F ext/fts5/test/fts5fault5.test 54da9fd4c3434a1d4f6abdcb6469299d91cf5875 -F ext/fts5/test/fts5fault6.test 97bce1a36b7a64e3203fea504ae8e5cfd5ada423 +F ext/fts5/test/fts5fault6.test 9682664d679643ac6736e90c225526cc84073cda F ext/fts5/test/fts5fault7.test f62ed4d98f137eb03f1db94d1fa41b17a771d971 F ext/fts5/test/fts5full.test 6f6143af0c6700501d9fd597189dfab1555bb741 F ext/fts5/test/fts5hash.test 42eb066f667e9a389a63437cb7038c51974d4fc6 @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 0d7f301fb03c8546a5dbce5d061a1d74e3c86bcf -R e1f9fdfa53cf5660ea6f21bb4b74b6a9 +P 97e11b79a52fb1c57f0afd2dbd6ee66cf00a922d +R 8e17a2728ff14bbeff2287e659139e9d U dan -Z e14f76d968001b7f399b579a0b72354e +Z 3aa012086094b7ff1432167080b1bc87 diff --git a/manifest.uuid b/manifest.uuid index d3267fc349..2c90e71ff5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -97e11b79a52fb1c57f0afd2dbd6ee66cf00a922d \ No newline at end of file +53dd7c4c65842c5c9ed3e84edd62e24f2c9be15b \ No newline at end of file From c306e08ad51b273bb2e132b058746e45f3e1024b Mon Sep 17 00:00:00 2001 From: drh Date: Thu, 8 Oct 2015 23:37:00 +0000 Subject: [PATCH 63/98] Json1 tests are working. Builds without FTS5 enabled. Still some problems building with FTS5. FossilOrigin-Name: 2928f8e87d2e5d121e6e7e5993cbb773bb2b0603 --- Makefile.in | 8 +++++--- main.mk | 18 +++++++++++++----- manifest | 28 ++++++++++++++-------------- manifest.uuid | 2 +- src/main.c | 14 ++++++-------- src/test1.c | 8 +++++--- src/test_config.c | 6 ++++++ test/json101.test | 6 +++++- test/json102.test | 6 +++++- test/releasetest.tcl | 4 ++++ 10 files changed, 64 insertions(+), 36 deletions(-) diff --git a/Makefile.in b/Makefile.in index f78d6cf092..b66086417a 100644 --- a/Makefile.in +++ b/Makefile.in @@ -175,7 +175,7 @@ LIBOBJS0 = alter.lo analyze.lo attach.lo auth.lo \ fts3_unicode.lo fts3_unicode2.lo fts3_write.lo \ fts5.lo \ func.lo global.lo hash.lo \ - icu.lo insert.lo journal.lo legacy.lo loadext.lo \ + icu.lo insert.lo journal.lo json1.lo legacy.lo loadext.lo \ main.lo malloc.lo mem0.lo mem1.lo mem2.lo mem3.lo mem5.lo \ memjournal.lo \ mutex.lo mutex_noop.lo mutex_unix.lo mutex_w32.lo \ @@ -346,7 +346,7 @@ SRC += \ $(TOP)/ext/rtree/rtree.c SRC += \ $(TOP)/ext/rbu/sqlite3rbu.h \ - $(TOP)/ext/rbu/sqlite3rbu.c\ + $(TOP)/ext/rbu/sqlite3rbu.c SRC += \ $(TOP)/ext/misc/json1.c @@ -420,7 +420,6 @@ TESTSRC += \ $(TOP)/ext/fts5/fts5_tcl.c \ $(TOP)/ext/fts5/fts5_test_mi.c \ $(TOP)/ext/misc/ieee754.c \ - $(TOP)/ext/misc/json1.c \ $(TOP)/ext/misc/nextchar.c \ $(TOP)/ext/misc/percentile.c \ $(TOP)/ext/misc/regexp.c \ @@ -994,6 +993,9 @@ fts3_write.lo: $(TOP)/ext/fts3/fts3_write.c $(HDR) $(EXTHDR) rtree.lo: $(TOP)/ext/rtree/rtree.c $(HDR) $(EXTHDR) $(LTCOMPILE) -DSQLITE_CORE -c $(TOP)/ext/rtree/rtree.c +json1.lo: $(TOP)/ext/misc/json1.c + $(LTCOMPILE) -DSQLITE_CORE -c $(TOP)/ext/misc/json1.c + # FTS5 things # FTS5_SRC = \ diff --git a/main.mk b/main.mk index 07ffd811a9..0fddfafe67 100644 --- a/main.mk +++ b/main.mk @@ -60,7 +60,7 @@ LIBOBJ+= vdbe.o parse.o \ fts3_tokenize_vtab.o \ fts3_unicode.o fts3_unicode2.o \ fts3_write.o func.o global.o hash.o \ - icu.o insert.o journal.o legacy.o loadext.o \ + icu.o insert.o journal.o json1.o legacy.o loadext.o \ main.o malloc.o mem0.o mem1.o mem2.o mem3.o mem5.o \ memjournal.o \ mutex.o mutex_noop.o mutex_unix.o mutex_w32.o \ @@ -322,7 +322,6 @@ TESTSRC += \ $(TOP)/ext/misc/fileio.c \ $(TOP)/ext/misc/fuzzer.c \ $(TOP)/ext/misc/ieee754.c \ - $(TOP)/ext/misc/json1.c \ $(TOP)/ext/misc/nextchar.c \ $(TOP)/ext/misc/percentile.c \ $(TOP)/ext/misc/regexp.c \ @@ -332,7 +331,8 @@ TESTSRC += \ $(TOP)/ext/misc/wholenumber.c \ $(TOP)/ext/misc/vfslog.c \ $(TOP)/ext/fts5/fts5_tcl.c \ - $(TOP)/ext/fts5/fts5_test_mi.c + $(TOP)/ext/fts5/fts5_test_mi.c \ + fts5.c #TESTSRC += $(TOP)/ext/fts2/fts2_tokenizer.c @@ -669,9 +669,17 @@ fts3_unicode2.o: $(TOP)/ext/fts3/fts3_unicode2.c $(HDR) $(EXTHDR) fts3_write.o: $(TOP)/ext/fts3/fts3_write.c $(HDR) $(EXTHDR) $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/fts3/fts3_write.c +fts5.o: fts5.c + $(TCCX) -DSQLITE_CORE -c fts5.c + +json1.o: $(TOP)/ext/misc/json1.c + $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/misc/json1.c + rtree.o: $(TOP)/ext/rtree/rtree.c $(HDR) $(EXTHDR) $(TCCX) -DSQLITE_CORE -c $(TOP)/ext/rtree/rtree.c + + fts5parse.c: $(TOP)/ext/fts5/fts5parse.y lemon cp $(TOP)/ext/fts5/fts5parse.y . rm -f fts5parse.h @@ -718,9 +726,9 @@ testfixture$(EXE): $(TESTSRC2) libsqlite3.a $(TESTSRC) $(TOP)/src/tclsqlite.c $(TESTSRC) $(TESTSRC2) $(TOP)/src/tclsqlite.c \ -o testfixture$(EXE) $(LIBTCL) libsqlite3.a $(THREADLIB) -amalgamation-testfixture$(EXE): sqlite3.c $(TESTSRC) $(TOP)/src/tclsqlite.c +amalgamation-testfixture$(EXE): sqlite3.c fts5.c $(TESTSRC) $(TOP)/src/tclsqlite.c $(TCCX) $(TCL_FLAGS) -DTCLSH=1 $(TESTFIXTURE_FLAGS) \ - $(TESTSRC) $(TOP)/src/tclsqlite.c sqlite3.c \ + $(TESTSRC) $(TOP)/src/tclsqlite.c sqlite3.c fts5.c \ -o testfixture$(EXE) $(LIBTCL) $(THREADLIB) fts3-testfixture$(EXE): sqlite3.c fts3amal.c $(TESTSRC) $(TOP)/src/tclsqlite.c diff --git a/manifest b/manifest index db74889816..76f039490f 100644 --- a/manifest +++ b/manifest @@ -1,7 +1,7 @@ -C Remove\scalls\sto\s"load_static_extension"\sfrom\sfts5\stest\sscripts. -D 2015-10-08T21:02:29.524 +C Json1\stests\sare\sworking.\s\sBuilds\swithout\sFTS5\senabled.\s\sStill\ssome\sproblems\nbuilding\swith\sFTS5. +D 2015-10-08T23:37:00.134 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f -F Makefile.in 336f9494810fe361b59aa4e0c5cd41fc64d83323 +F Makefile.in ab670f8513a9aac7e6367f791bf5ac685111d0a9 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 F Makefile.msc f95e14e549addbf22304f6c01901b600aea10a6d F Makefile.vxworks e1b65dea203f054e71653415bd8f96dcaed47858 @@ -264,7 +264,7 @@ F ext/userauth/userauth.c 5fa3bdb492f481bbc1709fc83c91ebd13460c69e F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk cabb44ec58598504aa60a73d0c7b2ed7867a5314 +F main.mk e78ca7d50592dd4a4f2c7a09db478034feabc92f F mkopcodec.awk c2ff431854d702cdd2d779c9c0d1f58fa16fa4ea F mkopcodeh.awk 0e7f04a8eb90f92259e47d80110e4e98d7ce337a F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 @@ -308,7 +308,7 @@ F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d F src/legacy.c ba1863ea58c4c840335a84ec276fc2b25e22bc4e F src/lempar.c d344a95d60c24e2f490ee59db9784b1b17439012 F src/loadext.c f0b66d28e377fd6c6d36cc9d92df1ff251ebee44 -F src/main.c 1bd3839327e6657ebb722085f02d9d5a48c4cd60 +F src/main.c fec97668771438033a7559883401067b139729e1 F src/malloc.c 3a37ce6979a40f499d8cea9e9ab4e8517854d35d F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c abe6ee469b6c5a35c7f22bfeb9c9bac664a1c987 @@ -353,7 +353,7 @@ F src/sqliteLimit.h 216557999cb45f2e3578ed53ebefe228d779cb46 F src/status.c f266ad8a2892d659b74f0f50cb6a88b6e7c12179 F src/table.c 51b46b2a62d1b3a959633d593b89bab5e2c9155e F src/tclsqlite.c d9439b6a910985b7fff43ba6756bcef00de22649 -F src/test1.c c96508c835979bf15dc0e3146e2c7a51a2333d3c +F src/test1.c 5d1bbac006ef00e6fe4332c554a7cd96abe5fa42 F src/test2.c 577961fe48961b2f2e5c8b56ee50c3f459d3359d F src/test3.c 64d2afdd68feac1bb5e2ffb8226c8c639f798622 F src/test4.c d168f83cc78d02e8d35567bb5630e40dcd85ac1e @@ -367,7 +367,7 @@ F src/test_autoext.c dea8a01a7153b9adc97bd26161e4226329546e12 F src/test_backup.c 2e6e6a081870150f20c526a2e9d0d29cda47d803 F src/test_blob.c e5a7a81d61a780da79101aeb1e60d300af169e07 F src/test_btree.c 2e9978eca99a9a4bfa8cae949efb00886860a64f -F src/test_config.c fb2e5d354d9a077f5fbb261652eff4787deb104f +F src/test_config.c ada6f38b0acb6722fb7f0ed8c54fd66df41085b9 F src/test_demovfs.c 0de72c2c89551629f58486fde5734b7d90758852 F src/test_devsym.c e7498904e72ba7491d142d5c83b476c4e76993bc F src/test_fs.c ced436e3d4b8e4681328409b8081051ce614e28f @@ -820,8 +820,8 @@ F test/journal3.test ff8af941f9e06161d3db1b46bb9f965ff0e7f307 F test/jrnlmode.test 7864d59cf7f6e552b9b99ba0f38acd167edc10fa F test/jrnlmode2.test 81610545a4e6ed239ea8fa661891893385e23a1d F test/jrnlmode3.test 556b447a05be0e0963f4311e95ab1632b11c9eaa -F test/json101.test e8b50fbcdbf283cfafbc42632bf2c7dfa4541c46 -F test/json102.test 796b1c59894c6e0f38fc1a3acb0e690573b952a3 +F test/json101.test 83e6ebfb3cef6329853ab854403ec82b1787b537 +F test/json102.test bf3fe7a706d30936a76a0f7a0375e1e8e73aff5a F test/keyword1.test 37ef6bba5d2ed5b07ecdd6810571de2956599dff F test/lastinsert.test 42e948fd6442f07d60acbd15d33fb86473e0ef63 F test/laststmtchanges.test ae613f53819206b3222771828d024154d51db200 @@ -947,7 +947,7 @@ F test/rbu.test 168573d353cd0fd10196b87b0caa322c144ef736 F test/rdonly.test 64e2696c322e3538df0b1ed624e21f9a23ed9ff8 F test/regexp1.test 497ea812f264d12b6198d6e50a76be4a1973a9d8 F test/reindex.test 44edd3966b474468b823d481eafef0c305022254 -F test/releasetest.tcl afdac5c3429dceb034295617c0a51df9954d467a +F test/releasetest.tcl 97e4e5ca5925b21ef470b3c97d4c46dd063cfec4 F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb F test/rollback.test 458fe73eb3ffdfdf9f6ba3e9b7350a6220414dea F test/rollback2.test fc14cf6d1a2b250d2735ef16124b971bce152f14 @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 97e11b79a52fb1c57f0afd2dbd6ee66cf00a922d -R 8e17a2728ff14bbeff2287e659139e9d -U dan -Z 3aa012086094b7ff1432167080b1bc87 +P 53dd7c4c65842c5c9ed3e84edd62e24f2c9be15b +R 9e61c8794766296f6abfb50c81f18f50 +U drh +Z a87c3731b988c508695a8d0d1121a40b diff --git a/manifest.uuid b/manifest.uuid index 2c90e71ff5..9f32f5f37e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -53dd7c4c65842c5c9ed3e84edd62e24f2c9be15b \ No newline at end of file +2928f8e87d2e5d121e6e7e5993cbb773bb2b0603 \ No newline at end of file diff --git a/src/main.c b/src/main.c index afdcfe4f21..ef2fa66ec3 100644 --- a/src/main.c +++ b/src/main.c @@ -25,6 +25,12 @@ #ifdef SQLITE_ENABLE_ICU # include "sqliteicu.h" #endif +#ifdef SQLITE_ENABLE_JSON1 +int sqlite3Json1Init(sqlite3*); +#endif +#ifdef SQLITE_ENABLE_FTS5 +int sqlite3Fts5Init(sqlite3*); +#endif #ifndef SQLITE_AMALGAMATION /* IMPLEMENTATION-OF: R-46656-45156 The sqlite3_version[] string constant @@ -2638,13 +2644,6 @@ int sqlite3ParseUri( return rc; } -#ifdef SQLITE_ENABLE_FTS5 -#ifdef SQLITE_AMALGAMATION -static int sqlite3Fts5Init(sqlite3*); -#else -extern int sqlite3Fts5Init(sqlite3*); -#endif -#endif /* ** This routine does the work of opening a database on behalf of @@ -2911,7 +2910,6 @@ static int openDatabase( #ifdef SQLITE_ENABLE_JSON1 if( !db->mallocFailed && rc==SQLITE_OK){ - extern int sqlite3Json1Init(sqlite3*); rc = sqlite3Json1Init(db); } #endif diff --git a/src/test1.c b/src/test1.c index 1f76ea5ba5..df00e1943e 100644 --- a/src/test1.c +++ b/src/test1.c @@ -6377,7 +6377,6 @@ static int tclLoadStaticExtensionCmd( extern int sqlite3_fileio_init(sqlite3*,char**,const sqlite3_api_routines*); extern int sqlite3_fuzzer_init(sqlite3*,char**,const sqlite3_api_routines*); extern int sqlite3_ieee_init(sqlite3*,char**,const sqlite3_api_routines*); - extern int sqlite3_json_init(sqlite3*,char**,const sqlite3_api_routines*); extern int sqlite3_nextchar_init(sqlite3*,char**,const sqlite3_api_routines*); extern int sqlite3_percentile_init(sqlite3*,char**,const sqlite3_api_routines*); extern int sqlite3_regexp_init(sqlite3*,char**,const sqlite3_api_routines*); @@ -6399,7 +6398,6 @@ static int tclLoadStaticExtensionCmd( { "fileio", sqlite3_fileio_init }, { "fuzzer", sqlite3_fuzzer_init }, { "ieee754", sqlite3_ieee_init }, - { "json", sqlite3_json_init }, { "nextchar", sqlite3_nextchar_init }, { "percentile", sqlite3_percentile_init }, { "regexp", sqlite3_regexp_init }, @@ -6426,7 +6424,11 @@ static int tclLoadStaticExtensionCmd( Tcl_AppendResult(interp, "no such extension: ", zName, (char*)0); return TCL_ERROR; } - rc = aExtension[i].pInit(db, &zErrMsg, 0); + if( aExtension[i].pInit ){ + rc = aExtension[i].pInit(db, &zErrMsg, 0); + }else{ + rc = SQLITE_OK; + } if( rc!=SQLITE_OK || zErrMsg ){ Tcl_AppendResult(interp, "initialization of ", zName, " failed: ", zErrMsg, (char*)0); diff --git a/src/test_config.c b/src/test_config.c index 0aa29c70d7..5da2df16b7 100644 --- a/src/test_config.c +++ b/src/test_config.c @@ -167,6 +167,12 @@ static void set_options(Tcl_Interp *interp){ Tcl_SetVar2(interp, "sqlite_options", "atomicwrite", "0", TCL_GLOBAL_ONLY); #endif +#ifdef SQLITE_ENABLE_JSON1 + Tcl_SetVar2(interp, "sqlite_options", "json1", "1", TCL_GLOBAL_ONLY); +#else + Tcl_SetVar2(interp, "sqlite_options", "json1", "0", TCL_GLOBAL_ONLY); +#endif + #ifdef SQLITE_OMIT_ATTACH Tcl_SetVar2(interp, "sqlite_options", "attach", "0", TCL_GLOBAL_ONLY); #else diff --git a/test/json101.test b/test/json101.test index 943292640d..e11cdd0138 100644 --- a/test/json101.test +++ b/test/json101.test @@ -15,7 +15,11 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl -load_static_extension db json +ifcapable !json1 { + finish_test + return +} + do_execsql_test json101-1.1.00 { SELECT json_array(1,2.5,null,'hello'); } {[1,2.5,null,"hello"]} diff --git a/test/json102.test b/test/json102.test index f40580da4e..a4d88dbeaa 100644 --- a/test/json102.test +++ b/test/json102.test @@ -18,7 +18,11 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl -load_static_extension db json +ifcapable !json1 { + finish_test + return +} + do_execsql_test json102-100 { SELECT json_object('ex','[52,3.14159]'); } {{{"ex":"[52,3.14159]"}}} diff --git a/test/releasetest.tcl b/test/releasetest.tcl index dde3f039d6..ef29a0d945 100644 --- a/test/releasetest.tcl +++ b/test/releasetest.tcl @@ -129,6 +129,7 @@ array set ::Configs [strip_comments { -DSQLITE_DISABLE_LFS=1 -DSQLITE_ENABLE_ATOMIC_WRITE=1 -DSQLITE_ENABLE_IOTRACE=1 + -DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1 -DSQLITE_MAX_PAGE_SIZE=4096 -DSQLITE_OMIT_LOAD_EXTENSION=1 @@ -145,6 +146,7 @@ array set ::Configs [strip_comments { -DSQLITE_DEFAULT_TEMP_CACHE_SIZE=1000 -DSQLITE_DISABLE_LFS=1 -DSQLITE_ENABLE_FTS3=1 + -DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1 -DSQLITE_ENABLE_RTREE=1 -DSQLITE_MAX_COMPOUND_SELECT=50 @@ -163,6 +165,7 @@ array set ::Configs [strip_comments { -DSQLITE_DEFAULT_MEMSTATUS=0 -DSQLITE_THREADSAFE=2 -DSQLITE_OS_UNIX=1 + -DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_LOCKING_STYLE=1 -DUSE_PREAD=1 -DSQLITE_ENABLE_RTREE=1 @@ -197,6 +200,7 @@ array set ::Configs [strip_comments { -DSQLITE_ENABLE_STAT4 -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_RTREE + -DSQLITE_ENABLE_JSON1=1 } # The next group of configurations are used only by the From 45fac889511c81929ee767b4928cd872949ee8ea Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 9 Oct 2015 01:42:49 +0000 Subject: [PATCH 64/98] Trying to get FTS5 tests to build and run using main.mk. Not yet working. FossilOrigin-Name: 206174f9b154c590a3e2e94236db38e111d64bdb --- Makefile.in | 4 ++-- ext/fts5/fts5Int.h | 4 ++++ ext/fts5/tool/mkfts5c.tcl | 2 +- main.mk | 8 +++++--- manifest | 20 ++++++++++---------- manifest.uuid | 2 +- tool/mksqlite3c.tcl | 3 ++- 7 files changed, 25 insertions(+), 18 deletions(-) diff --git a/Makefile.in b/Makefile.in index b66086417a..9d1020e070 100644 --- a/Makefile.in +++ b/Makefile.in @@ -65,7 +65,7 @@ TCC += -DSQLITE_THREADSAFE=@SQLITE_THREADSAFE@ # Any target libraries which libsqlite must be linked against # -TLIBS = @LIBS@ +TLIBS = @LIBS@ $(LIBS) # Flags controlling use of the in memory btree implementation # @@ -272,8 +272,8 @@ SRC = \ $(TOP)/src/sqliteInt.h \ $(TOP)/src/sqliteLimit.h \ $(TOP)/src/table.c \ - $(TOP)/src/threads.c \ $(TOP)/src/tclsqlite.c \ + $(TOP)/src/threads.c \ $(TOP)/src/tokenize.c \ $(TOP)/src/treeview.c \ $(TOP)/src/trigger.c \ diff --git a/ext/fts5/fts5Int.h b/ext/fts5/fts5Int.h index ce066f2aa8..407c9efed1 100644 --- a/ext/fts5/fts5Int.h +++ b/ext/fts5/fts5Int.h @@ -46,6 +46,10 @@ typedef sqlite3_uint64 u64; #endif +#ifndef SQLITE_PRIVATE +# define SQLITE_PRIVATE static +#endif + /* ** Maximum number of prefix indexes on single FTS5 table. This must be diff --git a/ext/fts5/tool/mkfts5c.tcl b/ext/fts5/tool/mkfts5c.tcl index 5a5eeae0af..c1acf8a493 100644 --- a/ext/fts5/tool/mkfts5c.tcl +++ b/ext/fts5/tool/mkfts5c.tcl @@ -88,7 +88,7 @@ proc fts5c_printfile {zIn} { foreach line [split $data "\n"] { if {[regexp {^#include.*fts5} $line]} continue if {[regexp {^(const )?[a-zA-Z][a-zA-Z0-9]* [*]?sqlite3Fts5} $line]} { - set line "static $line" + set line "SQLITE_PRIVATE $line" } set line [string map $sub_map $line] puts $G(fd) $line diff --git a/main.mk b/main.mk index 0fddfafe67..98a906eaaf 100644 --- a/main.mk +++ b/main.mk @@ -12,6 +12,8 @@ # THREADLIB Specify any extra linker options needed to make the library # thread safe # +# LIBS Extra libraries options +# # OPTS Extra compiler command-line options. # # EXE The suffix to add to executable files. ".exe" for windows @@ -48,6 +50,7 @@ TCCX = $(TCC) $(OPTS) -I. -I$(TOP)/src -I$(TOP) TCCX += -I$(TOP)/ext/rtree -I$(TOP)/ext/icu -I$(TOP)/ext/fts3 TCCX += -I$(TOP)/ext/async -I$(TOP)/ext/userauth TCCX += -I$(TOP)/ext/fts5 +THREADLIB += $(LIBS) # Object files for the SQLite library. # @@ -59,7 +62,7 @@ LIBOBJ+= vdbe.o parse.o \ fts3_snippet.o fts3_tokenizer.o fts3_tokenizer1.o \ fts3_tokenize_vtab.o \ fts3_unicode.o fts3_unicode2.o \ - fts3_write.o func.o global.o hash.o \ + fts3_write.o fts5.o func.o global.o hash.o \ icu.o insert.o journal.o json1.o legacy.o loadext.o \ main.o malloc.o mem0.o mem1.o mem2.o mem3.o mem5.o \ memjournal.o \ @@ -331,8 +334,7 @@ TESTSRC += \ $(TOP)/ext/misc/wholenumber.c \ $(TOP)/ext/misc/vfslog.c \ $(TOP)/ext/fts5/fts5_tcl.c \ - $(TOP)/ext/fts5/fts5_test_mi.c \ - fts5.c + $(TOP)/ext/fts5/fts5_test_mi.c #TESTSRC += $(TOP)/ext/fts2/fts2_tokenizer.c diff --git a/manifest b/manifest index 76f039490f..2e1fa12c7f 100644 --- a/manifest +++ b/manifest @@ -1,7 +1,7 @@ -C Json1\stests\sare\sworking.\s\sBuilds\swithout\sFTS5\senabled.\s\sStill\ssome\sproblems\nbuilding\swith\sFTS5. -D 2015-10-08T23:37:00.134 +C Trying\sto\sget\sFTS5\stests\sto\sbuild\sand\srun\susing\smain.mk.\s\sNot\syet\sworking. +D 2015-10-09T01:42:49.474 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f -F Makefile.in ab670f8513a9aac7e6367f791bf5ac685111d0a9 +F Makefile.in f0088ff0d2ac949fce6de7c00f13a99ac5bdb663 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 F Makefile.msc f95e14e549addbf22304f6c01901b600aea10a6d F Makefile.vxworks e1b65dea203f054e71653415bd8f96dcaed47858 @@ -106,7 +106,7 @@ F ext/fts3/unicode/mkunicode.tcl 95cf7ec186e48d4985e433ff8a1c89090a774252 F ext/fts3/unicode/parseunicode.tcl da577d1384810fb4e2b209bf3313074353193e95 F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 F ext/fts5/fts5.h 98f802fe41481f9d797fce496f0fefcad72c7782 -F ext/fts5/fts5Int.h ed6c05b803e0bacf85228a8d255853e89796f6f5 +F ext/fts5/fts5Int.h 3e682a711ffa249cb327eec5c1b3e5a3deba4050 F ext/fts5/fts5_aux.c b09aa27dcdaa3d50a30be433fddaa48a50aa827b F ext/fts5/fts5_buffer.c b2fb69c1ee3378956c0d9ee964d61b59d296afaf F ext/fts5/fts5_config.c 57ee5fe71578cb494574fc0e6e51acb9a22a8695 @@ -186,7 +186,7 @@ F ext/fts5/test/fts5version.test 978f59541d8cef7e8591f8be2115ec5ccb863e2e F ext/fts5/test/fts5vocab.test cdf97b9678484e9bad5062edf9c9106e5c3b0c5c F ext/fts5/tool/fts5txt2db.tcl 3d19fb8ffb234031d33d7d2151acfbc55e9cfcc4 F ext/fts5/tool/loadfts5.tcl 58e90407cc5c2b1770460119488fd7c0090d4dd3 -F ext/fts5/tool/mkfts5c.tcl 52a2bae4dd05ca2c635d7f744e7dd684a1401570 +F ext/fts5/tool/mkfts5c.tcl 21552771bdb9e2a44a975a1a84ffa0a5a39d57f0 F ext/fts5/tool/showfts5.tcl 9eaf6c3df352f98a2ab5ce1921dd94128ab1381d F ext/icu/README.txt d9fbbad0c2f647c3fdf715fc9fd64af53aedfc43 F ext/icu/icu.c b2732aef0b076e4276d9b39b5a33cec7a05e1413 @@ -264,7 +264,7 @@ F ext/userauth/userauth.c 5fa3bdb492f481bbc1709fc83c91ebd13460c69e F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk e78ca7d50592dd4a4f2c7a09db478034feabc92f +F main.mk 82271e141b6b15693a66ddbdd1285c36e8606841 F mkopcodec.awk c2ff431854d702cdd2d779c9c0d1f58fa16fa4ea F mkopcodeh.awk 0e7f04a8eb90f92259e47d80110e4e98d7ce337a F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 @@ -1357,7 +1357,7 @@ F tool/mkopts.tcl 66ac10d240cc6e86abd37dc908d50382f84ff46e F tool/mkpragmatab.tcl 84af2b180484323a2ea22a2279e8bd9e3e1e492e F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 F tool/mksqlite3c-noext.tcl 87240b09c20042999b41d5fabe091b7111287835 -F tool/mksqlite3c.tcl f38527a5125ada6705601d6665065a3bdf38ec64 +F tool/mksqlite3c.tcl b66b4170f693602cd6985aed15d9509fe2f18c84 F tool/mksqlite3h.tcl e3ac3f23897d86cb8f5f5df92e91643229fcc8d1 F tool/mksqlite3internalh.tcl eb994013e833359137eb53a55acdad0b5ae1049b F tool/mkvsix.tcl bbe57cd9ae11c6cc70319241101ef8d2b8c3765b @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 53dd7c4c65842c5c9ed3e84edd62e24f2c9be15b -R 9e61c8794766296f6abfb50c81f18f50 +P 2928f8e87d2e5d121e6e7e5993cbb773bb2b0603 +R 2760e46734f295e8733b8a00f5d6ba3d U drh -Z a87c3731b988c508695a8d0d1121a40b +Z 9cc40c2d063b915018c36739ed3ed59a diff --git a/manifest.uuid b/manifest.uuid index 9f32f5f37e..bcd6fffe1f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2928f8e87d2e5d121e6e7e5993cbb773bb2b0603 \ No newline at end of file +206174f9b154c590a3e2e94236db38e111d64bdb \ No newline at end of file diff --git a/tool/mksqlite3c.tcl b/tool/mksqlite3c.tcl index ce808faa91..23241e27a6 100644 --- a/tool/mksqlite3c.tcl +++ b/tool/mksqlite3c.tcl @@ -211,7 +211,8 @@ proc copy_file {filename} { puts $out "#if 0" } elseif {!$linemacros && [regexp {^#line} $line]} { # Skip #line directives. - } elseif {$addstatic && ![regexp {^(static|typedef)} $line]} { + } elseif {$addstatic + && ![regexp {^(static|typedef|SQLITE_PRIVATE)} $line]} { # Skip adding the SQLITE_PRIVATE or SQLITE_API keyword before # functions if this header file does not need it. if {![info exists varonly_hdr($tail)] From 0008ce7cc5a320bc9ec796cab2eab0185c87f8e1 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 9 Oct 2015 11:09:47 +0000 Subject: [PATCH 65/98] Makefile and fts5 changes so that fts5 works with main.mk. Still does not work with Makefile.in. FossilOrigin-Name: 6ebac32d8378e46f44a6eb55aaa30baf4d7dde7d --- ext/fts5/fts5Int.h | 4 ---- ext/fts5/fts5_main.c | 22 ++++++++++++++++++---- ext/fts5/tool/mkfts5c.tcl | 6 ++++-- main.mk | 7 ++++--- manifest | 22 +++++++++++----------- manifest.uuid | 2 +- src/test1.c | 4 ---- 7 files changed, 38 insertions(+), 29 deletions(-) diff --git a/ext/fts5/fts5Int.h b/ext/fts5/fts5Int.h index 407c9efed1..ce066f2aa8 100644 --- a/ext/fts5/fts5Int.h +++ b/ext/fts5/fts5Int.h @@ -46,10 +46,6 @@ typedef sqlite3_uint64 u64; #endif -#ifndef SQLITE_PRIVATE -# define SQLITE_PRIVATE static -#endif - /* ** Maximum number of prefix indexes on single FTS5 table. This must be diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index 5aebc97fde..0fe204a3eb 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -2393,7 +2393,7 @@ static void fts5SourceIdFunc( sqlite3_result_text(pCtx, "--FTS5-SOURCE-ID--", -1, SQLITE_TRANSIENT); } -int sqlite3Fts5Init(sqlite3 *db){ +static int fts5Init(sqlite3 *db){ static const sqlite3_module fts5Mod = { /* iVersion */ 2, /* xCreate */ fts5CreateMethod, @@ -2454,6 +2454,15 @@ int sqlite3Fts5Init(sqlite3 *db){ return rc; } +/* +** The following functions are used to register the module with SQLite. If +** this module is being built as part of the SQLite core (SQLITE_CORE is +** defined), then sqlite3_open() will call sqlite3Fts5Init() directly. +** +** Or, if this module is being built as a loadable extension, +** sqlite3Fts5Init() is omitted and the two standard entry points +** sqlite3_fts_init() and sqlite3_fts5_init() defined instead. +*/ #ifndef SQLITE_CORE #ifdef _WIN32 __declspec(dllexport) @@ -2465,9 +2474,8 @@ int sqlite3_fts_init( ){ SQLITE_EXTENSION_INIT2(pApi); (void)pzErrMsg; /* Unused parameter */ - return sqlite3Fts5Init(db); + return fts5Init(db); } -#endif #ifdef _WIN32 __declspec(dllexport) @@ -2479,5 +2487,11 @@ int sqlite3_fts5_init( ){ SQLITE_EXTENSION_INIT2(pApi); (void)pzErrMsg; /* Unused parameter */ - return sqlite3Fts5Init(db); + return fts5Init(db); } +#else +int sqlite3Fts5Init(sqlite3 *db){ + return fts5Init(db); +} +#endif + diff --git a/ext/fts5/tool/mkfts5c.tcl b/ext/fts5/tool/mkfts5c.tcl index c1acf8a493..535506de1b 100644 --- a/ext/fts5/tool/mkfts5c.tcl +++ b/ext/fts5/tool/mkfts5c.tcl @@ -87,8 +87,10 @@ proc fts5c_printfile {zIn} { foreach line [split $data "\n"] { if {[regexp {^#include.*fts5} $line]} continue - if {[regexp {^(const )?[a-zA-Z][a-zA-Z0-9]* [*]?sqlite3Fts5} $line]} { - set line "SQLITE_PRIVATE $line" + if { ![regexp { sqlite3Fts5Init\(} $line] + && [regexp {^(const )?[a-zA-Z][a-zA-Z0-9]* [*]?sqlite3Fts5} $line] + } { + set line "static $line" } set line [string map $sub_map $line] puts $G(fd) $line diff --git a/main.mk b/main.mk index 98a906eaaf..66068f668c 100644 --- a/main.mk +++ b/main.mk @@ -57,7 +57,8 @@ THREADLIB += $(LIBS) LIBOBJ+= vdbe.o parse.o \ alter.o analyze.o attach.o auth.o \ backup.o bitvec.o btmutex.o btree.o build.o \ - callback.o complete.o ctime.o date.o dbstat.o delete.o expr.o fault.o fkey.o \ + callback.o complete.o ctime.o date.o dbstat.o delete.o expr.o \ + fault.o fkey.o \ fts3.o fts3_aux.o fts3_expr.o fts3_hash.o fts3_icu.o fts3_porter.o \ fts3_snippet.o fts3_tokenizer.o fts3_tokenizer1.o \ fts3_tokenize_vtab.o \ @@ -728,9 +729,9 @@ testfixture$(EXE): $(TESTSRC2) libsqlite3.a $(TESTSRC) $(TOP)/src/tclsqlite.c $(TESTSRC) $(TESTSRC2) $(TOP)/src/tclsqlite.c \ -o testfixture$(EXE) $(LIBTCL) libsqlite3.a $(THREADLIB) -amalgamation-testfixture$(EXE): sqlite3.c fts5.c $(TESTSRC) $(TOP)/src/tclsqlite.c +amalgamation-testfixture$(EXE): sqlite3.c $(TESTSRC) $(TOP)/src/tclsqlite.c $(TCCX) $(TCL_FLAGS) -DTCLSH=1 $(TESTFIXTURE_FLAGS) \ - $(TESTSRC) $(TOP)/src/tclsqlite.c sqlite3.c fts5.c \ + $(TESTSRC) $(TOP)/src/tclsqlite.c sqlite3.c \ -o testfixture$(EXE) $(LIBTCL) $(THREADLIB) fts3-testfixture$(EXE): sqlite3.c fts3amal.c $(TESTSRC) $(TOP)/src/tclsqlite.c diff --git a/manifest b/manifest index 2e1fa12c7f..1e1981c630 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Trying\sto\sget\sFTS5\stests\sto\sbuild\sand\srun\susing\smain.mk.\s\sNot\syet\sworking. -D 2015-10-09T01:42:49.474 +C Makefile\sand\sfts5\schanges\sso\sthat\sfts5\sworks\swith\smain.mk.\sStill\sdoes\snot\swork\swith\sMakefile.in. +D 2015-10-09T11:09:47.175 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f0088ff0d2ac949fce6de7c00f13a99ac5bdb663 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -106,14 +106,14 @@ F ext/fts3/unicode/mkunicode.tcl 95cf7ec186e48d4985e433ff8a1c89090a774252 F ext/fts3/unicode/parseunicode.tcl da577d1384810fb4e2b209bf3313074353193e95 F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 F ext/fts5/fts5.h 98f802fe41481f9d797fce496f0fefcad72c7782 -F ext/fts5/fts5Int.h 3e682a711ffa249cb327eec5c1b3e5a3deba4050 +F ext/fts5/fts5Int.h ed6c05b803e0bacf85228a8d255853e89796f6f5 F ext/fts5/fts5_aux.c b09aa27dcdaa3d50a30be433fddaa48a50aa827b F ext/fts5/fts5_buffer.c b2fb69c1ee3378956c0d9ee964d61b59d296afaf F ext/fts5/fts5_config.c 57ee5fe71578cb494574fc0e6e51acb9a22a8695 F ext/fts5/fts5_expr.c 1df899afed24c9c6195eea1780dcc56fcd1d1139 F ext/fts5/fts5_hash.c 4bf4b99708848357b8a2b5819e509eb6d3df9246 F ext/fts5/fts5_index.c e03217c37f344f79673be385de6b03f732291000 -F ext/fts5/fts5_main.c d159079e618399f9b531ad1fe32772cff307ea91 +F ext/fts5/fts5_main.c 5125711e806d5d9382b4b12f71bd8a7b5e103ec6 F ext/fts5/fts5_storage.c df061a5caf9e50fbbd43113009b5b248362f4995 F ext/fts5/fts5_tcl.c 3bf445e66de32137d4693694ff7b1fd6074e32bd F ext/fts5/fts5_test_mi.c e96be827aa8f571031e65e481251dc1981d608bf @@ -186,7 +186,7 @@ F ext/fts5/test/fts5version.test 978f59541d8cef7e8591f8be2115ec5ccb863e2e F ext/fts5/test/fts5vocab.test cdf97b9678484e9bad5062edf9c9106e5c3b0c5c F ext/fts5/tool/fts5txt2db.tcl 3d19fb8ffb234031d33d7d2151acfbc55e9cfcc4 F ext/fts5/tool/loadfts5.tcl 58e90407cc5c2b1770460119488fd7c0090d4dd3 -F ext/fts5/tool/mkfts5c.tcl 21552771bdb9e2a44a975a1a84ffa0a5a39d57f0 +F ext/fts5/tool/mkfts5c.tcl 09ce6a7997440508360f5ba1651ab7e923a8bf31 F ext/fts5/tool/showfts5.tcl 9eaf6c3df352f98a2ab5ce1921dd94128ab1381d F ext/icu/README.txt d9fbbad0c2f647c3fdf715fc9fd64af53aedfc43 F ext/icu/icu.c b2732aef0b076e4276d9b39b5a33cec7a05e1413 @@ -264,7 +264,7 @@ F ext/userauth/userauth.c 5fa3bdb492f481bbc1709fc83c91ebd13460c69e F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk 82271e141b6b15693a66ddbdd1285c36e8606841 +F main.mk 784763e87a5080abc749d6263198bbe5aa93fd20 F mkopcodec.awk c2ff431854d702cdd2d779c9c0d1f58fa16fa4ea F mkopcodeh.awk 0e7f04a8eb90f92259e47d80110e4e98d7ce337a F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 @@ -353,7 +353,7 @@ F src/sqliteLimit.h 216557999cb45f2e3578ed53ebefe228d779cb46 F src/status.c f266ad8a2892d659b74f0f50cb6a88b6e7c12179 F src/table.c 51b46b2a62d1b3a959633d593b89bab5e2c9155e F src/tclsqlite.c d9439b6a910985b7fff43ba6756bcef00de22649 -F src/test1.c 5d1bbac006ef00e6fe4332c554a7cd96abe5fa42 +F src/test1.c 8fff9c5aa63d6490f516d018b70c12a9cb9a4d8a F src/test2.c 577961fe48961b2f2e5c8b56ee50c3f459d3359d F src/test3.c 64d2afdd68feac1bb5e2ffb8226c8c639f798622 F src/test4.c d168f83cc78d02e8d35567bb5630e40dcd85ac1e @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 2928f8e87d2e5d121e6e7e5993cbb773bb2b0603 -R 2760e46734f295e8733b8a00f5d6ba3d -U drh -Z 9cc40c2d063b915018c36739ed3ed59a +P 206174f9b154c590a3e2e94236db38e111d64bdb +R 7677b595a4a025d5b5c3743b20676b45 +U dan +Z 2d1f0773394fa57beba698d5cfa49140 diff --git a/manifest.uuid b/manifest.uuid index bcd6fffe1f..1147fff002 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -206174f9b154c590a3e2e94236db38e111d64bdb \ No newline at end of file +6ebac32d8378e46f44a6eb55aaa30baf4d7dde7d \ No newline at end of file diff --git a/src/test1.c b/src/test1.c index df00e1943e..6c47754bf9 100644 --- a/src/test1.c +++ b/src/test1.c @@ -6384,7 +6384,6 @@ static int tclLoadStaticExtensionCmd( extern int sqlite3_spellfix_init(sqlite3*,char**,const sqlite3_api_routines*); extern int sqlite3_totype_init(sqlite3*,char**,const sqlite3_api_routines*); extern int sqlite3_wholenumber_init(sqlite3*,char**,const sqlite3_api_routines*); - extern int sqlite3_fts5_init(sqlite3*,char**,const sqlite3_api_routines*); static const struct { const char *zExtName; int (*pInit)(sqlite3*,char**,const sqlite3_api_routines*); @@ -6392,9 +6391,6 @@ static int tclLoadStaticExtensionCmd( { "amatch", sqlite3_amatch_init }, { "closure", sqlite3_closure_init }, { "eval", sqlite3_eval_init }, -#ifdef SQLITE_ENABLE_FTS5 - { "fts5", sqlite3_fts5_init }, -#endif { "fileio", sqlite3_fileio_init }, { "fuzzer", sqlite3_fuzzer_init }, { "ieee754", sqlite3_ieee_init }, From ce1d9f546b38c133c1e4adfaef230a5c69e271a2 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 9 Oct 2015 12:48:33 +0000 Subject: [PATCH 66/98] Add configure script options --enable-fts5 and --enable-json1. Automatically search for -lm when using --enable-fts5. FossilOrigin-Name: a0c44f1d46f1f31043d66f20c8dc0df53db15c30 --- configure | 209 ++++++++++++++++++++++++++++++++++++++++--- configure.ac | 41 +++++++++ manifest | 18 ++-- manifest.uuid | 2 +- test/releasetest.tcl | 10 ++- 5 files changed, 253 insertions(+), 27 deletions(-) diff --git a/configure b/configure index 2969759f3c..532e0b202d 100755 --- a/configure +++ b/configure @@ -902,6 +902,11 @@ with_readline_inc enable_debug enable_amalgamation enable_load_extension +enable_fts3 +enable_fts4 +enable_fts5 +enable_json1 +enable_rtree enable_gcov ' ac_precious_vars='build_alias @@ -1544,6 +1549,11 @@ Optional Features: separately --disable-load-extension Disable loading of external extensions + --enable-fts3 Enable the FTS3 extension + --enable-fts4 Enable the FTS4 extension + --enable-fts5 Enable the FTS5 extension + --enable-json1 Enable the JSON1 extension + --enable-rtree Enable the RTREE extension --enable-gcov Enable coverage testing using gcov Optional Packages: @@ -3911,13 +3921,13 @@ if ${lt_cv_nm_interface+:} false; then : else lt_cv_nm_interface="BSD nm" echo "int some_variable = 0;" > conftest.$ac_ext - (eval echo "\"\$as_me:3914: $ac_compile\"" >&5) + (eval echo "\"\$as_me:3924: $ac_compile\"" >&5) (eval "$ac_compile" 2>conftest.err) cat conftest.err >&5 - (eval echo "\"\$as_me:3917: $NM \\\"conftest.$ac_objext\\\"\"" >&5) + (eval echo "\"\$as_me:3927: $NM \\\"conftest.$ac_objext\\\"\"" >&5) (eval "$NM \"conftest.$ac_objext\"" 2>conftest.err > conftest.out) cat conftest.err >&5 - (eval echo "\"\$as_me:3920: output\"" >&5) + (eval echo "\"\$as_me:3930: output\"" >&5) cat conftest.out >&5 if $GREP 'External.*some_variable' conftest.out > /dev/null; then lt_cv_nm_interface="MS dumpbin" @@ -5123,7 +5133,7 @@ ia64-*-hpux*) ;; *-*-irix6*) # Find out which ABI we are using. - echo '#line 5126 "configure"' > conftest.$ac_ext + echo '#line 5136 "configure"' > conftest.$ac_ext if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5 (eval $ac_compile) 2>&5 ac_status=$? @@ -6648,11 +6658,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:6651: $lt_compile\"" >&5) + (eval echo "\"\$as_me:6661: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:6655: \$? = $ac_status" >&5 + echo "$as_me:6665: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -6987,11 +6997,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:6990: $lt_compile\"" >&5) + (eval echo "\"\$as_me:7000: $lt_compile\"" >&5) (eval "$lt_compile" 2>conftest.err) ac_status=$? cat conftest.err >&5 - echo "$as_me:6994: \$? = $ac_status" >&5 + echo "$as_me:7004: \$? = $ac_status" >&5 if (exit $ac_status) && test -s "$ac_outfile"; then # The compiler can only warn and ignore the option if not recognized # So say no if there are warnings other than the usual output. @@ -7092,11 +7102,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:7095: $lt_compile\"" >&5) + (eval echo "\"\$as_me:7105: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:7099: \$? = $ac_status" >&5 + echo "$as_me:7109: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -7147,11 +7157,11 @@ else -e 's:.*FLAGS}\{0,1\} :&$lt_compiler_flag :; t' \ -e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \ -e 's:$: $lt_compiler_flag:'` - (eval echo "\"\$as_me:7150: $lt_compile\"" >&5) + (eval echo "\"\$as_me:7160: $lt_compile\"" >&5) (eval "$lt_compile" 2>out/conftest.err) ac_status=$? cat out/conftest.err >&5 - echo "$as_me:7154: \$? = $ac_status" >&5 + echo "$as_me:7164: \$? = $ac_status" >&5 if (exit $ac_status) && test -s out/conftest2.$ac_objext then # The compiler can only warn and ignore the option if not recognized @@ -9527,7 +9537,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 9530 "configure" +#line 9540 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -9623,7 +9633,7 @@ else lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 lt_status=$lt_dlunknown cat > conftest.$ac_ext <<_LT_EOF -#line 9626 "configure" +#line 9636 "configure" #include "confdefs.h" #if HAVE_DLFCN_H @@ -11223,6 +11233,177 @@ else OPT_FEATURE_FLAGS="-DSQLITE_OMIT_LOAD_EXTENSION=1" fi +######### +# See whether we should enable Full Text Search extensions +# Check whether --enable-fts3 was given. +if test "${enable_fts3+set}" = set; then : + enableval=$enable_fts3; enable_fts3=yes +else + enable_fts3=no +fi + +if test "${enable_fts3}" = "yes" ; then + OPT_FEATURE_FLAGS+=" -DSQLITE_ENABLE_FTS3" +fi +# Check whether --enable-fts4 was given. +if test "${enable_fts4+set}" = set; then : + enableval=$enable_fts4; enable_fts4=yes +else + enable_fts4=no +fi + +if test "${enable_fts4}" = "yes" ; then + OPT_FEATURE_FLAGS+=" -DSQLITE_ENABLE_FTS4" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing log" >&5 +$as_echo_n "checking for library containing log... " >&6; } +if ${ac_cv_search_log+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char log (); +int +main () +{ +return log (); + ; + return 0; +} +_ACEOF +for ac_lib in '' m; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_log=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_log+:} false; then : + break +fi +done +if ${ac_cv_search_log+:} false; then : + +else + ac_cv_search_log=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_log" >&5 +$as_echo "$ac_cv_search_log" >&6; } +ac_res=$ac_cv_search_log +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +fi +# Check whether --enable-fts5 was given. +if test "${enable_fts5+set}" = set; then : + enableval=$enable_fts5; enable_fts5=yes +else + enable_fts5=no +fi + +if test "${enable_fts5}" = "yes" ; then + OPT_FEATURE_FLAGS+=" -DSQLITE_ENABLE_FTS5" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing log" >&5 +$as_echo_n "checking for library containing log... " >&6; } +if ${ac_cv_search_log+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char log (); +int +main () +{ +return log (); + ; + return 0; +} +_ACEOF +for ac_lib in '' m; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_log=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_log+:} false; then : + break +fi +done +if ${ac_cv_search_log+:} false; then : + +else + ac_cv_search_log=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_log" >&5 +$as_echo "$ac_cv_search_log" >&6; } +ac_res=$ac_cv_search_log +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + +fi + +######### +# See whether we should enable JSON1 +# Check whether --enable-json1 was given. +if test "${enable_json1+set}" = set; then : + enableval=$enable_json1; enable_json1=yes +else + enable_json1=no +fi + +if test "${enable_json1}" = "yes" ; then + OPT_FEATURE_FLAGS+=" -DSQLITE_ENABLE_JSON1" +fi + +######### +# See whether we should enable RTREE +# Check whether --enable-rtree was given. +if test "${enable_rtree+set}" = set; then : + enableval=$enable_rtree; enable_rtree=yes +else + enable_rtree=no +fi + +if test "${enable_rtree}" = "yes" ; then + OPT_FEATURE_FLAGS+=" -DSQLITE_ENABLE_RTREE" +fi + ######### # attempt to duplicate any OMITS and ENABLES into the $(OPT_FEATURE_FLAGS) parameter for option in $CFLAGS $CPPFLAGS diff --git a/configure.ac b/configure.ac index 92d9b47b39..8fb9449bd5 100644 --- a/configure.ac +++ b/configure.ac @@ -560,6 +560,47 @@ else OPT_FEATURE_FLAGS="-DSQLITE_OMIT_LOAD_EXTENSION=1" fi +######### +# See whether we should enable Full Text Search extensions +AC_ARG_ENABLE(fts3, AC_HELP_STRING([--enable-fts3], + [Enable the FTS3 extension]), + [enable_fts3=yes],[enable_fts3=no]) +if test "${enable_fts3}" = "yes" ; then + OPT_FEATURE_FLAGS+=" -DSQLITE_ENABLE_FTS3" +fi +AC_ARG_ENABLE(fts4, AC_HELP_STRING([--enable-fts4], + [Enable the FTS4 extension]), + [enable_fts4=yes],[enable_fts4=no]) +if test "${enable_fts4}" = "yes" ; then + OPT_FEATURE_FLAGS+=" -DSQLITE_ENABLE_FTS4" + AC_SEARCH_LIBS([log],[m]) +fi +AC_ARG_ENABLE(fts5, AC_HELP_STRING([--enable-fts5], + [Enable the FTS5 extension]), + [enable_fts5=yes],[enable_fts5=no]) +if test "${enable_fts5}" = "yes" ; then + OPT_FEATURE_FLAGS+=" -DSQLITE_ENABLE_FTS5" + AC_SEARCH_LIBS([log],[m]) +fi + +######### +# See whether we should enable JSON1 +AC_ARG_ENABLE(json1, AC_HELP_STRING([--enable-json1], + [Enable the JSON1 extension]), + [enable_json1=yes],[enable_json1=no]) +if test "${enable_json1}" = "yes" ; then + OPT_FEATURE_FLAGS+=" -DSQLITE_ENABLE_JSON1" +fi + +######### +# See whether we should enable RTREE +AC_ARG_ENABLE(rtree, AC_HELP_STRING([--enable-rtree], + [Enable the RTREE extension]), + [enable_rtree=yes],[enable_rtree=no]) +if test "${enable_rtree}" = "yes" ; then + OPT_FEATURE_FLAGS+=" -DSQLITE_ENABLE_RTREE" +fi + ######### # attempt to duplicate any OMITS and ENABLES into the $(OPT_FEATURE_FLAGS) parameter for option in $CFLAGS $CPPFLAGS diff --git a/manifest b/manifest index 1e1981c630..4e165c5ce8 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Makefile\sand\sfts5\schanges\sso\sthat\sfts5\sworks\swith\smain.mk.\sStill\sdoes\snot\swork\swith\sMakefile.in. -D 2015-10-09T11:09:47.175 +C Add\sconfigure\sscript\soptions\s--enable-fts5\sand\s--enable-json1.\s\sAutomatically\nsearch\sfor\s-lm\swhen\susing\s--enable-fts5. +D 2015-10-09T12:48:33.545 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f0088ff0d2ac949fce6de7c00f13a99ac5bdb663 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -38,8 +38,8 @@ F autoconf/tea/win/rules.vc c511f222b80064096b705dbeb97060ee1d6b6d63 F config.guess 226d9a188c6196f3033ffc651cbc9dcee1a42977 F config.h.in 42b71ad3fe21c9e88fa59e8458ca1a6bc72eb0c0 F config.sub 9ebe4c3b3dab6431ece34f16828b594fb420da55 -F configure 2f61915a1bdfbc589244334401cf97d3401e6a39 x -F configure.ac 713de38000413e469188db2cb85bed759b56f322 +F configure 6c28beb2c5adfea004c7eb0dc615ce5ebaca67ee x +F configure.ac 1e87304e51af110950c48a1eea6ffc7a577f600e F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad F doc/lemon.html 334dbf6621b8fb8790297ec1abf3cfa4621709d1 F doc/pager-invariants.txt 27fed9a70ddad2088750c4a2b493b63853da2710 @@ -947,7 +947,7 @@ F test/rbu.test 168573d353cd0fd10196b87b0caa322c144ef736 F test/rdonly.test 64e2696c322e3538df0b1ed624e21f9a23ed9ff8 F test/regexp1.test 497ea812f264d12b6198d6e50a76be4a1973a9d8 F test/reindex.test 44edd3966b474468b823d481eafef0c305022254 -F test/releasetest.tcl 97e4e5ca5925b21ef470b3c97d4c46dd063cfec4 +F test/releasetest.tcl f52239d28ed829ca7979617845a442d2d1b08aaa F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb F test/rollback.test 458fe73eb3ffdfdf9f6ba3e9b7350a6220414dea F test/rollback2.test fc14cf6d1a2b250d2735ef16124b971bce152f14 @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 206174f9b154c590a3e2e94236db38e111d64bdb -R 7677b595a4a025d5b5c3743b20676b45 -U dan -Z 2d1f0773394fa57beba698d5cfa49140 +P 6ebac32d8378e46f44a6eb55aaa30baf4d7dde7d +R 15162ca8241950d9040673fb4e5f94d0 +U drh +Z 8ecad2a04d12126eee50b9755a0e6c68 diff --git a/manifest.uuid b/manifest.uuid index 1147fff002..1b4a81fd0c 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6ebac32d8378e46f44a6eb55aaa30baf4d7dde7d \ No newline at end of file +a0c44f1d46f1f31043d66f20c8dc0df53db15c30 \ No newline at end of file diff --git a/test/releasetest.tcl b/test/releasetest.tcl index ef29a0d945..c6ad2f4c04 100644 --- a/test/releasetest.tcl +++ b/test/releasetest.tcl @@ -78,6 +78,7 @@ array set ::Configs [strip_comments { -DSQLITE_DEFAULT_FILE_FORMAT=4 -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT=1 -DSQLITE_ENABLE_STMT_SCANSTATUS + --enable-json1 } "Check-Symbols" { -DSQLITE_MEMDEBUG=1 @@ -95,6 +96,7 @@ array set ::Configs [strip_comments { -DSQLITE_ENABLE_OVERSIZE_CELL_CHECK=1 -DSQLITE_ENABLE_STAT4 -DSQLITE_ENABLE_STMT_SCANSTATUS + --enable-json1 --enable-fts5 } "Debug-One" { --disable-shared @@ -129,13 +131,13 @@ array set ::Configs [strip_comments { -DSQLITE_DISABLE_LFS=1 -DSQLITE_ENABLE_ATOMIC_WRITE=1 -DSQLITE_ENABLE_IOTRACE=1 - -DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1 -DSQLITE_MAX_PAGE_SIZE=4096 -DSQLITE_OMIT_LOAD_EXTENSION=1 -DSQLITE_OMIT_PROGRESS_CALLBACK=1 -DSQLITE_OMIT_VIRTUALTABLE=1 -DSQLITE_TEMP_STORE=3 + --enable-json1 --enable-fts5 } "Device-Two" { -DSQLITE_4_BYTE_ALIGNED_MALLOC=1 @@ -146,7 +148,6 @@ array set ::Configs [strip_comments { -DSQLITE_DEFAULT_TEMP_CACHE_SIZE=1000 -DSQLITE_DISABLE_LFS=1 -DSQLITE_ENABLE_FTS3=1 - -DSQLITE_ENABLE_JSON1=1 -DSQLITE_ENABLE_MEMORY_MANAGEMENT=1 -DSQLITE_ENABLE_RTREE=1 -DSQLITE_MAX_COMPOUND_SELECT=50 @@ -154,6 +155,7 @@ array set ::Configs [strip_comments { -DSQLITE_OMIT_TRACE=1 -DSQLITE_TEMP_STORE=3 -DSQLITE_THREADSAFE=2 + --enable-json1 --enable-fts5 } "Locking-Style" { -O2 @@ -177,6 +179,7 @@ array set ::Configs [strip_comments { -DSQLITE_DEBUG=1 -DSQLITE_PREFER_PROXY_LOCKING=1 -DSQLITE_ENABLE_API_ARMOR=1 + --enable-json1 --enable-fts5 } "Extra-Robustness" { -DSQLITE_ENABLE_OVERSIZE_CELL_CHECK=1 @@ -190,6 +193,7 @@ array set ::Configs [strip_comments { -DSQLITE_ENABLE_FTS4_PARENTHESIS -DSQLITE_DISABLE_FTS4_DEFERRED -DSQLITE_ENABLE_RTREE + --enable-json1 --enable-fts5 } "No-lookaside" { -DSQLITE_TEST_REALLOC_STRESS=1 @@ -200,7 +204,7 @@ array set ::Configs [strip_comments { -DSQLITE_ENABLE_STAT4 -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_RTREE - -DSQLITE_ENABLE_JSON1=1 + --enable-json1 } # The next group of configurations are used only by the From 64db184efa98282a618279331c721681e6cf814d Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 9 Oct 2015 13:29:27 +0000 Subject: [PATCH 67/98] Fix a typo in the MSVC Makefile FossilOrigin-Name: c8a12082380991781b5ecd2f479ec65600f4f695 --- Makefile.msc | 2 +- manifest | 14 +++++++------- manifest.uuid | 2 +- test/releasetest.tcl | 2 +- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Makefile.msc b/Makefile.msc index 5419071ca9..8e00eb83b1 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -1213,7 +1213,7 @@ FUZZDATA = \ # Extra compiler options for various shell tools # -SHELL_OPT += -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS5 +SHELL_OPT = -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS5 FUZZERSHELL_OPT = -DSQLITE_ENABLE_JSON1 FUZZCHECK_OPT = -DSQLITE_ENABLE_JSON1 diff --git a/manifest b/manifest index 4e165c5ce8..6fc180d764 100644 --- a/manifest +++ b/manifest @@ -1,9 +1,9 @@ -C Add\sconfigure\sscript\soptions\s--enable-fts5\sand\s--enable-json1.\s\sAutomatically\nsearch\sfor\s-lm\swhen\susing\s--enable-fts5. -D 2015-10-09T12:48:33.545 +C Fix\sa\stypo\sin\sthe\sMSVC\sMakefile +D 2015-10-09T13:29:27.852 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f0088ff0d2ac949fce6de7c00f13a99ac5bdb663 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 -F Makefile.msc f95e14e549addbf22304f6c01901b600aea10a6d +F Makefile.msc cc5793c66d1d280d20c5a0652c176e0e115638df F Makefile.vxworks e1b65dea203f054e71653415bd8f96dcaed47858 F README.md 8ecc12493ff9f820cdea6520a9016001cb2e59b7 F VERSION ccfc4d1576dbfdeece0a4372a2e6a2e37d3e7975 @@ -947,7 +947,7 @@ F test/rbu.test 168573d353cd0fd10196b87b0caa322c144ef736 F test/rdonly.test 64e2696c322e3538df0b1ed624e21f9a23ed9ff8 F test/regexp1.test 497ea812f264d12b6198d6e50a76be4a1973a9d8 F test/reindex.test 44edd3966b474468b823d481eafef0c305022254 -F test/releasetest.tcl f52239d28ed829ca7979617845a442d2d1b08aaa +F test/releasetest.tcl 67a82199e6ddee609211488bc04ed3f9ea3aa28a F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb F test/rollback.test 458fe73eb3ffdfdf9f6ba3e9b7350a6220414dea F test/rollback2.test fc14cf6d1a2b250d2735ef16124b971bce152f14 @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 6ebac32d8378e46f44a6eb55aaa30baf4d7dde7d -R 15162ca8241950d9040673fb4e5f94d0 +P a0c44f1d46f1f31043d66f20c8dc0df53db15c30 +R 79fcc81444e121108889bba9b50309d6 U drh -Z 8ecad2a04d12126eee50b9755a0e6c68 +Z 6994955bda3f00155718d20bf831c8ed diff --git a/manifest.uuid b/manifest.uuid index 1b4a81fd0c..e1713c873f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a0c44f1d46f1f31043d66f20c8dc0df53db15c30 \ No newline at end of file +c8a12082380991781b5ecd2f479ec65600f4f695 \ No newline at end of file diff --git a/test/releasetest.tcl b/test/releasetest.tcl index c6ad2f4c04..04c2419ace 100644 --- a/test/releasetest.tcl +++ b/test/releasetest.tcl @@ -137,7 +137,7 @@ array set ::Configs [strip_comments { -DSQLITE_OMIT_PROGRESS_CALLBACK=1 -DSQLITE_OMIT_VIRTUALTABLE=1 -DSQLITE_TEMP_STORE=3 - --enable-json1 --enable-fts5 + --enable-json1 } "Device-Two" { -DSQLITE_4_BYTE_ALIGNED_MALLOC=1 From c4e6d1775ee3eec429b85c3fa5712cd4a1f0c442 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 9 Oct 2015 13:42:52 +0000 Subject: [PATCH 68/98] Change the version number of the next release to 3.9.0. FossilOrigin-Name: aa8fdadf2defed00a28366a3b35a3e2eefecf0ed --- VERSION | 2 +- configure | 18 +++++++++--------- manifest | 15 +++++++-------- manifest.uuid | 2 +- 4 files changed, 18 insertions(+), 19 deletions(-) diff --git a/VERSION b/VERSION index 89a1ad7ad3..a5c4c76339 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.8.12 +3.9.0 diff --git a/configure b/configure index 532e0b202d..67a926ecbb 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for sqlite 3.8.12. +# Generated by GNU Autoconf 2.69 for sqlite 3.9.0. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @@ -726,8 +726,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='sqlite' PACKAGE_TARNAME='sqlite' -PACKAGE_VERSION='3.8.12' -PACKAGE_STRING='sqlite 3.8.12' +PACKAGE_VERSION='3.9.0' +PACKAGE_STRING='sqlite 3.9.0' PACKAGE_BUGREPORT='' PACKAGE_URL='' @@ -1459,7 +1459,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures sqlite 3.8.12 to adapt to many kinds of systems. +\`configure' configures sqlite 3.9.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1524,7 +1524,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of sqlite 3.8.12:";; + short | recursive ) echo "Configuration of sqlite 3.9.0:";; esac cat <<\_ACEOF @@ -1644,7 +1644,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -sqlite configure 3.8.12 +sqlite configure 3.9.0 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2063,7 +2063,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by sqlite $as_me 3.8.12, which was +It was created by sqlite $as_me 3.9.0, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -11989,7 +11989,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by sqlite $as_me 3.8.12, which was +This file was extended by sqlite $as_me 3.9.0, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -12055,7 +12055,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -sqlite config.status 3.8.12 +sqlite config.status 3.9.0 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/manifest b/manifest index a156fd5c23..b99d30edbf 100644 --- a/manifest +++ b/manifest @@ -1,12 +1,12 @@ -C Add\sthe\sJSON1\sand\sFTS5\sextensions\sto\sthe\samalgamation.\s\sAdd\snew\soptions\nto\s./configure:\s--enable-json1\sand\s--enable-fts5. -D 2015-10-09T13:39:51.526 +C Change\sthe\sversion\snumber\sof\sthe\snext\srelease\sto\s3.9.0. +D 2015-10-09T13:42:52.722 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f0088ff0d2ac949fce6de7c00f13a99ac5bdb663 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 F Makefile.msc cc5793c66d1d280d20c5a0652c176e0e115638df F Makefile.vxworks e1b65dea203f054e71653415bd8f96dcaed47858 F README.md 8ecc12493ff9f820cdea6520a9016001cb2e59b7 -F VERSION ccfc4d1576dbfdeece0a4372a2e6a2e37d3e7975 +F VERSION cacf16a72f9a03cd06b939a764e32f6f53254c7f F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 F addopcodes.awk 9eb448a552d5c0185cf62c463f9c173cedae3811 F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 @@ -38,7 +38,7 @@ F autoconf/tea/win/rules.vc c511f222b80064096b705dbeb97060ee1d6b6d63 F config.guess 226d9a188c6196f3033ffc651cbc9dcee1a42977 F config.h.in 42b71ad3fe21c9e88fa59e8458ca1a6bc72eb0c0 F config.sub 9ebe4c3b3dab6431ece34f16828b594fb420da55 -F configure 6c28beb2c5adfea004c7eb0dc615ce5ebaca67ee x +F configure 4561c28dbc22bd5c678e3d5dc631cf7ee7e78efb x F configure.ac 1e87304e51af110950c48a1eea6ffc7a577f600e F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad F doc/lemon.html 334dbf6621b8fb8790297ec1abf3cfa4621709d1 @@ -1390,8 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P df9ef61f1ba2e3a3420fae84e3eaa2e0e235bc28 c8a12082380991781b5ecd2f479ec65600f4f695 -R ff35e33c45066b639f8723b72567b740 -T +closed c8a12082380991781b5ecd2f479ec65600f4f695 +P 1eb769933108cf401b25c8d784ea23f27324a0bd +R cd6778cbc7950f234a6f4e35497db7c8 U drh -Z 9e03a387129508847442535127adeb67 +Z 1e0fc771971e482332435479dc5f8b1d diff --git a/manifest.uuid b/manifest.uuid index c12eaca407..74c82ba483 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1eb769933108cf401b25c8d784ea23f27324a0bd \ No newline at end of file +aa8fdadf2defed00a28366a3b35a3e2eefecf0ed \ No newline at end of file From 8381be4ace3abe03bfb5a6ef501f25426b41dab2 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Fri, 9 Oct 2015 14:23:56 +0000 Subject: [PATCH 69/98] In the MSVC makefile, adjust the names of two nmake variables for consistency. FossilOrigin-Name: 92aa4b6b6fbb83f965e4c4be0aa21a8b7e330ed8 --- Makefile.msc | 18 +++++++++--------- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Makefile.msc b/Makefile.msc index 8e00eb83b1..b486c8b8d1 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -388,11 +388,11 @@ CORE_LINK_OPTS = /DEF:sqlite3.def # These are additional compiler options used for the shell executable. # -!IFNDEF SHELL_OPT +!IFNDEF SHELL_COMPILE_OPTS !IF $(DYNAMIC_SHELL)!=0 -SHELL_OPT = -DSQLITE_SHELL_JSON1 $(SHELL_CCONV_OPTS) -DSQLITE_API=__declspec(dllimport) +SHELL_COMPILE_OPTS = -DSQLITE_SHELL_JSON1 $(SHELL_CCONV_OPTS) -DSQLITE_API=__declspec(dllimport) !ELSE -SHELL_OPT = -DSQLITE_SHELL_JSON1 $(SHELL_CCONV_OPTS) +SHELL_COMPILE_OPTS = -DSQLITE_SHELL_JSON1 $(SHELL_CCONV_OPTS) !ENDIF !ENDIF @@ -1213,9 +1213,9 @@ FUZZDATA = \ # Extra compiler options for various shell tools # -SHELL_OPT = -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS5 -FUZZERSHELL_OPT = -DSQLITE_ENABLE_JSON1 -FUZZCHECK_OPT = -DSQLITE_ENABLE_JSON1 +SHELL_COMPILE_OPTS = -DSQLITE_ENABLE_FTS4 -DSQLITE_ENABLE_FTS5 +FUZZERSHELL_COMPILE_OPTS = -DSQLITE_ENABLE_JSON1 +FUZZCHECK_COMPILE_OPTS = -DSQLITE_ENABLE_JSON1 # Standard options to testfixture # @@ -1233,18 +1233,18 @@ libtclsqlite3.lib: tclsqlite.lo libsqlite3.lib $(LTLIB) $(LTLIBOPTS) $(LTLIBPATHS) /OUT:$@ tclsqlite.lo libsqlite3.lib $(LIBTCL:tcl=tclstub) $(TLIBS) sqlite3.exe: $(TOP)\src\shell.c $(SHELL_CORE_DEP) $(LIBRESOBJS) sqlite3.h - $(LTLINK) $(SHELL_COMPILE_OPTS) $(SHELL_OPT) $(READLINE_FLAGS) $(TOP)\src\shell.c \ + $(LTLINK) $(SHELL_COMPILE_OPTS) $(SHELL_COMPILE_OPTS) $(READLINE_FLAGS) $(TOP)\src\shell.c \ /link /pdb:sqlite3sh.pdb $(LTLINKOPTS) $(SHELL_LINK_OPTS) $(LTLIBPATHS) $(LIBRESOBJS) $(LIBREADLINE) $(LTLIBS) $(TLIBS) sqldiff.exe: $(TOP)\tool\sqldiff.c sqlite3.c sqlite3.h $(LTLINK) $(NO_WARN) $(TOP)\tool\sqldiff.c sqlite3.c fuzzershell.exe: $(TOP)\tool\fuzzershell.c sqlite3.c sqlite3.h - $(LTLINK) $(NO_WARN) $(FUZZERSHELL_OPT) \ + $(LTLINK) $(NO_WARN) $(FUZZERSHELL_COMPILE_OPTS) \ $(TOP)\tool\fuzzershell.c sqlite3.c fuzzcheck.exe: $(TOP)\test\fuzzcheck.c sqlite3.c sqlite3.h - $(LTLINK) $(NO_WARN) $(FUZZCHECK_OPT) $(TOP)\test\fuzzcheck.c sqlite3.c + $(LTLINK) $(NO_WARN) $(FUZZCHECK_COMPILE_OPTS) $(TOP)\test\fuzzcheck.c sqlite3.c mptester.exe: $(TOP)\mptest\mptest.c $(SHELL_CORE_DEP) $(LIBRESOBJS) sqlite3.h $(LTLINK) $(NO_WARN) $(SHELL_COMPILE_OPTS) $(TOP)\mptest\mptest.c \ diff --git a/manifest b/manifest index b99d30edbf..827da675cc 100644 --- a/manifest +++ b/manifest @@ -1,9 +1,9 @@ -C Change\sthe\sversion\snumber\sof\sthe\snext\srelease\sto\s3.9.0. -D 2015-10-09T13:42:52.722 +C In\sthe\sMSVC\smakefile,\sadjust\sthe\snames\sof\stwo\snmake\svariables\sfor\sconsistency. +D 2015-10-09T14:23:56.143 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f0088ff0d2ac949fce6de7c00f13a99ac5bdb663 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 -F Makefile.msc cc5793c66d1d280d20c5a0652c176e0e115638df +F Makefile.msc 0ed934b4ae6a5ec0b9d7e770104864f8372414ab F Makefile.vxworks e1b65dea203f054e71653415bd8f96dcaed47858 F README.md 8ecc12493ff9f820cdea6520a9016001cb2e59b7 F VERSION cacf16a72f9a03cd06b939a764e32f6f53254c7f @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 1eb769933108cf401b25c8d784ea23f27324a0bd -R cd6778cbc7950f234a6f4e35497db7c8 -U drh -Z 1e0fc771971e482332435479dc5f8b1d +P aa8fdadf2defed00a28366a3b35a3e2eefecf0ed +R 67a5030e734fab5c2a42f6160a4ca2ff +U mistachkin +Z a73711c3af55fff2b6c43d8879780308 diff --git a/manifest.uuid b/manifest.uuid index 74c82ba483..e8bf42d480 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -aa8fdadf2defed00a28366a3b35a3e2eefecf0ed \ No newline at end of file +92aa4b6b6fbb83f965e4c4be0aa21a8b7e330ed8 \ No newline at end of file From 2572751be87022f7dcfdfbae8d874e68a1382b66 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 9 Oct 2015 14:37:15 +0000 Subject: [PATCH 70/98] Add --enable-fts5 and --enable-json1 options to the amalgamation autoconf package. FossilOrigin-Name: 8a4e19888f512c3ee95aa3040924fc932fbdab1a --- autoconf/Makefile.am | 2 +- autoconf/configure.ac | 25 +++++++++++++++++++++++++ manifest | 16 ++++++++-------- manifest.uuid | 2 +- 4 files changed, 35 insertions(+), 10 deletions(-) diff --git a/autoconf/Makefile.am b/autoconf/Makefile.am index 60d2ba2673..5b7c4a090a 100644 --- a/autoconf/Makefile.am +++ b/autoconf/Makefile.am @@ -1,5 +1,5 @@ -AM_CFLAGS = @THREADSAFE_FLAGS@ @DYNAMIC_EXTENSION_FLAGS@ -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_RTREE +AM_CFLAGS = @THREADSAFE_FLAGS@ @DYNAMIC_EXTENSION_FLAGS@ @FTS5_FLAGS@ @JSON1_FLAGS@ -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_RTREE lib_LTLIBRARIES = libsqlite3.la libsqlite3_la_SOURCES = sqlite3.c diff --git a/autoconf/configure.ac b/autoconf/configure.ac index 46b6563edc..888b924e40 100644 --- a/autoconf/configure.ac +++ b/autoconf/configure.ac @@ -78,6 +78,31 @@ AC_MSG_RESULT($enable_dynamic_extensions) AC_SUBST(DYNAMIC_EXTENSION_FLAGS) #----------------------------------------------------------------------- +#----------------------------------------------------------------------- +# --enable-fts5 +# +AC_ARG_ENABLE(fts5, [AS_HELP_STRING( + [--enable-fts5], [include fts5 support [default=no]])], + [], [enable_fts5=no]) +if test x"$enable_fts5" == "xyes"; then + AC_SEARCH_LIBS(log, m) + FTS5_FLAGS=-DSQLITE_ENABLE_FTS5 +fi +AC_SUBST(FTS5_FLAGS) +#----------------------------------------------------------------------- + +#----------------------------------------------------------------------- +# --enable-json1 +# +AC_ARG_ENABLE(json1, [AS_HELP_STRING( + [--enable-json1], [include json1 support [default=no]])], + [], [enable_json1=no]) +if test x"$enable_json1" == "xyes"; then + JSON1_FLAGS=-DSQLITE_ENABLE_JSON1 +fi +AC_SUBST(JSON1_FLAGS) +#----------------------------------------------------------------------- + AC_CHECK_FUNCS(posix_fallocate) #----------------------------------------------------------------------- diff --git a/manifest b/manifest index 827da675cc..d0e0f762d0 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sthe\sMSVC\smakefile,\sadjust\sthe\snames\sof\stwo\snmake\svariables\sfor\sconsistency. -D 2015-10-09T14:23:56.143 +C Add\s--enable-fts5\sand\s--enable-json1\soptions\sto\sthe\samalgamation\sautoconf\spackage. +D 2015-10-09T14:37:15.899 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f0088ff0d2ac949fce6de7c00f13a99ac5bdb663 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -13,12 +13,12 @@ F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90 F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2 F autoconf/INSTALL 83e4a25da9fd053c7b3665eaaaf7919707915903 -F autoconf/Makefile.am 27de1af382c82e81f1fe36a7f38528fba004eb1a +F autoconf/Makefile.am bd4a90972aa87f079af6624ddea3df3d58f26d2f F autoconf/README 14458f1046c118efa721aadec5f227e876d3cd38 F autoconf/README.first 6c4f34fe115ff55d4e8dbfa3cecf04a0188292f7 F autoconf/config.guess 94cc57e2a3fdb9c235b362ace86d77e89d188cad x F autoconf/config.sub 1efb390a8fb4bfafd74783a15a8fb5311c84300e x -F autoconf/configure.ac ba3e99ba1a8171d0682b68443517088fc5d6f13a +F autoconf/configure.ac a1fe4eee429fd9d3170be41941514a2b7120ba4e F autoconf/depcomp 0b26f101e3bc9fd1ff0be1da9fb4a82371142f92 x F autoconf/install-sh 06ee6336e63bb845c8439d777c32eb2eccc4fbf1 x F autoconf/ltmain.sh 7a658a24028f02331c1d2446562758083c5eadd1 @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P aa8fdadf2defed00a28366a3b35a3e2eefecf0ed -R 67a5030e734fab5c2a42f6160a4ca2ff -U mistachkin -Z a73711c3af55fff2b6c43d8879780308 +P 92aa4b6b6fbb83f965e4c4be0aa21a8b7e330ed8 +R 22c99efaaba11dba793d1740711eaae0 +U dan +Z b821d121ea8aa17674df3a472339de94 diff --git a/manifest.uuid b/manifest.uuid index e8bf42d480..d20a675956 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -92aa4b6b6fbb83f965e4c4be0aa21a8b7e330ed8 \ No newline at end of file +8a4e19888f512c3ee95aa3040924fc932fbdab1a \ No newline at end of file From 80372ae248897f6c7f2931e3e6933a07a64c1aea Mon Sep 17 00:00:00 2001 From: mistachkin Date: Fri, 9 Oct 2015 17:36:06 +0000 Subject: [PATCH 71/98] Add tool capable of downloading a TclKit (and its associated SDK) on Windows. FossilOrigin-Name: 50673ddaf813335777673fa8585997a7551e5323 --- manifest | 14 +- manifest.uuid | 2 +- tool/GetFile.cs | 450 +++++++++++++++++++++++++++++++++++++++++++++ tool/GetTclKit.bat | 248 +++++++++++++++++++++++++ 4 files changed, 707 insertions(+), 7 deletions(-) create mode 100644 tool/GetFile.cs create mode 100644 tool/GetTclKit.bat diff --git a/manifest b/manifest index e48c25ca0f..f9798bddfc 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Convert\sthe\stool/tostr.awk\sscript\sinto\stool/tostr.tcl.\s\sRemove\stwo\sobsolete\nMakefiles.\s\sPurge\sNAWK\sfrom\sthe\sconfigure\sscript\sand\sfrom\sunix\smakefiles.\nThere\sare\sstill\stwo\suses\sof\sNAWK\sin\sMakefile.msc. -D 2015-10-07T12:36:42.935 +C Add\stool\scapable\sof\sdownloading\sa\sTclKit\s(and\sits\sassociated\sSDK)\son\sWindows. +D 2015-10-09T17:36:06.162 F Makefile.in 2a247c733c2dd6fab703df04dd009b26413956f5 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 17ce18bb7e9ca2ad3abed9b0a1fcbef3fbe8f307 @@ -1331,6 +1331,8 @@ F test/without_rowid6.test 1f99644e6508447fb050f73697350c7ceca3392e F test/wordcount.c 9915e06cb33d8ca8109b8700791afe80d305afda F test/zeroblob.test 3857870fe681b8185654414a9bccfde80b62a0fa F test/zerodamage.test cf6748bad89553cc1632be51a6f54e487e4039ac +F tool/GetFile.cs 963f7064b0b221b08feadb28894c3537916261ac +F tool/GetTclKit.bat 46092b151f7bb4f2a2735dfa1ada09736a4b35a4 F tool/addopcodes.tcl 7cc82ecca456a6b3148abf492b0419b83140881a F tool/build-all-msvc.bat 761d8c82a1a529261291812732a853a1b4256d85 x F tool/build-shell.sh 950f47c6174f1eea171319438b93ba67ff5bf367 @@ -1387,7 +1389,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 8bbf37142ef2759274668f6da114b5c8072e42db -R 07b752064456f02ed0865632d443e697 -U drh -Z 7087d810f3111cb2f52748462bb8f6e3 +P 5b6775215327a89232f5059653747a18e83b8b4b +R 785a6cb71a38ff7702fb9be84ec0066b +U mistachkin +Z 9f18b94f6375bd392631336361a9d038 diff --git a/manifest.uuid b/manifest.uuid index 7f24566eb2..38dfe5be77 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -5b6775215327a89232f5059653747a18e83b8b4b \ No newline at end of file +50673ddaf813335777673fa8585997a7551e5323 \ No newline at end of file diff --git a/tool/GetFile.cs b/tool/GetFile.cs new file mode 100644 index 0000000000..9c489c6738 --- /dev/null +++ b/tool/GetFile.cs @@ -0,0 +1,450 @@ +/* +** 2015 October 7 +** +** 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 contains C# code to download a single file based on a URI. +*/ + +using System; +using System.ComponentModel; +using System.Diagnostics; +using System.IO; +using System.Net; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Threading; + +/////////////////////////////////////////////////////////////////////////////// + +#region Assembly Metadata +[assembly: AssemblyTitle("GetFile Tool")] +[assembly: AssemblyDescription("Download a single file based on a URI.")] +[assembly: AssemblyCompany("SQLite Development Team")] +[assembly: AssemblyProduct("SQLite")] +[assembly: AssemblyCopyright("Public Domain")] +[assembly: ComVisible(false)] +[assembly: Guid("5c4b3728-1693-4a33-a218-8e6973ca15a6")] +[assembly: AssemblyVersion("1.0.*")] + +#if DEBUG +[assembly: AssemblyConfiguration("Debug")] +#else +[assembly: AssemblyConfiguration("Release")] +#endif +#endregion + +/////////////////////////////////////////////////////////////////////////////// + +namespace GetFile +{ + /// + /// This enumeration is used to represent all the possible exit codes from + /// this tool. + /// + internal enum ExitCode + { + /// + /// The file download was a success. + /// + Success = 0, + + /// + /// The command line arguments are missing (i.e. null). Generally, + /// this should not happen. + /// + MissingArgs = 1, + + /// + /// The wrong number of command line arguments was supplied. + /// + WrongNumArgs = 2, + + /// + /// The URI specified on the command line could not be parsed as a + /// supported absolute URI. + /// + BadUri = 3, + + /// + /// The file name portion of the URI specified on the command line + /// could not be extracted from it. + /// + BadFileName = 4, + + /// + /// The temporary directory is either invalid (i.e. null) or does not + /// represent an available directory. + /// + BadTempPath = 5, + + /// + /// An exception was caught in . Generally, this + /// should not happen. + /// + Exception = 6, + + /// + /// The file download was canceled. This tool does not make use of + /// the method; therefore, this + /// should not happen. + /// + DownloadCanceled = 7, + + /// + /// The file download encountered an error. Further information about + /// this error should be displayed on the console. + /// + DownloadError = 8 + } + + /////////////////////////////////////////////////////////////////////////// + + internal static class Program + { + #region Private Data + /// + /// This is used to synchronize multithreaded access to the + /// and + /// fields. + /// + private static readonly object syncRoot = new object(); + + /////////////////////////////////////////////////////////////////////// + + /// + /// This event will be signed when the file download has completed, + /// even if the file download itself was canceled or unsuccessful. + /// + private static EventWaitHandle doneEvent; + + /////////////////////////////////////////////////////////////////////// + + /// + /// The previous file download completion percentage seen by the + /// event handler. This value + /// is never decreased, nor is it ever reset to zero. + /// + private static int previousPercent = 0; + + /////////////////////////////////////////////////////////////////////// + + /// + /// This will be the exit code returned by this tool after the file + /// download completes, successfully or otherwise. This value is only + /// changed by the event handler. + /// + private static ExitCode exitCode = ExitCode.Success; + #endregion + + /////////////////////////////////////////////////////////////////////// + + #region Private Support Methods + /// + /// This method displays an error message to the console and/or + /// displays the command line usage information for this tool. + /// + /// + /// The error message to display, if any. + /// + /// + /// Non-zero to display the command line usage information. + /// + private static void Error( + string message, + bool usage + ) + { + if (message != null) + Console.WriteLine(message); + + string fileName = Path.GetFileName( + Process.GetCurrentProcess().MainModule.FileName); + + Console.WriteLine(String.Format("usage: {0} ", fileName)); + } + + /////////////////////////////////////////////////////////////////////// + + /// + /// This method attempts to determine the file name portion of the + /// specified URI. + /// + /// + /// The URI to process. + /// + /// + /// The file name portion of the specified URI -OR- null if it cannot + /// be determined. + /// + private static string GetFileName( + Uri uri + ) + { + if (uri == null) + return null; + + string pathAndQuery = uri.PathAndQuery; + + if (String.IsNullOrEmpty(pathAndQuery)) + return null; + + int index = pathAndQuery.LastIndexOf('/'); + + if ((index < 0) || (index == pathAndQuery.Length)) + return null; + + return pathAndQuery.Substring(index + 1); + } + #endregion + + /////////////////////////////////////////////////////////////////////// + + #region Private Event Handlers + /// + /// This method is an event handler that is called when the file + /// download completion percentage changes. It will display progress + /// on the console. Special care is taken to make sure that progress + /// events are not displayed out-of-order, even if duplicate and/or + /// out-of-order events are received. + /// + /// + /// The source of the event. + /// + /// + /// Information for the event being processed. + /// + private static void DownloadProgressChanged( + object sender, + DownloadProgressChangedEventArgs e + ) + { + if (e != null) + { + int percent = e.ProgressPercentage; + + lock (syncRoot) + { + if (percent > previousPercent) + { + Console.Write('.'); + + if ((percent % 10) == 0) + Console.Write(" {0}% ", percent); + + previousPercent = percent; + } + } + } + } + + /////////////////////////////////////////////////////////////////////// + + /// + /// This method is an event handler that is called when the file + /// download has completed, successfully or otherwise. It will + /// display the overall result of the file download on the console, + /// including any information, if applicable. + /// The field is changed by this method to + /// indicate the overall result of the file download and the event + /// within the field will be signaled. + /// + /// + /// The source of the event. + /// + /// + /// Information for the event being processed. + /// + private static void DownloadFileCompleted( + object sender, + AsyncCompletedEventArgs e + ) + { + if (e != null) + { + lock (syncRoot) + { + if (previousPercent < 100) + Console.Write(' '); + } + + if (e.Cancelled) + { + Console.WriteLine("Canceled"); + + lock (syncRoot) + { + exitCode = ExitCode.DownloadCanceled; + } + } + else + { + Exception error = e.Error; + + if (error != null) + { + Console.WriteLine("Error: {0}", error); + + lock (syncRoot) + { + exitCode = ExitCode.DownloadError; + } + } + else + { + Console.WriteLine("Done"); + } + } + } + + if (doneEvent != null) + doneEvent.Set(); + } + #endregion + + /////////////////////////////////////////////////////////////////////// + + #region Program Entry Point + /// + /// This is the entry-point for this tool. It handles processing the + /// command line arguments, setting up the web client, downloading the + /// file, and saving it to the file system. + /// + /// + /// The command line arguments. + /// + /// + /// Zero upon success; non-zero on failure. This will be one of the + /// values from the enumeration. + /// + private static int Main( + string[] args + ) + { + // + // NOTE: Sanity check the command line arguments. + // + if (args == null) + { + Error(null, true); + return (int)ExitCode.MissingArgs; + } + + if (args.Length != 1) + { + Error(null, true); + return (int)ExitCode.WrongNumArgs; + } + + // + // NOTE: Attempt to convert the first (and only) command line + // argument to an absolute URI. + // + Uri uri; + + if (!Uri.TryCreate(args[0], UriKind.Absolute, out uri)) + { + Error("First argument is not an absolute URI.", false); + return (int)ExitCode.BadUri; + } + + // + // NOTE: Attempt to extract the file name portion of the URI we + // just created. + // + string fileName = GetFileName(uri); + + if (fileName == null) + { + Error("Could not extract the file name from the URI.", false); + return (int)ExitCode.BadFileName; + } + + // + // NOTE: Grab the temporary path setup for this process. If it is + // unavailable, we will not continue. + // + string directory = Path.GetTempPath(); + + if (String.IsNullOrEmpty(directory) || + !Directory.Exists(directory)) + { + Error("Temporary directory is invalid or unavailable.", false); + return (int)ExitCode.BadTempPath; + } + + try + { + using (WebClient webClient = new WebClient()) + { + // + // NOTE: Create the event used to signal completion of the + // file download. + // + doneEvent = new ManualResetEvent(false); + + // + // NOTE: Hookup the event handlers we care about on the web + // client. These are necessary because the file is + // downloaded asynchronously. + // + webClient.DownloadProgressChanged += + new DownloadProgressChangedEventHandler( + DownloadProgressChanged); + + webClient.DownloadFileCompleted += + new AsyncCompletedEventHandler( + DownloadFileCompleted); + + // + // NOTE: Build the fully qualified path and file name, + // within the temporary directory, where the file to + // be downloaded will be saved. + // + fileName = Path.Combine(directory, fileName); + + // + // NOTE: If the file name already exists (in the temporary) + // directory, delete it. + // + // TODO: Perhaps an error should be raised here instead? + // + if (File.Exists(fileName)) + File.Delete(fileName); + + // + // NOTE: After kicking off the asynchronous file download + // process, wait [forever] until the "done" event is + // signaled. + // + Console.WriteLine( + "Downloading \"{0}\" to \"{1}\"...", uri, fileName); + + webClient.DownloadFileAsync(uri, fileName); + doneEvent.WaitOne(); + } + + lock (syncRoot) + { + return (int)exitCode; + } + } + catch (Exception e) + { + // + // NOTE: An exception was caught. Report it via the console + // and return failure. + // + Error(e.ToString(), false); + return (int)ExitCode.Exception; + } + } + #endregion + } +} diff --git a/tool/GetTclKit.bat b/tool/GetTclKit.bat new file mode 100644 index 0000000000..25ee5a5590 --- /dev/null +++ b/tool/GetTclKit.bat @@ -0,0 +1,248 @@ +@ECHO OFF + +:: +:: GetTclKit.bat -- +:: +:: TclKit Download Tool +:: + +SETLOCAL + +REM SET __ECHO=ECHO +REM SET __ECHO2=ECHO +REM SET __ECHO3=ECHO +IF NOT DEFINED _AECHO (SET _AECHO=REM) +IF NOT DEFINED _CECHO (SET _CECHO=REM) +IF NOT DEFINED _VECHO (SET _VECHO=REM) + +SET OVERWRITE=^> +IF DEFINED __ECHO SET OVERWRITE=^^^> + +SET APPEND=^>^> +IF DEFINED __ECHO SET APPEND=^^^>^^^> + +SET PROCESSOR=%1 + +IF DEFINED PROCESSOR ( + CALL :fn_UnquoteVariable PROCESSOR +) ELSE ( + GOTO usage +) + +%_VECHO% Processor = '%PROCESSOR%' + +SET DUMMY2=%2 + +IF DEFINED DUMMY2 ( + GOTO usage +) + +SET ROOT=%~dp0\.. +SET ROOT=%ROOT:\\=\% + +%_VECHO% Root = '%ROOT%' + +SET TOOLS=%~dp0 +SET TOOLS=%TOOLS:~0,-1% + +%_VECHO% Tools = '%TOOLS%' + +IF NOT DEFINED windir ( + ECHO The windir environment variable must be set first. + GOTO errors +) + +%_VECHO% WinDir = '%windir%' + +IF NOT DEFINED TEMP ( + ECHO The TEMP environment variable must be set first. + GOTO errors +) + +%_VECHO% Temp = '%TEMP%' + +SET TCLKIT_URI=http://tclsh.com/ + +%_VECHO% TclKitUri = '%TCLKIT_URI%' + +IF /I "%PROCESSOR%" == "x86" ( + CALL :fn_TclKitX86Variables +) ELSE IF /I "%PROCESSOR%" == "x64" ( + CALL :fn_TclKitX64Variables +) ELSE ( + GOTO usage +) + +%_VECHO% TclKitPatchLevel = '%TCLKIT_PATCHLEVEL%' +%_VECHO% TclKitNoSdk = '%TCLKIT_NOSDK%' +%_VECHO% TclKitExe = '%TCLKIT_EXE%' +%_VECHO% TclKitLib = '%TCLKIT_LIB%' +%_VECHO% TclKitSdk = '%TCLKIT_SDK%' +%_VECHO% TclKitSdkZip = '%TCLKIT_SDK_ZIP%' +%_VECHO% TclKitFiles = '%TCLKIT_FILES%' + +CALL :fn_ResetErrorLevel + +FOR %%T IN (csc.exe) DO ( + SET %%T_PATH=%%~dp$PATH:T +) + +%_VECHO% Csc.exe_PATH = '%csc.exe_PATH%' + +IF DEFINED csc.exe_PATH ( + GOTO skip_addToPath +) + +IF DEFINED FRAMEWORKDIR ( + REM Use the existing .NET Framework directory... +) ELSE IF EXIST "%windir%\Microsoft.NET\Framework64\v2.0.50727" ( + SET FRAMEWORKDIR=%windir%\Microsoft.NET\Framework64\v2.0.50727 +) ELSE IF EXIST "%windir%\Microsoft.NET\Framework64\v3.5" ( + SET FRAMEWORKDIR=%windir%\Microsoft.NET\Framework64\v3.5 +) ELSE IF EXIST "%windir%\Microsoft.NET\Framework64\v4.0.30319" ( + SET FRAMEWORKDIR=%windir%\Microsoft.NET\Framework64\v4.0.30319 +) ELSE IF EXIST "%windir%\Microsoft.NET\Framework\v2.0.50727" ( + SET FRAMEWORKDIR=%windir%\Microsoft.NET\Framework\v2.0.50727 +) ELSE IF EXIST "%windir%\Microsoft.NET\Framework\v3.5" ( + SET FRAMEWORKDIR=%windir%\Microsoft.NET\Framework\v3.5 +) ELSE IF EXIST "%windir%\Microsoft.NET\Framework\v4.0.30319" ( + SET FRAMEWORKDIR=%windir%\Microsoft.NET\Framework\v4.0.30319 +) ELSE ( + ECHO No suitable version of the .NET Framework appears to be installed. + GOTO errors +) + +%_VECHO% FrameworkDir = '%FRAMEWORKDIR%' + +IF NOT EXIST "%FRAMEWORKDIR%\csc.exe" ( + ECHO The file "%FRAMEWORKDIR%\csc.exe" is missing. + GOTO errors +) + +SET PATH=%FRAMEWORKDIR%;%PATH% + +:skip_addToPath + +%__ECHO% csc.exe "/out:%TEMP%\GetFile.exe" /target:exe "%TOOLS%\GetFile.cs" + +IF ERRORLEVEL 1 ( + ECHO Compilation of "%TOOLS%\GetFile.cs" failed. + GOTO errors +) + +FOR %%F IN (%TCLKIT_FILES%) DO ( + IF NOT EXIST "%%F" ( + %__ECHO% "%TEMP%\GetFile.exe" "%TCLKIT_URI%%%F" + + IF ERRORLEVEL 1 ( + ECHO Download of "%%F" from "%TCLKIT_URI%" failed. + GOTO errors + ) + ) +) + +IF DEFINED TCLKIT_NOSDK GOTO skip_sdkUnZip + +IF NOT EXIST "%TEMP%\%TCLKIT_SDK%" ( + %__ECHO% MKDIR "%TEMP%\%TCLKIT_SDK%" + + IF ERRORLEVEL 1 ( + ECHO Could not create directory "%TEMP%\%TCLKIT_SDK%". + GOTO errors + ) +) + +%__ECHO% "%TEMP%\unzip.exe" -o "%TEMP%\%TCLKIT_SDK_ZIP%" -d "%TEMP%\%TCLKIT_SDK%" + +IF ERRORLEVEL 1 ( + ECHO Could not unzip "%TEMP%\%TCLKIT_SDK_ZIP%" to "%TEMP%\%TCLKIT_SDK%". + GOTO errors +) + +:skip_sdkUnZip + +%__ECHO% ECHO SET TCLSH_CMD=%TEMP%\%TCLKIT_EXE%%OVERWRITE%"%ROOT%\SetTclKitEnv.bat" + +IF DEFINED TCLKIT_NOSDK GOTO skip_sdkVariables + +%__ECHO% ECHO SET TCLINCDIR=%TEMP%\%TCLKIT_SDK%\include%APPEND%"%ROOT%\SetTclKitEnv.bat" +%__ECHO% ECHO SET TCLLIBDIR=%TEMP%\%TCLKIT_SDK%\lib%APPEND%"%ROOT%\SetTclKitEnv.bat" +%__ECHO% ECHO SET LIBTCL=%TCLKIT_LIB%%APPEND%"%ROOT%\SetTclKitEnv.bat" + +:skip_sdkVariables + +GOTO no_errors + +:fn_TclKitX86Variables + IF NOT DEFINED TCLKIT_PATCHLEVEL ( + SET TCLKIT_PATCHLEVEL=8.6.4 + ) + SET TCLKIT_EXE=tclkit-%TCLKIT_PATCHLEVEL%.exe + SET TCLKIT_LIB=libtclkit%TCLKIT_PATCHLEVEL:.=%.lib + SET TCLKIT_SDK=libtclkit-sdk-x86-%TCLKIT_PATCHLEVEL% + SET TCLKIT_SDK_ZIP=%TCLKIT_SDK%.zip + SET TCLKIT_FILES=%TCLKIT_EXE% unzip.exe %TCLKIT_SDK_ZIP% + GOTO :EOF + +:fn_TclKitX64Variables + IF NOT DEFINED TCLKIT_PATCHLEVEL ( + REM + REM NOTE: By default, use latest available version of the TclKit SDK + REM for x64. However, the "default" TclKit executable for x86 + REM is still used here because it is the only one "well-known" + REM to be available for download. + REM + SET TCLKIT_PATCHLEVEL=8.6.3 + SET TCLKIT_EXE=tclkit-8.6.4.exe + ) ELSE ( + SET TCLKIT_EXE=tclkit-%TCLKIT_PATCHLEVEL%.exe + ) + SET TCLKIT_LIB=libtclkit%TCLKIT_PATCHLEVEL:.=%.lib + SET TCLKIT_SDK=libtclkit-sdk-x64-%TCLKIT_PATCHLEVEL% + SET TCLKIT_SDK_ZIP=%TCLKIT_SDK%.zip + SET TCLKIT_FILES=%TCLKIT_EXE% unzip.exe %TCLKIT_SDK_ZIP% + GOTO :EOF + +:fn_UnquoteVariable + IF NOT DEFINED %1 GOTO :EOF + SETLOCAL + SET __ECHO_CMD=ECHO %%%1%% + FOR /F "delims=" %%V IN ('%__ECHO_CMD%') DO ( + SET VALUE=%%V + ) + SET VALUE=%VALUE:"=% + REM " + ENDLOCAL && SET %1=%VALUE% + GOTO :EOF + +:fn_ResetErrorLevel + VERIFY > NUL + GOTO :EOF + +:fn_SetErrorLevel + VERIFY MAYBE 2> NUL + GOTO :EOF + +:usage + ECHO. + ECHO Usage: %~nx0 ^ + ECHO. + ECHO The only supported values for processor are "x86" and "x64". + GOTO errors + +:errors + CALL :fn_SetErrorLevel + ENDLOCAL + ECHO. + ECHO Failure, errors were encountered. + GOTO end_of_file + +:no_errors + CALL :fn_ResetErrorLevel + ENDLOCAL + ECHO. + ECHO Success, no errors were encountered. + GOTO end_of_file + +:end_of_file +%__ECHO% EXIT /B %ERRORLEVEL% From 6cac258245624d7392c900dae57f9450b208b628 Mon Sep 17 00:00:00 2001 From: dan Date: Fri, 9 Oct 2015 17:54:10 +0000 Subject: [PATCH 72/98] Remove fts5 sources from TESTSRC2 in main.mk as there is no SQLITE_TEST code in said files. FossilOrigin-Name: c1840639b8ce8314602cd2396a324de8fac98dbe --- main.mk | 3 +-- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/main.mk b/main.mk index 66068f668c..c941f93be3 100644 --- a/main.mk +++ b/main.mk @@ -382,8 +382,7 @@ TESTSRC2 = \ $(TOP)/ext/fts3/fts3_expr.c \ $(TOP)/ext/fts3/fts3_tokenizer.c \ $(TOP)/ext/fts3/fts3_write.c \ - $(TOP)/ext/async/sqlite3async.c \ - $(FTS5_SRC) + $(TOP)/ext/async/sqlite3async.c # Header files used by all library source files. # diff --git a/manifest b/manifest index d0e0f762d0..d0a55d2359 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\s--enable-fts5\sand\s--enable-json1\soptions\sto\sthe\samalgamation\sautoconf\spackage. -D 2015-10-09T14:37:15.899 +C Remove\sfts5\ssources\sfrom\sTESTSRC2\sin\smain.mk\sas\sthere\sis\sno\sSQLITE_TEST\scode\sin\ssaid\sfiles. +D 2015-10-09T17:54:10.922 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f0088ff0d2ac949fce6de7c00f13a99ac5bdb663 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -264,7 +264,7 @@ F ext/userauth/userauth.c 5fa3bdb492f481bbc1709fc83c91ebd13460c69e F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk 784763e87a5080abc749d6263198bbe5aa93fd20 +F main.mk 645d30a780fb304cf7fa79537b78728e32dd46fc F mkopcodec.awk c2ff431854d702cdd2d779c9c0d1f58fa16fa4ea F mkopcodeh.awk 0e7f04a8eb90f92259e47d80110e4e98d7ce337a F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 92aa4b6b6fbb83f965e4c4be0aa21a8b7e330ed8 -R 22c99efaaba11dba793d1740711eaae0 +P 8a4e19888f512c3ee95aa3040924fc932fbdab1a +R 38dcee8daf6135103e889e1478dbb9d1 U dan -Z b821d121ea8aa17674df3a472339de94 +Z 6a0f067a32a63752086ec828c1e4d102 diff --git a/manifest.uuid b/manifest.uuid index d20a675956..4dfa4dc00f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8a4e19888f512c3ee95aa3040924fc932fbdab1a \ No newline at end of file +c1840639b8ce8314602cd2396a324de8fac98dbe \ No newline at end of file From 8deb4b8b172e7156d8ab9ea55135a0af204c0baf Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 9 Oct 2015 18:21:43 +0000 Subject: [PATCH 73/98] Fix the JSON1 extension so that it renders integers outside the range of -9223372036854775808 to +9223372036854775807 as floating-point numbers. FossilOrigin-Name: ae736e35fb59c9aed33a8c805cf2ecdee528051f --- ext/misc/json1.c | 34 ++++++++++++++++++++++++++++------ manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 36 insertions(+), 14 deletions(-) diff --git a/ext/misc/json1.c b/ext/misc/json1.c index f6fb2eafec..2962df25e4 100644 --- a/ext/misc/json1.c +++ b/ext/misc/json1.c @@ -34,6 +34,11 @@ SQLITE_EXTENSION_INIT1 #define UNUSED_PARAM(X) (void)(X) +#ifndef LARGEST_INT64 +# define LARGEST_INT64 (0xffffffff|(((sqlite3_int64)0x7fffffff)<<32)) +# define SMALLEST_INT64 (((sqlite3_int64)-1) - LARGEST_INT64) +#endif + /* ** Versions of isspace(), isalnum() and isdigit() to which it is safe ** to pass signed char values. @@ -478,18 +483,35 @@ static void jsonReturn( sqlite3_result_int(pCtx, 0); break; } - case JSON_REAL: { - double r = strtod(pNode->u.zJContent, 0); - sqlite3_result_double(pCtx, r); - break; - } case JSON_INT: { sqlite3_int64 i = 0; const char *z = pNode->u.zJContent; if( z[0]=='-' ){ z++; } - while( z[0]>='0' && z[0]<='9' ){ i = i*10 + *(z++) - '0'; } + while( z[0]>='0' && z[0]<='9' ){ + unsigned v = *(z++) - '0'; + if( i>=LARGEST_INT64/10 ){ + if( z[0]>='0' && z[0]<='9' ) goto int_as_real; + if( v==9 ) goto int_as_real; + if( v==8 ){ + if( pNode->u.zJContent[0]=='-' ){ + sqlite3_result_int64(pCtx, SMALLEST_INT64); + goto int_done; + }else{ + goto int_as_real; + } + } + } + i = i*10 + v; + } if( pNode->u.zJContent[0]=='-' ){ i = -i; } sqlite3_result_int64(pCtx, i); + int_done: + break; + int_as_real: /* fall through to real */; + } + case JSON_REAL: { + double r = strtod(pNode->u.zJContent, 0); + sqlite3_result_double(pCtx, r); break; } case JSON_STRING: { diff --git a/manifest b/manifest index d0a55d2359..306b4988c5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sfts5\ssources\sfrom\sTESTSRC2\sin\smain.mk\sas\sthere\sis\sno\sSQLITE_TEST\scode\sin\ssaid\sfiles. -D 2015-10-09T17:54:10.922 +C Fix\sthe\sJSON1\sextension\sso\sthat\sit\srenders\sintegers\soutside\sthe\srange\nof\s-9223372036854775808\sto\s+9223372036854775807\sas\sfloating-point\snumbers. +D 2015-10-09T18:21:43.153 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f0088ff0d2ac949fce6de7c00f13a99ac5bdb663 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -198,7 +198,7 @@ F ext/misc/eval.c f971962e92ebb8b0a4e6b62949463ee454d88fa2 F ext/misc/fileio.c d4171c815d6543a9edef8308aab2951413cd8d0f F ext/misc/fuzzer.c 4c84635c71c26cfa7c2e5848cf49fe2d2cfcd767 F ext/misc/ieee754.c b0362167289170627659e84173f5d2e8fee8566e -F ext/misc/json1.c e1822098b8131133f24800bda551c56877244ceb +F ext/misc/json1.c 2b26b004bf6f3bf0a63b7967d06f9db41701db6e F ext/misc/nextchar.c 35c8b8baacb96d92abbb34a83a997b797075b342 F ext/misc/percentile.c bcbee3c061b884eccb80e21651daaae8e1e43c63 F ext/misc/regexp.c af92cdaa5058fcec1451e49becc7ba44dba023dc @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 8a4e19888f512c3ee95aa3040924fc932fbdab1a -R 38dcee8daf6135103e889e1478dbb9d1 -U dan -Z 6a0f067a32a63752086ec828c1e4d102 +P c1840639b8ce8314602cd2396a324de8fac98dbe +R 0a0d9dafaf6405334993e0ec52446217 +U drh +Z 3ad870ec9ba73f21ea47e4c129fbbfc2 diff --git a/manifest.uuid b/manifest.uuid index 4dfa4dc00f..0d52c70441 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -c1840639b8ce8314602cd2396a324de8fac98dbe \ No newline at end of file +ae736e35fb59c9aed33a8c805cf2ecdee528051f \ No newline at end of file From dfff1ffec66d979a3d8175ec11acf94599524d67 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Fri, 9 Oct 2015 18:48:47 +0000 Subject: [PATCH 74/98] Tweak batch tool added in the previous check-in to permit the base URI to be overridden. FossilOrigin-Name: 1d2f82df6774f8d66bfc5d67d5dad9f068a1069c --- manifest | 12 ++++++------ manifest.uuid | 2 +- tool/GetTclKit.bat | 4 +++- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index f9798bddfc..0196378f6d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\stool\scapable\sof\sdownloading\sa\sTclKit\s(and\sits\sassociated\sSDK)\son\sWindows. -D 2015-10-09T17:36:06.162 +C Tweak\sbatch\stool\sadded\sin\sthe\sprevious\scheck-in\sto\spermit\sthe\sbase\sURI\sto\sbe\soverridden. +D 2015-10-09T18:48:47.670 F Makefile.in 2a247c733c2dd6fab703df04dd009b26413956f5 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 17ce18bb7e9ca2ad3abed9b0a1fcbef3fbe8f307 @@ -1332,7 +1332,7 @@ F test/wordcount.c 9915e06cb33d8ca8109b8700791afe80d305afda F test/zeroblob.test 3857870fe681b8185654414a9bccfde80b62a0fa F test/zerodamage.test cf6748bad89553cc1632be51a6f54e487e4039ac F tool/GetFile.cs 963f7064b0b221b08feadb28894c3537916261ac -F tool/GetTclKit.bat 46092b151f7bb4f2a2735dfa1ada09736a4b35a4 +F tool/GetTclKit.bat b9fb86e129c43d51f53fe0320e7f5ad7c1f6a56f F tool/addopcodes.tcl 7cc82ecca456a6b3148abf492b0419b83140881a F tool/build-all-msvc.bat 761d8c82a1a529261291812732a853a1b4256d85 x F tool/build-shell.sh 950f47c6174f1eea171319438b93ba67ff5bf367 @@ -1389,7 +1389,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 5b6775215327a89232f5059653747a18e83b8b4b -R 785a6cb71a38ff7702fb9be84ec0066b +P 50673ddaf813335777673fa8585997a7551e5323 +R 633d2a263e4011119b12c5c71c6c891a U mistachkin -Z 9f18b94f6375bd392631336361a9d038 +Z 9124d78764e09fb7c7e86be9f7b744d5 diff --git a/manifest.uuid b/manifest.uuid index 38dfe5be77..b23b983a9e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -50673ddaf813335777673fa8585997a7551e5323 \ No newline at end of file +1d2f82df6774f8d66bfc5d67d5dad9f068a1069c \ No newline at end of file diff --git a/tool/GetTclKit.bat b/tool/GetTclKit.bat index 25ee5a5590..41ebceec03 100644 --- a/tool/GetTclKit.bat +++ b/tool/GetTclKit.bat @@ -61,7 +61,9 @@ IF NOT DEFINED TEMP ( %_VECHO% Temp = '%TEMP%' -SET TCLKIT_URI=http://tclsh.com/ +IF NOT DEFINED TCLKIT_URI ( + SET TCLKIT_URI=http://tclsh.com/ +) %_VECHO% TclKitUri = '%TCLKIT_URI%' From a0882fad7c02f183292998f2a99a72af2327c807 Mon Sep 17 00:00:00 2001 From: drh Date: Fri, 9 Oct 2015 20:40:44 +0000 Subject: [PATCH 75/98] The previous fix to JSON1 was not complete. A few more tweaks are needed for correct handling of all oversized integers. FossilOrigin-Name: 4a47f0177851721cdf6c981df962b6e8862372e7 --- ext/misc/json1.c | 3 ++- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 9 insertions(+), 8 deletions(-) diff --git a/ext/misc/json1.c b/ext/misc/json1.c index 2962df25e4..fa36419cfc 100644 --- a/ext/misc/json1.c +++ b/ext/misc/json1.c @@ -28,7 +28,7 @@ SQLITE_EXTENSION_INIT1 #include #include -#include +#include /* amalgamator: keep */ #include #include @@ -490,6 +490,7 @@ static void jsonReturn( while( z[0]>='0' && z[0]<='9' ){ unsigned v = *(z++) - '0'; if( i>=LARGEST_INT64/10 ){ + if( i>LARGEST_INT64/10 ) goto int_as_real; if( z[0]>='0' && z[0]<='9' ) goto int_as_real; if( v==9 ) goto int_as_real; if( v==8 ){ diff --git a/manifest b/manifest index 306b4988c5..4d164613ab 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sthe\sJSON1\sextension\sso\sthat\sit\srenders\sintegers\soutside\sthe\srange\nof\s-9223372036854775808\sto\s+9223372036854775807\sas\sfloating-point\snumbers. -D 2015-10-09T18:21:43.153 +C The\sprevious\sfix\sto\sJSON1\swas\snot\scomplete.\s\sA\sfew\smore\stweaks\sare\sneeded\nfor\scorrect\shandling\sof\sall\soversized\sintegers. +D 2015-10-09T20:40:44.669 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f0088ff0d2ac949fce6de7c00f13a99ac5bdb663 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -198,7 +198,7 @@ F ext/misc/eval.c f971962e92ebb8b0a4e6b62949463ee454d88fa2 F ext/misc/fileio.c d4171c815d6543a9edef8308aab2951413cd8d0f F ext/misc/fuzzer.c 4c84635c71c26cfa7c2e5848cf49fe2d2cfcd767 F ext/misc/ieee754.c b0362167289170627659e84173f5d2e8fee8566e -F ext/misc/json1.c 2b26b004bf6f3bf0a63b7967d06f9db41701db6e +F ext/misc/json1.c b169036ea45a6d47b56b6b4157c8b0eb60856107 F ext/misc/nextchar.c 35c8b8baacb96d92abbb34a83a997b797075b342 F ext/misc/percentile.c bcbee3c061b884eccb80e21651daaae8e1e43c63 F ext/misc/regexp.c af92cdaa5058fcec1451e49becc7ba44dba023dc @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P c1840639b8ce8314602cd2396a324de8fac98dbe -R 0a0d9dafaf6405334993e0ec52446217 +P ae736e35fb59c9aed33a8c805cf2ecdee528051f +R d3a3aa15755c918bcb3d0b2253f2a58f U drh -Z 3ad870ec9ba73f21ea47e4c129fbbfc2 +Z d6c45f3b0d0fc25a320efb8ad376e1dd diff --git a/manifest.uuid b/manifest.uuid index 0d52c70441..d9366b0f4a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -ae736e35fb59c9aed33a8c805cf2ecdee528051f \ No newline at end of file +4a47f0177851721cdf6c981df962b6e8862372e7 \ No newline at end of file From cc7304888fac2bffbe5077d85c024a2e157eec37 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Sat, 10 Oct 2015 00:53:28 +0000 Subject: [PATCH 76/98] More fine-tuning to the new TclKit tools. FossilOrigin-Name: 43addd8aa04c3faceb9d303672e330294af01a16 --- manifest | 14 +++++++------- manifest.uuid | 2 +- tool/GetFile.cs | 2 +- tool/GetTclKit.bat | 9 +++++++-- 4 files changed, 16 insertions(+), 11 deletions(-) diff --git a/manifest b/manifest index 0196378f6d..689702bf1b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Tweak\sbatch\stool\sadded\sin\sthe\sprevious\scheck-in\sto\spermit\sthe\sbase\sURI\sto\sbe\soverridden. -D 2015-10-09T18:48:47.670 +C More\sfine-tuning\sto\sthe\snew\sTclKit\stools. +D 2015-10-10T00:53:28.483 F Makefile.in 2a247c733c2dd6fab703df04dd009b26413956f5 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 17ce18bb7e9ca2ad3abed9b0a1fcbef3fbe8f307 @@ -1331,8 +1331,8 @@ F test/without_rowid6.test 1f99644e6508447fb050f73697350c7ceca3392e F test/wordcount.c 9915e06cb33d8ca8109b8700791afe80d305afda F test/zeroblob.test 3857870fe681b8185654414a9bccfde80b62a0fa F test/zerodamage.test cf6748bad89553cc1632be51a6f54e487e4039ac -F tool/GetFile.cs 963f7064b0b221b08feadb28894c3537916261ac -F tool/GetTclKit.bat b9fb86e129c43d51f53fe0320e7f5ad7c1f6a56f +F tool/GetFile.cs a15e08acb5dd7539b75ba23501581d7c2b462cb5 +F tool/GetTclKit.bat 786f6a075beaa0187bd0e6751263f77f831bff77 F tool/addopcodes.tcl 7cc82ecca456a6b3148abf492b0419b83140881a F tool/build-all-msvc.bat 761d8c82a1a529261291812732a853a1b4256d85 x F tool/build-shell.sh 950f47c6174f1eea171319438b93ba67ff5bf367 @@ -1389,7 +1389,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 50673ddaf813335777673fa8585997a7551e5323 -R 633d2a263e4011119b12c5c71c6c891a +P 1d2f82df6774f8d66bfc5d67d5dad9f068a1069c +R e581949b3345aa5207b2c38f2d8bf17e U mistachkin -Z 9124d78764e09fb7c7e86be9f7b744d5 +Z 2c1d38a7e80b3d62039ba691f1ca8a45 diff --git a/manifest.uuid b/manifest.uuid index b23b983a9e..e20379fb17 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1d2f82df6774f8d66bfc5d67d5dad9f068a1069c \ No newline at end of file +43addd8aa04c3faceb9d303672e330294af01a16 \ No newline at end of file diff --git a/tool/GetFile.cs b/tool/GetFile.cs index 9c489c6738..56601f3e85 100644 --- a/tool/GetFile.cs +++ b/tool/GetFile.cs @@ -350,7 +350,7 @@ namespace GetFile if (!Uri.TryCreate(args[0], UriKind.Absolute, out uri)) { - Error("First argument is not an absolute URI.", false); + Error("Could not create absolute URI from argument.", false); return (int)ExitCode.BadUri; } diff --git a/tool/GetTclKit.bat b/tool/GetTclKit.bat index 41ebceec03..5bd9ab6345 100644 --- a/tool/GetTclKit.bat +++ b/tool/GetTclKit.bat @@ -133,7 +133,7 @@ IF ERRORLEVEL 1 ( ) FOR %%F IN (%TCLKIT_FILES%) DO ( - IF NOT EXIST "%%F" ( + IF NOT EXIST "%TEMP%\%%F" ( %__ECHO% "%TEMP%\GetFile.exe" "%TCLKIT_URI%%%F" IF ERRORLEVEL 1 ( @@ -154,7 +154,7 @@ IF NOT EXIST "%TEMP%\%TCLKIT_SDK%" ( ) ) -%__ECHO% "%TEMP%\unzip.exe" -o "%TEMP%\%TCLKIT_SDK_ZIP%" -d "%TEMP%\%TCLKIT_SDK%" +%__ECHO% "%TEMP%\unzip.exe" -n "%TEMP%\%TCLKIT_SDK_ZIP%" -d "%TEMP%\%TCLKIT_SDK%" IF ERRORLEVEL 1 ( ECHO Could not unzip "%TEMP%\%TCLKIT_SDK_ZIP%" to "%TEMP%\%TCLKIT_SDK%". @@ -173,6 +173,11 @@ IF DEFINED TCLKIT_NOSDK GOTO skip_sdkVariables :skip_sdkVariables +ECHO. +ECHO Wrote "%ROOT%\SetTclKitEnv.bat". +ECHO Please run it to set the necessary Tcl environment variables. +ECHO. + GOTO no_errors :fn_TclKitX86Variables From 946ef60ad0412ad50aeaecfa4942118da56c32a5 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Sat, 10 Oct 2015 01:55:57 +0000 Subject: [PATCH 77/98] Fix typo in the MSVC makefile. Replace remaining uses of AWK in the MSVC makefile with a Tcl script. FossilOrigin-Name: f8c2193b64979a2fe480fcf913573b5fac06235e --- Makefile.msc | 12 +++--------- manifest | 13 +++++++------ manifest.uuid | 2 +- tool/replace.tcl | 20 ++++++++++++++++++++ 4 files changed, 31 insertions(+), 16 deletions(-) create mode 100644 tool/replace.tcl diff --git a/Makefile.msc b/Makefile.msc index 71b5fc8cc9..d8459e8492 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -809,12 +809,6 @@ LTLIBPATHS = $(LTLIBPATHS) /LIBPATH:$(ICULIBDIR) LTLIBS = $(LTLIBS) $(LIBICU) !ENDIF -# nawk compatible awk. -# -!IFNDEF NAWK -NAWK = gawk.exe -!ENDIF - # You should not have to change anything below this line ############################################################################### @@ -1331,7 +1325,7 @@ $(LIBRESOBJS): $(TOP)\src\sqlite3.rc $(HDR) echo #ifndef SQLITE_RESOURCE_VERSION > sqlite3rc.h for /F %%V in ('type "$(TOP)\VERSION"') do ( \ echo #define SQLITE_RESOURCE_VERSION %%V \ - | $(NAWK) "/.*/ { gsub(/[.]/,\",\");print }" >> sqlite3rc.h \ + | $(TCLSH_CMD) $(TOP)\tool\replace.tcl exact . ^, >> sqlite3rc.h \ ) echo #endif >> sqlite3rc.h $(LTRCOMPILE) -fo $(LIBRESOBJS) $(TOP)\src\sqlite3.rc @@ -1576,7 +1570,7 @@ opcodes.c: opcodes.h $(TOP)\tool\mkopcodec.tcl $(TCLSH_CMD) $(TOP)\tool\mkopcodec.tcl opcodes.h > opcodes.c opcodes.h: parse.h $(TOP)\src\vdbe.c $(TOP)\tool\mkopcodeh.tcl - type parse.h $(TOP)\src\vdbe.c | $(TCLSH_CMD) $(TOP)\tool\mkopcodeh.awk > opcodes.h + type parse.h $(TOP)\src\vdbe.c | $(TCLSH_CMD) $(TOP)\tool\mkopcodeh.tcl > opcodes.h # Rules to build parse.c and parse.h - the outputs of lemon. # @@ -1858,7 +1852,7 @@ dll: sqlite3.dll sqlite3.def: libsqlite3.lib echo EXPORTS > sqlite3.def dumpbin /all libsqlite3.lib \ - | $(NAWK) "/ 1 _?sqlite3_/ { sub(/^.* _?/,\"\");print }" \ + | $(TCLSH_CMD) $(TOP)\tool\replace.tcl include "^\s+1 _?(sqlite3_.*)$$" "\1" \ | sort >> sqlite3.def sqlite3.dll: $(LIBOBJ) $(LIBRESOBJS) $(CORE_LINK_DEP) diff --git a/manifest b/manifest index 689702bf1b..ac0312bb8a 100644 --- a/manifest +++ b/manifest @@ -1,8 +1,8 @@ -C More\sfine-tuning\sto\sthe\snew\sTclKit\stools. -D 2015-10-10T00:53:28.483 +C Fix\stypo\sin\sthe\sMSVC\smakefile.\s\sReplace\sremaining\suses\sof\sAWK\sin\sthe\sMSVC\smakefile\swith\sa\sTcl\sscript. +D 2015-10-10T01:55:57.399 F Makefile.in 2a247c733c2dd6fab703df04dd009b26413956f5 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 -F Makefile.msc 17ce18bb7e9ca2ad3abed9b0a1fcbef3fbe8f307 +F Makefile.msc d40af03b1453a4f5b132cfa5ffef36a4c4fc3338 F README.md 8ecc12493ff9f820cdea6520a9016001cb2e59b7 F VERSION ccfc4d1576dbfdeece0a4372a2e6a2e37d3e7975 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 @@ -1363,6 +1363,7 @@ F tool/mkvsix.tcl bbe57cd9ae11c6cc70319241101ef8d2b8c3765b F tool/offsets.c fe4262fdfa378e8f5499a42136d17bf3b98f6091 F tool/omittest.tcl 34d7ac01fe4fd18e3637f64abe12c40eca0f6b97 F tool/pagesig.c ff0ca355fd3c2398e933da5e22439bbff89b803b +F tool/replace.tcl 7727c60a04299b65a92f5e1590896fea0f25b9e0 F tool/restore_jrnl.tcl 6957a34f8f1f0f8285e07536225ec3b292a9024a F tool/rollback-test.c 9fc98427d1e23e84429d7e6d07d9094fbdec65a5 F tool/showdb.c b1e16174385d5bd0815823a7fda1ecc82ed6088b @@ -1389,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 1d2f82df6774f8d66bfc5d67d5dad9f068a1069c -R e581949b3345aa5207b2c38f2d8bf17e +P 43addd8aa04c3faceb9d303672e330294af01a16 +R 006632f80fd4c638e12a5eb804e62e4f U mistachkin -Z 2c1d38a7e80b3d62039ba691f1ca8a45 +Z 791ad8ca8445d57bc0ffe78a443c7839 diff --git a/manifest.uuid b/manifest.uuid index e20379fb17..33acad9038 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -43addd8aa04c3faceb9d303672e330294af01a16 \ No newline at end of file +f8c2193b64979a2fe480fcf913573b5fac06235e \ No newline at end of file diff --git a/tool/replace.tcl b/tool/replace.tcl new file mode 100644 index 0000000000..b01a83accb --- /dev/null +++ b/tool/replace.tcl @@ -0,0 +1,20 @@ +#!/usr/bin/tcl +# +# Replace string with another string -OR- include +# only lines successfully modified with a regular +# expression. +# +set mode [string tolower [lindex $argv 0]] +set from [lindex $argv 1] +set to [lindex $argv 2] +if {$mode ni [list exact include]} {exit 1} +if {[string length $from]==0} {exit 2} +while {![eof stdin]} { + set line [gets stdin] + if {[eof stdin]} break + switch -exact $mode { + exact {set line [string map [list $from $to] $line]} + include {if {[regsub -all -- $from $line $to line]==0} continue} + } + puts stdout $line +} From ba461cac7b112037b75ed7a0d7b49f10204de6fc Mon Sep 17 00:00:00 2001 From: mistachkin Date: Sat, 10 Oct 2015 02:06:05 +0000 Subject: [PATCH 78/98] Remove a couple superfluous double quotes in the MSVC makefile. FossilOrigin-Name: 0f9e205b28e013412b19dfd588f2a6cf341c40e8 --- Makefile.msc | 2 +- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/Makefile.msc b/Makefile.msc index d8459e8492..d838aa685c 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -1852,7 +1852,7 @@ dll: sqlite3.dll sqlite3.def: libsqlite3.lib echo EXPORTS > sqlite3.def dumpbin /all libsqlite3.lib \ - | $(TCLSH_CMD) $(TOP)\tool\replace.tcl include "^\s+1 _?(sqlite3_.*)$$" "\1" \ + | $(TCLSH_CMD) $(TOP)\tool\replace.tcl include "^\s+1 _?(sqlite3_.*)$$" \1 \ | sort >> sqlite3.def sqlite3.dll: $(LIBOBJ) $(LIBRESOBJS) $(CORE_LINK_DEP) diff --git a/manifest b/manifest index ac0312bb8a..7f0ed5c665 100644 --- a/manifest +++ b/manifest @@ -1,8 +1,8 @@ -C Fix\stypo\sin\sthe\sMSVC\smakefile.\s\sReplace\sremaining\suses\sof\sAWK\sin\sthe\sMSVC\smakefile\swith\sa\sTcl\sscript. -D 2015-10-10T01:55:57.399 +C Remove\sa\scouple\ssuperfluous\sdouble\squotes\sin\sthe\sMSVC\smakefile. +D 2015-10-10T02:06:05.870 F Makefile.in 2a247c733c2dd6fab703df04dd009b26413956f5 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 -F Makefile.msc d40af03b1453a4f5b132cfa5ffef36a4c4fc3338 +F Makefile.msc b32cae4343a16d4eb1c0dec49ee6877e54ad9678 F README.md 8ecc12493ff9f820cdea6520a9016001cb2e59b7 F VERSION ccfc4d1576dbfdeece0a4372a2e6a2e37d3e7975 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 43addd8aa04c3faceb9d303672e330294af01a16 -R 006632f80fd4c638e12a5eb804e62e4f +P f8c2193b64979a2fe480fcf913573b5fac06235e +R 7cc2a5813618966360cf80bf66f0084c U mistachkin -Z 791ad8ca8445d57bc0ffe78a443c7839 +Z d70bac36f21bbf58c368f1d4e150ed30 diff --git a/manifest.uuid b/manifest.uuid index 33acad9038..b2060c7cc5 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -f8c2193b64979a2fe480fcf913573b5fac06235e \ No newline at end of file +0f9e205b28e013412b19dfd588f2a6cf341c40e8 \ No newline at end of file From 9a4718ff7385123d85caf8b6bbe219f182da6bd0 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 10 Oct 2015 14:00:37 +0000 Subject: [PATCH 79/98] Add some #ifdef-ery to json1.c to avoid a duplicate typedef when used in the amalgamation, since some compilers become upset over duplicate typedefs. FossilOrigin-Name: de28acd42f29693341feb884b7223cd3d2b96730 --- ext/misc/json1.c | 11 +++++++---- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/ext/misc/json1.c b/ext/misc/json1.c index fa36419cfc..c968011eea 100644 --- a/ext/misc/json1.c +++ b/ext/misc/json1.c @@ -71,10 +71,13 @@ static const char jsonIsSpace[] = { }; #define safe_isspace(x) (jsonIsSpace[(unsigned char)x]) -/* Unsigned integer types */ -typedef sqlite3_uint64 u64; -typedef unsigned int u32; -typedef unsigned char u8; +#ifndef SQLITE_AMALGAMATION + /* Unsigned integer types. These are already defined in the sqliteInt.h, + ** but the definitions need to be repeated for separate compilation. */ + typedef sqlite3_uint64 u64; + typedef unsigned int u32; + typedef unsigned char u8; +#endif /* Objects */ typedef struct JsonString JsonString; diff --git a/manifest b/manifest index 4d164613ab..44e404e10b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\sprevious\sfix\sto\sJSON1\swas\snot\scomplete.\s\sA\sfew\smore\stweaks\sare\sneeded\nfor\scorrect\shandling\sof\sall\soversized\sintegers. -D 2015-10-09T20:40:44.669 +C Add\ssome\s#ifdef-ery\sto\sjson1.c\sto\savoid\sa\sduplicate\stypedef\swhen\sused\sin\sthe\namalgamation,\ssince\ssome\scompilers\sbecome\supset\sover\sduplicate\stypedefs. +D 2015-10-10T14:00:37.789 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f0088ff0d2ac949fce6de7c00f13a99ac5bdb663 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -198,7 +198,7 @@ F ext/misc/eval.c f971962e92ebb8b0a4e6b62949463ee454d88fa2 F ext/misc/fileio.c d4171c815d6543a9edef8308aab2951413cd8d0f F ext/misc/fuzzer.c 4c84635c71c26cfa7c2e5848cf49fe2d2cfcd767 F ext/misc/ieee754.c b0362167289170627659e84173f5d2e8fee8566e -F ext/misc/json1.c b169036ea45a6d47b56b6b4157c8b0eb60856107 +F ext/misc/json1.c e827cb3148e7db283e4b6ca36a0c16480bf8e743 F ext/misc/nextchar.c 35c8b8baacb96d92abbb34a83a997b797075b342 F ext/misc/percentile.c bcbee3c061b884eccb80e21651daaae8e1e43c63 F ext/misc/regexp.c af92cdaa5058fcec1451e49becc7ba44dba023dc @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P ae736e35fb59c9aed33a8c805cf2ecdee528051f -R d3a3aa15755c918bcb3d0b2253f2a58f +P 4a47f0177851721cdf6c981df962b6e8862372e7 +R 678f628a8c12a6813211ec0771a1c708 U drh -Z d6c45f3b0d0fc25a320efb8ad376e1dd +Z 1fdffd2212b4b8a28bd72b035f7937f1 diff --git a/manifest.uuid b/manifest.uuid index d9366b0f4a..68800f111e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -4a47f0177851721cdf6c981df962b6e8862372e7 \ No newline at end of file +de28acd42f29693341feb884b7223cd3d2b96730 \ No newline at end of file From 728e0f91bb357c7ebd42d9a0e87b68a7cf9938f6 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 10 Oct 2015 14:41:28 +0000 Subject: [PATCH 80/98] Compiler warning fixes: Rename some local variables from "j1" to avoid a name collision with the j1() bessel function in the math library. Omit a dummy initializer that gcc 4.6.3 does not like. FossilOrigin-Name: 9ddef84d432813f3ece8012047d08441caa3315d --- manifest | 26 +++++++++++++------------- manifest.uuid | 2 +- src/alter.c | 6 +++--- src/build.c | 6 +++--- src/expr.c | 12 ++++++------ src/insert.c | 29 +++++++++++++++-------------- src/loadext.c | 2 +- src/select.c | 28 ++++++++++++++-------------- src/update.c | 8 ++++---- src/wherecode.c | 9 +++++---- 10 files changed, 65 insertions(+), 63 deletions(-) diff --git a/manifest b/manifest index 44e404e10b..3181c9f513 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\ssome\s#ifdef-ery\sto\sjson1.c\sto\savoid\sa\sduplicate\stypedef\swhen\sused\sin\sthe\namalgamation,\ssince\ssome\scompilers\sbecome\supset\sover\sduplicate\stypedefs. -D 2015-10-10T14:00:37.789 +C Compiler\swarning\sfixes:\s\sRename\ssome\slocal\svariables\sfrom\s"j1"\sto\savoid\sa\nname\scollision\swith\sthe\sj1()\sbessel\sfunction\sin\sthe\smath\slibrary.\s\sOmit\sa\ndummy\sinitializer\sthat\sgcc\s4.6.3\sdoes\snot\slike. +D 2015-10-10T14:41:28.105 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f0088ff0d2ac949fce6de7c00f13a99ac5bdb663 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -278,7 +278,7 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c 4911e1f18fc11b60edbc6410643e938762969a6a +F src/alter.c 9d649e46c780166e416fb11dbd23f8d49aab8267 F src/analyze.c 4c308880cf53c558070cb8513bdff4ffb1a38a77 F src/attach.c e944d0052b577703b9b83aac1638452ff42a8395 F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 @@ -288,14 +288,14 @@ F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 F src/btree.c a5a653087ae98dd743d12ae0920d5b64c5335960 F src/btree.h 40189aefdc2b830d25c8b58fd7d56538481bfdd7 F src/btreeInt.h 8177c9ab90d772d6d2c6c517e05bed774b7c92c0 -F src/build.c 0549b56722f15c146ca21f82a33838365c2031f0 +F src/build.c d6162335d690396dfc5c4bd59e8b2b0c14ba6285 F src/callback.c 7b44ce59674338ad48b0e84e7b72f935ea4f68b0 F src/complete.c addcd8160b081131005d5bc2d34adf20c1c5c92f F src/ctime.c 509ef9c64d1321f42448f111da86400b1799218a F src/date.c fb1c99172017dcc8e237339132c91a21a0788584 F src/dbstat.c e637e7a7ff40ef32132a418c6fdf1cfb63aa27c7 F src/delete.c 35c939eb8bacc9dd8a6715964e5f69feb8c20e44 -F src/expr.c 36381822e617cb3586d4be1af2cbc3dd5f2b84eb +F src/expr.c b89dfbb8a385a45411c487355597c01f4ea4c882 F src/fault.c 160a0c015b6c2629d3899ed2daf63d75754a32bb F src/fkey.c 31900763094a3736a5fc887469202eb579fef2d0 F src/func.c ecdd69ec6a1e406f04cc73324be2ebbf6354197f @@ -303,11 +303,11 @@ F src/global.c 508e4087f7b41d688e4762dcf4d4fe28cfbc87f9 F src/hash.c 4263fbc955f26c2e8cdc0cf214bc42435aa4e4f5 F src/hash.h c8f3c31722cf3277d03713909761e152a5b81094 F src/hwtime.h d32741c8f4df852c7d959236615444e2b1063b08 -F src/insert.c a9b7f200081fa1b482a4ccac05165e10371ae9e0 +F src/insert.c 3c522beb5bf50a2efee1fca1e80fd40942e5817c F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d F src/legacy.c ba1863ea58c4c840335a84ec276fc2b25e22bc4e F src/lempar.c d344a95d60c24e2f490ee59db9784b1b17439012 -F src/loadext.c f0b66d28e377fd6c6d36cc9d92df1ff251ebee44 +F src/loadext.c b3f1a529245b14c881b270a9f29fae6c5727cde8 F src/main.c fec97668771438033a7559883401067b139729e1 F src/malloc.c 3a37ce6979a40f499d8cea9e9ab4e8517854d35d F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 @@ -343,7 +343,7 @@ F src/printf.c 0c4bcdd1c2e2521024f0a69cb5eb334f86b3652a F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 F src/resolve.c 1954a0f01bf65d78d7d559aea3d5c67f33376d91 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e -F src/select.c 2c4bfdf7c797df9b43121ed7850bf939b6f27405 +F src/select.c 36c05502d5aef2a14aff3f7faba95b0c7d87ca9a F src/shell.c d25df04168d6ba5a4fa05bdbf859df667f9eb621 F src/sqlite.h.in 4b76d74d69af48c534c58fb723137dc6944bdedc F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad @@ -402,7 +402,7 @@ F src/threads.c bbfb74450643cb5372a43ad4f6cffd7e9dfcecb0 F src/tokenize.c 83c6ed569423a3af83a83973b444cf7123be33a6 F src/treeview.c 154f0acc622fa3514de8777dcedf4c8a8802b4ce F src/trigger.c 322f23aad694e8f31d384dcfa386d52a48d3c52f -F src/update.c a134027f59c7eb6e63ed18e2d5dd8ef0ce7f8ff8 +F src/update.c dc37664095ca8604293ff1de2d9a547c6efb5e6e F src/utf.c fc6b889ba0779b7722634cdeaa25f1930d93820c F src/util.c fc612367108b74573c5fd13a85d0a23027f438bd F src/vacuum.c 2ddd5cad2a7b9cef7f9e431b8c7771634c6b1701 @@ -422,7 +422,7 @@ F src/wal.h df01efe09c5cb8c8e391ff1715cca294f89668a4 F src/walker.c 2e14d17f592d176b6dc879c33fbdec4fbccaa2ba F src/where.c 4c4646675e794ac71e701289edefd7cd81bac844 F src/whereInt.h 7892bb54cf9ca0ae5c7e6094491b94c9286dc647 -F src/wherecode.c a32bf1f304f6328e3eefcb82e70bd86836cff343 +F src/wherecode.c cdfff200d065e7fb1af827b3274ed46b10a91d65 F src/whereexpr.c e63244ca06c503e5f3c5b7f3c9aea0db826089ed F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 4a47f0177851721cdf6c981df962b6e8862372e7 -R 678f628a8c12a6813211ec0771a1c708 +P de28acd42f29693341feb884b7223cd3d2b96730 +R 7bd14eb389d990bdd306d4dfa0d204c7 U drh -Z 1fdffd2212b4b8a28bd72b035f7937f1 +Z 96e28de24d5c75afd93b95f0019483d4 diff --git a/manifest.uuid b/manifest.uuid index 68800f111e..e0d9d9b437 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -de28acd42f29693341feb884b7223cd3d2b96730 \ No newline at end of file +9ddef84d432813f3ece8012047d08441caa3315d \ No newline at end of file diff --git a/src/alter.c b/src/alter.c index 80b707beff..2b043ef158 100644 --- a/src/alter.c +++ b/src/alter.c @@ -602,14 +602,14 @@ void sqlite3MinimumFileFormat(Parse *pParse, int iDb, int minFormat){ if( ALWAYS(v) ){ int r1 = sqlite3GetTempReg(pParse); int r2 = sqlite3GetTempReg(pParse); - int j1; + int addr1; sqlite3VdbeAddOp3(v, OP_ReadCookie, iDb, r1, BTREE_FILE_FORMAT); sqlite3VdbeUsesBtree(v, iDb); sqlite3VdbeAddOp2(v, OP_Integer, minFormat, r2); - j1 = sqlite3VdbeAddOp3(v, OP_Ge, r2, 0, r1); + addr1 = sqlite3VdbeAddOp3(v, OP_Ge, r2, 0, r1); sqlite3VdbeChangeP5(v, SQLITE_NOTNULL); VdbeCoverage(v); sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_FILE_FORMAT, r2); - sqlite3VdbeJumpHere(v, j1); + sqlite3VdbeJumpHere(v, addr1); sqlite3ReleaseTempReg(pParse, r1); sqlite3ReleaseTempReg(pParse, r2); } diff --git a/src/build.c b/src/build.c index ea89e501dc..7c79fe5400 100644 --- a/src/build.c +++ b/src/build.c @@ -985,7 +985,7 @@ void sqlite3StartTable( ** now. */ if( !db->init.busy && (v = sqlite3GetVdbe(pParse))!=0 ){ - int j1; + int addr1; int fileFormat; int reg1, reg2, reg3; /* nullRow[] is an OP_Record encoding of a row containing 5 NULLs */ @@ -1006,14 +1006,14 @@ void sqlite3StartTable( reg3 = ++pParse->nMem; sqlite3VdbeAddOp3(v, OP_ReadCookie, iDb, reg3, BTREE_FILE_FORMAT); sqlite3VdbeUsesBtree(v, iDb); - j1 = sqlite3VdbeAddOp1(v, OP_If, reg3); VdbeCoverage(v); + addr1 = sqlite3VdbeAddOp1(v, OP_If, reg3); VdbeCoverage(v); fileFormat = (db->flags & SQLITE_LegacyFileFmt)!=0 ? 1 : SQLITE_MAX_FILE_FORMAT; sqlite3VdbeAddOp2(v, OP_Integer, fileFormat, reg3); sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_FILE_FORMAT, reg3); sqlite3VdbeAddOp2(v, OP_Integer, ENC(db), reg3); sqlite3VdbeAddOp3(v, OP_SetCookie, iDb, BTREE_TEXT_ENCODING, reg3); - sqlite3VdbeJumpHere(v, j1); + sqlite3VdbeJumpHere(v, addr1); /* This just creates a place-holder record in the sqlite_master table. ** The record created does not contain anything yet. It will be replaced diff --git a/src/expr.c b/src/expr.c index b52e814f3c..b39dea2ea1 100644 --- a/src/expr.c +++ b/src/expr.c @@ -1595,13 +1595,13 @@ int sqlite3CodeOnce(Parse *pParse){ ** to be set to NULL if iCur contains one or more NULL values. */ static void sqlite3SetHasNullFlag(Vdbe *v, int iCur, int regHasNull){ - int j1; + int addr1; sqlite3VdbeAddOp2(v, OP_Integer, 0, regHasNull); - j1 = sqlite3VdbeAddOp1(v, OP_Rewind, iCur); VdbeCoverage(v); + addr1 = sqlite3VdbeAddOp1(v, OP_Rewind, iCur); VdbeCoverage(v); sqlite3VdbeAddOp3(v, OP_Column, iCur, 0, regHasNull); sqlite3VdbeChangeP5(v, OPFLAG_TYPEOFARG); VdbeComment((v, "first_entry_in(%d)", iCur)); - sqlite3VdbeJumpHere(v, j1); + sqlite3VdbeJumpHere(v, addr1); } @@ -2201,7 +2201,7 @@ static void sqlite3ExprCodeIN( ** the presence of a NULL on the RHS makes a difference in the ** outcome. */ - int j1; + int addr1; /* First check to see if the LHS is contained in the RHS. If so, ** then the answer is TRUE the presence of NULLs in the RHS does @@ -2209,12 +2209,12 @@ static void sqlite3ExprCodeIN( ** answer is NULL if the RHS contains NULLs and the answer is ** FALSE if the RHS is NULL-free. */ - j1 = sqlite3VdbeAddOp4Int(v, OP_Found, pExpr->iTable, 0, r1, 1); + addr1 = sqlite3VdbeAddOp4Int(v, OP_Found, pExpr->iTable, 0, r1, 1); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_IsNull, rRhsHasNull, destIfNull); VdbeCoverage(v); sqlite3VdbeGoto(v, destIfFalse); - sqlite3VdbeJumpHere(v, j1); + sqlite3VdbeJumpHere(v, addr1); } } } diff --git a/src/insert.c b/src/insert.c index 785e57d02c..0cf670e6cf 100644 --- a/src/insert.c +++ b/src/insert.c @@ -313,16 +313,16 @@ void sqlite3AutoincrementEnd(Parse *pParse){ assert( v ); for(p = pParse->pAinc; p; p = p->pNext){ Db *pDb = &db->aDb[p->iDb]; - int j1; + int addr1; int iRec; int memId = p->regCtr; iRec = sqlite3GetTempReg(pParse); assert( sqlite3SchemaMutexHeld(db, 0, pDb->pSchema) ); sqlite3OpenTable(pParse, 0, p->iDb, pDb->pSchema->pSeqTab, OP_OpenWrite); - j1 = sqlite3VdbeAddOp1(v, OP_NotNull, memId+1); VdbeCoverage(v); + addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, memId+1); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_NewRowid, 0, memId+1); - sqlite3VdbeJumpHere(v, j1); + sqlite3VdbeJumpHere(v, addr1); sqlite3VdbeAddOp3(v, OP_MakeRecord, memId-1, 2, iRec); sqlite3VdbeAddOp3(v, OP_Insert, 0, iRec, memId+1); sqlite3VdbeChangeP5(v, OPFLAG_APPEND); @@ -814,7 +814,7 @@ void sqlite3Insert( if( ipkColumn<0 ){ sqlite3VdbeAddOp2(v, OP_Integer, -1, regCols); }else{ - int j1; + int addr1; assert( !withoutRowid ); if( useTempTable ){ sqlite3VdbeAddOp3(v, OP_Column, srcTab, ipkColumn, regCols); @@ -822,9 +822,9 @@ void sqlite3Insert( assert( pSelect==0 ); /* Otherwise useTempTable is true */ sqlite3ExprCode(pParse, pList->a[ipkColumn].pExpr, regCols); } - j1 = sqlite3VdbeAddOp1(v, OP_NotNull, regCols); VdbeCoverage(v); + addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, regCols); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Integer, -1, regCols); - sqlite3VdbeJumpHere(v, j1); + sqlite3VdbeJumpHere(v, addr1); sqlite3VdbeAddOp1(v, OP_MustBeInt, regCols); VdbeCoverage(v); } @@ -898,14 +898,14 @@ void sqlite3Insert( ** to generate a unique primary key value. */ if( !appendFlag ){ - int j1; + int addr1; if( !IsVirtual(pTab) ){ - j1 = sqlite3VdbeAddOp1(v, OP_NotNull, regRowid); VdbeCoverage(v); + addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, regRowid); VdbeCoverage(v); sqlite3VdbeAddOp3(v, OP_NewRowid, iDataCur, regRowid, regAutoinc); - sqlite3VdbeJumpHere(v, j1); + sqlite3VdbeJumpHere(v, addr1); }else{ - j1 = sqlite3VdbeCurrentAddr(v); - sqlite3VdbeAddOp2(v, OP_IsNull, regRowid, j1+2); VdbeCoverage(v); + addr1 = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp2(v, OP_IsNull, regRowid, addr1+2); VdbeCoverage(v); } sqlite3VdbeAddOp1(v, OP_MustBeInt, regRowid); VdbeCoverage(v); } @@ -1159,7 +1159,7 @@ void sqlite3GenerateConstraintChecks( int ix; /* Index loop counter */ int nCol; /* Number of columns */ int onError; /* Conflict resolution strategy */ - int j1; /* Address of jump instruction */ + int addr1; /* Address of jump instruction */ int seenReplace = 0; /* True if REPLACE is used to resolve INT PK conflict */ int nPkField; /* Number of fields in PRIMARY KEY. 1 for ROWID tables */ int ipkTop = 0; /* Top of the rowid change constraint check */ @@ -1230,9 +1230,10 @@ void sqlite3GenerateConstraintChecks( } default: { assert( onError==OE_Replace ); - j1 = sqlite3VdbeAddOp1(v, OP_NotNull, regNewData+1+i); VdbeCoverage(v); + addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, regNewData+1+i); + VdbeCoverage(v); sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, regNewData+1+i); - sqlite3VdbeJumpHere(v, j1); + sqlite3VdbeJumpHere(v, addr1); break; } } diff --git a/src/loadext.c b/src/loadext.c index b4b981e548..d649616b73 100644 --- a/src/loadext.c +++ b/src/loadext.c @@ -615,7 +615,7 @@ int sqlite3_enable_load_extension(sqlite3 *db, int onoff){ ** dummy pointer. */ #ifdef SQLITE_OMIT_LOAD_EXTENSION -static const sqlite3_api_routines sqlite3Apis = { 0 }; +static const sqlite3_api_routines sqlite3Apis; #endif diff --git a/src/select.c b/src/select.c index 548030fb14..c865472334 100644 --- a/src/select.c +++ b/src/select.c @@ -2578,12 +2578,12 @@ static int generateOutputSubroutine( /* Suppress duplicates for UNION, EXCEPT, and INTERSECT */ if( regPrev ){ - int j1, j2; - j1 = sqlite3VdbeAddOp1(v, OP_IfNot, regPrev); VdbeCoverage(v); - j2 = sqlite3VdbeAddOp4(v, OP_Compare, pIn->iSdst, regPrev+1, pIn->nSdst, + int addr1, addr2; + addr1 = sqlite3VdbeAddOp1(v, OP_IfNot, regPrev); VdbeCoverage(v); + addr2 = sqlite3VdbeAddOp4(v, OP_Compare, pIn->iSdst, regPrev+1, pIn->nSdst, (char*)sqlite3KeyInfoRef(pKeyInfo), P4_KEYINFO); - sqlite3VdbeAddOp3(v, OP_Jump, j2+2, iContinue, j2+2); VdbeCoverage(v); - sqlite3VdbeJumpHere(v, j1); + sqlite3VdbeAddOp3(v, OP_Jump, addr2+2, iContinue, addr2+2); VdbeCoverage(v); + sqlite3VdbeJumpHere(v, addr1); sqlite3VdbeAddOp3(v, OP_Copy, pIn->iSdst, regPrev+1, pIn->nSdst-1); sqlite3VdbeAddOp2(v, OP_Integer, 1, regPrev); } @@ -2800,7 +2800,7 @@ static int multiSelectOrderBy( int savedOffset; /* Saved value of p->iOffset */ int labelCmpr; /* Label for the start of the merge algorithm */ int labelEnd; /* Label for the end of the overall SELECT stmt */ - int j1; /* Jump instructions that get retargetted */ + int addr1; /* Jump instructions that get retargetted */ int op; /* One of TK_ALL, TK_UNION, TK_EXCEPT, TK_INTERSECT */ KeyInfo *pKeyDup = 0; /* Comparison information for duplicate removal */ KeyInfo *pKeyMerge; /* Comparison information for merging rows */ @@ -2936,19 +2936,19 @@ static int multiSelectOrderBy( ** left of the compound operator - the "A" select. */ addrSelectA = sqlite3VdbeCurrentAddr(v) + 1; - j1 = sqlite3VdbeAddOp3(v, OP_InitCoroutine, regAddrA, 0, addrSelectA); + addr1 = sqlite3VdbeAddOp3(v, OP_InitCoroutine, regAddrA, 0, addrSelectA); VdbeComment((v, "left SELECT")); pPrior->iLimit = regLimitA; explainSetInteger(iSub1, pParse->iNextSelectId); sqlite3Select(pParse, pPrior, &destA); sqlite3VdbeAddOp1(v, OP_EndCoroutine, regAddrA); - sqlite3VdbeJumpHere(v, j1); + sqlite3VdbeJumpHere(v, addr1); /* Generate a coroutine to evaluate the SELECT statement on ** the right - the "B" select */ addrSelectB = sqlite3VdbeCurrentAddr(v) + 1; - j1 = sqlite3VdbeAddOp3(v, OP_InitCoroutine, regAddrB, 0, addrSelectB); + addr1 = sqlite3VdbeAddOp3(v, OP_InitCoroutine, regAddrB, 0, addrSelectB); VdbeComment((v, "right SELECT")); savedLimit = p->iLimit; savedOffset = p->iOffset; @@ -3039,7 +3039,7 @@ static int multiSelectOrderBy( /* This code runs once to initialize everything. */ - sqlite3VdbeJumpHere(v, j1); + sqlite3VdbeJumpHere(v, addr1); sqlite3VdbeAddOp2(v, OP_Yield, regAddrA, addrEofA_noB); VdbeCoverage(v); sqlite3VdbeAddOp2(v, OP_Yield, regAddrB, addrEofB); VdbeCoverage(v); @@ -5213,7 +5213,7 @@ int sqlite3Select( */ if( pGroupBy ){ KeyInfo *pKeyInfo; /* Keying information for the group by clause */ - int j1; /* A-vs-B comparision jump */ + int addr1; /* A-vs-B comparision jump */ int addrOutputRow; /* Start of subroutine that outputs a result row */ int regOutputRow; /* Return address register for output subroutine */ int addrSetAbort; /* Set the abort flag and return */ @@ -5361,8 +5361,8 @@ int sqlite3Select( } sqlite3VdbeAddOp4(v, OP_Compare, iAMem, iBMem, pGroupBy->nExpr, (char*)sqlite3KeyInfoRef(pKeyInfo), P4_KEYINFO); - j1 = sqlite3VdbeCurrentAddr(v); - sqlite3VdbeAddOp3(v, OP_Jump, j1+1, 0, j1+1); VdbeCoverage(v); + addr1 = sqlite3VdbeCurrentAddr(v); + sqlite3VdbeAddOp3(v, OP_Jump, addr1+1, 0, addr1+1); VdbeCoverage(v); /* Generate code that runs whenever the GROUP BY changes. ** Changes in the GROUP BY are detected by the previous code @@ -5384,7 +5384,7 @@ int sqlite3Select( /* Update the aggregate accumulators based on the content of ** the current row */ - sqlite3VdbeJumpHere(v, j1); + sqlite3VdbeJumpHere(v, addr1); updateAccumulator(pParse, &sAggInfo); sqlite3VdbeAddOp2(v, OP_Integer, 1, iUseFlag); VdbeComment((v, "indicate data in accumulator")); diff --git a/src/update.c b/src/update.c index 74f247bb28..c814a5b68a 100644 --- a/src/update.c +++ b/src/update.c @@ -564,7 +564,7 @@ void sqlite3Update( } if( !isView ){ - int j1 = 0; /* Address of jump instruction */ + int addr1 = 0; /* Address of jump instruction */ int bReplace = 0; /* True if REPLACE conflict resolution might happen */ /* Do constraint checks. */ @@ -580,9 +580,9 @@ void sqlite3Update( /* Delete the index entries associated with the current record. */ if( bReplace || chngKey ){ if( pPk ){ - j1 = sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, 0, regKey, nKey); + addr1 = sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, 0, regKey, nKey); }else{ - j1 = sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, 0, regOldRowid); + addr1 = sqlite3VdbeAddOp3(v, OP_NotExists, iDataCur, 0, regOldRowid); } VdbeCoverageNeverTaken(v); } @@ -593,7 +593,7 @@ void sqlite3Update( sqlite3VdbeAddOp2(v, OP_Delete, iDataCur, 0); } if( bReplace || chngKey ){ - sqlite3VdbeJumpHere(v, j1); + sqlite3VdbeJumpHere(v, addr1); } if( hasFK ){ diff --git a/src/wherecode.c b/src/wherecode.c index a6c45f0321..910ff34e02 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -1266,7 +1266,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( if( pOrTerm->leftCursor==iCur || (pOrTerm->eOperator & WO_AND)!=0 ){ WhereInfo *pSubWInfo; /* Info for single OR-term scan */ Expr *pOrExpr = pOrTerm->pExpr; /* Current OR clause term */ - int j1 = 0; /* Address of jump operation */ + int jmp1 = 0; /* Address of jump operation */ if( pAndExpr && !ExprHasProperty(pOrExpr, EP_FromJoin) ){ pAndExpr->pLeft = pOrExpr; pOrExpr = pAndExpr; @@ -1293,7 +1293,8 @@ Bitmask sqlite3WhereCodeOneLoopStart( int iSet = ((ii==pOrWc->nTerm-1)?-1:ii); if( HasRowid(pTab) ){ r = sqlite3ExprCodeGetColumn(pParse, pTab, -1, iCur, regRowid, 0); - j1 = sqlite3VdbeAddOp4Int(v, OP_RowSetTest, regRowset, 0, r,iSet); + jmp1 = sqlite3VdbeAddOp4Int(v, OP_RowSetTest, regRowset, 0, + r,iSet); VdbeCoverage(v); }else{ Index *pPk = sqlite3PrimaryKeyIndex(pTab); @@ -1323,7 +1324,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( ** need to insert the key into the temp table, as it will never ** be tested for. */ if( iSet ){ - j1 = sqlite3VdbeAddOp4Int(v, OP_Found, regRowset, 0, r, nPk); + jmp1 = sqlite3VdbeAddOp4Int(v, OP_Found, regRowset, 0, r, nPk); VdbeCoverage(v); } if( iSet>=0 ){ @@ -1342,7 +1343,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( /* Jump here (skipping the main loop body subroutine) if the ** current sub-WHERE row is a duplicate from prior sub-WHEREs. */ - if( j1 ) sqlite3VdbeJumpHere(v, j1); + if( jmp1 ) sqlite3VdbeJumpHere(v, jmp1); /* The pSubWInfo->untestedTerms flag means that this OR term ** contained one or more AND term from a notReady table. The From c5971cc859d87f09785502644da5ecdaa3d2f3d2 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 10 Oct 2015 15:11:49 +0000 Subject: [PATCH 81/98] Omit the use of strcpy() in FTS5 since OpenBSD hates strcpy(). FossilOrigin-Name: bc24a5bbfd95df3518611b221de69b73776111bc --- ext/fts5/fts5_main.c | 7 ++++--- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index 0fe204a3eb..ebc0db751f 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -2215,14 +2215,16 @@ static int fts5CreateAux( int rc = sqlite3_overload_function(pGlobal->db, zName, -1); if( rc==SQLITE_OK ){ Fts5Auxiliary *pAux; + int nName; /* Size of zName in bytes, including \0 */ int nByte; /* Bytes of space to allocate */ - nByte = sizeof(Fts5Auxiliary) + strlen(zName) + 1; + nName = (int)strlen(zName) + 1; + nByte = sizeof(Fts5Auxiliary) + nName; pAux = (Fts5Auxiliary*)sqlite3_malloc(nByte); if( pAux ){ memset(pAux, 0, nByte); pAux->zFunc = (char*)&pAux[1]; - strcpy(pAux->zFunc, zName); + memcpy(pAux->zFunc, zName, nName); pAux->pGlobal = pGlobal; pAux->pUserData = pUserData; pAux->xFunc = xFunc; @@ -2494,4 +2496,3 @@ int sqlite3Fts5Init(sqlite3 *db){ return fts5Init(db); } #endif - diff --git a/manifest b/manifest index 3181c9f513..ce65d77a54 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Compiler\swarning\sfixes:\s\sRename\ssome\slocal\svariables\sfrom\s"j1"\sto\savoid\sa\nname\scollision\swith\sthe\sj1()\sbessel\sfunction\sin\sthe\smath\slibrary.\s\sOmit\sa\ndummy\sinitializer\sthat\sgcc\s4.6.3\sdoes\snot\slike. -D 2015-10-10T14:41:28.105 +C Omit\sthe\suse\sof\sstrcpy()\sin\sFTS5\ssince\sOpenBSD\shates\sstrcpy(). +D 2015-10-10T15:11:49.700 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f0088ff0d2ac949fce6de7c00f13a99ac5bdb663 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -113,7 +113,7 @@ F ext/fts5/fts5_config.c 57ee5fe71578cb494574fc0e6e51acb9a22a8695 F ext/fts5/fts5_expr.c 1df899afed24c9c6195eea1780dcc56fcd1d1139 F ext/fts5/fts5_hash.c 4bf4b99708848357b8a2b5819e509eb6d3df9246 F ext/fts5/fts5_index.c e03217c37f344f79673be385de6b03f732291000 -F ext/fts5/fts5_main.c 5125711e806d5d9382b4b12f71bd8a7b5e103ec6 +F ext/fts5/fts5_main.c 833150368303efe236def0f03ee17d3d4f1c1d4b F ext/fts5/fts5_storage.c df061a5caf9e50fbbd43113009b5b248362f4995 F ext/fts5/fts5_tcl.c 3bf445e66de32137d4693694ff7b1fd6074e32bd F ext/fts5/fts5_test_mi.c e96be827aa8f571031e65e481251dc1981d608bf @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P de28acd42f29693341feb884b7223cd3d2b96730 -R 7bd14eb389d990bdd306d4dfa0d204c7 +P 9ddef84d432813f3ece8012047d08441caa3315d +R e5629b6e9c75c27b580d6b996849f5e2 U drh -Z 96e28de24d5c75afd93b95f0019483d4 +Z b54cdc21ac2ceff0ade7c4edde93839a diff --git a/manifest.uuid b/manifest.uuid index e0d9d9b437..09e4694b0d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9ddef84d432813f3ece8012047d08441caa3315d \ No newline at end of file +bc24a5bbfd95df3518611b221de69b73776111bc \ No newline at end of file From 72724da95a15ff501e113db849021905daa5b354 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 10 Oct 2015 15:57:20 +0000 Subject: [PATCH 82/98] Remove another instance of strcpy() from FTS5, to mollify OpenBSD. FossilOrigin-Name: 35e6248abb4435a8b26d270092b856beff867406 --- ext/fts5/fts5_main.c | 6 ++++-- manifest | 12 ++++++------ manifest.uuid | 2 +- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index ebc0db751f..c2a37171ec 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -2252,15 +2252,17 @@ static int fts5CreateTokenizer( ){ Fts5Global *pGlobal = (Fts5Global*)pApi; Fts5TokenizerModule *pNew; + int nName; /* Size of zName and its \0 terminator */ int nByte; /* Bytes of space to allocate */ int rc = SQLITE_OK; - nByte = sizeof(Fts5TokenizerModule) + strlen(zName) + 1; + nName = (int)strlen(zName) + 1; + nByte = sizeof(Fts5TokenizerModule) + nName; pNew = (Fts5TokenizerModule*)sqlite3_malloc(nByte); if( pNew ){ memset(pNew, 0, nByte); pNew->zName = (char*)&pNew[1]; - strcpy(pNew->zName, zName); + memcpy(pNew->zName, zName, nName); pNew->pUserData = pUserData; pNew->x = *pTokenizer; pNew->xDestroy = xDestroy; diff --git a/manifest b/manifest index ce65d77a54..2e4d2de99b 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Omit\sthe\suse\sof\sstrcpy()\sin\sFTS5\ssince\sOpenBSD\shates\sstrcpy(). -D 2015-10-10T15:11:49.700 +C Remove\sanother\sinstance\sof\sstrcpy()\sfrom\sFTS5,\sto\smollify\sOpenBSD. +D 2015-10-10T15:57:20.187 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f0088ff0d2ac949fce6de7c00f13a99ac5bdb663 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -113,7 +113,7 @@ F ext/fts5/fts5_config.c 57ee5fe71578cb494574fc0e6e51acb9a22a8695 F ext/fts5/fts5_expr.c 1df899afed24c9c6195eea1780dcc56fcd1d1139 F ext/fts5/fts5_hash.c 4bf4b99708848357b8a2b5819e509eb6d3df9246 F ext/fts5/fts5_index.c e03217c37f344f79673be385de6b03f732291000 -F ext/fts5/fts5_main.c 833150368303efe236def0f03ee17d3d4f1c1d4b +F ext/fts5/fts5_main.c 36fa4fe8b80ba5d596fa6afb910d195f148fd9d2 F ext/fts5/fts5_storage.c df061a5caf9e50fbbd43113009b5b248362f4995 F ext/fts5/fts5_tcl.c 3bf445e66de32137d4693694ff7b1fd6074e32bd F ext/fts5/fts5_test_mi.c e96be827aa8f571031e65e481251dc1981d608bf @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 9ddef84d432813f3ece8012047d08441caa3315d -R e5629b6e9c75c27b580d6b996849f5e2 +P bc24a5bbfd95df3518611b221de69b73776111bc +R 35f43270ac91020433e35fde493807ce U drh -Z b54cdc21ac2ceff0ade7c4edde93839a +Z 62a6607ac126b7b5aac408948416878c diff --git a/manifest.uuid b/manifest.uuid index 09e4694b0d..99f29c9a8d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bc24a5bbfd95df3518611b221de69b73776111bc \ No newline at end of file +35e6248abb4435a8b26d270092b856beff867406 \ No newline at end of file From 48310f8c5131bd5d07228c7bf8af71553e2854c4 Mon Sep 17 00:00:00 2001 From: drh Date: Sat, 10 Oct 2015 16:41:28 +0000 Subject: [PATCH 83/98] Work around a "security feature" bug in memcpy() on OpenBSD. FossilOrigin-Name: fab6f09044d033dd09ed8a22e06bc6a7851bbabf --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/btree.c | 8 +++++++- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index 2e4d2de99b..fa290bfaef 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sanother\sinstance\sof\sstrcpy()\sfrom\sFTS5,\sto\smollify\sOpenBSD. -D 2015-10-10T15:57:20.187 +C Work\saround\sa\s"security\sfeature"\sbug\sin\smemcpy()\son\sOpenBSD. +D 2015-10-10T16:41:28.969 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f0088ff0d2ac949fce6de7c00f13a99ac5bdb663 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -285,7 +285,7 @@ F src/auth.c b56c78ebe40a2110fd361379f7e8162d23f92240 F src/backup.c c3a9c4209439b806c44cf30daf466955727bf46c F src/bitvec.c d1f21d7d91690747881f03940584f4cc548c9d3d F src/btmutex.c 45a968cc85afed9b5e6cf55bf1f42f8d18107f79 -F src/btree.c a5a653087ae98dd743d12ae0920d5b64c5335960 +F src/btree.c 0b74bc28b2dc907cba03b5b4b3b81584273be699 F src/btree.h 40189aefdc2b830d25c8b58fd7d56538481bfdd7 F src/btreeInt.h 8177c9ab90d772d6d2c6c517e05bed774b7c92c0 F src/build.c d6162335d690396dfc5c4bd59e8b2b0c14ba6285 @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P bc24a5bbfd95df3518611b221de69b73776111bc -R 35f43270ac91020433e35fde493807ce +P 35e6248abb4435a8b26d270092b856beff867406 +R 9fd826df5b8be6e5111bab176d72d145 U drh -Z 62a6607ac126b7b5aac408948416878c +Z 61d2ace382c5fa85de2f4090e2c287bd diff --git a/manifest.uuid b/manifest.uuid index 99f29c9a8d..ea0c817d83 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -35e6248abb4435a8b26d270092b856beff867406 \ No newline at end of file +fab6f09044d033dd09ed8a22e06bc6a7851bbabf \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 1eae0ac5d2..2c1a9983e5 100644 --- a/src/btree.c +++ b/src/btree.c @@ -6499,7 +6499,13 @@ static int pageInsertArray( if( pDataapCell[i], sz); + /* pSlot and pCArray->apCell[i] will never overlap on a well-formed + ** database. But they might for a corrupt database. Hence use memmove() + ** since memcpy() sends SIGABORT with overlapping buffers on OpenBSD */ + assert( (pSlot+sz)<=pCArray->apCell[i] + || pSlot>=(pCArray->apCell[i]+sz) + || CORRUPT_DB ); + memmove(pSlot, pCArray->apCell[i], sz); put2byte(pCellptr, (pSlot - aData)); pCellptr += 2; } From 5b66350ac70d98df05caee2953803f9175bebb46 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Sat, 10 Oct 2015 23:39:55 +0000 Subject: [PATCH 84/98] Enhance TclKit batch tool (and MSVC makefile) to support targets that require the Tcl stub library. FossilOrigin-Name: bc6223b1d6c31a47c7b734cfb8a9ecf15ab809fc --- Makefile.msc | 6 +++++- manifest | 14 +++++++------- manifest.uuid | 2 +- tool/GetTclKit.bat | 19 +++++++++++++++---- 4 files changed, 28 insertions(+), 13 deletions(-) diff --git a/Makefile.msc b/Makefile.msc index d838aa685c..d980e3c652 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -569,6 +569,10 @@ TCLLIBDIR = c:\tcl\lib LIBTCL = tcl85.lib !ENDIF +!IFNDEF LIBTCLSTUB +LIBTCLSTUB = tclstub85.lib +!ENDIF + # The locations of the ICU header and library files. These variables # (ICUINCDIR, ICULIBDIR, and LIBICU) may be overridden via the environment # prior to running nmake in order to match the actual installed location on @@ -1223,7 +1227,7 @@ libsqlite3.lib: $(LIBOBJ) $(LTLIB) $(LTLIBOPTS) /OUT:$@ $(LIBOBJ) $(TLIBS) libtclsqlite3.lib: tclsqlite.lo libsqlite3.lib - $(LTLIB) $(LTLIBOPTS) $(LTLIBPATHS) /OUT:$@ tclsqlite.lo libsqlite3.lib $(LIBTCL:tcl=tclstub) $(TLIBS) + $(LTLIB) $(LTLIBOPTS) $(LTLIBPATHS) /OUT:$@ tclsqlite.lo libsqlite3.lib $(LIBTCLSTUB) $(TLIBS) sqlite3.exe: $(TOP)\src\shell.c $(JSON1_DEP) $(SHELL_CORE_DEP) $(LIBRESOBJS) sqlite3.h $(LTLINK) $(SHELL_COMPILE_OPTS) $(JSON1_OPT) $(READLINE_FLAGS) $(TOP)\src\shell.c $(JSON1_SRC) \ diff --git a/manifest b/manifest index 7f0ed5c665..3b57e44a30 100644 --- a/manifest +++ b/manifest @@ -1,8 +1,8 @@ -C Remove\sa\scouple\ssuperfluous\sdouble\squotes\sin\sthe\sMSVC\smakefile. -D 2015-10-10T02:06:05.870 +C Enhance\sTclKit\sbatch\stool\s(and\sMSVC\smakefile)\sto\ssupport\stargets\sthat\srequire\sthe\sTcl\sstub\slibrary. +D 2015-10-10T23:39:55.377 F Makefile.in 2a247c733c2dd6fab703df04dd009b26413956f5 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 -F Makefile.msc b32cae4343a16d4eb1c0dec49ee6877e54ad9678 +F Makefile.msc f846966b1c38bdc12a384bd48bfbdb257fb5b558 F README.md 8ecc12493ff9f820cdea6520a9016001cb2e59b7 F VERSION ccfc4d1576dbfdeece0a4372a2e6a2e37d3e7975 F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 @@ -1332,7 +1332,7 @@ F test/wordcount.c 9915e06cb33d8ca8109b8700791afe80d305afda F test/zeroblob.test 3857870fe681b8185654414a9bccfde80b62a0fa F test/zerodamage.test cf6748bad89553cc1632be51a6f54e487e4039ac F tool/GetFile.cs a15e08acb5dd7539b75ba23501581d7c2b462cb5 -F tool/GetTclKit.bat 786f6a075beaa0187bd0e6751263f77f831bff77 +F tool/GetTclKit.bat 32000d7c7cb27e5aac5d58789535bb1be662138f F tool/addopcodes.tcl 7cc82ecca456a6b3148abf492b0419b83140881a F tool/build-all-msvc.bat 761d8c82a1a529261291812732a853a1b4256d85 x F tool/build-shell.sh 950f47c6174f1eea171319438b93ba67ff5bf367 @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P f8c2193b64979a2fe480fcf913573b5fac06235e -R 7cc2a5813618966360cf80bf66f0084c +P 0f9e205b28e013412b19dfd588f2a6cf341c40e8 +R 3257d1b5b394e4f53f94f7465d06faaf U mistachkin -Z d70bac36f21bbf58c368f1d4e150ed30 +Z ec0928dd2133e890176fa11b64cc0e8a diff --git a/manifest.uuid b/manifest.uuid index b2060c7cc5..b13e4b4a8a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0f9e205b28e013412b19dfd588f2a6cf341c40e8 \ No newline at end of file +bc6223b1d6c31a47c7b734cfb8a9ecf15ab809fc \ No newline at end of file diff --git a/tool/GetTclKit.bat b/tool/GetTclKit.bat index 5bd9ab6345..8e250d9793 100644 --- a/tool/GetTclKit.bat +++ b/tool/GetTclKit.bat @@ -75,10 +75,12 @@ IF /I "%PROCESSOR%" == "x86" ( GOTO usage ) +%_VECHO% TclKitVersion = '%TCLKIT_VERSION%' %_VECHO% TclKitPatchLevel = '%TCLKIT_PATCHLEVEL%' %_VECHO% TclKitNoSdk = '%TCLKIT_NOSDK%' %_VECHO% TclKitExe = '%TCLKIT_EXE%' %_VECHO% TclKitLib = '%TCLKIT_LIB%' +%_VECHO% TclKitLibStub = '%TCLKIT_LIB_STUB%' %_VECHO% TclKitSdk = '%TCLKIT_SDK%' %_VECHO% TclKitSdkZip = '%TCLKIT_SDK_ZIP%' %_VECHO% TclKitFiles = '%TCLKIT_FILES%' @@ -125,11 +127,13 @@ SET PATH=%FRAMEWORKDIR%;%PATH% :skip_addToPath -%__ECHO% csc.exe "/out:%TEMP%\GetFile.exe" /target:exe "%TOOLS%\GetFile.cs" +IF NOT EXIST "%TEMP%\GetFile.exe" ( + %__ECHO% csc.exe "/out:%TEMP%\GetFile.exe" /target:exe "%TOOLS%\GetFile.cs" -IF ERRORLEVEL 1 ( - ECHO Compilation of "%TOOLS%\GetFile.cs" failed. - GOTO errors + IF ERRORLEVEL 1 ( + ECHO Compilation of "%TOOLS%\GetFile.cs" failed. + GOTO errors + ) ) FOR %%F IN (%TCLKIT_FILES%) DO ( @@ -170,6 +174,7 @@ IF DEFINED TCLKIT_NOSDK GOTO skip_sdkVariables %__ECHO% ECHO SET TCLINCDIR=%TEMP%\%TCLKIT_SDK%\include%APPEND%"%ROOT%\SetTclKitEnv.bat" %__ECHO% ECHO SET TCLLIBDIR=%TEMP%\%TCLKIT_SDK%\lib%APPEND%"%ROOT%\SetTclKitEnv.bat" %__ECHO% ECHO SET LIBTCL=%TCLKIT_LIB%%APPEND%"%ROOT%\SetTclKitEnv.bat" +%__ECHO% ECHO SET LIBTCLSTUB=%TCLKIT_LIB_STUB%%APPEND%"%ROOT%\SetTclKitEnv.bat" :skip_sdkVariables @@ -184,8 +189,11 @@ GOTO no_errors IF NOT DEFINED TCLKIT_PATCHLEVEL ( SET TCLKIT_PATCHLEVEL=8.6.4 ) + SET TCLKIT_VERSION=%TCLKIT_PATCHLEVEL:.=% + SET TCLKIT_VERSION=%TCLKIT_VERSION:~0,2% SET TCLKIT_EXE=tclkit-%TCLKIT_PATCHLEVEL%.exe SET TCLKIT_LIB=libtclkit%TCLKIT_PATCHLEVEL:.=%.lib + SET TCLKIT_LIB_STUB=libtclstub%TCLKIT_VERSION:.=%.a SET TCLKIT_SDK=libtclkit-sdk-x86-%TCLKIT_PATCHLEVEL% SET TCLKIT_SDK_ZIP=%TCLKIT_SDK%.zip SET TCLKIT_FILES=%TCLKIT_EXE% unzip.exe %TCLKIT_SDK_ZIP% @@ -204,7 +212,10 @@ GOTO no_errors ) ELSE ( SET TCLKIT_EXE=tclkit-%TCLKIT_PATCHLEVEL%.exe ) + SET TCLKIT_VERSION=%TCLKIT_PATCHLEVEL:.=% + SET TCLKIT_VERSION=%TCLKIT_VERSION:~0,2% SET TCLKIT_LIB=libtclkit%TCLKIT_PATCHLEVEL:.=%.lib + SET TCLKIT_LIB_STUB=libtclstub%TCLKIT_VERSION:.=%.a SET TCLKIT_SDK=libtclkit-sdk-x64-%TCLKIT_PATCHLEVEL% SET TCLKIT_SDK_ZIP=%TCLKIT_SDK%.zip SET TCLKIT_FILES=%TCLKIT_EXE% unzip.exe %TCLKIT_SDK_ZIP% From d12b636330335bde32dd1de144596f87683cdf9d Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 11 Oct 2015 19:46:59 +0000 Subject: [PATCH 85/98] Improved substitution logic in the query flattener. Saves code space, and (more importantly) works correctly with table-valued functions. FossilOrigin-Name: 3d0bd95e977db50c314d33ec292f99e0539d7b4a --- manifest | 14 +++++------ manifest.uuid | 2 +- src/select.c | 58 +++++++++++++++++++-------------------------- test/tabfunc01.test | 6 ++++- 4 files changed, 38 insertions(+), 42 deletions(-) diff --git a/manifest b/manifest index fa290bfaef..2aad6581bf 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Work\saround\sa\s"security\sfeature"\sbug\sin\smemcpy()\son\sOpenBSD. -D 2015-10-10T16:41:28.969 +C Improved\ssubstitution\slogic\sin\sthe\squery\sflattener.\s\sSaves\scode\sspace,\sand\n(more\simportantly)\sworks\scorrectly\swith\stable-valued\sfunctions. +D 2015-10-11T19:46:59.677 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f0088ff0d2ac949fce6de7c00f13a99ac5bdb663 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -343,7 +343,7 @@ F src/printf.c 0c4bcdd1c2e2521024f0a69cb5eb334f86b3652a F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 F src/resolve.c 1954a0f01bf65d78d7d559aea3d5c67f33376d91 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e -F src/select.c 36c05502d5aef2a14aff3f7faba95b0c7d87ca9a +F src/select.c 0e0899675f9f2bdf93f5779906709f5c3009d465 F src/shell.c d25df04168d6ba5a4fa05bdbf859df667f9eb621 F src/sqlite.h.in 4b76d74d69af48c534c58fb723137dc6944bdedc F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad @@ -1048,7 +1048,7 @@ F test/superlock.test 1cde669f68d2dd37d6c9bd35eee1d95491ae3fc2 F test/sync.test a34cd43e98b7fb84eabbf38f7ed8f7349b3f3d85 F test/syscall.test d2fdaad713f103ac611fe7ef9b724c7b69f8149c F test/sysfault.test fa776e60bf46bdd3ae69f0b73e46ee3977a58ae6 -F test/tabfunc01.test 83e63be7b6e3f67b6a03519c9c61bc68efb25f31 +F test/tabfunc01.test 03c4ad422c6ab596cff6dcaf86dd061a9f039525 F test/table.test b708f3e5fa2542fa51dfab21fc07b36ea445cb2f F test/tableapi.test 2674633fa95d80da917571ebdd759a14d9819126 F test/tableopts.test dba698ba97251017b7c80d738c198d39ab747930 @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 35e6248abb4435a8b26d270092b856beff867406 -R 9fd826df5b8be6e5111bab176d72d145 +P fab6f09044d033dd09ed8a22e06bc6a7851bbabf +R 0a60e7c34e5485b5033bf31572e696c0 U drh -Z 61d2ace382c5fa85de2f4090e2c287bd +Z 976ba04014f2425afb980aca8bc89218 diff --git a/manifest.uuid b/manifest.uuid index ea0c817d83..a287e72de8 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -fab6f09044d033dd09ed8a22e06bc6a7851bbabf \ No newline at end of file +3d0bd95e977db50c314d33ec292f99e0539d7b4a \ No newline at end of file diff --git a/src/select.c b/src/select.c index c865472334..1010289aa5 100644 --- a/src/select.c +++ b/src/select.c @@ -3082,7 +3082,7 @@ static int multiSelectOrderBy( #if !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) /* Forward Declarations */ static void substExprList(sqlite3*, ExprList*, int, ExprList*); -static void substSelect(sqlite3*, Select *, int, ExprList *); +static void substSelect(sqlite3*, Select *, int, ExprList*, int); /* ** Scan through the expression pExpr. Replace every reference to @@ -3119,7 +3119,7 @@ static Expr *substExpr( pExpr->pLeft = substExpr(db, pExpr->pLeft, iTable, pEList); pExpr->pRight = substExpr(db, pExpr->pRight, iTable, pEList); if( ExprHasProperty(pExpr, EP_xIsSelect) ){ - substSelect(db, pExpr->x.pSelect, iTable, pEList); + substSelect(db, pExpr->x.pSelect, iTable, pEList, 1); }else{ substExprList(db, pExpr->x.pList, iTable, pEList); } @@ -3142,25 +3142,29 @@ static void substSelect( sqlite3 *db, /* Report malloc errors here */ Select *p, /* SELECT statement in which to make substitutions */ int iTable, /* Table to be replaced */ - ExprList *pEList /* Substitute values */ + ExprList *pEList, /* Substitute values */ + int doPrior /* Do substitutes on p->pPrior too */ ){ SrcList *pSrc; struct SrcList_item *pItem; int i; if( !p ) return; - substExprList(db, p->pEList, iTable, pEList); - substExprList(db, p->pGroupBy, iTable, pEList); - substExprList(db, p->pOrderBy, iTable, pEList); - p->pHaving = substExpr(db, p->pHaving, iTable, pEList); - p->pWhere = substExpr(db, p->pWhere, iTable, pEList); - substSelect(db, p->pPrior, iTable, pEList); - pSrc = p->pSrc; - assert( pSrc ); /* Even for (SELECT 1) we have: pSrc!=0 but pSrc->nSrc==0 */ - if( ALWAYS(pSrc) ){ - for(i=pSrc->nSrc, pItem=pSrc->a; i>0; i--, pItem++){ - substSelect(db, pItem->pSelect, iTable, pEList); + do{ + substExprList(db, p->pEList, iTable, pEList); + substExprList(db, p->pGroupBy, iTable, pEList); + substExprList(db, p->pOrderBy, iTable, pEList); + p->pHaving = substExpr(db, p->pHaving, iTable, pEList); + p->pWhere = substExpr(db, p->pWhere, iTable, pEList); + pSrc = p->pSrc; + if( pSrc ){ + for(i=pSrc->nSrc, pItem=pSrc->a; i>0; i--, pItem++){ + substSelect(db, pItem->pSelect, iTable, pEList, 1); + if( pItem->fg.isTabFunc ){ + substExprList(db, pItem->u1.pFuncArg, iTable, pEList); + } + } } - } + }while( doPrior && (p = p->pPrior)!=0 ); } #endif /* !defined(SQLITE_OMIT_SUBQUERY) || !defined(SQLITE_OMIT_VIEW) */ @@ -3312,7 +3316,7 @@ static int flattenSubquery( int subqueryIsAgg /* True if the subquery uses aggregate functions */ ){ const char *zSavedAuthContext = pParse->zAuthContext; - Select *pParent; + Select *pParent; /* Current UNION ALL term of the other query */ Select *pSub; /* The inner query or "subquery" */ Select *pSub1; /* Pointer to the rightmost select in sub-query */ SrcList *pSrc; /* The FROM clause of the outer query */ @@ -3607,9 +3611,9 @@ static int flattenSubquery( ** ** The outer query has 3 slots in its FROM clause. One slot of the ** outer query (the middle slot) is used by the subquery. The next - ** block of code will expand the out query to 4 slots. The middle - ** slot is expanded to two slots in order to make space for the - ** two elements in the FROM clause of the subquery. + ** block of code will expand the outer query FROM clause to 4 slots. + ** The middle slot is expanded to two slots in order to make space + ** for the two elements in the FROM clause of the subquery. */ if( nSubSrc>1 ){ pParent->pSrc = pSrc = sqlite3SrcListEnlarge(db, pSrc, nSubSrc-1,iFrom+1); @@ -3648,11 +3652,6 @@ static int flattenSubquery( pList->a[i].zName = zName; } } - substExprList(db, pParent->pEList, iParent, pSub->pEList); - if( isAgg ){ - substExprList(db, pParent->pGroupBy, iParent, pSub->pEList); - pParent->pHaving = substExpr(db, pParent->pHaving, iParent, pSub->pEList); - } if( pSub->pOrderBy ){ /* At this point, any non-zero iOrderByCol values indicate that the ** ORDER BY column expression is identical to the iOrderByCol'th @@ -3672,27 +3671,20 @@ static int flattenSubquery( assert( pSub->pPrior==0 ); pParent->pOrderBy = pOrderBy; pSub->pOrderBy = 0; - }else if( pParent->pOrderBy ){ - substExprList(db, pParent->pOrderBy, iParent, pSub->pEList); - } - if( pSub->pWhere ){ - pWhere = sqlite3ExprDup(db, pSub->pWhere, 0); - }else{ - pWhere = 0; } + pWhere = sqlite3ExprDup(db, pSub->pWhere, 0); if( subqueryIsAgg ){ assert( pParent->pHaving==0 ); pParent->pHaving = pParent->pWhere; pParent->pWhere = pWhere; - pParent->pHaving = substExpr(db, pParent->pHaving, iParent, pSub->pEList); pParent->pHaving = sqlite3ExprAnd(db, pParent->pHaving, sqlite3ExprDup(db, pSub->pHaving, 0)); assert( pParent->pGroupBy==0 ); pParent->pGroupBy = sqlite3ExprListDup(db, pSub->pGroupBy, 0); }else{ - pParent->pWhere = substExpr(db, pParent->pWhere, iParent, pSub->pEList); pParent->pWhere = sqlite3ExprAnd(db, pParent->pWhere, pWhere); } + substSelect(db, pParent, iParent, pSub->pEList, 0); /* The flattened query is distinct if either the inner or the ** outer query is distinct. diff --git a/test/tabfunc01.test b/test/tabfunc01.test index 5bd729b87d..47af39606e 100644 --- a/test/tabfunc01.test +++ b/test/tabfunc01.test @@ -75,8 +75,12 @@ do_execsql_test tabfunc01-2.1 { INSERT INTO t1(x) VALUES(2),(3); SELECT *, '|' FROM t1, generate_series(1,x) ORDER BY 1, 2 } {2 1 | 2 2 | 3 1 | 3 2 | 3 3 |} - do_execsql_test tabfunc01-2.2 { + SELECT *, '|' FROM (SELECT x FROM t1) AS y, generate_series(1,y.x) + ORDER BY 1, 2; +} {2 1 | 2 2 | 3 1 | 3 2 | 3 3 |} + +do_execsql_test tabfunc01-2.50 { SELECT * FROM generate_series() LIMIT 5; } {0 1 2 3 4} From 2906490b716daac524fbb3c1863c3ab9f4e2fc64 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 11 Oct 2015 20:08:31 +0000 Subject: [PATCH 86/98] Remove an unreachable branch in the query flattener substitution logic. FossilOrigin-Name: 46ee3453a31b5e793d5aaad471cec1b1a11ab2cf --- manifest | 12 ++++++------ manifest.uuid | 2 +- src/select.c | 11 +++++------ 3 files changed, 12 insertions(+), 13 deletions(-) diff --git a/manifest b/manifest index 2aad6581bf..a6ed3fb2d1 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Improved\ssubstitution\slogic\sin\sthe\squery\sflattener.\s\sSaves\scode\sspace,\sand\n(more\simportantly)\sworks\scorrectly\swith\stable-valued\sfunctions. -D 2015-10-11T19:46:59.677 +C Remove\san\sunreachable\sbranch\sin\sthe\squery\sflattener\ssubstitution\slogic. +D 2015-10-11T20:08:31.981 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f0088ff0d2ac949fce6de7c00f13a99ac5bdb663 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -343,7 +343,7 @@ F src/printf.c 0c4bcdd1c2e2521024f0a69cb5eb334f86b3652a F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 F src/resolve.c 1954a0f01bf65d78d7d559aea3d5c67f33376d91 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e -F src/select.c 0e0899675f9f2bdf93f5779906709f5c3009d465 +F src/select.c f70b36caa607655a8417198389f1802a56b1c8b6 F src/shell.c d25df04168d6ba5a4fa05bdbf859df667f9eb621 F src/sqlite.h.in 4b76d74d69af48c534c58fb723137dc6944bdedc F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P fab6f09044d033dd09ed8a22e06bc6a7851bbabf -R 0a60e7c34e5485b5033bf31572e696c0 +P 3d0bd95e977db50c314d33ec292f99e0539d7b4a +R 0631d5a91a7b127155b4e818909096dd U drh -Z 976ba04014f2425afb980aca8bc89218 +Z ec249e682dee8ecef8754c1790b6f485 diff --git a/manifest.uuid b/manifest.uuid index a287e72de8..8d1e749a05 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3d0bd95e977db50c314d33ec292f99e0539d7b4a \ No newline at end of file +46ee3453a31b5e793d5aaad471cec1b1a11ab2cf \ No newline at end of file diff --git a/src/select.c b/src/select.c index 1010289aa5..566cec44b8 100644 --- a/src/select.c +++ b/src/select.c @@ -3156,12 +3156,11 @@ static void substSelect( p->pHaving = substExpr(db, p->pHaving, iTable, pEList); p->pWhere = substExpr(db, p->pWhere, iTable, pEList); pSrc = p->pSrc; - if( pSrc ){ - for(i=pSrc->nSrc, pItem=pSrc->a; i>0; i--, pItem++){ - substSelect(db, pItem->pSelect, iTable, pEList, 1); - if( pItem->fg.isTabFunc ){ - substExprList(db, pItem->u1.pFuncArg, iTable, pEList); - } + assert( pSrc!=0 ); + for(i=pSrc->nSrc, pItem=pSrc->a; i>0; i--, pItem++){ + substSelect(db, pItem->pSelect, iTable, pEList, 1); + if( pItem->fg.isTabFunc ){ + substExprList(db, pItem->u1.pFuncArg, iTable, pEList); } } }while( doPrior && (p = p->pPrior)!=0 ); From bfad7be78a7080c49b56bb65428d3078972f18e5 Mon Sep 17 00:00:00 2001 From: drh Date: Sun, 11 Oct 2015 20:39:46 +0000 Subject: [PATCH 87/98] Detect and report circularly defined views even if the views have the columns defined in the CREATE VIEW statement. FossilOrigin-Name: 9ab9c8c6d747647f8ade58c2c4812fc69a813368 --- manifest | 14 +++++++------- manifest.uuid | 2 +- src/select.c | 4 ++++ test/view.test | 7 +++++++ 4 files changed, 19 insertions(+), 8 deletions(-) diff --git a/manifest b/manifest index a6ed3fb2d1..5893122f2e 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\san\sunreachable\sbranch\sin\sthe\squery\sflattener\ssubstitution\slogic. -D 2015-10-11T20:08:31.981 +C Detect\sand\sreport\scircularly\sdefined\sviews\seven\sif\sthe\sviews\shave\sthe\ncolumns\sdefined\sin\sthe\sCREATE\sVIEW\sstatement. +D 2015-10-11T20:39:46.984 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f0088ff0d2ac949fce6de7c00f13a99ac5bdb663 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -343,7 +343,7 @@ F src/printf.c 0c4bcdd1c2e2521024f0a69cb5eb334f86b3652a F src/random.c ba2679f80ec82c4190062d756f22d0c358180696 F src/resolve.c 1954a0f01bf65d78d7d559aea3d5c67f33376d91 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e -F src/select.c f70b36caa607655a8417198389f1802a56b1c8b6 +F src/select.c 0bc9cd2e1cacfdc9cdc9a83884cc100f166e80a4 F src/shell.c d25df04168d6ba5a4fa05bdbf859df667f9eb621 F src/sqlite.h.in 4b76d74d69af48c534c58fb723137dc6944bdedc F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad @@ -1253,7 +1253,7 @@ F test/vacuum3.test 77ecdd54592b45a0bcb133339f99f1ae0ae94d0d F test/vacuum4.test d3f8ecff345f166911568f397d2432c16d2867d9 F test/varint.test ab7b110089a08b9926ed7390e7e97bdefeb74102 F test/veryquick.test 57ab846bacf7b90cf4e9a672721ea5c5b669b661 -F test/view.test 0d8935e64867ae01492347884f5cbb47f056f4c8 +F test/view.test f6c3a39e0c819891265e1d0754e99960d81ef6c9 F test/vtab1.test 6210e076997f176bedc300a87ad6404651b601dd F test/vtab2.test f8cd1bb9aba7143eba97812d9617880a36d247ad F test/vtab3.test b45f47d20f225ccc9c28dc915d92740c2dee311e @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 3d0bd95e977db50c314d33ec292f99e0539d7b4a -R 0631d5a91a7b127155b4e818909096dd +P 46ee3453a31b5e793d5aaad471cec1b1a11ab2cf +R f02e8925b44dc59b1569a7e5ccbd6813 U drh -Z ec249e682dee8ecef8754c1790b6f485 +Z 2390f857ae51a8bc2278cbec6c80566a diff --git a/manifest.uuid b/manifest.uuid index 8d1e749a05..678dba625e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -46ee3453a31b5e793d5aaad471cec1b1a11ab2cf \ No newline at end of file +9ab9c8c6d747647f8ade58c2c4812fc69a813368 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 566cec44b8..fad46f0b47 100644 --- a/src/select.c +++ b/src/select.c @@ -4248,6 +4248,7 @@ static int selectExpander(Walker *pWalker, Select *p){ pTab->nRef++; #if !defined(SQLITE_OMIT_VIEW) || !defined (SQLITE_OMIT_VIRTUALTABLE) if( pTab->pSelect || IsVirtual(pTab) ){ + i16 nCol; if( sqlite3ViewGetColumnNames(pParse, pTab) ) return WRC_Abort; assert( pFrom->pSelect==0 ); if( pFrom->fg.isTabFunc && !IsVirtual(pTab) ){ @@ -4256,7 +4257,10 @@ static int selectExpander(Walker *pWalker, Select *p){ } pFrom->pSelect = sqlite3SelectDup(db, pTab->pSelect, 0); sqlite3SelectSetName(pFrom->pSelect, pTab->zName); + nCol = pTab->nCol; + pTab->nCol = -1; sqlite3WalkSelect(pWalker, pFrom->pSelect); + pTab->nCol = nCol; } #endif } diff --git a/test/view.test b/test/view.test index 0b8354a38e..235f8605ac 100644 --- a/test/view.test +++ b/test/view.test @@ -499,6 +499,13 @@ do_test view-14.1 { SELECT * FROM temp.t1; } } {1 {view t1 is circularly defined}} +do_test view-14.2 { + catchsql { + DROP VIEW IF EXISTS temp.t1; + CREATE TEMP VIEW t1(a,b) AS SELECT a,b FROM t1; + SELECT * FROM temp.t1; + } +} {1 {view t1 is circularly defined}} # Tickets #1688, #1709 # From cf9fb7eb1c81eee0c37ff9f065da093ff6bf976c Mon Sep 17 00:00:00 2001 From: mistachkin Date: Mon, 12 Oct 2015 03:44:39 +0000 Subject: [PATCH 88/98] The TclKit batch tool should not download the TclKit SDK when the TCLKIT_NOSDK environment variable is set. FossilOrigin-Name: 7c5d583bac89f8db94e7f73df09e1d04f0f24990 --- manifest | 12 ++++++------ manifest.uuid | 2 +- tool/GetTclKit.bat | 10 ++++++++-- 3 files changed, 15 insertions(+), 9 deletions(-) diff --git a/manifest b/manifest index 3b57e44a30..1dab58c169 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Enhance\sTclKit\sbatch\stool\s(and\sMSVC\smakefile)\sto\ssupport\stargets\sthat\srequire\sthe\sTcl\sstub\slibrary. -D 2015-10-10T23:39:55.377 +C The\sTclKit\sbatch\stool\sshould\snot\sdownload\sthe\sTclKit\sSDK\swhen\sthe\sTCLKIT_NOSDK\senvironment\svariable\sis\sset. +D 2015-10-12T03:44:39.745 F Makefile.in 2a247c733c2dd6fab703df04dd009b26413956f5 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc f846966b1c38bdc12a384bd48bfbdb257fb5b558 @@ -1332,7 +1332,7 @@ F test/wordcount.c 9915e06cb33d8ca8109b8700791afe80d305afda F test/zeroblob.test 3857870fe681b8185654414a9bccfde80b62a0fa F test/zerodamage.test cf6748bad89553cc1632be51a6f54e487e4039ac F tool/GetFile.cs a15e08acb5dd7539b75ba23501581d7c2b462cb5 -F tool/GetTclKit.bat 32000d7c7cb27e5aac5d58789535bb1be662138f +F tool/GetTclKit.bat f8159730269bdbf5c334383134011dda4df45511 F tool/addopcodes.tcl 7cc82ecca456a6b3148abf492b0419b83140881a F tool/build-all-msvc.bat 761d8c82a1a529261291812732a853a1b4256d85 x F tool/build-shell.sh 950f47c6174f1eea171319438b93ba67ff5bf367 @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 0f9e205b28e013412b19dfd588f2a6cf341c40e8 -R 3257d1b5b394e4f53f94f7465d06faaf +P bc6223b1d6c31a47c7b734cfb8a9ecf15ab809fc +R 47fe09613250f52fb94741367469a8c4 U mistachkin -Z ec0928dd2133e890176fa11b64cc0e8a +Z c3b529016ed8bb4851b8f9db9d7c6231 diff --git a/manifest.uuid b/manifest.uuid index b13e4b4a8a..d600833764 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bc6223b1d6c31a47c7b734cfb8a9ecf15ab809fc \ No newline at end of file +7c5d583bac89f8db94e7f73df09e1d04f0f24990 \ No newline at end of file diff --git a/tool/GetTclKit.bat b/tool/GetTclKit.bat index 8e250d9793..31988aadac 100644 --- a/tool/GetTclKit.bat +++ b/tool/GetTclKit.bat @@ -196,7 +196,10 @@ GOTO no_errors SET TCLKIT_LIB_STUB=libtclstub%TCLKIT_VERSION:.=%.a SET TCLKIT_SDK=libtclkit-sdk-x86-%TCLKIT_PATCHLEVEL% SET TCLKIT_SDK_ZIP=%TCLKIT_SDK%.zip - SET TCLKIT_FILES=%TCLKIT_EXE% unzip.exe %TCLKIT_SDK_ZIP% + SET TCLKIT_FILES=%TCLKIT_EXE% + IF NOT DEFINED TCLKIT_NOSDK ( + SET TCLKIT_FILES=%TCLKIT_FILES% unzip.exe %TCLKIT_SDK_ZIP% + ) GOTO :EOF :fn_TclKitX64Variables @@ -218,7 +221,10 @@ GOTO no_errors SET TCLKIT_LIB_STUB=libtclstub%TCLKIT_VERSION:.=%.a SET TCLKIT_SDK=libtclkit-sdk-x64-%TCLKIT_PATCHLEVEL% SET TCLKIT_SDK_ZIP=%TCLKIT_SDK%.zip - SET TCLKIT_FILES=%TCLKIT_EXE% unzip.exe %TCLKIT_SDK_ZIP% + SET TCLKIT_FILES=%TCLKIT_EXE% + IF NOT DEFINED TCLKIT_NOSDK ( + SET TCLKIT_FILES=%TCLKIT_FILES% unzip.exe %TCLKIT_SDK_ZIP% + ) GOTO :EOF :fn_UnquoteVariable From fcbe99ae3850b4aa1689cd458151890723af0f2d Mon Sep 17 00:00:00 2001 From: mistachkin Date: Mon, 12 Oct 2015 03:56:21 +0000 Subject: [PATCH 89/98] Remove AWK requirement from the MSVC batch build tool. FossilOrigin-Name: 6d9cdb931cf4e2f0830184cff32e441e4966bd7e --- manifest | 12 ++++++------ manifest.uuid | 2 +- tool/build-all-msvc.bat | 33 +++++++++++++++------------------ 3 files changed, 22 insertions(+), 25 deletions(-) diff --git a/manifest b/manifest index 1dab58c169..439f387bb5 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C The\sTclKit\sbatch\stool\sshould\snot\sdownload\sthe\sTclKit\sSDK\swhen\sthe\sTCLKIT_NOSDK\senvironment\svariable\sis\sset. -D 2015-10-12T03:44:39.745 +C Remove\sAWK\srequirement\sfrom\sthe\sMSVC\sbatch\sbuild\stool. +D 2015-10-12T03:56:21.327 F Makefile.in 2a247c733c2dd6fab703df04dd009b26413956f5 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc f846966b1c38bdc12a384bd48bfbdb257fb5b558 @@ -1334,7 +1334,7 @@ F test/zerodamage.test cf6748bad89553cc1632be51a6f54e487e4039ac F tool/GetFile.cs a15e08acb5dd7539b75ba23501581d7c2b462cb5 F tool/GetTclKit.bat f8159730269bdbf5c334383134011dda4df45511 F tool/addopcodes.tcl 7cc82ecca456a6b3148abf492b0419b83140881a -F tool/build-all-msvc.bat 761d8c82a1a529261291812732a853a1b4256d85 x +F tool/build-all-msvc.bat 2b1703b322da121e56b955cb58de091107f777c3 x F tool/build-shell.sh 950f47c6174f1eea171319438b93ba67ff5bf367 F tool/checkSpacing.c 810e51703529a204fc4e1eb060e9ab663e3c06d2 F tool/extract.c 054069d81b095fbdc189a6f5d4466e40380505e2 @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P bc6223b1d6c31a47c7b734cfb8a9ecf15ab809fc -R 47fe09613250f52fb94741367469a8c4 +P 7c5d583bac89f8db94e7f73df09e1d04f0f24990 +R 47cd1b08f2579a86c3f7eed6daa15a48 U mistachkin -Z c3b529016ed8bb4851b8f9db9d7c6231 +Z 42590804f6e58f764778427b7ddbdea9 diff --git a/manifest.uuid b/manifest.uuid index d600833764..03917d0b4d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7c5d583bac89f8db94e7f73df09e1d04f0f24990 \ No newline at end of file +6d9cdb931cf4e2f0830184cff32e441e4966bd7e \ No newline at end of file diff --git a/tool/build-all-msvc.bat b/tool/build-all-msvc.bat index 4842dc4074..a8ba1bc293 100755 --- a/tool/build-all-msvc.bat +++ b/tool/build-all-msvc.bat @@ -29,9 +29,9 @@ REM source tree for SQLite and "C:\Temp" represents the final destination REM directory for the generated output files. REM REM Please note that the SQLite build process performed by the Makefile -REM associated with this batch script requires both Gawk ^(gawk.exe^) and Tcl -REM 8.5 ^(tclsh85.exe^) to be present in a directory contained in the PATH -REM environment variable unless a pre-existing amalgamation file is used. +REM associated with this batch script requires a Tcl shell to be present +REM in a directory contained in the PATH environment variable unless a +REM pre-existing amalgamation file is used. REM REM There are several environment variables that may be set to modify the REM behavior of this batch script and its associated Makefile. The list of @@ -232,25 +232,22 @@ REM NOTE: Check for the external tools needed during the build process ^(i.e. REM those that do not get compiled as part of the build process itself^) REM along the PATH. REM -FOR %%T IN (gawk.exe tclsh85.exe) DO ( +IF DEFINED TCLSH_CMD ( + SET TCLSH_FILE=%TCLSH_CMD% +) ELSE ( + SET TCLSH_FILE=tclsh85.exe +) + +FOR %%T IN (%TCLSH_FILE%) DO ( SET %%T_PATH=%%~dp$PATH:T ) REM -REM NOTE: The Gawk executable "gawk.exe" is required during the SQLite build -REM process unless a pre-existing amalgamation file is used. +REM NOTE: A Tcl shell executable is required during the SQLite build process +REM unless a pre-existing amalgamation file is used. REM -IF NOT DEFINED gawk.exe_PATH ( - ECHO The Gawk executable "gawk.exe" is required to be in the PATH. - GOTO errors -) - -REM -REM NOTE: The Tcl 8.5 executable "tclsh85.exe" is required during the SQLite -REM build process unless a pre-existing amalgamation file is used. -REM -IF NOT DEFINED tclsh85.exe_PATH ( - ECHO The Tcl 8.5 executable "tclsh85.exe" is required to be in the PATH. +IF NOT DEFINED %TCLSH_FILE%_PATH ( + ECHO The Tcl shell executable "%TCLSH_FILE%" is required to be in the PATH. GOTO errors ) @@ -258,7 +255,7 @@ REM REM NOTE: Set the TOOLPATH variable to contain all the directories where the REM external tools were found in the search above. REM -SET TOOLPATH=%gawk.exe_PATH%;%tclsh85.exe_PATH% +CALL :fn_CopyVariable %TCLSH_FILE%_PATH TOOLPATH %_VECHO% ToolPath = '%TOOLPATH%' From 58a8a9236efe5e925854f00d715834a56e178b0d Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 12 Oct 2015 04:56:12 +0000 Subject: [PATCH 90/98] Change all references to 3.8.12 into 3.9.0. Comment changes only - no changes to code. FossilOrigin-Name: 6f2858f6817ca70c132f0437ac2f0f74deb273d2 --- manifest | 16 ++++++++-------- manifest.uuid | 2 +- src/loadext.c | 2 +- src/sqlite.h.in | 6 +++--- src/sqlite3ext.h | 4 ++-- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/manifest b/manifest index 5893122f2e..3e2bd9208d 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Detect\sand\sreport\scircularly\sdefined\sviews\seven\sif\sthe\sviews\shave\sthe\ncolumns\sdefined\sin\sthe\sCREATE\sVIEW\sstatement. -D 2015-10-11T20:39:46.984 +C Change\sall\sreferences\sto\s3.8.12\sinto\s3.9.0.\s\sComment\schanges\sonly\s-\sno\nchanges\sto\scode. +D 2015-10-12T04:56:12.349 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f0088ff0d2ac949fce6de7c00f13a99ac5bdb663 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -307,7 +307,7 @@ F src/insert.c 3c522beb5bf50a2efee1fca1e80fd40942e5817c F src/journal.c b4124532212b6952f42eb2c12fa3c25701d8ba8d F src/legacy.c ba1863ea58c4c840335a84ec276fc2b25e22bc4e F src/lempar.c d344a95d60c24e2f490ee59db9784b1b17439012 -F src/loadext.c b3f1a529245b14c881b270a9f29fae6c5727cde8 +F src/loadext.c c5916a158f1fb74d955847c84f7ebdb6f5de9d8c F src/main.c fec97668771438033a7559883401067b139729e1 F src/malloc.c 3a37ce6979a40f499d8cea9e9ab4e8517854d35d F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 @@ -345,9 +345,9 @@ F src/resolve.c 1954a0f01bf65d78d7d559aea3d5c67f33376d91 F src/rowset.c eccf6af6d620aaa4579bd3b72c1b6395d9e9fa1e F src/select.c 0bc9cd2e1cacfdc9cdc9a83884cc100f166e80a4 F src/shell.c d25df04168d6ba5a4fa05bdbf859df667f9eb621 -F src/sqlite.h.in 4b76d74d69af48c534c58fb723137dc6944bdedc +F src/sqlite.h.in dc35357824c6bb84a04acd4e99dee3e07299a8c6 F src/sqlite3.rc 992c9f5fb8285ae285d6be28240a7e8d3a7f2bad -F src/sqlite3ext.h 64350bf36833a56ad675e27392a913f417c5c308 +F src/sqlite3ext.h 4b66e3e3435da4b4c8c83696d0349f0c503b3924 F src/sqliteInt.h e21cc96bc24161df7373f6b24367cf580496889d F src/sqliteLimit.h 216557999cb45f2e3578ed53ebefe228d779cb46 F src/status.c f266ad8a2892d659b74f0f50cb6a88b6e7c12179 @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 46ee3453a31b5e793d5aaad471cec1b1a11ab2cf -R f02e8925b44dc59b1569a7e5ccbd6813 +P 9ab9c8c6d747647f8ade58c2c4812fc69a813368 +R 84edb3e7271e5a0e0aa256262a048c3a U drh -Z 2390f857ae51a8bc2278cbec6c80566a +Z 934ebb8a1ac47019300027e32a36b72c diff --git a/manifest.uuid b/manifest.uuid index 678dba625e..f2eda9b02d 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9ab9c8c6d747647f8ade58c2c4812fc69a813368 \ No newline at end of file +6f2858f6817ca70c132f0437ac2f0f74deb273d2 \ No newline at end of file diff --git a/src/loadext.c b/src/loadext.c index d649616b73..1ae87d6b7e 100644 --- a/src/loadext.c +++ b/src/loadext.c @@ -408,7 +408,7 @@ static const sqlite3_api_routines sqlite3Apis = { sqlite3_value_free, sqlite3_result_zeroblob64, sqlite3_bind_zeroblob64, - /* Version 3.8.12 and later */ + /* Version 3.9.0 and later */ sqlite3_value_subtype, sqlite3_result_subtype }; diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 75e51f4b01..c3b2890f0b 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -5656,9 +5656,9 @@ struct sqlite3_module { ** to included crashing the application). The estimatedRows field should ** therefore only be used if [sqlite3_libversion_number()] returns a ** value greater than or equal to 3008002. Similarly, the idxFlags field -** was added for version 3.8.12. It may therefore only be used if +** was added for version 3.9.0. It may therefore only be used if ** sqlite3_libversion_number() returns a value greater than or equal to -** 3008012. +** 3009000. */ struct sqlite3_index_info { /* Inputs */ @@ -5686,7 +5686,7 @@ struct sqlite3_index_info { double estimatedCost; /* Estimated cost of using this index */ /* Fields below are only available in SQLite 3.8.2 and later */ sqlite3_int64 estimatedRows; /* Estimated number of rows returned */ - /* Fields below are only available in SQLite 3.8.12 and later */ + /* Fields below are only available in SQLite 3.9.0 and later */ int idxFlags; /* Mask of SQLITE_INDEX_SCAN_* flags */ }; diff --git a/src/sqlite3ext.h b/src/sqlite3ext.h index 9b9f610e93..017ea308b1 100644 --- a/src/sqlite3ext.h +++ b/src/sqlite3ext.h @@ -272,7 +272,7 @@ struct sqlite3_api_routines { void (*value_free)(sqlite3_value*); int (*result_zeroblob64)(sqlite3_context*,sqlite3_uint64); int (*bind_zeroblob64)(sqlite3_stmt*, int, sqlite3_uint64); - /* Version 3.8.12 and later */ + /* Version 3.9.0 and later */ unsigned int (*value_subtype)(sqlite3_value*); void (*result_subtype)(sqlite3_context*,unsigned int); }; @@ -511,7 +511,7 @@ struct sqlite3_api_routines { #define sqlite3_value_free sqlite3_api->value_free #define sqlite3_result_zeroblob64 sqlite3_api->result_zeroblob64 #define sqlite3_bind_zeroblob64 sqlite3_api->bind_zeroblob64 -/* Version 3.8.12 and later */ +/* Version 3.9.0 and later */ #define sqlite3_value_subtype sqlite3_api->value_subtype #define sqlite3_result_subtype sqlite3_api->result_subtype #endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ From df705d8185df5691474314a3f07ec9cf18d3770d Mon Sep 17 00:00:00 2001 From: dan Date: Mon, 12 Oct 2015 19:12:29 +0000 Subject: [PATCH 91/98] Further tweaks to improve fts5 prefix query performance. FossilOrigin-Name: 1c20c1c28b56411f106cf2f6961b3ad4b4d6f6c8 --- ext/fts5/fts5Int.h | 4 +- ext/fts5/fts5_buffer.c | 10 +- ext/fts5/fts5_expr.c | 107 +++-------------- ext/fts5/fts5_index.c | 217 ++++++++++++++++++++++++---------- ext/fts5/fts5_main.c | 2 +- ext/fts5/fts5_vocab.c | 2 +- ext/fts5/test/fts5simple.test | 18 +++ manifest | 26 ++-- manifest.uuid | 2 +- 9 files changed, 207 insertions(+), 181 deletions(-) diff --git a/ext/fts5/fts5Int.h b/ext/fts5/fts5Int.h index ce066f2aa8..3671da1f12 100644 --- a/ext/fts5/fts5Int.h +++ b/ext/fts5/fts5Int.h @@ -254,7 +254,6 @@ int sqlite3Fts5Get32(const u8*); typedef struct Fts5PoslistReader Fts5PoslistReader; struct Fts5PoslistReader { /* Variables used only by sqlite3Fts5PoslistIterXXX() functions. */ - int iCol; /* If (iCol>=0), this column only */ const u8 *a; /* Position list to iterate through */ int n; /* Size of buffer at a[] in bytes */ int i; /* Current offset in a[] */ @@ -266,7 +265,6 @@ struct Fts5PoslistReader { i64 iPos; /* (iCol<<32) + iPos */ }; int sqlite3Fts5PoslistReaderInit( - int iCol, /* If (iCol>=0), this column only */ const u8 *a, int n, /* Poslist buffer to iterate through */ Fts5PoslistReader *pIter /* Iterator object to initialize */ ); @@ -347,7 +345,7 @@ int sqlite3Fts5IterEof(Fts5IndexIter*); int sqlite3Fts5IterNext(Fts5IndexIter*); int sqlite3Fts5IterNextFrom(Fts5IndexIter*, i64 iMatch); i64 sqlite3Fts5IterRowid(Fts5IndexIter*); -int sqlite3Fts5IterPoslist(Fts5IndexIter*, const u8 **pp, int *pn, i64 *pi); +int sqlite3Fts5IterPoslist(Fts5IndexIter*,Fts5Colset*, const u8**, int*, i64*); int sqlite3Fts5IterPoslistBuffer(Fts5IndexIter *pIter, Fts5Buffer *pBuf); /* diff --git a/ext/fts5/fts5_buffer.c b/ext/fts5/fts5_buffer.c index e7e8d6d663..68f24bf18b 100644 --- a/ext/fts5/fts5_buffer.c +++ b/ext/fts5/fts5_buffer.c @@ -203,26 +203,20 @@ int sqlite3Fts5PoslistNext64( ** if the iterator reaches EOF, or false otherwise. */ int sqlite3Fts5PoslistReaderNext(Fts5PoslistReader *pIter){ - if( sqlite3Fts5PoslistNext64(pIter->a, pIter->n, &pIter->i, &pIter->iPos) - || (pIter->iCol>=0 && (pIter->iPos >> 32) > pIter->iCol) - ){ + if( sqlite3Fts5PoslistNext64(pIter->a, pIter->n, &pIter->i, &pIter->iPos) ){ pIter->bEof = 1; } return pIter->bEof; } int sqlite3Fts5PoslistReaderInit( - int iCol, /* If (iCol>=0), this column only */ const u8 *a, int n, /* Poslist buffer to iterate through */ Fts5PoslistReader *pIter /* Iterator object to initialize */ ){ memset(pIter, 0, sizeof(*pIter)); pIter->a = a; pIter->n = n; - pIter->iCol = iCol; - do { - sqlite3Fts5PoslistReaderNext(pIter); - }while( pIter->bEof==0 && (pIter->iPos >> 32)bEof; } diff --git a/ext/fts5/fts5_expr.c b/ext/fts5/fts5_expr.c index 02351478a0..a8a8363a4e 100644 --- a/ext/fts5/fts5_expr.c +++ b/ext/fts5/fts5_expr.c @@ -309,6 +309,7 @@ static i64 fts5ExprSynonymRowid(Fts5ExprTerm *pTerm, int bDesc, int *pbEof){ */ static int fts5ExprSynonymPoslist( Fts5ExprTerm *pTerm, + Fts5Colset *pColset, i64 iRowid, int *pbDel, /* OUT: Caller should sqlite3_free(*pa) */ u8 **pa, int *pn @@ -327,7 +328,7 @@ static int fts5ExprSynonymPoslist( const u8 *a; int n; i64 dummy; - rc = sqlite3Fts5IterPoslist(pIter, &a, &n, &dummy); + rc = sqlite3Fts5IterPoslist(pIter, pColset, &a, &n, &dummy); if( rc!=SQLITE_OK ) goto synonym_poslist_out; if( nIter==nAlloc ){ int nByte = sizeof(Fts5PoslistReader) * nAlloc * 2; @@ -341,7 +342,7 @@ static int fts5ExprSynonymPoslist( if( aIter!=aStatic ) sqlite3_free(aIter); aIter = aNew; } - sqlite3Fts5PoslistReaderInit(-1, a, n, &aIter[nIter]); + sqlite3Fts5PoslistReaderInit(a, n, &aIter[nIter]); assert( aIter[nIter].bEof==0 ); nIter++; } @@ -409,13 +410,7 @@ static int fts5ExprPhraseIsMatch( Fts5PoslistReader *aIter = aStatic; int i; int rc = SQLITE_OK; - int iCol = -1; - if( pColset && pColset->nCol==1 ){ - iCol = pColset->aiCol[0]; - pColset = 0; - } - fts5BufferZero(&pPhrase->poslist); /* If the aStatic[] array is not large enough, allocate a large array @@ -435,12 +430,14 @@ static int fts5ExprPhraseIsMatch( int bFlag = 0; const u8 *a = 0; if( pTerm->pSynonym ){ - rc = fts5ExprSynonymPoslist(pTerm, pNode->iRowid, &bFlag, (u8**)&a, &n); + rc = fts5ExprSynonymPoslist( + pTerm, pColset, pNode->iRowid, &bFlag, (u8**)&a, &n + ); }else{ - rc = sqlite3Fts5IterPoslist(pTerm->pIter, &a, &n, &dummy); + rc = sqlite3Fts5IterPoslist(pTerm->pIter, pColset, &a, &n, &dummy); } if( rc!=SQLITE_OK ) goto ismatch_out; - sqlite3Fts5PoslistReaderInit(iCol, a, n, &aIter[i]); + sqlite3Fts5PoslistReaderInit(a, n, &aIter[i]); aIter[i].bFlag = bFlag; if( aIter[i].bEof ) goto ismatch_out; } @@ -463,11 +460,9 @@ static int fts5ExprPhraseIsMatch( } }while( bMatch==0 ); - if( pColset==0 || fts5ExprColsetTest(pColset, FTS5_POS2COLUMN(iPos)) ){ - /* Append position iPos to the output */ - rc = sqlite3Fts5PoslistWriterAppend(&pPhrase->poslist, &writer, iPos); - if( rc!=SQLITE_OK ) goto ismatch_out; - } + /* Append position iPos to the output */ + rc = sqlite3Fts5PoslistWriterAppend(&pPhrase->poslist, &writer, iPos); + if( rc!=SQLITE_OK ) goto ismatch_out; for(i=0; inTerm; i++){ if( sqlite3Fts5PoslistReaderNext(&aIter[i]) ) goto ismatch_out; @@ -762,61 +757,6 @@ static int fts5ExprSynonymAdvanceto( return bEof; } -/* -** IN/OUT parameter (*pa) points to a position list n bytes in size. If -** the position list contains entries for column iCol, then (*pa) is set -** to point to the sub-position-list for that column and the number of -** bytes in it returned. Or, if the argument position list does not -** contain any entries for column iCol, return 0. -*/ -static int fts5ExprExtractCol( - const u8 **pa, /* IN/OUT: Pointer to poslist */ - int n, /* IN: Size of poslist in bytes */ - int iCol /* Column to extract from poslist */ -){ - int iCurrent = 0; - const u8 *p = *pa; - const u8 *pEnd = &p[n]; /* One byte past end of position list */ - u8 prev = 0; - - while( iCol!=iCurrent ){ - /* Advance pointer p until it points to pEnd or an 0x01 byte that is - ** not part of a varint */ - while( (prev & 0x80) || *p!=0x01 ){ - prev = *p++; - if( p==pEnd ) return 0; - } - *pa = p++; - p += fts5GetVarint32(p, iCurrent); - } - - /* Advance pointer p until it points to pEnd or an 0x01 byte that is - ** not part of a varint */ - assert( (prev & 0x80)==0 ); - while( pnCol; i++){ - const u8 *pSub = pPos; - int nSub = fts5ExprExtractCol(&pSub, nPos, pColset->aiCol[i]); - if( nSub ){ - fts5BufferAppendBlob(&rc, pBuf, nSub, pSub); - } - } - return rc; -} static int fts5ExprNearTest( int *pRc, @@ -864,34 +804,15 @@ static int fts5ExprTokenTest( Fts5ExprPhrase *pPhrase = pNear->apPhrase[0]; Fts5IndexIter *pIter = pPhrase->aTerm[0].pIter; Fts5Colset *pColset = pNear->pColset; - const u8 *pPos; - int nPos; int rc; assert( pNode->eType==FTS5_TERM ); assert( pNear->nPhrase==1 && pPhrase->nTerm==1 ); assert( pPhrase->aTerm[0].pSynonym==0 ); - rc = sqlite3Fts5IterPoslist(pIter, &pPos, &nPos, &pNode->iRowid); - - /* If the term may match any column, then this must be a match. - ** Return immediately in this case. Otherwise, try to find the - ** part of the poslist that corresponds to the required column. - ** If it can be found, return. If it cannot, the next iteration - ** of the loop will test the next rowid in the database for this - ** term. */ - if( pColset==0 ){ - assert( pPhrase->poslist.nSpace==0 ); - pPhrase->poslist.p = (u8*)pPos; - pPhrase->poslist.n = nPos; - }else if( pColset->nCol==1 ){ - assert( pPhrase->poslist.nSpace==0 ); - pPhrase->poslist.n = fts5ExprExtractCol(&pPos, nPos, pColset->aiCol[0]); - pPhrase->poslist.p = (u8*)pPos; - }else if( rc==SQLITE_OK ){ - rc = fts5ExprExtractColset(pColset, pPos, nPos, &pPhrase->poslist); - } - + rc = sqlite3Fts5IterPoslist(pIter, pColset, + (const u8**)&pPhrase->poslist.p, &pPhrase->poslist.n, &pNode->iRowid + ); pNode->bNomatch = (pPhrase->poslist.n==0); return rc; } diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index ec9ed3b921..6c731432fe 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -511,8 +511,9 @@ struct Fts5IndexIter { int nSeg; /* Size of aSeg[] array */ int bRev; /* True to iterate in reverse order */ - int bSkipEmpty; /* True to skip deleted entries */ - int bEof; /* True at EOF */ + u8 bSkipEmpty; /* True to skip deleted entries */ + u8 bEof; /* True at EOF */ + u8 bFiltered; /* True if column-filter already applied */ i64 iSwitchRowid; /* Firstest rowid of other than aFirst[1] */ Fts5CResult *aFirst; /* Current merge state (see above) */ @@ -1457,7 +1458,8 @@ static void fts5SegIterNextPage( */ static int fts5GetPoslistSize(const u8 *p, int *pnSz, int *pbDel){ int nSz; - int n = fts5GetVarint32(p, nSz); + int n = 0; + fts5FastGetVarint32(p, n, nSz); assert_nc( nSz>=0 ); *pnSz = nSz/2; *pbDel = nSz & 0x0001; @@ -1478,13 +1480,12 @@ static int fts5GetPoslistSize(const u8 *p, int *pnSz, int *pbDel){ static void fts5SegIterLoadNPos(Fts5Index *p, Fts5SegIter *pIter){ if( p->rc==SQLITE_OK ){ int iOff = pIter->iLeafOffset; /* Offset to read at */ + int nSz; ASSERT_SZLEAF_OK(pIter->pLeaf); - if( iOff>=pIter->pLeaf->szLeaf ){ - p->rc = FTS5_CORRUPT; - }else{ - const u8 *a = &pIter->pLeaf->p[iOff]; - pIter->iLeafOffset += fts5GetPoslistSize(a, &pIter->nPos, &pIter->bDel); - } + fts5FastGetVarint32(pIter->pLeaf->p, iOff, nSz); + pIter->bDel = (nSz & 0x0001); + pIter->nPos = nSz>>1; + pIter->iLeafOffset = iOff; } } @@ -2725,6 +2726,7 @@ static void fts5MultiIterNew2( if( pNew ){ Fts5SegIter *pIter = &pNew->aSeg[1]; + pNew->bFiltered = 1; pIter->flags = FTS5_SEGITER_ONETERM; if( pData->szLeaf>0 ){ pIter->pLeaf = pData; @@ -3940,7 +3942,7 @@ static void fts5PoslistCallback( ){ assert_nc( nChunk>=0 ); if( nChunk>0 ){ - fts5BufferAppendBlob(&p->rc, (Fts5Buffer*)pContext, nChunk, pChunk); + fts5BufferSafeAppendBlob((Fts5Buffer*)pContext, pChunk, nChunk); } } @@ -3980,7 +3982,7 @@ static void fts5PoslistFilterCallback( fts5FastGetVarint32(pChunk, i, iCol); if( fts5IndexColsetTest(pCtx->pColset, iCol) ){ pCtx->eState = 1; - fts5BufferAppendVarint(&p->rc, pCtx->pBuf, 1); + fts5BufferSafeAppendVarint(pCtx->pBuf, 1); }else{ pCtx->eState = 0; } @@ -3992,7 +3994,7 @@ static void fts5PoslistFilterCallback( i++; } if( pCtx->eState ){ - fts5BufferAppendBlob(&p->rc, pCtx->pBuf, i-iStart, &pChunk[iStart]); + fts5BufferSafeAppendBlob(pCtx->pBuf, &pChunk[iStart], i-iStart); } if( ieState = fts5IndexColsetTest(pCtx->pColset, iCol); if( pCtx->eState ){ - fts5BufferAppendBlob(&p->rc, pCtx->pBuf, i-iStart, &pChunk[iStart]); + fts5BufferSafeAppendBlob(pCtx->pBuf, &pChunk[iStart], i-iStart); iStart = i; } } @@ -4025,56 +4027,123 @@ static void fts5SegiterPoslist( Fts5Colset *pColset, Fts5Buffer *pBuf ){ - if( pColset==0 ){ - fts5ChunkIterate(p, pSeg, (void*)pBuf, fts5PoslistCallback); - }else{ - PoslistCallbackCtx sCtx; - sCtx.pBuf = pBuf; - sCtx.pColset = pColset; - sCtx.eState = pColset ? fts5IndexColsetTest(pColset, 0) : 1; - assert( sCtx.eState==0 || sCtx.eState==1 ); - fts5ChunkIterate(p, pSeg, (void*)&sCtx, fts5PoslistFilterCallback); + if( 0==fts5BufferGrow(&p->rc, pBuf, pSeg->nPos) ){ + if( pColset==0 ){ + fts5ChunkIterate(p, pSeg, (void*)pBuf, fts5PoslistCallback); + }else{ + PoslistCallbackCtx sCtx; + sCtx.pBuf = pBuf; + sCtx.pColset = pColset; + sCtx.eState = pColset ? fts5IndexColsetTest(pColset, 0) : 1; + assert( sCtx.eState==0 || sCtx.eState==1 ); + fts5ChunkIterate(p, pSeg, (void*)&sCtx, fts5PoslistFilterCallback); + } } } /* -** Iterator pMulti currently points to a valid entry (not EOF). This -** function appends a copy of the position-list of the entry pMulti -** currently points to to buffer pBuf. -** -** If an error occurs, an error code is left in p->rc. It is assumed -** no error has already occurred when this function is called. +** IN/OUT parameter (*pa) points to a position list n bytes in size. If +** the position list contains entries for column iCol, then (*pa) is set +** to point to the sub-position-list for that column and the number of +** bytes in it returned. Or, if the argument position list does not +** contain any entries for column iCol, return 0. */ -static int fts5MultiIterPoslist( +static int fts5IndexExtractCol( + const u8 **pa, /* IN/OUT: Pointer to poslist */ + int n, /* IN: Size of poslist in bytes */ + int iCol /* Column to extract from poslist */ +){ + int iCurrent = 0; /* Anything before the first 0x01 is col 0 */ + const u8 *p = *pa; + const u8 *pEnd = &p[n]; /* One byte past end of position list */ + u8 prev = 0; + + while( iCol!=iCurrent ){ + /* Advance pointer p until it points to pEnd or an 0x01 byte that is + ** not part of a varint */ + while( (prev & 0x80) || *p!=0x01 ){ + prev = *p++; + if( p==pEnd ) return 0; + } + *pa = p++; + p += fts5GetVarint32(p, iCurrent); + } + + /* Advance pointer p until it points to pEnd or an 0x01 byte that is + ** not part of a varint */ + assert( (prev & 0x80)==0 ); + while( prc. +*/ +static int fts5AppendPoslist( Fts5Index *p, + i64 iDelta, Fts5IndexIter *pMulti, Fts5Colset *pColset, Fts5Buffer *pBuf ){ if( p->rc==SQLITE_OK ){ - int iSz; - int iData; - Fts5SegIter *pSeg = &pMulti->aSeg[ pMulti->aFirst[1].iFirst ]; assert( fts5MultiIterEof(p, pMulti)==0 ); + assert( pSeg->nPos>0 ); + if( 0==fts5BufferGrow(&p->rc, pBuf, pSeg->nPos+9+9) ){ + int iSv1; + int iSv2; + int iData; - /* WRITEPOSLISTSIZE */ - iSz = pBuf->n; - fts5BufferSafeAppendVarint(pBuf, pSeg->nPos*2); - iData = pBuf->n; + /* Append iDelta */ + iSv1 = pBuf->n; + fts5BufferSafeAppendVarint(pBuf, iDelta); - fts5SegiterPoslist(p, pSeg, pColset, pBuf); + /* WRITEPOSLISTSIZE */ + iSv2 = pBuf->n; + fts5BufferSafeAppendVarint(pBuf, pSeg->nPos*2); + iData = pBuf->n; - if( pColset ){ - int nActual = pBuf->n - iData; - if( nActual!=pSeg->nPos ){ - /* WRITEPOSLISTSIZE */ - if( nActual==0 ){ - return 1; + if( pSeg->iLeafOffset+pSeg->nPos<=pSeg->pLeaf->szLeaf + && (pColset==0 || pColset->nCol==1) + ){ + const u8 *pPos = &pSeg->pLeaf->p[pSeg->iLeafOffset]; + int nPos; + if( pColset ){ + nPos = fts5IndexExtractCol(&pPos, pSeg->nPos, pColset->aiCol[0]); }else{ - int nReq = sqlite3Fts5GetVarintLen((u32)(nActual*2)); - while( iSz<(iData-nReq) ){ pBuf->p[iSz++] = 0x80; } - sqlite3Fts5PutVarint(&pBuf->p[iSz], nActual*2); + nPos = pSeg->nPos; + } + fts5BufferSafeAppendBlob(pBuf, pPos, nPos); + }else{ + fts5SegiterPoslist(p, pSeg, pColset, pBuf); + } + + if( pColset ){ + int nActual = pBuf->n - iData; + if( nActual!=pSeg->nPos ){ + if( nActual==0 ){ + pBuf->n = iSv1; + return 1; + }else{ + int nReq = sqlite3Fts5GetVarintLen((u32)(nActual*2)); + while( iSv2<(iData-nReq) ){ pBuf->p[iSv2++] = 0x80; } + sqlite3Fts5PutVarint(&pBuf->p[iSv2], nActual*2); + } } } } @@ -4282,15 +4351,8 @@ static void fts5SetupPrefixIter( iLastRowid = 0; } - if( 0==sqlite3Fts5BufferGrow(&p->rc, &doclist, 9) ){ - int iSave = doclist.n; - assert( doclist.n!=0 || iLastRowid==0 ); - fts5BufferSafeAppendVarint(&doclist, iRowid - iLastRowid); - if( fts5MultiIterPoslist(p, p1, pColset, &doclist) ){ - doclist.n = iSave; - }else{ - iLastRowid = iRowid; - } + if( !fts5AppendPoslist(p, iRowid-iLastRowid, p1, pColset, &doclist) ){ + iLastRowid = iRowid; } } @@ -4648,6 +4710,26 @@ const char *sqlite3Fts5IterTerm(Fts5IndexIter *pIter, int *pn){ } +static int fts5IndexExtractColset ( + Fts5Colset *pColset, /* Colset to filter on */ + const u8 *pPos, int nPos, /* Position list */ + Fts5Buffer *pBuf /* Output buffer */ +){ + int rc = SQLITE_OK; + int i; + + fts5BufferZero(pBuf); + for(i=0; inCol; i++){ + const u8 *pSub = pPos; + int nSub = fts5IndexExtractCol(&pSub, nPos, pColset->aiCol[i]); + if( nSub ){ + fts5BufferAppendBlob(&rc, pBuf, nSub, pSub); + } + } + return rc; +} + + /* ** Return a pointer to a buffer containing a copy of the position list for ** the current entry. Output variable *pn is set to the size of the buffer @@ -4658,6 +4740,7 @@ const char *sqlite3Fts5IterTerm(Fts5IndexIter *pIter, int *pn){ */ int sqlite3Fts5IterPoslist( Fts5IndexIter *pIter, + Fts5Colset *pColset, /* Column filter (or NULL) */ const u8 **pp, /* OUT: Pointer to position-list data */ int *pn, /* OUT: Size of position-list in bytes */ i64 *piRowid /* OUT: Current rowid */ @@ -4665,13 +4748,25 @@ int sqlite3Fts5IterPoslist( Fts5SegIter *pSeg = &pIter->aSeg[ pIter->aFirst[1].iFirst ]; assert( pIter->pIndex->rc==SQLITE_OK ); *piRowid = pSeg->iRowid; - *pn = pSeg->nPos; - if( pSeg->iLeafOffset+pSeg->nPos <= pSeg->pLeaf->szLeaf ){ - *pp = &pSeg->pLeaf->p[pSeg->iLeafOffset]; + if( pSeg->iLeafOffset+pSeg->nPos<=pSeg->pLeaf->szLeaf ){ + u8 *pPos = &pSeg->pLeaf->p[pSeg->iLeafOffset]; + if( pColset==0 || pIter->bFiltered ){ + *pn = pSeg->nPos; + *pp = pPos; + }else if( pColset->nCol==1 ){ + *pp = pPos; + *pn = fts5IndexExtractCol(pp, pSeg->nPos, pColset->aiCol[0]); + }else{ + fts5BufferZero(&pIter->poslist); + fts5IndexExtractColset(pColset, pPos, pSeg->nPos, &pIter->poslist); + *pp = pIter->poslist.p; + *pn = pIter->poslist.n; + } }else{ fts5BufferZero(&pIter->poslist); - fts5SegiterPoslist(pIter->pIndex, pSeg, 0, &pIter->poslist); + fts5SegiterPoslist(pIter->pIndex, pSeg, pColset, &pIter->poslist); *pp = pIter->poslist.p; + *pn = pIter->poslist.n; } return fts5IndexReturn(pIter->pIndex); } @@ -4868,10 +4963,10 @@ static int fts5QueryCksum( const u8 *pPos; int nPos; i64 rowid = sqlite3Fts5IterRowid(pIdxIter); - rc = sqlite3Fts5IterPoslist(pIdxIter, &pPos, &nPos, &dummy); + rc = sqlite3Fts5IterPoslist(pIdxIter, 0, &pPos, &nPos, &dummy); if( rc==SQLITE_OK ){ Fts5PoslistReader sReader; - for(sqlite3Fts5PoslistReaderInit(-1, pPos, nPos, &sReader); + for(sqlite3Fts5PoslistReaderInit(pPos, nPos, &sReader); sReader.bEof==0; sqlite3Fts5PoslistReaderNext(&sReader) ){ diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index c2a37171ec..eba8a6cbce 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -1643,7 +1643,7 @@ static int fts5CacheInstArray(Fts5Cursor *pCsr){ for(i=0; ipIter, &pPos, &nPos, &dummy); + rc = sqlite3Fts5IterPoslist(pCsr->pIter, 0, &pPos, &nPos, &dummy); if( rc==SQLITE_OK ){ if( pTab->eType==FTS5_VOCAB_ROW ){ while( 0==sqlite3Fts5PoslistNext64(pPos, nPos, &iOff, &iPos) ){ diff --git a/ext/fts5/test/fts5simple.test b/ext/fts5/test/fts5simple.test index 67fc494435..9175e420a2 100644 --- a/ext/fts5/test/fts5simple.test +++ b/ext/fts5/test/fts5simple.test @@ -251,6 +251,10 @@ do_execsql_test 10.1 { SELECT rowid FROM t3('c: c*'); } {2} +do_execsql_test 10.2 { + SELECT rowid FROM t3('b: acb'); +} {2} + #------------------------------------------------------------------------- # Test that character 0x1A is allowed in fts5 barewords. # @@ -281,6 +285,20 @@ do_test 11.5 { catchsql "SELECT rowid FROM t4('d\x19')" } {/fts5: syntax error/} +#------------------------------------------------------------------------- +# +do_test 12.1 { + execsql { + CREATE VIRTUAL TABLE xx USING fts5(x,y); + BEGIN; + INSERT INTO xx VALUES('1 2 3', 'a b c'); + } +} {} + +do_execsql_test 12.2 { + SELECT rowid FROM xx('x:a'); + COMMIT; +} {} finish_test diff --git a/manifest b/manifest index 3e2bd9208d..534a14bd88 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Change\sall\sreferences\sto\s3.8.12\sinto\s3.9.0.\s\sComment\schanges\sonly\s-\sno\nchanges\sto\scode. -D 2015-10-12T04:56:12.349 +C Further\stweaks\sto\simprove\sfts5\sprefix\squery\sperformance. +D 2015-10-12T19:12:29.091 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f0088ff0d2ac949fce6de7c00f13a99ac5bdb663 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -106,21 +106,21 @@ F ext/fts3/unicode/mkunicode.tcl 95cf7ec186e48d4985e433ff8a1c89090a774252 F ext/fts3/unicode/parseunicode.tcl da577d1384810fb4e2b209bf3313074353193e95 F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 F ext/fts5/fts5.h 98f802fe41481f9d797fce496f0fefcad72c7782 -F ext/fts5/fts5Int.h ed6c05b803e0bacf85228a8d255853e89796f6f5 +F ext/fts5/fts5Int.h 38667e39859ff3f3bc91f47efe672023a145a118 F ext/fts5/fts5_aux.c b09aa27dcdaa3d50a30be433fddaa48a50aa827b -F ext/fts5/fts5_buffer.c b2fb69c1ee3378956c0d9ee964d61b59d296afaf +F ext/fts5/fts5_buffer.c e99224a316cc5b2c574ccccdc7f2344bca54784d F ext/fts5/fts5_config.c 57ee5fe71578cb494574fc0e6e51acb9a22a8695 -F ext/fts5/fts5_expr.c 1df899afed24c9c6195eea1780dcc56fcd1d1139 +F ext/fts5/fts5_expr.c 17a945210cbc0cd29f03a87fd30ab7bf994ed16c F ext/fts5/fts5_hash.c 4bf4b99708848357b8a2b5819e509eb6d3df9246 -F ext/fts5/fts5_index.c e03217c37f344f79673be385de6b03f732291000 -F ext/fts5/fts5_main.c 36fa4fe8b80ba5d596fa6afb910d195f148fd9d2 +F ext/fts5/fts5_index.c f73968357818455039ecb79dcd4b082c3baaeaeb +F ext/fts5/fts5_main.c bf43550b8e9a68514abd179500f1917a2256cd7a F ext/fts5/fts5_storage.c df061a5caf9e50fbbd43113009b5b248362f4995 F ext/fts5/fts5_tcl.c 3bf445e66de32137d4693694ff7b1fd6074e32bd F ext/fts5/fts5_test_mi.c e96be827aa8f571031e65e481251dc1981d608bf F ext/fts5/fts5_tokenize.c f380f46f341af9c9a9908e1aade685ba1eaa157a F ext/fts5/fts5_unicode2.c 78273fbd588d1d9bd0a7e4e0ccc9207348bae33c F ext/fts5/fts5_varint.c 3f86ce09cab152e3d45490d7586b7ed2e40c13f1 -F ext/fts5/fts5_vocab.c 17320c476a5296ee475ab616d95fd10515bacfec +F ext/fts5/fts5_vocab.c a05027ab6abb692ad27654c85137a4f1061a159e F ext/fts5/fts5parse.y e83dca6028e3309178d05b5bd920e372dc295d35 F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba F ext/fts5/test/fts5_common.tcl 51f7ef3af444b89c6f6ce3896a0ac349ff4e996d @@ -175,7 +175,7 @@ F ext/fts5/test/fts5rank.test 11dcebba31d822f7e99685b4ea2c2ae3ec0b16f1 F ext/fts5/test/fts5rebuild.test 03935f617ace91ed23a6099c7c74d905227ff29b F ext/fts5/test/fts5restart.test c17728fdea26e7d0f617d22ad5b4b2862b994c17 F ext/fts5/test/fts5rowid.test 400384798349d658eaf06aefa1e364957d5d4821 -F ext/fts5/test/fts5simple.test 85bbb268e01d2e3527d70a7fa511ddc3bba2ccc0 +F ext/fts5/test/fts5simple.test f8463172dc2d4bf9f74c78e9df9c83e942c63a94 F ext/fts5/test/fts5synonym.test cf88c0a56d5ea9591e3939ef1f6e294f7f2d0671 F ext/fts5/test/fts5tokenizer.test ea4df698b35cc427ebf2ba22829d0e28386d8c89 F ext/fts5/test/fts5unicode.test fbef8d8a3b4b88470536cc57604a82ca52e51841 @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 9ab9c8c6d747647f8ade58c2c4812fc69a813368 -R 84edb3e7271e5a0e0aa256262a048c3a -U drh -Z 934ebb8a1ac47019300027e32a36b72c +P 6f2858f6817ca70c132f0437ac2f0f74deb273d2 +R 648c7563956f80fd03a6301b24b597df +U dan +Z 3852831c6b0a26fcaca66c9a24d96d73 diff --git a/manifest.uuid b/manifest.uuid index f2eda9b02d..976558fcea 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -6f2858f6817ca70c132f0437ac2f0f74deb273d2 \ No newline at end of file +1c20c1c28b56411f106cf2f6961b3ad4b4d6f6c8 \ No newline at end of file From f2c26ed17b3e4f09a84d8574185b34fcaf1fe322 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Mon, 12 Oct 2015 22:20:29 +0000 Subject: [PATCH 92/98] Fix a couple harmless compiler warnings. FossilOrigin-Name: 7f896a971c5953d5370215ecd834d1fb711b4263 --- ext/misc/json1.c | 2 +- manifest | 16 ++++++++-------- manifest.uuid | 2 +- test/fuzzcheck.c | 1 - 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/ext/misc/json1.c b/ext/misc/json1.c index c968011eea..d5f019ff98 100644 --- a/ext/misc/json1.c +++ b/ext/misc/json1.c @@ -885,7 +885,7 @@ static int jsonParseFindParents(JsonParse *pParse){ ** Compare the OBJECT label at pNode against zKey,nKey. Return true on ** a match. */ -static int jsonLabelCompare(JsonNode *pNode, const char *zKey, int nKey){ +static int jsonLabelCompare(JsonNode *pNode, const char *zKey, u32 nKey){ if( pNode->jnFlags & JNODE_RAW ){ if( pNode->n!=nKey ) return 0; return strncmp(pNode->u.zJContent, zKey, nKey)==0; diff --git a/manifest b/manifest index 534a14bd88..fc00ef7610 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Further\stweaks\sto\simprove\sfts5\sprefix\squery\sperformance. -D 2015-10-12T19:12:29.091 +C Fix\sa\scouple\sharmless\scompiler\swarnings. +D 2015-10-12T22:20:29.991 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f0088ff0d2ac949fce6de7c00f13a99ac5bdb663 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -198,7 +198,7 @@ F ext/misc/eval.c f971962e92ebb8b0a4e6b62949463ee454d88fa2 F ext/misc/fileio.c d4171c815d6543a9edef8308aab2951413cd8d0f F ext/misc/fuzzer.c 4c84635c71c26cfa7c2e5848cf49fe2d2cfcd767 F ext/misc/ieee754.c b0362167289170627659e84173f5d2e8fee8566e -F ext/misc/json1.c e827cb3148e7db283e4b6ca36a0c16480bf8e743 +F ext/misc/json1.c d31022098b0c4c7c2c1781cb328180a4da6fbdb3 F ext/misc/nextchar.c 35c8b8baacb96d92abbb34a83a997b797075b342 F ext/misc/percentile.c bcbee3c061b884eccb80e21651daaae8e1e43c63 F ext/misc/regexp.c af92cdaa5058fcec1451e49becc7ba44dba023dc @@ -753,7 +753,7 @@ F test/fuzz2.test 76dc35b32b6d6f965259508508abce75a6c4d7e1 F test/fuzz3.test 53fabcd5f0f430f8b221282f6c12c4d0903c21eb F test/fuzz_common.tcl a87dfbb88c2a6b08a38e9a070dabd129e617b45b F test/fuzz_malloc.test 328f70aaca63adf29b4c6f06505ed0cf57ca7c26 -F test/fuzzcheck.c b8eb7ee40f6d28548a0b028e0676293522f3427f +F test/fuzzcheck.c 73d7c49980c1a380f1dff52df9c6d67c854d92ea F test/fuzzdata1.db 7ee3227bad0e7ccdeb08a9e6822916777073c664 F test/fuzzdata2.db f03a420d3b822cc82e4f894ca957618fbe9c4973 F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 6f2858f6817ca70c132f0437ac2f0f74deb273d2 -R 648c7563956f80fd03a6301b24b597df -U dan -Z 3852831c6b0a26fcaca66c9a24d96d73 +P 1c20c1c28b56411f106cf2f6961b3ad4b4d6f6c8 +R afbc852dad884213e6cdc034cff88444 +U mistachkin +Z 86c808002d54e8263a5056aea0515a65 diff --git a/manifest.uuid b/manifest.uuid index 976558fcea..1021eaf1e9 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -1c20c1c28b56411f106cf2f6961b3ad4b4d6f6c8 \ No newline at end of file +7f896a971c5953d5370215ecd834d1fb711b4263 \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index 4597891c3a..b1ba573d60 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -1051,7 +1051,6 @@ int main(int argc, char **argv){ /* Print the description, if there is one */ if( !quietFlag ){ - int i; zDbName = azSrcDb[iSrcDb]; i = strlen(zDbName) - 1; while( i>0 && zDbName[i-1]!='/' && zDbName[i-1]!='\\' ){ i--; } From cec7dec006cf656fa2f415ce2c73d5206d8eab46 Mon Sep 17 00:00:00 2001 From: drh Date: Mon, 12 Oct 2015 22:31:02 +0000 Subject: [PATCH 93/98] Remove the unused fts5ExprColsetTest() routine. FossilOrigin-Name: 9ecafc0c94102dca6da192f400278399464086fb --- ext/fts5/fts5_expr.c | 9 --------- manifest | 14 +++++++------- manifest.uuid | 2 +- 3 files changed, 8 insertions(+), 17 deletions(-) diff --git a/ext/fts5/fts5_expr.c b/ext/fts5/fts5_expr.c index a8a8363a4e..8800808a32 100644 --- a/ext/fts5/fts5_expr.c +++ b/ext/fts5/fts5_expr.c @@ -271,14 +271,6 @@ void sqlite3Fts5ExprFree(Fts5Expr *p){ } } -static int fts5ExprColsetTest(Fts5Colset *pColset, int iCol){ - int i; - for(i=0; inCol; i++){ - if( pColset->aiCol[i]==iCol ) return 1; - } - return 0; -} - /* ** Argument pTerm must be a synonym iterator. Return the current rowid ** that it points to. @@ -2242,4 +2234,3 @@ int sqlite3Fts5ExprPoslist(Fts5Expr *pExpr, int iPhrase, const u8 **pa){ } return nRet; } - diff --git a/manifest b/manifest index fc00ef7610..2b8b0a9573 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sa\scouple\sharmless\scompiler\swarnings. -D 2015-10-12T22:20:29.991 +C Remove\sthe\sunused\sfts5ExprColsetTest()\sroutine. +D 2015-10-12T22:31:02.804 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f0088ff0d2ac949fce6de7c00f13a99ac5bdb663 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -110,7 +110,7 @@ F ext/fts5/fts5Int.h 38667e39859ff3f3bc91f47efe672023a145a118 F ext/fts5/fts5_aux.c b09aa27dcdaa3d50a30be433fddaa48a50aa827b F ext/fts5/fts5_buffer.c e99224a316cc5b2c574ccccdc7f2344bca54784d F ext/fts5/fts5_config.c 57ee5fe71578cb494574fc0e6e51acb9a22a8695 -F ext/fts5/fts5_expr.c 17a945210cbc0cd29f03a87fd30ab7bf994ed16c +F ext/fts5/fts5_expr.c bc31478fd04de55150031f6e6a652939d3e335ac F ext/fts5/fts5_hash.c 4bf4b99708848357b8a2b5819e509eb6d3df9246 F ext/fts5/fts5_index.c f73968357818455039ecb79dcd4b082c3baaeaeb F ext/fts5/fts5_main.c bf43550b8e9a68514abd179500f1917a2256cd7a @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 1c20c1c28b56411f106cf2f6961b3ad4b4d6f6c8 -R afbc852dad884213e6cdc034cff88444 -U mistachkin -Z 86c808002d54e8263a5056aea0515a65 +P 7f896a971c5953d5370215ecd834d1fb711b4263 +R 9caea6f3d0d85e53ac44439278fad807 +U drh +Z 910ebb884723e98753b60b18fc83ff4b diff --git a/manifest.uuid b/manifest.uuid index 1021eaf1e9..9f4eab788a 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -7f896a971c5953d5370215ecd834d1fb711b4263 \ No newline at end of file +9ecafc0c94102dca6da192f400278399464086fb \ No newline at end of file From f4f968443b33d43c07dc87f12e36da4cc116f010 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 14 Oct 2015 10:56:34 +0000 Subject: [PATCH 94/98] Add the missing 'extern "C" {...}' blocks to fts5.h and sqlite3rbu.h. FossilOrigin-Name: 47a2ce97d585e1760ffcf760c0de1753677d5713 --- ext/fts5/fts5.h | 8 ++++++++ ext/rbu/sqlite3rbu.h | 8 ++++++++ manifest | 16 ++++++++-------- manifest.uuid | 2 +- 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/ext/fts5/fts5.h b/ext/fts5/fts5.h index 7d974921d1..5f528af793 100644 --- a/ext/fts5/fts5.h +++ b/ext/fts5/fts5.h @@ -23,6 +23,10 @@ #include "sqlite3.h" +#ifdef __cplusplus +extern "C" { +#endif + /************************************************************************* ** CUSTOM AUXILIARY FUNCTIONS ** @@ -508,5 +512,9 @@ struct fts5_api { ** END OF REGISTRATION API *************************************************************************/ +#ifdef __cplusplus +} /* end of the 'extern "C"' block */ +#endif + #endif /* _FTS5_H */ diff --git a/ext/rbu/sqlite3rbu.h b/ext/rbu/sqlite3rbu.h index b6cbf4d8b9..65d1c5f6e5 100644 --- a/ext/rbu/sqlite3rbu.h +++ b/ext/rbu/sqlite3rbu.h @@ -269,6 +269,10 @@ #include "sqlite3.h" /* Required for error code definitions */ +#ifdef __cplusplus +extern "C" { +#endif + typedef struct sqlite3rbu sqlite3rbu; /* @@ -447,4 +451,8 @@ int sqlite3rbu_create_vfs(const char *zName, const char *zParent); */ void sqlite3rbu_destroy_vfs(const char *zName); +#ifdef __cplusplus +} /* end of the 'extern "C"' block */ +#endif + #endif /* _SQLITE3RBU_H */ diff --git a/manifest b/manifest index 2b8b0a9573..856180902a 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Remove\sthe\sunused\sfts5ExprColsetTest()\sroutine. -D 2015-10-12T22:31:02.804 +C Add\sthe\smissing\s'extern\s"C"\s{...}'\sblocks\sto\sfts5.h\sand\ssqlite3rbu.h. +D 2015-10-14T10:56:34.956 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f0088ff0d2ac949fce6de7c00f13a99ac5bdb663 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -105,7 +105,7 @@ F ext/fts3/unicode/UnicodeData.txt cd07314edb62d49fde34debdaf92fa2aa69011e7 F ext/fts3/unicode/mkunicode.tcl 95cf7ec186e48d4985e433ff8a1c89090a774252 F ext/fts3/unicode/parseunicode.tcl da577d1384810fb4e2b209bf3313074353193e95 F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 -F ext/fts5/fts5.h 98f802fe41481f9d797fce496f0fefcad72c7782 +F ext/fts5/fts5.h 8b9a13b309b180e9fb88ea5666c0d8d73c6102d9 F ext/fts5/fts5Int.h 38667e39859ff3f3bc91f47efe672023a145a118 F ext/fts5/fts5_aux.c b09aa27dcdaa3d50a30be433fddaa48a50aa827b F ext/fts5/fts5_buffer.c e99224a316cc5b2c574ccccdc7f2344bca54784d @@ -233,7 +233,7 @@ F ext/rbu/rbufault2.test 9a7f19edd6ea35c4c9f807d8a3db0a03a5670c06 F ext/rbu/rbufts.test 828cd689da825f0a7b7c53ffc1f6f7fdb6fa5bda F ext/rbu/rbusave.test 0f43b6686084f426ddd040b878426452fd2c2f48 F ext/rbu/sqlite3rbu.c ea47de615e911b3a69a8e7fb3be3866298403a25 -F ext/rbu/sqlite3rbu.h 5357f070cd8c0bcad459b620651ec1656859e4d0 +F ext/rbu/sqlite3rbu.h 1d568cb33738d7900975cc5c72e6f68049f15914 F ext/rbu/test_rbu.c 2a3652241fa45d5eaa141775e4ae68c1d3582c03 F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 F ext/rtree/rtree.c 0f9b595bd0debcbedf1d7a63d0e0678d619e6c9c @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 7f896a971c5953d5370215ecd834d1fb711b4263 -R 9caea6f3d0d85e53ac44439278fad807 -U drh -Z 910ebb884723e98753b60b18fc83ff4b +P 9ecafc0c94102dca6da192f400278399464086fb +R 41ced18917e64acb8afddf6eb6ae0b31 +U dan +Z ea28d4ccb4ab6552cc0b271363717ac2 diff --git a/manifest.uuid b/manifest.uuid index 9f4eab788a..333b353217 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -9ecafc0c94102dca6da192f400278399464086fb \ No newline at end of file +47a2ce97d585e1760ffcf760c0de1753677d5713 \ No newline at end of file From b43b7115879d0269b5374d438a295df700d74128 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 14 Oct 2015 12:29:53 +0000 Subject: [PATCH 95/98] Version 3.9.0 FossilOrigin-Name: a721fc0d89495518fe5612e2e3bbc60befd2e90d --- manifest | 13 ++++++++----- manifest.uuid | 2 +- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/manifest b/manifest index 856180902a..d6c6d0e394 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\smissing\s'extern\s"C"\s{...}'\sblocks\sto\sfts5.h\sand\ssqlite3rbu.h. -D 2015-10-14T10:56:34.956 +C Version\s3.9.0 +D 2015-10-14T12:29:53.720 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f0088ff0d2ac949fce6de7c00f13a99ac5bdb663 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -1390,7 +1390,10 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 9ecafc0c94102dca6da192f400278399464086fb +P 47a2ce97d585e1760ffcf760c0de1753677d5713 R 41ced18917e64acb8afddf6eb6ae0b31 -U dan -Z ea28d4ccb4ab6552cc0b271363717ac2 +T +bgcolor * #d0c0ff +T +sym-release * +T +sym-version-3.9.0 * +U drh +Z b8800b50bce461e41ccef8a16de7b330 diff --git a/manifest.uuid b/manifest.uuid index 333b353217..ea62748708 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -47a2ce97d585e1760ffcf760c0de1753677d5713 \ No newline at end of file +a721fc0d89495518fe5612e2e3bbc60befd2e90d \ No newline at end of file From 8d32e8042cc7c3f68099eea533a6481873e79dc3 Mon Sep 17 00:00:00 2001 From: dan Date: Wed, 14 Oct 2015 18:45:42 +0000 Subject: [PATCH 96/98] Avoid exporting sqlite3_json_init() from amalgamation builds. FossilOrigin-Name: 8463f7e7908d0a96ed036377dfa3805328c62925 --- ext/misc/json1.c | 2 ++ manifest | 17 +++++++---------- manifest.uuid | 2 +- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/ext/misc/json1.c b/ext/misc/json1.c index d5f019ff98..337e4d3b0d 100644 --- a/ext/misc/json1.c +++ b/ext/misc/json1.c @@ -2022,6 +2022,7 @@ int sqlite3Json1Init(sqlite3 *db){ } +#ifndef SQLITE_CORE #ifdef _WIN32 __declspec(dllexport) #endif @@ -2034,4 +2035,5 @@ int sqlite3_json_init( (void)pzErrMsg; /* Unused parameter */ return sqlite3Json1Init(db); } +#endif #endif /* !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_JSON1) */ diff --git a/manifest b/manifest index d6c6d0e394..db5a8b9441 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Version\s3.9.0 -D 2015-10-14T12:29:53.720 +C Avoid\sexporting\ssqlite3_json_init()\sfrom\samalgamation\sbuilds. +D 2015-10-14T18:45:42.476 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f0088ff0d2ac949fce6de7c00f13a99ac5bdb663 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -198,7 +198,7 @@ F ext/misc/eval.c f971962e92ebb8b0a4e6b62949463ee454d88fa2 F ext/misc/fileio.c d4171c815d6543a9edef8308aab2951413cd8d0f F ext/misc/fuzzer.c 4c84635c71c26cfa7c2e5848cf49fe2d2cfcd767 F ext/misc/ieee754.c b0362167289170627659e84173f5d2e8fee8566e -F ext/misc/json1.c d31022098b0c4c7c2c1781cb328180a4da6fbdb3 +F ext/misc/json1.c fed5b948168f26f39e67d898b03d93dd00e75196 F ext/misc/nextchar.c 35c8b8baacb96d92abbb34a83a997b797075b342 F ext/misc/percentile.c bcbee3c061b884eccb80e21651daaae8e1e43c63 F ext/misc/regexp.c af92cdaa5058fcec1451e49becc7ba44dba023dc @@ -1390,10 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 47a2ce97d585e1760ffcf760c0de1753677d5713 -R 41ced18917e64acb8afddf6eb6ae0b31 -T +bgcolor * #d0c0ff -T +sym-release * -T +sym-version-3.9.0 * -U drh -Z b8800b50bce461e41ccef8a16de7b330 +P a721fc0d89495518fe5612e2e3bbc60befd2e90d +R 91fe8986fc4249f600867bbdb41be531 +U dan +Z 2ae4d2560a7d6d806cb90ab807854a5b diff --git a/manifest.uuid b/manifest.uuid index ea62748708..2a577e009f 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a721fc0d89495518fe5612e2e3bbc60befd2e90d \ No newline at end of file +8463f7e7908d0a96ed036377dfa3805328c62925 \ No newline at end of file From 021643560b1171803fe6410932646a982b3aa028 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 14 Oct 2015 19:44:42 +0000 Subject: [PATCH 97/98] Fix fuzzcheck.c so that it assumes that JSON1 is already compiled in and does not need to be initialized further. FossilOrigin-Name: ec003958359d6b69b1b1a75be2a988796268e063 --- manifest | 14 +++++++------- manifest.uuid | 2 +- test/fuzzcheck.c | 6 ------ 3 files changed, 8 insertions(+), 14 deletions(-) diff --git a/manifest b/manifest index db5a8b9441..bee11982bd 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Avoid\sexporting\ssqlite3_json_init()\sfrom\samalgamation\sbuilds. -D 2015-10-14T18:45:42.476 +C Fix\sfuzzcheck.c\sso\sthat\sit\sassumes\sthat\sJSON1\sis\salready\scompiled\sin\sand\ndoes\snot\sneed\sto\sbe\sinitialized\sfurther. +D 2015-10-14T19:44:42.477 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f0088ff0d2ac949fce6de7c00f13a99ac5bdb663 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -753,7 +753,7 @@ F test/fuzz2.test 76dc35b32b6d6f965259508508abce75a6c4d7e1 F test/fuzz3.test 53fabcd5f0f430f8b221282f6c12c4d0903c21eb F test/fuzz_common.tcl a87dfbb88c2a6b08a38e9a070dabd129e617b45b F test/fuzz_malloc.test 328f70aaca63adf29b4c6f06505ed0cf57ca7c26 -F test/fuzzcheck.c 73d7c49980c1a380f1dff52df9c6d67c854d92ea +F test/fuzzcheck.c c84086021a514360268190a1bc6ae8ed78d7c94f F test/fuzzdata1.db 7ee3227bad0e7ccdeb08a9e6822916777073c664 F test/fuzzdata2.db f03a420d3b822cc82e4f894ca957618fbe9c4973 F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba @@ -1390,7 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P a721fc0d89495518fe5612e2e3bbc60befd2e90d -R 91fe8986fc4249f600867bbdb41be531 -U dan -Z 2ae4d2560a7d6d806cb90ab807854a5b +P 8463f7e7908d0a96ed036377dfa3805328c62925 +R 143450f83083f2864dd76299804f842d +U drh +Z 0061d3e09dbd49242f0e67704e30ef02 diff --git a/manifest.uuid b/manifest.uuid index 2a577e009f..e5c356dd10 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -8463f7e7908d0a96ed036377dfa3805328c62925 \ No newline at end of file +ec003958359d6b69b1b1a75be2a988796268e063 \ No newline at end of file diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index b1ba573d60..15ddd09eed 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -1126,12 +1126,6 @@ int main(int argc, char **argv){ } rc = sqlite3_open_v2("main.db", &db, openFlags, zVfs); if( rc ) fatalError("cannot open inmem database"); -#ifdef SQLITE_ENABLE_JSON1 - { - extern int sqlite3_json_init(sqlite3*); - sqlite3_json_init(db); - } -#endif if( cellSzCkFlag ) runSql(db, "PRAGMA cell_size_check=ON", runFlags); setAlarm(iTimeout); #ifndef SQLITE_OMIT_PROGRESS_CALLBACK From 78e3f61f229556e64e925d863a7e9499d5825ce4 Mon Sep 17 00:00:00 2001 From: mistachkin Date: Wed, 14 Oct 2015 20:01:12 +0000 Subject: [PATCH 98/98] Enable cross-compiling the various tool EXEs with MSVC. FossilOrigin-Name: 7d77233389c595237d5b3d244b8aeca1524290c0 --- Makefile.msc | 34 +++++++++++++++++----------------- manifest | 15 +++++++-------- manifest.uuid | 2 +- 3 files changed, 25 insertions(+), 26 deletions(-) diff --git a/Makefile.msc b/Makefile.msc index b486c8b8d1..13f4fe4d3b 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -1234,21 +1234,21 @@ libtclsqlite3.lib: tclsqlite.lo libsqlite3.lib sqlite3.exe: $(TOP)\src\shell.c $(SHELL_CORE_DEP) $(LIBRESOBJS) sqlite3.h $(LTLINK) $(SHELL_COMPILE_OPTS) $(SHELL_COMPILE_OPTS) $(READLINE_FLAGS) $(TOP)\src\shell.c \ - /link /pdb:sqlite3sh.pdb $(LTLINKOPTS) $(SHELL_LINK_OPTS) $(LTLIBPATHS) $(LIBRESOBJS) $(LIBREADLINE) $(LTLIBS) $(TLIBS) + /link /pdb:sqlite3sh.pdb $(LDFLAGS) $(LTLINKOPTS) $(SHELL_LINK_OPTS) $(LTLIBPATHS) $(LIBRESOBJS) $(LIBREADLINE) $(LTLIBS) $(TLIBS) sqldiff.exe: $(TOP)\tool\sqldiff.c sqlite3.c sqlite3.h - $(LTLINK) $(NO_WARN) $(TOP)\tool\sqldiff.c sqlite3.c + $(LTLINK) $(NO_WARN) $(TOP)\tool\sqldiff.c sqlite3.c /link $(LDFLAGS) $(LTLINKOPTS) fuzzershell.exe: $(TOP)\tool\fuzzershell.c sqlite3.c sqlite3.h $(LTLINK) $(NO_WARN) $(FUZZERSHELL_COMPILE_OPTS) \ - $(TOP)\tool\fuzzershell.c sqlite3.c + $(TOP)\tool\fuzzershell.c sqlite3.c /link $(LDFLAGS) $(LTLINKOPTS) fuzzcheck.exe: $(TOP)\test\fuzzcheck.c sqlite3.c sqlite3.h - $(LTLINK) $(NO_WARN) $(FUZZCHECK_COMPILE_OPTS) $(TOP)\test\fuzzcheck.c sqlite3.c + $(LTLINK) $(NO_WARN) $(FUZZCHECK_COMPILE_OPTS) $(TOP)\test\fuzzcheck.c sqlite3.c /link $(LDFLAGS) $(LTLINKOPTS) mptester.exe: $(TOP)\mptest\mptest.c $(SHELL_CORE_DEP) $(LIBRESOBJS) sqlite3.h $(LTLINK) $(NO_WARN) $(SHELL_COMPILE_OPTS) $(TOP)\mptest\mptest.c \ - /link $(LTLINKOPTS) $(LTLIBPATHS) $(SHELL_LINK_OPTS) $(LIBRESOBJS) $(LIBREADLINE) $(LTLIBS) $(TLIBS) + /link $(LDFLAGS) $(LTLINKOPTS) $(LTLIBPATHS) $(SHELL_LINK_OPTS) $(LIBRESOBJS) $(LIBREADLINE) $(LTLIBS) $(TLIBS) MPTEST1 = mptester mptest.db $(TOP)\mptest\crash01.test --repeat 20 MPTEST2 = mptester mptest.db $(TOP)\mptest\multiwrite01.test --repeat 20 @@ -1571,7 +1571,7 @@ tclsqlite-shell.lo: $(TOP)\src\tclsqlite.c $(HDR) $(LTCOMPILE) $(NO_WARN) -DTCLSH=1 -DBUILD_sqlite -I$(TCLINCDIR) -c $(TOP)\src\tclsqlite.c tclsqlite3.exe: tclsqlite-shell.lo $(SQLITE3C) $(LIBRESOBJS) - $(LTLINK) $(SQLITE3C) /link $(LTLINKOPTS) $(LTLIBPATHS) /OUT:$@ tclsqlite-shell.lo $(LIBRESOBJS) $(LTLIBS) $(TLIBS) + $(LTLINK) $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) $(LTLIBPATHS) /OUT:$@ tclsqlite-shell.lo $(LIBRESOBJS) $(LTLIBS) $(TLIBS) # Rules to build opcodes.c and opcodes.h # @@ -1734,7 +1734,7 @@ testfixture.exe: $(TESTFIXTURE_SRC) $(LIBRESOBJS) $(HDR) $(LTLINK) -DSQLITE_NO_SYNC=1 $(TESTFIXTURE_FLAGS) \ -DBUILD_sqlite -I$(TCLINCDIR) \ $(TESTFIXTURE_SRC) \ - /link $(LTLINKOPTS) $(LTLIBPATHS) $(LIBRESOBJS) $(LTLIBS) $(TLIBS) + /link $(LDFLAGS) $(LTLINKOPTS) $(LTLIBPATHS) $(LIBRESOBJS) $(LTLIBS) $(TLIBS) extensiontest: testfixture.exe testloadext.dll .\testfixture.exe $(TOP)\test\loadext.test $(TESTOPTS) @@ -1782,7 +1782,7 @@ sqlite3_analyzer.c: $(SQLITE3C) $(TOP)\src\tclsqlite.c $(TOP)\tool\spaceanal.tcl sqlite3_analyzer.exe: sqlite3_analyzer.c $(LIBRESOBJS) $(LTLINK) $(NO_WARN) -DBUILD_sqlite -I$(TCLINCDIR) sqlite3_analyzer.c \ - /link $(LTLINKOPTS) $(LTLIBPATHS) $(LIBRESOBJS) $(LTLIBS) $(TLIBS) + /link $(LDFLAGS) $(LTLINKOPTS) $(LTLIBPATHS) $(LIBRESOBJS) $(LTLIBS) $(TLIBS) testloadext.lo: $(TOP)\src\test_loadext.c $(LTCOMPILE) $(NO_WARN) -c $(TOP)\src\test_loadext.c @@ -1792,38 +1792,38 @@ testloadext.dll: testloadext.lo showdb.exe: $(TOP)\tool\showdb.c $(SQLITE3C) $(LTLINK) $(NO_WARN) -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION -Fe$@ \ - $(TOP)\tool\showdb.c $(SQLITE3C) + $(TOP)\tool\showdb.c $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) showstat4.exe: $(TOP)\tool\showstat4.c $(SQLITE3C) $(LTLINK) $(NO_WARN) -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION -Fe$@ \ - $(TOP)\tool\showstat4.c $(SQLITE3C) + $(TOP)\tool\showstat4.c $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) showjournal.exe: $(TOP)\tool\showjournal.c $(SQLITE3C) $(LTLINK) $(NO_WARN) -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION -Fe$@ \ - $(TOP)\tool\showjournal.c $(SQLITE3C) + $(TOP)\tool\showjournal.c $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) showwal.exe: $(TOP)\tool\showwal.c $(SQLITE3C) $(LTLINK) $(NO_WARN) -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION -Fe$@ \ - $(TOP)\tool\showwal.c $(SQLITE3C) + $(TOP)\tool\showwal.c $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) fts3view.exe: $(TOP)\ext\fts3\tool\fts3view.c $(SQLITE3C) $(LTLINK) $(NO_WARN) -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION -Fe$@ \ - $(TOP)\ext\fts3\tool\fts3view.c $(SQLITE3C) + $(TOP)\ext\fts3\tool\fts3view.c $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) rollback-test.exe: $(TOP)\tool\rollback-test.c $(SQLITE3C) $(LTLINK) $(NO_WARN) -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION -Fe$@ \ - $(TOP)\tool\rollback-test.c $(SQLITE3C) + $(TOP)\tool\rollback-test.c $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) LogEst.exe: $(TOP)\tool\logest.c sqlite3.h - $(LTLINK) $(NO_WARN) -Fe$@ $(TOP)\tool\LogEst.c + $(LTLINK) $(NO_WARN) -Fe$@ $(TOP)\tool\LogEst.c /link $(LDFLAGS) $(LTLINKOPTS) wordcount.exe: $(TOP)\test\wordcount.c $(SQLITE3C) $(LTLINK) $(NO_WARN) -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION -Fe$@ \ - $(TOP)\test\wordcount.c $(SQLITE3C) + $(TOP)\test\wordcount.c $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) speedtest1.exe: $(TOP)\test\speedtest1.c $(SQLITE3C) $(LTLINK) $(NO_WARN) -DSQLITE_OMIT_LOAD_EXTENSION -Fe$@ \ - $(TOP)\test\speedtest1.c $(SQLITE3C) + $(TOP)\test\speedtest1.c $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) clean: del /Q *.exp *.lo *.ilk *.lib *.obj *.ncb *.pdb *.sdf *.suo 2>NUL diff --git a/manifest b/manifest index 87f86220b2..d281516416 100644 --- a/manifest +++ b/manifest @@ -1,9 +1,9 @@ -C Fixes\sto\sthe\sJSON1\sextension\sand\sto\sits\suse\sby\sfuzzcheck\sto\savoid\sproblems\nwhen\sbuilding\sDLLs. -D 2015-10-14T19:52:27.982 +C Enable\scross-compiling\sthe\svarious\stool\sEXEs\swith\sMSVC. +D 2015-10-14T20:01:12.045 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in f0088ff0d2ac949fce6de7c00f13a99ac5bdb663 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 -F Makefile.msc 0ed934b4ae6a5ec0b9d7e770104864f8372414ab +F Makefile.msc c3b8393498780d2207278c7beae0042d9f881007 F Makefile.vxworks e1b65dea203f054e71653415bd8f96dcaed47858 F README.md 8ecc12493ff9f820cdea6520a9016001cb2e59b7 F VERSION cacf16a72f9a03cd06b939a764e32f6f53254c7f @@ -1390,8 +1390,7 @@ F tool/vdbe_profile.tcl 67746953071a9f8f2f668b73fe899074e2c6d8c1 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh 48bd54594752d5be3337f12c72f28d2080cb630b F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P a721fc0d89495518fe5612e2e3bbc60befd2e90d ec003958359d6b69b1b1a75be2a988796268e063 -R 143450f83083f2864dd76299804f842d -T +closed ec003958359d6b69b1b1a75be2a988796268e063 -U drh -Z 9888e39b5177d6b3f8e12974b89fa09f +P 01d3ee7bbe4feeb82dcedecbe3c9058c807b18f6 +R c40c01c72f42f25a92a8c4a83d0b3093 +U mistachkin +Z fc9103245e653032cd30d15d9e8811ac diff --git a/manifest.uuid b/manifest.uuid index 3c45ae8c61..76d58ba4fc 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -01d3ee7bbe4feeb82dcedecbe3c9058c807b18f6 \ No newline at end of file +7d77233389c595237d5b3d244b8aeca1524290c0 \ No newline at end of file
    %s %s %s %s\n", $3, $4, $5, $6 - }else if( $1=="*/" ){ - printf "