dev-db/sqlite: update to 3.33.0

Now that `dev-lang/tcl` is included in SDK, we can now build
dev-db/sqlite without having to rely on third-party patches
in coreos-overlay.

So simply sync sqlite with Gentoo upstream, and update to the latest
version 3.33.0.
This commit is contained in:
Dongsu Park 2020-10-30 16:00:47 +01:00
parent 3171a5d96b
commit 8494602fb1
19 changed files with 3237 additions and 1402 deletions

View File

@ -1,9 +1,4 @@
DIST sqlite-autoconf-3290000.tar.gz 2833613 BLAKE2B b68a4f9bfe90653f5ce9dbf94b44cecc843fbb639883a7be9dd40150749f8d2eca0c231b215137d2f8da78d33356d72640a943ba06516c6d7c10ebd04cae4766 SHA512 85dcaa72cc2476c628e801d4ce46cf10ed8997f56cb0334062df5553f18c29d607883a1049bf75258204f2f53a29a02a01f014dcca383b05dfac1e2123778024 DIST sqlite-doc-3320300.zip 9772933 BLAKE2B efd72c18d0398c103e3f9c4cfeb03e7794fd69691b1bcea95b74a0c5d8af22aa13abc84ce8dc5864b5f4cb79be239433933b4daca34d1adfcc6f31ce2cde66bf SHA512 af9dca970b4c03c058d7d1cd55a3d11fa4b112dccac942b8660d82a7e9ba2956963fcb429eedfdc85915637c102e1f904ace98c8e0455c4120422bbd9f2f3cd0
DIST sqlite-autoconf-3300100.tar.gz 2848951 BLAKE2B 3a541a2b07ebbaf7ddca4693b71765e2ecd11974dd64b4a7a19eaee4eea8a17a6004c69f3b2163213fe7568480152709745e029107711813d4bdd41052763cd1 SHA512 9ec0283c417fb0323b0e43550af2a49e9a63988e4212c27ea62cc9da3534caa6faf5bdc7e051b6772c4ce61560a433b3d3288b68e05e9ba8495f61a3bcebda3e DIST sqlite-doc-3330000.zip 9834159 BLAKE2B f67155a8ce8e46c2fbc0a4e35722d1fcad86e905a15230adc70732cee267b6b2002c7499883b938129aaa908b99634e4214360e9d1dbdae333b09060de24530e SHA512 14a3cccb4ff6af57738990eeadd37a1b827f89c9c1b16201c62ca5bb9301d39223d48677b9c269ce332210e5c9ae3f42aa0f9de7d79b38acb9809c732d038368
DIST sqlite-autoconf-3310100.tar.gz 2887243 BLAKE2B ef5d40b6e6c59a51ae95368eb9f6a938188813f89d5328ea1c1180ef35f124c14b3e83b0832ae5c2fa24cc2df352f1b0ea5f20b64d0762d50a700d9895f9a12e SHA512 d85250ba5f78f0c918880f663741709aba662192f04888b2324a0df17affdf5b8540e8428c6c7315119806e7adad758ea281c9b403c0ad94ac6a9bd1b93fd617 DIST sqlite-src-3320300.zip 12461750 BLAKE2B 59cce74d284191cfc69ac09b6014701ddd2b7b3d7ebaad5da4ad71cc200e70285b3b201ff174819aa8dde5f610589d7947f547450334f0f17149014078316185 SHA512 7e027c7163a760fb9b6dbfd2e4ccffb39d4972280583fb0d7f8390017101dfed3b12a36653b3130a548ae4d04c6abb11c0a1921b6f09c54c6ae1e72fbdcb2fd4
DIST sqlite-doc-3290000.zip 9415641 BLAKE2B 97fef1f01d3e7730e5220541ad9ccdf9f8538aa43939c0f513919c8505b3a4f4b4c89eb2e04fddae80b7eeed440eb0f06f7cfd93cd56f0539bd6fdd5f47e1ff7 SHA512 ca856cf250e395d9c7e9817337adb5a16b1d96a20548a4010f5137188d35bb9d49a4a6da47bf2a696deffa68d2976dbb35a036adce19b8320e0e286876ac094f DIST sqlite-src-3330000.zip 12591089 BLAKE2B 14888bca229683e97c4666f8efb535be5bd3e322de0089f0175ba15e038016be3a3cc00b5bfa8c111538116914cf6d8439839ca5d1e20339b184e547ddf260a4 SHA512 3260e3e03ee2f6a4ff2bc4ea4bada5a1497afeca33878c155a8005824970c6c1eb8a2db58eb3023cab084af475fadb81d1c3c9892ae92c07f884881e6602e173
DIST sqlite-doc-3300100.zip 9485342 BLAKE2B bf5e3909a327c773106d4990b3e3be5dd63db2dbc1a7f8a7c1bd16f39bec83a6b2a98c4c56ded3b58f4087dcdcc934e542db36e142bf338a411ed7115d67d6b3 SHA512 373e843015307071443a0db5fb930f9120718f6118cc2e21b506fdc8535fbe6996e9889e8b5809ffb91257addfe778bdf3412a81e11f6bced2c5e0330337d00d
DIST sqlite-doc-3310100.zip 9600405 BLAKE2B 324fb7a0a38bc56476e41504c14996e9d5d83ac659403991515413d49f5ee3aad064ccece25f52b6041ef26bf23f320a9be1b6b02c5fbe96c36372107f54fc2e SHA512 5572e2c2dac30c014ef9cd60a620b7a7bb610f91a47e2890c0641540d39b9d5ce0e914ee697583130317633918b7827e2612a7cbc024f5bd6aa22ad28a78b56b
DIST sqlite-src-3290000.zip 12557725 BLAKE2B b1aeb80734a2cb7d45c6f2e278bad2996b56ecaf792a8f26322bf50aeaa430eea267f23edb1721bb80ecb6e0c8e14c7a5d8f26178d056fd23efb52f496cc03e1 SHA512 575398fbe20c6471ee2abcbde170b8d48efbb3cb2716a65f42f05c52429a45d14e8046e50c59bbf75bfe2d8f151c34abd50b440c50af571f19e19f3290b230df
DIST sqlite-src-3300100.zip 12648162 BLAKE2B bb239bac9115c74778de0347b4f4e24a82f149f55fe7dea8b89eb859bfe4cf6f6c2f065f5e1741c40624bb88ecd395140064a41d475a1c64a0188990fd6248e7 SHA512 f40236d0bb25f3ea01a1192dace3b6732fb671fbdabb7cfa8d0cc2b99d21aef00ae380999fdee904501cb03304644cddfb2506951f36a2f6a83693f311c3c11d
DIST sqlite-src-3310100.zip 12510166 BLAKE2B a856695e8552b8b4dcb28452fdbd48305fdb9072f9d6587f4b1f4445daf386e920eb936dcb50fdfe41a49f84b26a7c5fedcffea5acf3ba3fa935c36695d4b8ee SHA512 af92a00877bcd90372d6f83a27fea12b4fe8d1155b223a6bccbccc31bb8e3d2269cd9e68f329bc55f70d1068ccbf220ff5abccea6f593fd7a3a4bdd732d1cdbe

View File

@ -1,14 +0,0 @@
Fix building with dlopen() not available.
--- /configure.ac
+++ /configure.ac
@@ -102,6 +102,9 @@
[], [enable_dynamic_extensions=yes])
if test x"$enable_dynamic_extensions" != "xno"; then
AC_SEARCH_LIBS(dlopen, dl)
+ if test "${ac_cv_search_dlopen}" = "no"; then
+ BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_OMIT_LOAD_EXTENSION=1"
+ fi
else
BUILD_CFLAGS="$BUILD_CFLAGS -DSQLITE_OMIT_LOAD_EXTENSION=1"
fi

View File

@ -1,121 +0,0 @@
https://sqlite.org/src/info/408144a1832569ce
--- /test/vtab1.test
+++ /test/vtab1.test
@@ -1303,25 +1303,27 @@
CREATE VIRTUAL TABLE e6 USING echo(t6);
}
-foreach {tn sql res filter} {
- 1.1 "SELECT a FROM e6 WHERE b>'8James'" {4 2 6 1 5}
- {xFilter {SELECT rowid, a, b FROM 't6' WHERE b > ?} 8James}
-
- 1.2 "SELECT a FROM e6 WHERE b>='8' AND b<'9'" {3 4}
- {xFilter {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ?} 8 9}
-
- 1.3 "SELECT a FROM e6 WHERE b LIKE '8J%'" {3 4}
- {xFilter {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b like ?} 8J 8k 8J%}
-
- 1.4 "SELECT a FROM e6 WHERE b LIKE '8j%'" {3 4}
- {xFilter {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b like ?} 8J 8k 8j%}
-
- 1.5 "SELECT a FROM e6 WHERE b LIKE '8%'" {3 4}
- {xFilter {SELECT rowid, a, b FROM 't6' WHERE b like ?} 8%}
-} {
- set echo_module {}
- do_execsql_test 18.$tn.1 $sql $res
- do_test 18.$tn.2 { lrange $::echo_module 2 end } $filter
+ifcapable !icu {
+ foreach {tn sql res filter} {
+ 1.1 "SELECT a FROM e6 WHERE b>'8James'" {4 2 6 1 5}
+ {xFilter {SELECT rowid, a, b FROM 't6' WHERE b > ?} 8James}
+
+ 1.2 "SELECT a FROM e6 WHERE b>='8' AND b<'9'" {3 4}
+ {xFilter {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ?} 8 9}
+
+ 1.3 "SELECT a FROM e6 WHERE b LIKE '8J%'" {3 4}
+ {xFilter {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b like ?} 8J 8k 8J%}
+
+ 1.4 "SELECT a FROM e6 WHERE b LIKE '8j%'" {3 4}
+ {xFilter {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b like ?} 8J 8k 8j%}
+
+ 1.5 "SELECT a FROM e6 WHERE b LIKE '8%'" {3 4}
+ {xFilter {SELECT rowid, a, b FROM 't6' WHERE b like ?} 8%}
+ } {
+ set echo_module {}
+ do_execsql_test 18.$tn.1 $sql $res
+ do_test 18.$tn.2 { lrange $::echo_module 2 end } $filter
+ }
}
do_execsql_test 18.2.0 { PRAGMA case_sensitive_like = ON }
--- /test/vtabH.test
+++ /test/vtabH.test
@@ -30,36 +30,38 @@
CREATE VIRTUAL TABLE e6 USING echo(t6);
}
-foreach {tn sql expect} {
- 1 "SELECT * FROM e6 WHERE b LIKE '8abc'" {
- xBestIndex
- {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b like ?}
- xFilter
- {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b like ?}
- 8ABC 8abd 8abc
+ifcapable !icu {
+ foreach {tn sql expect} {
+ 1 "SELECT * FROM e6 WHERE b LIKE '8abc'" {
+ xBestIndex
+ {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b like ?}
+ xFilter
+ {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b like ?}
+ 8ABC 8abd 8abc
+ }
+
+ 2 "SELECT * FROM e6 WHERE b GLOB '8abc'" {
+ xBestIndex
+ {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b glob ?}
+ xFilter
+ {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b glob ?}
+ 8abc 8abd 8abc
+ }
+ 3 "SELECT * FROM e6 WHERE b LIKE '8e/'" {
+ xBestIndex {SELECT rowid, a, b FROM 't6' WHERE b like ?}
+ xFilter {SELECT rowid, a, b FROM 't6' WHERE b like ?} 8e/
+ }
+ 4 "SELECT * FROM e6 WHERE b GLOB '8e/'" {
+ xBestIndex {SELECT rowid, a, b FROM 't6' WHERE b glob ?}
+ xFilter {SELECT rowid, a, b FROM 't6' WHERE b glob ?} 8e/
+ }
+ } {
+ do_test 1.$tn {
+ set echo_module {}
+ execsql $sql
+ set ::echo_module
+ } [list {*}$expect]
}
-
- 2 "SELECT * FROM e6 WHERE b GLOB '8abc'" {
- xBestIndex
- {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b glob ?}
- xFilter
- {SELECT rowid, a, b FROM 't6' WHERE b >= ? AND b < ? AND b glob ?}
- 8abc 8abd 8abc
- }
- 3 "SELECT * FROM e6 WHERE b LIKE '8e/'" {
- xBestIndex {SELECT rowid, a, b FROM 't6' WHERE b like ?}
- xFilter {SELECT rowid, a, b FROM 't6' WHERE b like ?} 8e/
- }
- 4 "SELECT * FROM e6 WHERE b GLOB '8e/'" {
- xBestIndex {SELECT rowid, a, b FROM 't6' WHERE b glob ?}
- xFilter {SELECT rowid, a, b FROM 't6' WHERE b glob ?} 8e/
- }
-} {
- do_test 1.$tn {
- set echo_module {}
- execsql $sql
- set ::echo_module
- } [list {*}$expect]
}

View File

@ -1,72 +0,0 @@
https://sqlite.org/cgi/src/info/04885763c4cd00cb
https://sqlite.org/cgi/src/info/b20503aaf5b6595a
--- /ext/fts5/test/fts5matchinfo.test
+++ /ext/fts5/test/fts5matchinfo.test
@@ -500,14 +500,18 @@
INSERT INTO t1 VALUES('c', 'd');
}
+if {$tcl_platform(byteOrder)=="littleEndian"} {
+ set res {X'02000000'}
+} else {
+ set res {X'00000002'}
+}
do_execsql_test 15.1 {
SELECT quote(matchinfo(t1, 'n')) FROM t1 LIMIT 1;
-} {X'02000000'}
-
+} $res
do_execsql_test 15.2 {
DELETE FROM t1_content WHERE rowid=1;
SELECT quote(matchinfo(t1, 'n')) FROM t1 LIMIT 1;
-} {X'02000000'}
+} $res
fts5_aux_test_functions db
do_execsql_test 15.3 {
@@ -517,4 +521,3 @@
}
finish_test
-
--- /src/insert.c
+++ /src/insert.c
@@ -2170,12 +2170,14 @@
x = *sqlite3VdbeGetOp(v, addrConflictCk);
if( x.opcode!=OP_IdxRowid ){
int p2; /* New P2 value for copied conflict check opcode */
+ const char *zP4;
if( sqlite3OpcodeProperty[x.opcode]&OPFLG_JUMP ){
p2 = lblRecheckOk;
}else{
p2 = x.p2;
}
- sqlite3VdbeAddOp4(v, x.opcode, x.p1, p2, x.p3, x.p4.z, x.p4type);
+ zP4 = x.p4type==P4_INT32 ? SQLITE_INT_TO_PTR(x.p4.i) : x.p4.z;
+ sqlite3VdbeAddOp4(v, x.opcode, x.p1, p2, x.p3, zP4, x.p4type);
sqlite3VdbeChangeP5(v, x.p5);
VdbeCoverageIf(v, p2!=x.p2);
}
--- /test/fts4aa.test
+++ /test/fts4aa.test
@@ -229,13 +229,18 @@
# 2019-11-18 https://bugs.chromium.org/p/chromium/issues/detail?id=1025467
db close
sqlite3 db :memory:
+if {$tcl_platform(byteOrder)=="littleEndian"} {
+ set res {X'0200000000000000000000000E0000000E00000001000000010000000100000001000000'}
+} else {
+ set res {X'0000000200000000000000000000000E0000000E00000001000000010000000100000001'}
+}
do_execsql_test fts4aa-6.10 {
CREATE VIRTUAL TABLE f USING fts4();
INSERT INTO f_segdir VALUES (77,91,0,0,'255 77',x'0001308000004d5c4ddddddd4d4d7b4d4d4d614d8019ff4d05000001204d4d2e4d6e4d4d4d4b4d6c4d004d4d4d4d4d4d3d000000004d5d4d4d645d4d004d4d4d4d4d4d4d4d4d454d6910004d05ffff054d646c4d004d5d4d4d4d4d3d000000004d4d4d4d4d4d4d4d4d4d4d69624d4d4d04004d4d4d4d4d604d4ce1404d554d45');
INSERT INTO f_segdir VALUES (77,108,0,0,'255 77',x'0001310000fa64004d4d4d3c5d4d654d4d4d614d8000ff4d05000001204d4d2e4d6e4d4d4dff4d4d4d4d4d4d00104d4d4d4d000000004d4d4d0400311d4d4d4d4d4d4d4d4d4d684d6910004d05ffff054d4d6c4d004d4d4d4d4d4d3d000000004d4d4d4d644d4d4d4d4d4d69624d4d4d03ed4d4d4d4d4d604d4ce1404d550080');
INSERT INTO f_stat VALUES (0,x'80808080100000000064004d4d4d3c4d4d654d4d4d614d8000ff4df6ff1a00204d4d2e4d6e4d4d4d104d4d4d4d4d4d00104d4d4d4d4d4d69574d4d4d000031044d4d4d3e4d4d4c4d05004d6910');
SELECT quote(matchinfo(f,'pnax')) from f where f match '0 1';
-} {X'0200000000000000000000000E0000000E00000001000000010000000100000001000000'}
+} $res
# 2019-11-18 Detect infinite loop in fts3SelectLeaf()
db close

View File

@ -1,163 +0,0 @@
https://sqlite.org/cgi/src/info/9d0d4ab95dc0c56e
https://sqlite.org/cgi/src/info/abc473fb8fb99900
https://sqlite.org/cgi/src/info/5aeb5a2d295e10d5
https://sqlite.org/cgi/src/info/a67cf5b7d37d5b14
https://sqlite.org/cgi/src/info/14d14eb537075c6a
https://sqlite.org/cgi/src/info/c431b3fd8fd0f6a6
--- /src/expr.c
+++ /src/expr.c
@@ -5463,19 +5463,25 @@
case TK_LT:
case TK_LE:
case TK_GT:
- case TK_GE:
+ case TK_GE: {
+ Expr *pLeft = pExpr->pLeft;
+ Expr *pRight = pExpr->pRight;
testcase( pExpr->op==TK_EQ );
testcase( pExpr->op==TK_NE );
testcase( pExpr->op==TK_LT );
testcase( pExpr->op==TK_LE );
testcase( pExpr->op==TK_GT );
testcase( pExpr->op==TK_GE );
- if( (pExpr->pLeft->op==TK_COLUMN && IsVirtual(pExpr->pLeft->y.pTab))
- || (pExpr->pRight->op==TK_COLUMN && IsVirtual(pExpr->pRight->y.pTab))
+ /* The y.pTab=0 assignment in wherecode.c always happens after the
+ ** impliesNotNullRow() test */
+ if( (pLeft->op==TK_COLUMN && ALWAYS(pLeft->y.pTab!=0)
+ && IsVirtual(pLeft->y.pTab))
+ || (pRight->op==TK_COLUMN && ALWAYS(pRight->y.pTab!=0)
+ && IsVirtual(pRight->y.pTab))
){
- return WRC_Prune;
+ return WRC_Prune;
}
-
+ }
default:
return WRC_Continue;
}
--- /src/resolve.c
+++ /src/resolve.c
@@ -1051,7 +1051,7 @@
assert( !ExprHasProperty(pExpr, EP_Reduced) );
/* Handle special cases of "x IS TRUE", "x IS FALSE", "x IS NOT TRUE",
** and "x IS NOT FALSE". */
- if( pRight->op==TK_ID ){
+ if( pRight && pRight->op==TK_ID ){
int rc = resolveExprStep(pWalker, pRight);
if( rc==WRC_Abort ) return WRC_Abort;
if( pRight->op==TK_TRUEFALSE ){
--- /src/select.c
+++ /src/select.c
@@ -2806,6 +2806,7 @@
/* Generate code to take the intersection of the two temporary
** tables.
*/
+ if( rc ) break;
assert( p->pEList );
iBreak = sqlite3VdbeMakeLabel(pParse);
iCont = sqlite3VdbeMakeLabel(pParse);
@@ -5148,7 +5149,7 @@
pNew = sqlite3ExprListAppend(pParse, pNew, pExpr);
sqlite3TokenInit(&sColname, zColname);
sqlite3ExprListSetName(pParse, pNew, &sColname, 0);
- if( pNew && (p->selFlags & SF_NestedFrom)!=0 ){
+ if( pNew && (p->selFlags & SF_NestedFrom)!=0 && !IN_RENAME_OBJECT ){
struct ExprList_item *pX = &pNew->a[pNew->nExpr-1];
sqlite3DbFree(db, pX->zEName);
if( pSub ){
--- /src/sqliteInt.h
+++ /src/sqliteInt.h
@@ -2153,8 +2153,11 @@
*/
#ifndef SQLITE_OMIT_VIRTUALTABLE
# define IsVirtual(X) ((X)->nModuleArg)
+# define ExprIsVtab(X) \
+ ((X)->op==TK_COLUMN && (X)->y.pTab!=0 && (X)->y.pTab->nModuleArg)
#else
# define IsVirtual(X) 0
+# define ExprIsVtab(X) 0
#endif
/*
--- /src/whereexpr.c
+++ /src/whereexpr.c
@@ -377,7 +377,8 @@
** MATCH(expression,vtab_column)
*/
pCol = pList->a[1].pExpr;
- if( pCol->op==TK_COLUMN && IsVirtual(pCol->y.pTab) ){
+ testcase( pCol->op==TK_COLUMN && pCol->y.pTab==0 );
+ if( ExprIsVtab(pCol) ){
for(i=0; i<ArraySize(aOp); i++){
if( sqlite3StrICmp(pExpr->u.zToken, aOp[i].zOp)==0 ){
*peOp2 = aOp[i].eOp2;
@@ -399,7 +400,8 @@
** with function names in an arbitrary case.
*/
pCol = pList->a[0].pExpr;
- if( pCol->op==TK_COLUMN && IsVirtual(pCol->y.pTab) ){
+ testcase( pCol->op==TK_COLUMN && pCol->y.pTab==0 );
+ if( ExprIsVtab(pCol) ){
sqlite3_vtab *pVtab;
sqlite3_module *pMod;
void (*xNotUsed)(sqlite3_context*,int,sqlite3_value**);
@@ -422,10 +424,12 @@
int res = 0;
Expr *pLeft = pExpr->pLeft;
Expr *pRight = pExpr->pRight;
- if( pLeft->op==TK_COLUMN && IsVirtual(pLeft->y.pTab) ){
+ testcase( pLeft->op==TK_COLUMN && pLeft->y.pTab==0 );
+ if( ExprIsVtab(pLeft) ){
res++;
}
- if( pRight && pRight->op==TK_COLUMN && IsVirtual(pRight->y.pTab) ){
+ testcase( pRight && pRight->op==TK_COLUMN && pRight->y.pTab==0 );
+ if( pRight && ExprIsVtab(pRight) ){
res++;
SWAP(Expr*, pLeft, pRight);
}
--- /test/altertab.test
+++ /test/altertab.test
@@ -613,4 +613,21 @@
SELECT sql FROM sqlite_master;
} {{CREATE TABLE t0 (c1 INTEGER, PRIMARY KEY(c1))}}
+# 2020-02-23 ticket f50af3e8a565776b
+reset_db
+do_execsql_test 19.100 {
+ CREATE TABLE t1(x);
+ CREATE VIEW t2 AS SELECT 1 FROM t1, (t1 AS a0, t1);
+ ALTER TABLE t1 RENAME TO t3;
+ SELECT sql FROM sqlite_master;
+} {{CREATE TABLE "t3"(x)} {CREATE VIEW t2 AS SELECT 1 FROM "t3", ("t3" AS a0, "t3")}}
+do_execsql_test 19.110 {
+ INSERT INTO t3(x) VALUES(123);
+ SELECT * FROM t2;
+} {1}
+do_execsql_test 19.120 {
+ INSERT INTO t3(x) VALUES('xyz');
+ SELECT * FROM t2;
+} {1 1 1 1 1 1 1 1}
+
finish_test
--- /test/windowfault.test
+++ /test/windowfault.test
@@ -263,4 +263,15 @@
faultsim_test_result {0 {}}
}
+do_faultsim_test 11 -faults oom* -prep {
+} -body {
+ execsql {
+ VALUES(false),(current_date collate binary)
+ intersect
+ values(count() not like group_concat(cast(cast(0e00 as text) as integer) <= NULL || 0.4e-0 || 0x8 & true ) over () collate rtrim);
+ }
+} -test {
+ faultsim_test_result {0 {}}
+}
+
finish_test

View File

@ -1,20 +0,0 @@
https://sqlite.org/cgi/src/info/04885763c4cd00cb
--- /sqlite3.c
+++ /sqlite3.c
@@ -121302,12 +121302,14 @@
x = *sqlite3VdbeGetOp(v, addrConflictCk);
if( x.opcode!=OP_IdxRowid ){
int p2; /* New P2 value for copied conflict check opcode */
+ const char *zP4;
if( sqlite3OpcodeProperty[x.opcode]&OPFLG_JUMP ){
p2 = lblRecheckOk;
}else{
p2 = x.p2;
}
- sqlite3VdbeAddOp4(v, x.opcode, x.p1, p2, x.p3, x.p4.z, x.p4type);
+ zP4 = x.p4type==P4_INT32 ? SQLITE_INT_TO_PTR(x.p4.i) : x.p4.z;
+ sqlite3VdbeAddOp4(v, x.opcode, x.p1, p2, x.p3, zP4, x.p4type);
sqlite3VdbeChangeP5(v, x.p5);
VdbeCoverageIf(v, p2!=x.p2);
}

View File

@ -1,112 +0,0 @@
https://sqlite.org/cgi/src/info/9d0d4ab95dc0c56e
https://sqlite.org/cgi/src/info/abc473fb8fb99900
https://sqlite.org/cgi/src/info/5aeb5a2d295e10d5
https://sqlite.org/cgi/src/info/a67cf5b7d37d5b14
https://sqlite.org/cgi/src/info/c431b3fd8fd0f6a6
--- /sqlite3.c
+++ /sqlite3.c
@@ -17428,8 +17428,11 @@
*/
#ifndef SQLITE_OMIT_VIRTUALTABLE
# define IsVirtual(X) ((X)->nModuleArg)
+# define ExprIsVtab(X) \
+ ((X)->op==TK_COLUMN && (X)->y.pTab!=0 && (X)->y.pTab->nModuleArg)
#else
# define IsVirtual(X) 0
+# define ExprIsVtab(X) 0
#endif
/*
@@ -97816,7 +97819,7 @@
assert( !ExprHasProperty(pExpr, EP_Reduced) );
/* Handle special cases of "x IS TRUE", "x IS FALSE", "x IS NOT TRUE",
** and "x IS NOT FALSE". */
- if( pRight->op==TK_ID ){
+ if( pRight && pRight->op==TK_ID ){
int rc = resolveExprStep(pWalker, pRight);
if( rc==WRC_Abort ) return WRC_Abort;
if( pRight->op==TK_TRUEFALSE ){
@@ -104133,19 +104136,25 @@
case TK_LT:
case TK_LE:
case TK_GT:
- case TK_GE:
+ case TK_GE: {
+ Expr *pLeft = pExpr->pLeft;
+ Expr *pRight = pExpr->pRight;
testcase( pExpr->op==TK_EQ );
testcase( pExpr->op==TK_NE );
testcase( pExpr->op==TK_LT );
testcase( pExpr->op==TK_LE );
testcase( pExpr->op==TK_GT );
testcase( pExpr->op==TK_GE );
- if( (pExpr->pLeft->op==TK_COLUMN && IsVirtual(pExpr->pLeft->y.pTab))
- || (pExpr->pRight->op==TK_COLUMN && IsVirtual(pExpr->pRight->y.pTab))
+ /* The y.pTab=0 assignment in wherecode.c always happens after the
+ ** impliesNotNullRow() test */
+ if( (pLeft->op==TK_COLUMN && ALWAYS(pLeft->y.pTab!=0)
+ && IsVirtual(pLeft->y.pTab))
+ || (pRight->op==TK_COLUMN && ALWAYS(pRight->y.pTab!=0)
+ && IsVirtual(pRight->y.pTab))
){
- return WRC_Prune;
+ return WRC_Prune;
}
-
+ }
default:
return WRC_Continue;
}
@@ -130673,6 +130682,7 @@
/* Generate code to take the intersection of the two temporary
** tables.
*/
+ if( rc ) break;
assert( p->pEList );
iBreak = sqlite3VdbeMakeLabel(pParse);
iCont = sqlite3VdbeMakeLabel(pParse);
@@ -133015,7 +133025,7 @@
pNew = sqlite3ExprListAppend(pParse, pNew, pExpr);
sqlite3TokenInit(&sColname, zColname);
sqlite3ExprListSetName(pParse, pNew, &sColname, 0);
- if( pNew && (p->selFlags & SF_NestedFrom)!=0 ){
+ if( pNew && (p->selFlags & SF_NestedFrom)!=0 && !IN_RENAME_OBJECT ){
struct ExprList_item *pX = &pNew->a[pNew->nExpr-1];
sqlite3DbFree(db, pX->zEName);
if( pSub ){
@@ -142593,7 +142603,8 @@
** MATCH(expression,vtab_column)
*/
pCol = pList->a[1].pExpr;
- if( pCol->op==TK_COLUMN && IsVirtual(pCol->y.pTab) ){
+ testcase( pCol->op==TK_COLUMN && pCol->y.pTab==0 );
+ if( ExprIsVtab(pCol) ){
for(i=0; i<ArraySize(aOp); i++){
if( sqlite3StrICmp(pExpr->u.zToken, aOp[i].zOp)==0 ){
*peOp2 = aOp[i].eOp2;
@@ -142615,7 +142626,8 @@
** with function names in an arbitrary case.
*/
pCol = pList->a[0].pExpr;
- if( pCol->op==TK_COLUMN && IsVirtual(pCol->y.pTab) ){
+ testcase( pCol->op==TK_COLUMN && pCol->y.pTab==0 );
+ if( ExprIsVtab(pCol) ){
sqlite3_vtab *pVtab;
sqlite3_module *pMod;
void (*xNotUsed)(sqlite3_context*,int,sqlite3_value**);
@@ -142638,10 +142650,12 @@
int res = 0;
Expr *pLeft = pExpr->pLeft;
Expr *pRight = pExpr->pRight;
- if( pLeft->op==TK_COLUMN && IsVirtual(pLeft->y.pTab) ){
+ testcase( pLeft->op==TK_COLUMN && pLeft->y.pTab==0 );
+ if( ExprIsVtab(pLeft) ){
res++;
}
- if( pRight && pRight->op==TK_COLUMN && IsVirtual(pRight->y.pTab) ){
+ testcase( pRight && pRight->op==TK_COLUMN && pRight->y.pTab==0 );
+ if( pRight && ExprIsVtab(pRight) ){
res++;
SWAP(Expr*, pLeft, pRight);
}

View File

@ -0,0 +1,670 @@
Add initialization functions for internal usage in libsqlite3.so.
--- /ext/misc/carray.c
+++ /ext/misc/carray.c
@@ -383,16 +383,8 @@
#endif /* SQLITE_OMIT_VIRTUALTABLE */
-#ifdef _WIN32
-__declspec(dllexport)
-#endif
-int sqlite3_carray_init(
- sqlite3 *db,
- char **pzErrMsg,
- const sqlite3_api_routines *pApi
-){
+int sqlite3CarrayInit(sqlite3 *db){
int rc = SQLITE_OK;
- SQLITE_EXTENSION_INIT2(pApi);
#ifndef SQLITE_OMIT_VIRTUALTABLE
rc = sqlite3_create_module(db, "carray", &carrayModule, 0);
#ifdef SQLITE_TEST
@@ -404,3 +396,18 @@
#endif /* SQLITE_OMIT_VIRTUALTABLE */
return rc;
}
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
+int sqlite3_carray_init(
+ sqlite3 *db,
+ char **pzErrMsg,
+ const sqlite3_api_routines *pApi
+){
+ SQLITE_EXTENSION_INIT2(pApi);
+ (void)pzErrMsg; /* Unused parameter */
+ return sqlite3CarrayInit(db);
+}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/completion.c
+++ /ext/misc/completion.c
@@ -483,12 +483,13 @@
return rc;
}
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
#ifdef _WIN32
__declspec(dllexport)
#endif
int sqlite3_completion_init(
- sqlite3 *db,
- char **pzErrMsg,
+ sqlite3 *db,
+ char **pzErrMsg,
const sqlite3_api_routines *pApi
){
int rc = SQLITE_OK;
@@ -499,3 +500,4 @@
#endif
return rc;
}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/csv.c
+++ /ext/misc/csv.c
@@ -928,6 +928,22 @@
#endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) */
+int sqlite3CsvInit(sqlite3 *db){
+#ifndef SQLITE_OMIT_VIRTUALTABLE
+ int rc;
+ rc = sqlite3_create_module(db, "csv", &CsvModule, 0);
+#ifdef SQLITE_TEST
+ if( rc==SQLITE_OK ){
+ rc = sqlite3_create_module(db, "csv_wr", &CsvModuleFauxWrite, 0);
+ }
+#endif
+ return rc;
+#else
+ return SQLITE_OK;
+#endif
+}
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
#ifdef _WIN32
__declspec(dllexport)
#endif
@@ -941,17 +957,8 @@
char **pzErrMsg,
const sqlite3_api_routines *pApi
){
-#ifndef SQLITE_OMIT_VIRTUALTABLE
- int rc;
SQLITE_EXTENSION_INIT2(pApi);
- rc = sqlite3_create_module(db, "csv", &CsvModule, 0);
-#ifdef SQLITE_TEST
- if( rc==SQLITE_OK ){
- rc = sqlite3_create_module(db, "csv_wr", &CsvModuleFauxWrite, 0);
- }
-#endif
- return rc;
-#else
- return SQLITE_OK;
-#endif
+ (void)pzErrMsg; /* Unused parameter */
+ return sqlite3CsvInit(db);
}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/dbdata.c
+++ /ext/misc/dbdata.c
@@ -803,7 +803,7 @@
/*
** Invoke this routine to register the "sqlite_dbdata" virtual table module
*/
-static int sqlite3DbdataRegister(sqlite3 *db){
+int sqlite3DbdataRegister(sqlite3 *db){
static sqlite3_module dbdata_module = {
0, /* iVersion */
0, /* xCreate */
@@ -838,6 +838,7 @@
return rc;
}
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
#ifdef _WIN32
__declspec(dllexport)
#endif
@@ -849,3 +850,4 @@
SQLITE_EXTENSION_INIT2(pApi);
return sqlite3DbdataRegister(db);
}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/eval.c
+++ /ext/misc/eval.c
@@ -102,6 +102,20 @@
}
+int sqlite3EvalInit(sqlite3 *db){
+ int rc = SQLITE_OK;
+ rc = sqlite3_create_function(db, "eval", 1,
+ SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
+ sqlEvalFunc, 0, 0);
+ if( rc==SQLITE_OK ){
+ rc = sqlite3_create_function(db, "eval", 2,
+ SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
+ sqlEvalFunc, 0, 0);
+ }
+ return rc;
+}
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
#ifdef _WIN32
__declspec(dllexport)
#endif
@@ -110,16 +124,8 @@
char **pzErrMsg,
const sqlite3_api_routines *pApi
){
- int rc = SQLITE_OK;
SQLITE_EXTENSION_INIT2(pApi);
(void)pzErrMsg; /* Unused parameter */
- rc = sqlite3_create_function(db, "eval", 1,
- SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
- sqlEvalFunc, 0, 0);
- if( rc==SQLITE_OK ){
- rc = sqlite3_create_function(db, "eval", 2,
- SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
- sqlEvalFunc, 0, 0);
- }
- return rc;
+ return sqlite3EvalInit(db);
}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/fileio.c
+++ /ext/misc/fileio.c
@@ -340,7 +340,7 @@
** This function does the work for the writefile() UDF. Refer to
** header comments at the top of this file for details.
*/
-static int writeFile(
+static int writeFileContents(
sqlite3_context *pCtx, /* Context to return bytes written in */
const char *zFile, /* File to write */
sqlite3_value *pData, /* Data to write */
@@ -480,10 +480,10 @@
mtime = sqlite3_value_int64(argv[3]);
}
- res = writeFile(context, zFile, argv[1], mode, mtime);
+ res = writeFileContents(context, zFile, argv[1], mode, mtime);
if( res==1 && errno==ENOENT ){
if( makeDirectory(zFile)==SQLITE_OK ){
- res = writeFile(context, zFile, argv[1], mode, mtime);
+ res = writeFileContents(context, zFile, argv[1], mode, mtime);
}
}
@@ -970,18 +970,9 @@
# define fsdirRegister(x) SQLITE_OK
#endif
-#ifdef _WIN32
-__declspec(dllexport)
-#endif
-int sqlite3_fileio_init(
- sqlite3 *db,
- char **pzErrMsg,
- const sqlite3_api_routines *pApi
-){
+int sqlite3FileioInit(sqlite3 *db){
int rc = SQLITE_OK;
- SQLITE_EXTENSION_INIT2(pApi);
- (void)pzErrMsg; /* Unused parameter */
- rc = sqlite3_create_function(db, "readfile", 1,
+ rc = sqlite3_create_function(db, "readfile", 1,
SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
readfileFunc, 0, 0);
if( rc==SQLITE_OK ){
@@ -998,3 +989,18 @@
}
return rc;
}
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
+int sqlite3_fileio_init(
+ sqlite3 *db,
+ char **pzErrMsg,
+ const sqlite3_api_routines *pApi
+){
+ SQLITE_EXTENSION_INIT2(pApi);
+ (void)pzErrMsg; /* Unused parameter */
+ return sqlite3FileioInit(db);
+}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/ieee754.c
+++ /ext/misc/ieee754.c
@@ -110,6 +110,20 @@
}
+int sqlite3IeeeInit(sqlite3 *db){
+ int rc = SQLITE_OK;
+ rc = sqlite3_create_function(db, "ieee754", 1,
+ SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
+ ieee754func, 0, 0);
+ if( rc==SQLITE_OK ){
+ rc = sqlite3_create_function(db, "ieee754", 2,
+ SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
+ ieee754func, 0, 0);
+ }
+ return rc;
+}
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
#ifdef _WIN32
__declspec(dllexport)
#endif
@@ -118,16 +132,8 @@
char **pzErrMsg,
const sqlite3_api_routines *pApi
){
- int rc = SQLITE_OK;
SQLITE_EXTENSION_INIT2(pApi);
(void)pzErrMsg; /* Unused parameter */
- rc = sqlite3_create_function(db, "ieee754", 1,
- SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
- ieee754func, 0, 0);
- if( rc==SQLITE_OK ){
- rc = sqlite3_create_function(db, "ieee754", 2,
- SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
- ieee754func, 0, 0);
- }
- return rc;
+ return sqlite3IeeeInit(db);
}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/regexp.c
+++ /ext/misc/regexp.c
@@ -740,10 +740,18 @@
}
}
+int sqlite3RegexpInit(sqlite3 *db){
+ int rc = SQLITE_OK;
+ rc = sqlite3_create_function(db, "regexp", 2, SQLITE_UTF8|SQLITE_INNOCUOUS,
+ 0, re_sql_func, 0, 0);
+ return rc;
+}
+
/*
** Invoke this routine to register the regexp() function with the
** SQLite database connection.
*/
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
#ifdef _WIN32
__declspec(dllexport)
#endif
@@ -752,9 +760,8 @@
char **pzErrMsg,
const sqlite3_api_routines *pApi
){
- int rc = SQLITE_OK;
SQLITE_EXTENSION_INIT2(pApi);
- rc = sqlite3_create_function(db, "regexp", 2, SQLITE_UTF8|SQLITE_INNOCUOUS,
- 0, re_sql_func, 0, 0);
- return rc;
+ (void)pzErrMsg; /* Unused parameter */
+ return sqlite3RegexpInit(db);
}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/sha1.c
+++ /ext/misc/sha1.c
@@ -175,7 +175,7 @@
}
/* Compute a string using sqlite3_vsnprintf() and hash it */
-static void hash_step_vformat(
+static void sha1_hash_step_vformat(
SHA1Context *p, /* Add content to this context */
const char *zFormat,
...
@@ -306,7 +306,7 @@
nCol = sqlite3_column_count(pStmt);
z = sqlite3_sql(pStmt);
n = (int)strlen(z);
- hash_step_vformat(&cx,"S%d:",n);
+ sha1_hash_step_vformat(&cx,"S%d:",n);
hash_step(&cx,(unsigned char*)z,n);
/* Compute a hash over the result of the query */
@@ -349,14 +349,14 @@
case SQLITE_TEXT: {
int n2 = sqlite3_column_bytes(pStmt, i);
const unsigned char *z2 = sqlite3_column_text(pStmt, i);
- hash_step_vformat(&cx,"T%d:",n2);
+ sha1_hash_step_vformat(&cx,"T%d:",n2);
hash_step(&cx, z2, n2);
break;
}
case SQLITE_BLOB: {
int n2 = sqlite3_column_bytes(pStmt, i);
const unsigned char *z2 = sqlite3_column_blob(pStmt, i);
- hash_step_vformat(&cx,"B%d:",n2);
+ sha1_hash_step_vformat(&cx,"B%d:",n2);
hash_step(&cx, z2, n2);
break;
}
@@ -370,6 +370,20 @@
}
+int sqlite3ShaInit(sqlite3 *db){
+ int rc = SQLITE_OK;
+ rc = sqlite3_create_function(db, "sha1", 1,
+ SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC,
+ 0, sha1Func, 0, 0);
+ if( rc==SQLITE_OK ){
+ rc = sqlite3_create_function(db, "sha1_query", 1,
+ SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
+ sha1QueryFunc, 0, 0);
+ }
+ return rc;
+}
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
#ifdef _WIN32
__declspec(dllexport)
#endif
@@ -378,16 +392,8 @@
char **pzErrMsg,
const sqlite3_api_routines *pApi
){
- int rc = SQLITE_OK;
SQLITE_EXTENSION_INIT2(pApi);
(void)pzErrMsg; /* Unused parameter */
- rc = sqlite3_create_function(db, "sha1", 1,
- SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC,
- 0, sha1Func, 0, 0);
- if( rc==SQLITE_OK ){
- rc = sqlite3_create_function(db, "sha1_query", 1,
- SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
- sha1QueryFunc, 0, 0);
- }
- return rc;
+ return sqlite3ShaInit(db);
}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/shathree.c
+++ /ext/misc/shathree.c
@@ -527,7 +527,7 @@
/* Compute a string using sqlite3_vsnprintf() with a maximum length
** of 50 bytes and add it to the hash.
*/
-static void hash_step_vformat(
+static void sha3_hash_step_vformat(
SHA3Context *p, /* Add content to this context */
const char *zFormat,
...
@@ -622,7 +622,7 @@
nCol = sqlite3_column_count(pStmt);
z = sqlite3_sql(pStmt);
n = (int)strlen(z);
- hash_step_vformat(&cx,"S%d:",n);
+ sha3_hash_step_vformat(&cx,"S%d:",n);
SHA3Update(&cx,(unsigned char*)z,n);
/* Compute a hash over the result of the query */
@@ -665,14 +665,14 @@
case SQLITE_TEXT: {
int n2 = sqlite3_column_bytes(pStmt, i);
const unsigned char *z2 = sqlite3_column_text(pStmt, i);
- hash_step_vformat(&cx,"T%d:",n2);
+ sha3_hash_step_vformat(&cx,"T%d:",n2);
SHA3Update(&cx, z2, n2);
break;
}
case SQLITE_BLOB: {
int n2 = sqlite3_column_bytes(pStmt, i);
const unsigned char *z2 = sqlite3_column_blob(pStmt, i);
- hash_step_vformat(&cx,"B%d:",n2);
+ sha3_hash_step_vformat(&cx,"B%d:",n2);
SHA3Update(&cx, z2, n2);
break;
}
@@ -685,17 +685,8 @@
}
-#ifdef _WIN32
-__declspec(dllexport)
-#endif
-int sqlite3_shathree_init(
- sqlite3 *db,
- char **pzErrMsg,
- const sqlite3_api_routines *pApi
-){
+int sqlite3ShathreeInit(sqlite3 *db){
int rc = SQLITE_OK;
- SQLITE_EXTENSION_INIT2(pApi);
- (void)pzErrMsg; /* Unused parameter */
rc = sqlite3_create_function(db, "sha3", 1,
SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC,
0, sha3Func, 0, 0);
@@ -716,3 +707,18 @@
}
return rc;
}
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
+int sqlite3_shathree_init(
+ sqlite3 *db,
+ char **pzErrMsg,
+ const sqlite3_api_routines *pApi
+){
+ SQLITE_EXTENSION_INIT2(pApi);
+ (void)pzErrMsg; /* Unused parameter */
+ return sqlite3ShathreeInit(db);
+}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/sqlar.c
+++ /ext/misc/sqlar.c
@@ -14,6 +14,8 @@
** for working with sqlar archives and used by the shell tool's built-in
** sqlar support.
*/
+#ifdef SQLITE_HAVE_ZLIB
+
#include "sqlite3ext.h"
SQLITE_EXTENSION_INIT1
#include <zlib.h>
@@ -101,6 +103,20 @@
}
+int sqlite3SqlarInit(sqlite3 *db){
+ int rc = SQLITE_OK;
+ rc = sqlite3_create_function(db, "sqlar_compress", 1,
+ SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
+ sqlarCompressFunc, 0, 0);
+ if( rc==SQLITE_OK ){
+ rc = sqlite3_create_function(db, "sqlar_uncompress", 2,
+ SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
+ sqlarUncompressFunc, 0, 0);
+ }
+ return rc;
+}
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
#ifdef _WIN32
__declspec(dllexport)
#endif
@@ -109,16 +125,10 @@
char **pzErrMsg,
const sqlite3_api_routines *pApi
){
- int rc = SQLITE_OK;
SQLITE_EXTENSION_INIT2(pApi);
(void)pzErrMsg; /* Unused parameter */
- rc = sqlite3_create_function(db, "sqlar_compress", 1,
- SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
- sqlarCompressFunc, 0, 0);
- if( rc==SQLITE_OK ){
- rc = sqlite3_create_function(db, "sqlar_uncompress", 2,
- SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
- sqlarUncompressFunc, 0, 0);
- }
- return rc;
+ return sqlite3SqlarInit(db);
}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
+
+#endif /* SQLITE_HAVE_ZLIB */
--- /ext/misc/totype.c
+++ /ext/misc/totype.c
@@ -491,17 +491,8 @@
#pragma warning(default: 4748)
#endif
-#ifdef _WIN32
-__declspec(dllexport)
-#endif
-int sqlite3_totype_init(
- sqlite3 *db,
- char **pzErrMsg,
- const sqlite3_api_routines *pApi
-){
+int sqlite3TotypeInit(sqlite3 *db){
int rc = SQLITE_OK;
- SQLITE_EXTENSION_INIT2(pApi);
- (void)pzErrMsg; /* Unused parameter */
rc = sqlite3_create_function(db, "tointeger", 1,
SQLITE_UTF8 | SQLITE_DETERMINISTIC | SQLITE_INNOCUOUS, 0,
tointegerFunc, 0, 0);
@@ -512,3 +503,18 @@
}
return rc;
}
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
+int sqlite3_totype_init(
+ sqlite3 *db,
+ char **pzErrMsg,
+ const sqlite3_api_routines *pApi
+){
+ SQLITE_EXTENSION_INIT2(pApi);
+ (void)pzErrMsg; /* Unused parameter */
+ return sqlite3TotypeInit(db);
+}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/uint.c
+++ /ext/misc/uint.c
@@ -78,6 +78,11 @@
return (nKey1 - i) - (nKey2 - j);
}
+int sqlite3UintInit(sqlite3 *db){
+ return sqlite3_create_collation(db, "UINT", SQLITE_UTF8, 0, uintCollFunc);
+}
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
#ifdef _WIN32
__declspec(dllexport)
#endif
@@ -88,5 +93,6 @@
){
SQLITE_EXTENSION_INIT2(pApi);
(void)pzErrMsg; /* Unused parameter */
- return sqlite3_create_collation(db, "uint", SQLITE_UTF8, 0, uintCollFunc);
+ return sqlite3UintInit(db);
}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/uuid.c
+++ /ext/misc/uuid.c
@@ -206,21 +206,12 @@
sqlite3_result_blob(context, pBlob, 16, SQLITE_TRANSIENT);
}
-#ifdef _WIN32
-__declspec(dllexport)
-#endif
-int sqlite3_uuid_init(
- sqlite3 *db,
- char **pzErrMsg,
- const sqlite3_api_routines *pApi
-){
+int sqlite3UuidInit(sqlite3 *db){
int rc = SQLITE_OK;
- SQLITE_EXTENSION_INIT2(pApi);
- (void)pzErrMsg; /* Unused parameter */
rc = sqlite3_create_function(db, "uuid", 0, SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
sqlite3UuidFunc, 0, 0);
if( rc==SQLITE_OK ){
- rc = sqlite3_create_function(db, "uuid_str", 1,
+ rc = sqlite3_create_function(db, "uuid_str", 1,
SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC,
0, sqlite3UuidStrFunc, 0, 0);
}
@@ -231,3 +222,18 @@
}
return rc;
}
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
+int sqlite3_uuid_init(
+ sqlite3 *db,
+ char **pzErrMsg,
+ const sqlite3_api_routines *pApi
+){
+ SQLITE_EXTENSION_INIT2(pApi);
+ (void)pzErrMsg; /* Unused parameter */
+ return sqlite3UuidInit(db);
+}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/zipfile.c
+++ /ext/misc/zipfile.c
@@ -24,6 +24,8 @@
** * No support for zip64 extensions
** * Only the "inflate/deflate" (zlib) compression method is supported
*/
+#ifdef SQLITE_HAVE_ZLIB
+
#include "sqlite3ext.h"
SQLITE_EXTENSION_INIT1
#include <stdio.h>
@@ -2137,7 +2139,7 @@
/*
** Register the "zipfile" virtual table.
*/
-static int zipfileRegister(sqlite3 *db){
+int sqlite3ZipfileInit(sqlite3 *db){
static sqlite3_module zipfileModule = {
1, /* iVersion */
zipfileConnect, /* xCreate */
@@ -2171,9 +2173,10 @@
return rc;
}
#else /* SQLITE_OMIT_VIRTUALTABLE */
-# define zipfileRegister(x) SQLITE_OK
+# define sqlite3ZipfileInit(x) SQLITE_OK
#endif
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
#ifdef _WIN32
__declspec(dllexport)
#endif
@@ -2184,5 +2187,8 @@
){
SQLITE_EXTENSION_INIT2(pApi);
(void)pzErrMsg; /* Unused parameter */
- return zipfileRegister(db);
+ return sqlite3ZipfileInit(db);
}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
+
+#endif /* SQLITE_HAVE_ZLIB */

View File

@ -1,3 +1,4 @@
Enable some extensions in libsqlite3.so.
Move some code to libsqlite3.so to avoid duplication. Move some code to libsqlite3.so to avoid duplication.
Link executables against libsqlite3.so. Link executables against libsqlite3.so.
Increase timeout for fuzzcheck. Increase timeout for fuzzcheck.
@ -5,7 +6,7 @@ Fix building with dlopen() not available.
--- /Makefile.in --- /Makefile.in
+++ /Makefile.in +++ /Makefile.in
@@ -311,6 +311,9 @@ @@ -313,6 +313,9 @@
# Source code for extensions # Source code for extensions
# #
SRC += \ SRC += \
@ -15,37 +16,67 @@ Fix building with dlopen() not available.
$(TOP)/ext/fts1/fts1.c \ $(TOP)/ext/fts1/fts1.c \
$(TOP)/ext/fts1/fts1.h \ $(TOP)/ext/fts1/fts1.h \
$(TOP)/ext/fts1/fts1_hash.c \ $(TOP)/ext/fts1/fts1_hash.c \
@@ -363,8 +366,12 @@ @@ -365,8 +368,24 @@
$(TOP)/ext/rbu/sqlite3rbu.h \ $(TOP)/ext/rbu/sqlite3rbu.h \
$(TOP)/ext/rbu/sqlite3rbu.c $(TOP)/ext/rbu/sqlite3rbu.c
SRC += \ SRC += \
+ $(TOP)/ext/misc/appendvfs.c \ + $(TOP)/ext/misc/appendvfs.c \
+ $(TOP)/ext/misc/carray.c \
+ $(TOP)/ext/misc/completion.c \
+ $(TOP)/ext/misc/csv.c \
+ $(TOP)/ext/misc/dbdata.c \ + $(TOP)/ext/misc/dbdata.c \
+ $(TOP)/ext/misc/eval.c \
+ $(TOP)/ext/misc/fileio.c \
+ $(TOP)/ext/misc/ieee754.c \
$(TOP)/ext/misc/json1.c \ $(TOP)/ext/misc/json1.c \
- $(TOP)/ext/misc/stmt.c - $(TOP)/ext/misc/stmt.c
+ $(TOP)/ext/misc/regexp.c \
+ $(TOP)/ext/misc/sha1.c \
+ $(TOP)/ext/misc/shathree.c \
+ $(TOP)/ext/misc/sqlar.c \ + $(TOP)/ext/misc/sqlar.c \
+ $(TOP)/ext/misc/stmt.c \ + $(TOP)/ext/misc/stmt.c \
+ $(TOP)/ext/misc/totype.c \
+ $(TOP)/ext/misc/uint.c \
+ $(TOP)/ext/misc/uuid.c \
+ $(TOP)/ext/misc/zipfile.c + $(TOP)/ext/misc/zipfile.c
# Generated source code files # Generated source code files
# #
@@ -435,7 +442,6 @@ @@ -437,33 +456,24 @@
# Statically linked extensions # Statically linked extensions
# #
TESTSRC += \ TESTSRC += \
- $(TOP)/ext/expert/sqlite3expert.c \ - $(TOP)/ext/expert/sqlite3expert.c \
$(TOP)/ext/expert/test_expert.c \ $(TOP)/ext/expert/test_expert.c \
$(TOP)/ext/misc/amatch.c \ $(TOP)/ext/misc/amatch.c \
$(TOP)/ext/misc/carray.c \ - $(TOP)/ext/misc/carray.c \
@@ -461,7 +467,6 @@ $(TOP)/ext/misc/closure.c \
$(TOP)/ext/misc/totype.c \ - $(TOP)/ext/misc/csv.c \
- $(TOP)/ext/misc/eval.c \
$(TOP)/ext/misc/explain.c \
- $(TOP)/ext/misc/fileio.c \
$(TOP)/ext/misc/fuzzer.c \
$(TOP)/ext/fts5/fts5_tcl.c \
$(TOP)/ext/fts5/fts5_test_mi.c \
$(TOP)/ext/fts5/fts5_test_tok.c \
- $(TOP)/ext/misc/ieee754.c \
$(TOP)/ext/misc/mmapwarm.c \
$(TOP)/ext/misc/nextchar.c \
$(TOP)/ext/misc/normalize.c \
$(TOP)/ext/misc/percentile.c \
$(TOP)/ext/misc/prefixes.c \
- $(TOP)/ext/misc/regexp.c \
$(TOP)/ext/misc/remember.c \
$(TOP)/ext/misc/series.c \
$(TOP)/ext/misc/spellfix.c \
- $(TOP)/ext/misc/totype.c \
$(TOP)/ext/misc/unionvtab.c \ $(TOP)/ext/misc/unionvtab.c \
$(TOP)/ext/misc/wholenumber.c \ $(TOP)/ext/misc/wholenumber.c \
- $(TOP)/ext/misc/zipfile.c \ - $(TOP)/ext/misc/zipfile.c \
$(TOP)/ext/userauth/userauth.c $(TOP)/ext/userauth/userauth.c
# Source code to the library files needed by the test fixture # Source code to the library files needed by the test fixture
@@ -640,25 +645,25 @@ @@ -645,25 +655,25 @@
libtclsqlite3.la: tclsqlite.lo libsqlite3.la libtclsqlite3.la: tclsqlite.lo libsqlite3.la
$(LTLINK) -no-undefined -o $@ tclsqlite.lo \ $(LTLINK) -no-undefined -o $@ tclsqlite.lo \
@ -82,7 +113,7 @@ Fix building with dlopen() not available.
srcck1$(BEXE): $(TOP)/tool/srcck1.c srcck1$(BEXE): $(TOP)/tool/srcck1.c
$(BCC) -o srcck1$(BEXE) $(TOP)/tool/srcck1.c $(BCC) -o srcck1$(BEXE) $(TOP)/tool/srcck1.c
@@ -768,7 +773,7 @@ @@ -774,7 +784,7 @@
# Rule to build the amalgamation # Rule to build the amalgamation
# #
sqlite3.lo: sqlite3.c sqlite3.lo: sqlite3.c
@ -91,22 +122,23 @@ Fix building with dlopen() not available.
# Rules to build the LEMON compiler generator # Rules to build the LEMON compiler generator
# #
@@ -1065,14 +1070,9 @@ @@ -1074,15 +1084,6 @@
# Source files that go into making shell.c # Source files that go into making shell.c
SHELL_SRC = \ SHELL_SRC = \
$(TOP)/src/shell.c.in \ $(TOP)/src/shell.c.in \
- $(TOP)/ext/misc/appendvfs.c \ - $(TOP)/ext/misc/appendvfs.c \
$(TOP)/ext/misc/shathree.c \ - $(TOP)/ext/misc/shathree.c \
$(TOP)/ext/misc/fileio.c \ - $(TOP)/ext/misc/fileio.c \
$(TOP)/ext/misc/completion.c \ - $(TOP)/ext/misc/completion.c \
- $(TOP)/ext/misc/sqlar.c \ - $(TOP)/ext/misc/sqlar.c \
- $(TOP)/ext/misc/uint.c \
- $(TOP)/ext/expert/sqlite3expert.c \ - $(TOP)/ext/expert/sqlite3expert.c \
- $(TOP)/ext/expert/sqlite3expert.h \ - $(TOP)/ext/expert/sqlite3expert.h \
- $(TOP)/ext/misc/zipfile.c \ - $(TOP)/ext/misc/zipfile.c \
$(TOP)/ext/misc/memtrace.c \ $(TOP)/ext/misc/memtrace.c \
$(TOP)/src/test_windirent.c $(TOP)/src/test_windirent.c
@@ -1240,15 +1240,15 @@ @@ -1251,11 +1252,11 @@
# Fuzz testing # Fuzz testing
fuzztest: fuzzcheck$(TEXE) $(FUZZDATA) sessionfuzz$(TEXE) $(TOP)/test/sessionfuzz-data1.db fuzztest: fuzzcheck$(TEXE) $(FUZZDATA) sessionfuzz$(TEXE) $(TOP)/test/sessionfuzz-data1.db
@ -114,18 +146,13 @@ Fix building with dlopen() not available.
+ ./fuzzcheck$(TEXE) --timeout 3600 $(FUZZDATA) + ./fuzzcheck$(TEXE) --timeout 3600 $(FUZZDATA)
./sessionfuzz$(TEXE) run $(TOP)/test/sessionfuzz-data1.db ./sessionfuzz$(TEXE) run $(TOP)/test/sessionfuzz-data1.db
fastfuzztest: fuzzcheck$(TEXE) $(FUZZDATA) sessionfuzz$(TEXE) $(TOP)/test/sessionfuzz-data1.db
- ./fuzzcheck$(TEXE) --limit-mem 100M $(FUZZDATA)
+ ./fuzzcheck$(TEXE) --limit-mem 100M --timeout 3600 $(FUZZDATA)
./sessionfuzz$(TEXE) run $(TOP)/test/sessionfuzz-data1.db
valgrindfuzz: fuzzcheck$(TEXT) $(FUZZDATA) sessionfuzz$(TEXE) $(TOP)/test/sessionfuzz-data1.db valgrindfuzz: fuzzcheck$(TEXT) $(FUZZDATA) sessionfuzz$(TEXE) $(TOP)/test/sessionfuzz-data1.db
- valgrind ./fuzzcheck$(TEXE) --cell-size-check --limit-mem 10M --timeout 600 $(FUZZDATA) - valgrind ./fuzzcheck$(TEXE) --cell-size-check --limit-mem 10M --timeout 600 $(FUZZDATA)
+ valgrind ./fuzzcheck$(TEXE) --cell-size-check --limit-mem 10M --timeout 3600 $(FUZZDATA) + valgrind ./fuzzcheck$(TEXE) --cell-size-check --limit-mem 10M --timeout 3600 $(FUZZDATA)
valgrind ./sessionfuzz$(TEXE) run $(TOP)/test/sessionfuzz-data1.db valgrind ./sessionfuzz$(TEXE) run $(TOP)/test/sessionfuzz-data1.db
# The veryquick.test TCL tests. # The veryquick.test TCL tests.
@@ -1279,24 +1279,23 @@ @@ -1286,24 +1287,23 @@
smoketest: $(TESTPROGS) fuzzcheck$(TEXE) smoketest: $(TESTPROGS) fuzzcheck$(TEXE)
./testfixture$(TEXE) $(TOP)/test/main.test $(TESTOPTS) ./testfixture$(TEXE) $(TOP)/test/main.test $(TESTOPTS)
@ -158,7 +185,7 @@ Fix building with dlopen() not available.
$(TOP)/src/tclsqlite.c \ $(TOP)/src/tclsqlite.c \
$(TOP)/ext/repair/sqlite3_checker.tcl \ $(TOP)/ext/repair/sqlite3_checker.tcl \
$(TOP)/ext/repair/checkindex.c \ $(TOP)/ext/repair/checkindex.c \
@@ -1307,36 +1306,36 @@ @@ -1314,36 +1314,36 @@
sqlite3_checker.c: $(CHECKER_DEPS) sqlite3_checker.c: $(CHECKER_DEPS)
$(TCLSH_CMD) $(TOP)/tool/mkccode.tcl $(TOP)/ext/repair/sqlite3_checker.c.in >$@ $(TCLSH_CMD) $(TOP)/tool/mkccode.tcl $(TOP)/ext/repair/sqlite3_checker.c.in >$@
@ -213,7 +240,7 @@ Fix building with dlopen() not available.
changesetfuzz$(TEXE): $(TOP)/ext/session/changesetfuzz.c sqlite3.lo changesetfuzz$(TEXE): $(TOP)/ext/session/changesetfuzz.c sqlite3.lo
$(LTLINK) -o $@ $(TOP)/ext/session/changesetfuzz.c sqlite3.lo $(TLIBS) $(LTLINK) -o $@ $(TOP)/ext/session/changesetfuzz.c sqlite3.lo $(TLIBS)
@@ -1361,11 +1360,11 @@ @@ -1368,11 +1368,11 @@
kvtest$(TEXE): $(TOP)/test/kvtest.c sqlite3.c kvtest$(TEXE): $(TOP)/test/kvtest.c sqlite3.c
$(LTLINK) $(KV_OPT) -o $@ $(TOP)/test/kvtest.c sqlite3.c $(TLIBS) $(LTLINK) $(KV_OPT) -o $@ $(TOP)/test/kvtest.c sqlite3.c $(TLIBS)
@ -241,40 +268,6 @@ Fix building with dlopen() not available.
else else
OPT_FEATURE_FLAGS="-DSQLITE_OMIT_LOAD_EXTENSION=1" OPT_FEATURE_FLAGS="-DSQLITE_OMIT_LOAD_EXTENSION=1"
fi fi
--- /ext/misc/sqlar.c
+++ /ext/misc/sqlar.c
@@ -14,6 +14,8 @@
** for working with sqlar archives and used by the shell tool's built-in
** sqlar support.
*/
+#ifdef SQLITE_HAVE_ZLIB
+
#include "sqlite3ext.h"
SQLITE_EXTENSION_INIT1
#include <zlib.h>
@@ -119,3 +121,5 @@
}
return rc;
}
+
+#endif /* SQLITE_HAVE_ZLIB */
--- /ext/misc/zipfile.c
+++ /ext/misc/zipfile.c
@@ -24,6 +24,8 @@
** * No support for zip64 extensions
** * Only the "inflate/deflate" (zlib) compression method is supported
*/
+#ifdef SQLITE_HAVE_ZLIB
+
#include "sqlite3ext.h"
SQLITE_EXTENSION_INIT1
#include <stdio.h>
@@ -2176,3 +2178,5 @@
(void)pzErrMsg; /* Unused parameter */
return zipfileRegister(db);
}
+
+#endif /* SQLITE_HAVE_ZLIB */
--- /ext/repair/sqlite3_checker.c.in --- /ext/repair/sqlite3_checker.c.in
+++ /ext/repair/sqlite3_checker.c.in +++ /ext/repair/sqlite3_checker.c.in
@@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@
@ -294,9 +287,76 @@ Fix building with dlopen() not available.
INCLUDE $ROOT/src/tclsqlite.c INCLUDE $ROOT/src/tclsqlite.c
INCLUDE $ROOT/ext/misc/btreeinfo.c INCLUDE $ROOT/ext/misc/btreeinfo.c
INCLUDE $ROOT/ext/repair/checkindex.c INCLUDE $ROOT/ext/repair/checkindex.c
--- /src/main.c
+++ /src/main.c
@@ -50,12 +50,31 @@
#ifdef SQLITE_ENABLE_FTS5
int sqlite3Fts5Init(sqlite3*);
#endif
+#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
+int sqlite3DbdataRegister(sqlite3*);
+#endif
#ifdef SQLITE_ENABLE_JSON1
int sqlite3Json1Init(sqlite3*);
#endif
#ifdef SQLITE_ENABLE_STMTVTAB
int sqlite3StmtVtabInit(sqlite3*);
#endif
+int sqlite3CarrayInit(sqlite3*);
+int sqlite3CompletionVtabInit(sqlite3*);
+int sqlite3CsvInit(sqlite3*);
+int sqlite3EvalInit(sqlite3*);
+int sqlite3FileioInit(sqlite3*);
+int sqlite3IeeeInit(sqlite3*);
+int sqlite3RegexpInit(sqlite3*);
+int sqlite3ShaInit(sqlite3*);
+int sqlite3ShathreeInit(sqlite3*);
+int sqlite3TotypeInit(sqlite3*);
+int sqlite3UintInit(sqlite3*);
+int sqlite3UuidInit(sqlite3*);
+#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
+int sqlite3ZipfileInit(sqlite3*);
+int sqlite3SqlarInit(sqlite3*);
+#endif
/*
** An array of pointers to extension initializer functions for
@@ -83,6 +102,9 @@
#ifdef SQLITE_ENABLE_DBPAGE_VTAB
sqlite3DbpageRegister,
#endif
+#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
+ sqlite3DbdataRegister,
+#endif
#ifdef SQLITE_ENABLE_DBSTAT_VTAB
sqlite3DbstatRegister,
#endif
@@ -96,6 +118,22 @@
#ifdef SQLITE_ENABLE_BYTECODE_VTAB
sqlite3VdbeBytecodeVtabInit,
#endif
+ sqlite3CarrayInit,
+ sqlite3CompletionVtabInit,
+ sqlite3CsvInit,
+ sqlite3EvalInit,
+ sqlite3FileioInit,
+ sqlite3IeeeInit,
+ sqlite3RegexpInit,
+ sqlite3ShaInit,
+ sqlite3ShathreeInit,
+ sqlite3TotypeInit,
+ sqlite3UintInit,
+ sqlite3UuidInit,
+#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
+ sqlite3ZipfileInit,
+ sqlite3SqlarInit,
+#endif
};
#ifndef SQLITE_AMALGAMATION
--- /src/shell.c.in --- /src/shell.c.in
+++ /src/shell.c.in +++ /src/shell.c.in
@@ -61,6 +61,7 @@ @@ -69,6 +69,7 @@
#include <stdio.h> #include <stdio.h>
#include <assert.h> #include <assert.h>
#include "sqlite3.h" #include "sqlite3.h"
@ -304,7 +364,7 @@ Fix building with dlopen() not available.
typedef sqlite3_int64 i64; typedef sqlite3_int64 i64;
typedef sqlite3_uint64 u64; typedef sqlite3_uint64 u64;
typedef unsigned char u8; typedef unsigned char u8;
@@ -127,6 +128,10 @@ @@ -135,6 +136,10 @@
# define SHELL_USE_LOCAL_GETLINE 1 # define SHELL_USE_LOCAL_GETLINE 1
#endif #endif
@ -314,13 +374,17 @@ Fix building with dlopen() not available.
+ +
#if defined(_WIN32) || defined(WIN32) #if defined(_WIN32) || defined(WIN32)
# include <io.h> # if SQLITE_OS_WINRT
@@ -939,18 +944,7 @@ @@ -1005,22 +1010,7 @@
INCLUDE ../ext/misc/shathree.c INCLUDE test_windirent.c
INCLUDE ../ext/misc/fileio.c #define dirent DIRENT
INCLUDE ../ext/misc/completion.c #endif
-INCLUDE ../ext/misc/shathree.c
-INCLUDE ../ext/misc/fileio.c
-INCLUDE ../ext/misc/completion.c
-INCLUDE ../ext/misc/appendvfs.c -INCLUDE ../ext/misc/appendvfs.c
INCLUDE ../ext/misc/memtrace.c INCLUDE ../ext/misc/memtrace.c
-INCLUDE ../ext/misc/uint.c
-#ifdef SQLITE_HAVE_ZLIB -#ifdef SQLITE_HAVE_ZLIB
-INCLUDE ../ext/misc/zipfile.c -INCLUDE ../ext/misc/zipfile.c
-INCLUDE ../ext/misc/sqlar.c -INCLUDE ../ext/misc/sqlar.c
@ -334,29 +398,34 @@ Fix building with dlopen() not available.
#if defined(SQLITE_ENABLE_SESSION) #if defined(SQLITE_ENABLE_SESSION)
/* /*
@@ -4135,10 +4129,13 @@ @@ -4261,17 +4251,6 @@
sqlite3_shathree_init(p->db, 0, 0); #ifndef SQLITE_OMIT_LOAD_EXTENSION
sqlite3_completion_init(p->db, 0, 0); sqlite3_enable_load_extension(p->db, 1);
#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
+ extern int sqlite3_dbdata_init(sqlite3 *, char **, const sqlite3_api_routines *);
sqlite3_dbdata_init(p->db, 0, 0);
#endif
#ifdef SQLITE_HAVE_ZLIB
+ extern int sqlite3_zipfile_init(sqlite3 *, char **, const sqlite3_api_routines *);
sqlite3_zipfile_init(p->db, 0, 0);
+ extern int sqlite3_sqlar_init(sqlite3 *, char **, const sqlite3_api_routines *);
sqlite3_sqlar_init(p->db, 0, 0);
#endif #endif
- sqlite3_fileio_init(p->db, 0, 0);
- sqlite3_shathree_init(p->db, 0, 0);
- sqlite3_completion_init(p->db, 0, 0);
- sqlite3_uint_init(p->db, 0, 0);
-#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
- sqlite3_dbdata_init(p->db, 0, 0);
-#endif
-#ifdef SQLITE_HAVE_ZLIB
- sqlite3_zipfile_init(p->db, 0, 0);
- sqlite3_sqlar_init(p->db, 0, 0);
-#endif
sqlite3_create_function(p->db, "shell_add_schema", 3, SQLITE_UTF8, 0, sqlite3_create_function(p->db, "shell_add_schema", 3, SQLITE_UTF8, 0,
@@ -6135,6 +6132,7 @@ shellAddSchemaName, 0, 0);
sqlite3_create_function(p->db, "shell_module_schema", 1, SQLITE_UTF8, 0,
@@ -6281,8 +6260,6 @@
);
goto end_ar_command; goto end_ar_command;
} }
sqlite3_fileio_init(cmd.db, 0, 0); - sqlite3_fileio_init(cmd.db, 0, 0);
+ extern int sqlite3_sqlar_init(sqlite3 *, char **, const sqlite3_api_routines *); - sqlite3_sqlar_init(cmd.db, 0, 0);
sqlite3_sqlar_init(cmd.db, 0, 0);
sqlite3_create_function(cmd.db, "shell_putsnl", 1, SQLITE_UTF8, cmd.p, sqlite3_create_function(cmd.db, "shell_putsnl", 1, SQLITE_UTF8, cmd.p,
shellPutsFunc, 0, 0); shellPutsFunc, 0, 0);
@@ -10187,6 +10185,7 @@
@@ -10621,6 +10598,7 @@
#endif #endif
} }
data.out = stdout; data.out = stdout;
@ -364,6 +433,94 @@ Fix building with dlopen() not available.
sqlite3_appendvfs_init(0,0,0); sqlite3_appendvfs_init(0,0,0);
/* Go ahead and open the database file if it already exists. If the /* Go ahead and open the database file if it already exists. If the
--- /src/test_config.c
+++ /src/test_config.c
@@ -540,6 +540,8 @@
Tcl_SetVar2(interp, "sqlite_options", "progress", "1", TCL_GLOBAL_ONLY);
#endif
+ Tcl_SetVar2(interp, "sqlite_options", "regexp", "1", TCL_GLOBAL_ONLY);
+
#ifdef SQLITE_OMIT_REINDEX
Tcl_SetVar2(interp, "sqlite_options", "reindex", "0", TCL_GLOBAL_ONLY);
#else
@@ -662,6 +664,8 @@
Tcl_SetVar2(interp, "sqlite_options", "truncate_opt", "1", TCL_GLOBAL_ONLY);
#endif
+ Tcl_SetVar2(interp, "sqlite_options", "uint", "1", TCL_GLOBAL_ONLY);
+
#ifdef SQLITE_OMIT_UTF16
Tcl_SetVar2(interp, "sqlite_options", "utf16", "0", TCL_GLOBAL_ONLY);
#else
--- /test/e_expr.test
+++ /test/e_expr.test
@@ -1078,7 +1078,7 @@
#
# There is a regexp function if ICU is enabled though.
#
-ifcapable !icu {
+ifcapable !icu&&!regexp {
do_catchsql_test e_expr-18.1.1 {
SELECT regexp('abc', 'def')
} {1 {no such function: regexp}}
--- /test/icu.test
+++ /test/icu.test
@@ -41,7 +41,7 @@
#
test_expr icu-1.1 {i1='hello'} {i1 REGEXP 'hello'} 1
test_expr icu-1.2 {i1='hello'} {i1 REGEXP '.ello'} 1
- test_expr icu-1.3 {i1='hello'} {i1 REGEXP '.ell'} 0
+ test_expr icu-1.3 {i1='hello'} {i1 REGEXP '.ell$'} 0
test_expr icu-1.4 {i1='hello'} {i1 REGEXP '.ell.*'} 1
test_expr icu-1.5 {i1=NULL} {i1 REGEXP '.ell.*'} {}
--- /test/pragma.test
+++ /test/pragma.test
@@ -1360,17 +1360,32 @@
} ;# ifcapable trigger
ifcapable schema_pragmas {
- do_test pragma-11.1 {
- execsql2 {
- pragma collation_list;
- }
- } {seq 0 name RTRIM seq 1 name NOCASE seq 2 name BINARY}
- do_test pragma-11.2 {
- db collate New_Collation blah...
- execsql {
- pragma collation_list;
- }
- } {0 New_Collation 1 RTRIM 2 NOCASE 3 BINARY}
+ ifcapable uint {
+ do_test pragma-11.1 {
+ execsql2 {
+ pragma collation_list;
+ }
+ } {seq 0 name UINT seq 1 name RTRIM seq 2 name NOCASE seq 3 name BINARY}
+ do_test pragma-11.2 {
+ db collate New_Collation blah...
+ execsql {
+ pragma collation_list;
+ }
+ } {0 New_Collation 1 UINT 2 RTRIM 3 NOCASE 4 BINARY}
+ }
+ ifcapable !uint {
+ do_test pragma-11.1 {
+ execsql2 {
+ pragma collation_list;
+ }
+ } {seq 0 name RTRIM seq 1 name NOCASE seq 2 name BINARY}
+ do_test pragma-11.2 {
+ db collate New_Collation blah...
+ execsql {
+ pragma collation_list;
+ }
+ } {0 New_Collation 1 RTRIM 2 NOCASE 3 BINARY}
+ }
}
ifcapable schema_pragmas&&tempdb {
--- /test/sessionfuzz.c --- /test/sessionfuzz.c
+++ /test/sessionfuzz.c +++ /test/sessionfuzz.c
@@ -700,42 +700,6 @@ @@ -700,42 +700,6 @@
@ -419,14 +576,26 @@ Fix building with dlopen() not available.
sqlite3ext.h sqlite3ext.h
sqlite3rbu.h sqlite3rbu.h
sqliteicu.h sqliteicu.h
@@ -403,6 +404,11 @@ @@ -404,6 +405,23 @@
sqlite3session.c sqlite3session.c
fts5.c fts5.c
stmt.c stmt.c
+ appendvfs.c + appendvfs.c
+ carray.c
+ completion.c
+ csv.c
+ dbdata.c + dbdata.c
+ eval.c
+ fileio.c
+ ieee754.c
+ regexp.c
+ sha1.c
+ shathree.c
+ sqlar.c + sqlar.c
+ sqlite3expert.c + sqlite3expert.c
+ totype.c
+ uint.c
+ uuid.c
+ zipfile.c + zipfile.c
} { } {
copy_file tsrc/$file copy_file tsrc/$file
@ -445,7 +614,7 @@ Fix building with dlopen() not available.
const char *sqlite3_analyzer_init_proc(Tcl_Interp *interp){ const char *sqlite3_analyzer_init_proc(Tcl_Interp *interp){
--- /tool/sqltclsh.c.in --- /tool/sqltclsh.c.in
+++ /tool/sqltclsh.c.in +++ /tool/sqltclsh.c.in
@@ -27,19 +27,17 @@ @@ -27,21 +27,13 @@
#define SQLITE_OMIT_SHARED_CACHE 1 #define SQLITE_OMIT_SHARED_CACHE 1
#define SQLITE_DEFAULT_MEMSTATUS 0 #define SQLITE_DEFAULT_MEMSTATUS 0
#define SQLITE_MAX_EXPR_DEPTH 0 #define SQLITE_MAX_EXPR_DEPTH 0
@ -462,10 +631,10 @@ Fix building with dlopen() not available.
(void)interp; (void)interp;
+ extern int sqlite3_appendvfs_init(sqlite3 *,char **, const sqlite3_api_routines *); + extern int sqlite3_appendvfs_init(sqlite3 *,char **, const sqlite3_api_routines *);
sqlite3_appendvfs_init(0,0,0); sqlite3_appendvfs_init(0,0,0);
#ifdef SQLITE_HAVE_ZLIB -#ifdef SQLITE_HAVE_ZLIB
+ extern int sqlite3_sqlar_init(sqlite3 *, char **, const sqlite3_api_routines *); - sqlite3_auto_extension((void(*)(void))sqlite3_sqlar_init);
sqlite3_auto_extension((void(*)(void))sqlite3_sqlar_init); - sqlite3_auto_extension((void(*)(void))sqlite3_zipfile_init);
+ extern int sqlite3_zipfile_init(sqlite3 *, char **, const sqlite3_api_routines *); -#endif
sqlite3_auto_extension((void(*)(void))sqlite3_zipfile_init);
#endif
return
BEGIN_STRING

View File

@ -0,0 +1,361 @@
https://sqlite.org/src/info/d48af4d2cfff3d5f
https://sqlite.org/src/info/cc888878ea8d5bc7
https://sqlite.org/src/info/be545f85a6ef09cc
https://sqlite.org/src/info/6e0ffa2053124168
https://sqlite.org/src/info/4d0cfb1236884349
https://sqlite.org/src/info/ccff8cb8267d4c56
https://sqlite.org/src/info/5124732370fd53c9
--- /ext/fts3/fts3.c
+++ /ext/fts3/fts3.c
@@ -2068,7 +2068,7 @@
sqlite3_int64 *piPrev, /* IN/OUT: Previous value written to list */
sqlite3_int64 iVal /* Write this value to the list */
){
- assert( iVal-*piPrev > 0 || (*piPrev==0 && iVal==0) );
+ assert_fts3_nc( iVal-*piPrev > 0 || (*piPrev==0 && iVal==0) );
*pp += sqlite3Fts3PutVarint(*pp, iVal-*piPrev);
*piPrev = iVal;
}
@@ -5208,10 +5208,12 @@
);
if( res ){
nNew = (int)(pOut - pPhrase->doclist.pList) - 1;
- assert( pPhrase->doclist.pList[nNew]=='\0' );
- assert( nNew<=pPhrase->doclist.nList && nNew>0 );
- memset(&pPhrase->doclist.pList[nNew], 0, pPhrase->doclist.nList - nNew);
- pPhrase->doclist.nList = nNew;
+ if( nNew>=0 ){
+ assert( pPhrase->doclist.pList[nNew]=='\0' );
+ assert( nNew<=pPhrase->doclist.nList && nNew>0 );
+ memset(&pPhrase->doclist.pList[nNew], 0, pPhrase->doclist.nList - nNew);
+ pPhrase->doclist.nList = nNew;
+ }
*paPoslist = pPhrase->doclist.pList;
*pnToken = pPhrase->nToken;
}
@@ -5563,7 +5565,10 @@
}else
#endif
{
- bHit = (pExpr->bEof==0 && pExpr->iDocid==pCsr->iPrevId);
+ bHit = (
+ pExpr->bEof==0 && pExpr->iDocid==pCsr->iPrevId
+ && pExpr->pPhrase->doclist.nList>0
+ );
}
break;
}
--- /ext/fts3/fts3_write.c
+++ /ext/fts3/fts3_write.c
@@ -341,7 +341,9 @@
** created by merging the oldest :2 segments from absolute level :1. See
** function sqlite3Fts3Incrmerge() for details. */
/* 29 */ "SELECT 2 * total(1 + leaves_end_block - start_block) "
- " FROM %Q.'%q_segdir' WHERE level = ? AND idx < ?",
+ " FROM (SELECT * FROM %Q.'%q_segdir' "
+ " WHERE level = ? ORDER BY idx ASC LIMIT ?"
+ " )",
/* SQL_DELETE_SEGDIR_ENTRY
** Delete the %_segdir entry on absolute level :1 with index :2. */
@@ -2853,6 +2855,19 @@
return SQLITE_OK;
}
+static int fts3GrowSegReaderBuffer(Fts3MultiSegReader *pCsr, int nReq){
+ if( nReq>pCsr->nBuffer ){
+ char *aNew;
+ pCsr->nBuffer = nReq*2;
+ aNew = sqlite3_realloc(pCsr->aBuffer, pCsr->nBuffer);
+ if( !aNew ){
+ return SQLITE_NOMEM;
+ }
+ pCsr->aBuffer = aNew;
+ }
+ return SQLITE_OK;
+}
+
int sqlite3Fts3SegReaderStep(
Fts3Table *p, /* Virtual table handle */
@@ -2987,15 +3002,9 @@
}
nByte = sqlite3Fts3VarintLen(iDelta) + (isRequirePos?nList+1:0);
- if( nDoclist+nByte>pCsr->nBuffer ){
- char *aNew;
- pCsr->nBuffer = (nDoclist+nByte)*2;
- aNew = sqlite3_realloc(pCsr->aBuffer, pCsr->nBuffer);
- if( !aNew ){
- return SQLITE_NOMEM;
- }
- pCsr->aBuffer = aNew;
- }
+
+ rc = fts3GrowSegReaderBuffer(pCsr, nByte+nDoclist);
+ if( rc ) return rc;
if( isFirst ){
char *a = &pCsr->aBuffer[nDoclist];
@@ -3020,6 +3029,9 @@
fts3SegReaderSort(apSegment, nMerge, j, xCmp);
}
if( nDoclist>0 ){
+ rc = fts3GrowSegReaderBuffer(pCsr, nDoclist+FTS3_NODE_PADDING);
+ if( rc ) return rc;
+ memset(&pCsr->aBuffer[nDoclist], 0, FTS3_NODE_PADDING);
pCsr->aDoclist = pCsr->aBuffer;
pCsr->nDoclist = nDoclist;
rc = SQLITE_ROW;
@@ -4288,7 +4300,7 @@
int i;
int nHeight = (int)aRoot[0];
NodeWriter *pNode;
- if( nHeight<1 || nHeight>FTS_MAX_APPENDABLE_HEIGHT ){
+ if( nHeight<1 || nHeight>=FTS_MAX_APPENDABLE_HEIGHT ){
sqlite3_reset(pSelect);
return FTS_CORRUPT_VTAB;
}
--- /src/expr.c
+++ /src/expr.c
@@ -4272,7 +4272,9 @@
int nCol;
testcase( op==TK_EXISTS );
testcase( op==TK_SELECT );
- if( op==TK_SELECT && (nCol = pExpr->x.pSelect->pEList->nExpr)!=1 ){
+ if( pParse->db->mallocFailed ){
+ return 0;
+ }else if( op==TK_SELECT && (nCol = pExpr->x.pSelect->pEList->nExpr)!=1 ){
sqlite3SubselectError(pParse, nCol, 1);
}else{
return sqlite3CodeSubselect(pParse, pExpr);
--- /test/fts3corrupt4.test
+++ /test/fts3corrupt4.test
@@ -6123,4 +6123,163 @@
SELECT offsets(t1) FROM t1 WHERE t1 MATCH 'rtree ner "json1^enable"';
}
+#-------------------------------------------------------------------------
+do_execsql_test 42.1 {
+ CREATE VIRTUAL TABLE f USING fts3(a, b);
+}
+do_execsql_test 42.2 {
+ INSERT INTO f_segdir VALUES(0,2,1111,0,0,X'00');
+ INSERT INTO f_segdir VALUES(0,3,0 ,0,0,X'00013003010200');
+}
+do_execsql_test 42.3 {
+ INSERT INTO f(f) VALUES ('merge=107,2');
+}
+
+#-------------------------------------------------------------------------
+reset_db
+set saved $sqlite_fts3_enable_parentheses
+set sqlite_fts3_enable_parentheses 1
+do_execsql_test 43.1 {
+ CREATE VIRTUAL TABLE def USING fts3(xyz);
+ INSERT INTO def_segdir VALUES(0,0,0,0,0, X'0001310301c9000103323334050d81');
+} {}
+
+do_execsql_test 43.2 {
+ SELECT rowid FROM def WHERE def MATCH '1 NEAR 1'
+} {1}
+
+set sqlite_fts3_enable_parentheses $saved
+
+#-------------------------------------------------------------------------
+reset_db
+do_execsql_test 44.1 {
+ CREATE VIRTUAL TABLE t0 USING fts3(col0 INTEGER PRIMARY KEY,col1 VARCHAR(8),col2 BINARY,col3 BINARY);
+ INSERT INTO t0_content VALUES(0,NULL,NULL,NULL,NULL);
+ INSERT INTO t0_segdir VALUES(0,0,0,0,'0 42',X'00013103010200010332333405010201ba00000461616161050101020200000462626262050101030200');
+}
+
+do_execsql_test 44.2 {
+ SELECT matchinfo(t0, t0) IS NULL FROM t0 WHERE t0 MATCH '1*'
+} {0}
+
+#-------------------------------------------------------------------------
+#
+reset_db
+do_test 45.0 {
+ sqlite3 db {}
+ db deserialize [decode_hexdb {
+.open --hexdb
+| size 24576 pagesize 4096 filename crash-65c98512cc9e49.db
+| page 1 offset 0
+| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3.
+| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 06 .....@ ........
+| 96: 00 00 00 00 0d 0e fc 00 06 0d bc 00 0f ca 0f 6c ...............l
+| 112: 0f 04 0e 13 0e c9 0d bc 00 00 00 00 00 00 00 00 ................
+| 3504: 00 00 00 00 00 00 00 00 00 00 00 00 55 06 07 17 ............U...
+| 3520: 1b 1b 01 81 01 74 61 62 6c 65 78 31 5f 73 74 61 .....tablex1_sta
+| 3536: 74 78 31 5f 73 74 61 74 06 43 52 45 41 54 45 20 tx1_stat.CREATE
+| 3552: 54 41 42 4c 45 20 27 78 31 5f 73 74 61 74 27 28 TABLE 'x1_stat'(
+| 3568: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 id INTEGER PRIMA
+| 3584: 52 59 20 4b 45 59 2c 20 76 61 6c 75 65 20 42 4c RY KEY, value BL
+| 3600: 41 82 29 81 33 04 07 17 1f 1f 01 82 35 74 61 62 A.).3.......5tab
+| 3616: 6c 65 78 31 5f 73 65 67 64 69 72 78 31 5f 73 65 lex1_segdirx1_se
+| 3632: 67 64 69 72 04 43 52 45 41 54 45 20 54 41 42 4c gdir.CREATE TABL
+| 3648: 45 20 27 78 31 5f 73 65 67 64 69 72 27 28 6c 65 E 'x1_segdir'(le
+| 3664: 76 65 6c 20 49 4e 54 45 47 45 52 2c 69 64 78 20 vel INTEGER,idx
+| 3680: 49 4e 54 45 47 45 52 2c 73 74 61 72 74 5f 62 6c INTEGER,start_bl
+| 3696: 6f 63 6b 20 49 4e 54 45 47 45 52 2c 6c 65 61 76 ock INTEGER,leav
+| 3712: 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20 49 4e 54 es_end_block INT
+| 3728: 45 47 45 52 2c 65 6e 64 5f 62 6c 6f 63 6b 20 49 EGER,end_block I
+| 3744: 4e 54 45 47 45 52 2c 72 6f 6f 74 20 42 4c 4f 42 NTEGER,root BLOB
+| 3760: 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 6c 65 76 ,PRIMARY KEY(lev
+| 3776: 65 6c 2c 20 69 64 78 29 29 31 05 06 17 45 1f 01 el, idx))1...E..
+| 3792: 00 69 6e 64 65 78 73 71 6c 69 74 65 5f 61 75 74 .indexsqlite_aut
+| 3808: 6f 69 6e 64 65 78 5f 78 31 5f 73 65 67 64 69 72 oindex_x1_segdir
+| 3824: 5f 31 78 31 5f 73 65 67 64 69 72 05 00 00 00 08 _1x1_segdir.....
+| 3840: 60 00 00 00 66 03 07 17 23 23 01 81 13 74 61 62 `...f...##...tab
+| 3856: 6c 65 78 31 5f 73 65 67 6d 65 6e 74 73 78 31 5f lex1_segmentsx1_
+| 3872: 73 65 67 6d 65 6e 74 73 03 43 52 45 41 54 45 20 segments.CREATE
+| 3888: 54 41 42 4c 45 20 27 78 31 5f 73 65 67 6d 65 6e TABLE 'x1_segmen
+| 3904: 74 73 27 28 62 6c 6f 63 6b 69 64 20 49 4e 54 45 ts'(blockid INTE
+| 3920: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c GER PRIMARY KEY,
+| 3936: 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 5c 02 07 17 block BLOB)....
+| 3952: 21 21 01 81 03 74 61 62 6c 65 78 31 5f 63 6f 6e !!...tablex1_con
+| 3968: 74 65 6e 74 78 31 5f 63 6f 6e 74 65 6e 74 02 43 tentx1_content.C
+| 3984: 52 45 41 54 45 20 54 41 42 4c 45 20 27 78 31 5f REATE TABLE 'x1_
+| 4000: 63 6f 6e 74 65 6e 74 27 28 64 6f 63 69 64 20 49 content'(docid I
+| 4016: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b NTEGER PRIMARY K
+| 4032: 45 59 2c 20 27 63 30 78 27 29 34 01 06 17 11 11 EY, 'c0x')4.....
+| 4048: 08 57 74 61 62 6c 65 78 31 78 31 43 52 45 41 54 .Wtablex1x1CREAT
+| 4064: 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 E VIRTUAL TABLE
+| 4080: 78 31 20 55 53 49 4e 47 20 66 74 73 33 28 78 29 x1 USING fts3(x)
+| page 2 offset 4096
+| 0: 0d 00 00 00 11 0f 77 f0 0f f8 0f f0 0f e8 0f e0 ......w.........
+| 16: 0f d8 0f d0 0f c8 0f c0 00 00 00 00 00 00 00 00 ................
+| 3952: 00 00 00 00 00 00 00 00 06 11 03 00 13 77 78 79 .............wxy
+| 3968: 06 10 03 00 13 74 75 76 06 0f 03 00 13 71 33 73 .....tuv.....q3s
+| 3984: 06 0e 03 00 13 6e 6f 70 06 0d 03 00 13 6b 6c 6d .....nop.....klm
+| 4000: 06 0c 03 04 c3 68 69 6a 06 0b 03 00 13 65 66 67 .....hij.....efg
+| 4016: 06 0a 03 00 13 62 63 64 06 09 03 00 13 79 7a 61 .....bcd.....yza
+| 4032: 06 08 03 00 13 76 77 78 06 07 03 00 13 73 74 75 .....vwx.....stu
+| 4048: 06 06 03 00 13 70 71 72 06 05 03 00 13 6d 6e 6f .....pqr.....mno
+| 4064: 06 03 03 00 13 6a 6b 6c 06 03 03 00 13 67 68 69 .....jkl.....ghi
+| 4080: 06 02 02 00 03 64 65 66 06 01 03 00 13 61 52 63 .....def.....aRc
+| page 3 offset 8192
+| 0: 0d 00 00 00 03 0f a7 00 0f b5 0f a7 0f fa 01 00 ................
+| 4000: 00 00 00 00 00 00 00 0c 02 03 00 1e 00 03 6b 6c ..............kl
+| 4016: 6d 03 0d 02 00 43 01 04 00 81 0a 00 03 61 62 63 m....C.......abc
+| 4032: 03 0b 32 00 00 03 62 63 64 03 0a 02 00 00 03 64 ..2...bcd......d
+| 4048: 69 26 03 02 02 00 00 03 65 66 67 03 0b 02 00 00 i&......efg.....
+| 4064: 03 67 68 69 03 03 02 00 00 03 68 69 6a 03 0c 02 .ghi......hij...
+| 4080: 00 00 03 6a 6a 2c 03 04 02 00 03 81 00 03 00 00 ...jj,..........
+| page 4 offset 12288
+| 0: 0d 0f 3a 00 05 0f 25 00 0f 9e 0f 88 0f 43 0f 25 ..:...%......C.%
+| 16: 0f 72 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .r..............
+| 3856: 00 00 00 00 00 00 00 00 00 56 01 08 08 13 1e 03 .........V......
+| 3872: 30 20 39 00 03 13 05 07 08 08 18 08 13 1e 30 20 0 9...........0
+| 3888: 39 00 03 77 78 79 03 11 02 00 0f 6c 00 09 01 08 9..wxy.....l....
+| 3904: 08 15 54 27 04 07 09 01 08 08 15 42 02 30 20 33 ..T'.......B.0 3
+| 3920: 36 00 03 6e 6f 70 03 0e 02 00 00 03 71 72 73 03 6..nop......qrs.
+| 3936: 0f 02 00 00 03 74 75 76 03 10 02 00 0f cf b1 06 .....tuv........
+| 3952: 01 08 14 06 07 01 08 09 01 1b 14 02 02 31 32 38 .............128
+| 3968: 20 2d 37 32 10 01 01 6b 14 03 07 09 09 08 08 15 -72...k........
+| 3984: 1e 30 20 33 36 00 03 79 7a 61 03 09 02 00 2f 02 .0 36..yza..../.
+| 4000: 07 09 08 08 08 15 54 30 20 33 36 00 03 6d 6e 6f ......T0 36..mno
+| 4016: 03 05 02 00 00 03 70 71 72 03 06 02 00 00 03 73 ......pqr......s
+| 4032: 74 75 03 07 02 00 00 03 76 77 78 03 08 02 00 00 tu......vwx.....
+| 4048: 00 00 4a 08 08 08 15 54 30 20 33 36 00 03 61 62 ..J....T0 36..ab
+| 4064: 63 03 01 02 00 00 03 64 65 66 03 02 02 00 00 03 c......def......
+| 4080: 67 68 69 03 03 67 00 00 03 6a 6b 6c 03 04 02 00 ghi..g...jkl....
+| page 5 offset 16384
+| 0: 0a 0f e7 00 05 0f da 00 0f e1 0f fa 0f f4 0f ed ................
+| 16: 0f da 0f 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
+| 4048: 00 00 00 00 00 00 00 1a 01 03 06 04 01 08 01 02 ................
+| 4064: 06 05 04 08 08 01 05 00 00 00 06 01 03 06 04 09 ................
+| 4080: 02 01 02 04 05 04 09 09 01 03 05 04 09 08 01 02 ................
+| page 6 offset 20480
+| 0: 0d 00 10 00 01 0f f9 00 0f f9 00 00 00 00 00 00 ................
+| 4080: 00 00 00 00 00 00 00 00 00 05 01 03 00 10 01 03 ................
+| end crash-65c98512cc9e49.db
+}]} {}
+
+do_catchsql_test 45.2 {
+ INSERT INTO x1(x1) VALUES( 'merge=1' )
+} {1 {database disk image is malformed}}
+
+#-------------------------------------------------------------------------
+reset_db
+set saved $sqlite_fts3_enable_parentheses
+set sqlite_fts3_enable_parentheses 1
+do_execsql_test 46.1 {
+ CREATE VIRTUAL TABLE t0 USING fts3(a INTEGER PRIMARY KEY,b,c,d);
+ INSERT INTO t0_segdir VALUES(0,0,0,0,'0 42',X'0001310301c9000103323334050d8000f200000461616161050101020200000462626262050101030200');
+} {}
+
+do_catchsql_test 46.2 {
+ SELECT * FROM t0
+ WHERE t0 MATCH x'2b0a312b0a312a312a2a0b5d0a0b0b0a312a0a0b0b0a312a0b310a392a0b0a27312a2a0b5d0a312a0b310a31315d0b310a312a316d2a0b313b15bceaa50a312a0b0a27312a2a0b5d0a312a0b310a312b0b2a310a312a0b2a0b2a0b2e5d0a0bff313336e34a2a312a0b0a3c310b0a0b4b4b0b4b2a4bec40322b2a0b310a0a312a0a0a0a0a0a0a0a0a0b310a312a2a2a0b5d0a0b0b0a312a0b310a312a0b0a4e4541530b310a5df5ced70a0a0a0a0a4f520a0a0a0a0a0a0a312a0b0a4e4541520b310a5d616161610a0a0a0a4f520a0a0a0a0a0a312b0a312a312a0a0a0a0a0a0a004a0b0a310b220a0b0a310a4a22310a0b0a7e6fe0e0e030e0e0e0e0e01176e02000e0e0e0e0e01131320226310a0b0a310a4a22310a0b0a310a766f8b8b4ee0e0300ae0090909090909090909090909090909090909090909090909090909090909090947aaaa540b09090909090909090909090909090909090909090909090909090909090909fae0e0f2f22164e0e0f273e07fefefef7d6dfafafafa6d6d6d6d';
+} {1 {database disk image is malformed}}
+
+set sqlite_fts3_enable_parentheses $saved
+
finish_test
--- /test/fts3corrupt6.test
+++ /test/fts3corrupt6.test
@@ -0,0 +1,60 @@
+# 2020 June 8
+#
+# The author disclaims copyright to this source code. In place of
+# a legal notice, here is a blessing:
+#
+# May you do good and not evil.
+# May you find forgiveness for yourself and forgive others.
+# May you share freely, never taking more than you give.
+#
+#*************************************************************************
+# This file implements regression tests for SQLite library. The
+# focus of this script is testing the FTS3 module.
+#
+# $Id: fts3aa.test,v 1.1 2007/08/20 17:38:42 shess Exp $
+#
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+source $testdir/fts3_common.tcl
+set testprefix fts3corrupt6
+
+# If SQLITE_ENABLE_FTS3 is defined, omit this file.
+ifcapable !fts3 {
+ finish_test
+ return
+}
+
+set ::saved_sqlite_fts3_enable_parentheses $::sqlite_fts3_enable_parentheses
+set sqlite_fts3_enable_parentheses 1
+sqlite3_fts3_may_be_corrupt 1
+database_may_be_corrupt
+
+do_execsql_test 1.0 {
+ BEGIN TRANSACTION;
+ CREATE TABLE t_content(col0 INTEGER);
+ PRAGMA writable_schema=ON;
+ CREATE VIRTUAL TABLE t0 USING fts3(col0 INTEGER PRIMARY KEY,col1 VARCHAR(8),col2 BINARY,col3 BINARY);
+ INSERT INTO t0_content VALUES(0,NULL,NULL,NULL,NULL);
+ INSERT INTO t0_segdir VALUES(0,0,0,0,'0 42',X'000131030102000103323334050101010200000461616161050101020200000462626262050101030200');
+ COMMIT;
+}
+
+do_execsql_test 1.1 {
+ SELECT 0+matchinfo(t0,'yxyyxy') FROM t0 WHERE t0 MATCH CAST( x'2b0a312b0a312a312a2a0b5d0a0b0b0a312a0a0b0b0a312a0b310a392a0b0a27312a2a0b5d0a312a0b310a31315d0b310a312a316d2a0b313b15bceaa50a312a0b0a27312a2a0b5d0a312a0b310a312b0b2a310a312a0b2a0b2a0b2e5d0a0bff313336e34a2a312a0b0a3c310b0a0b4b4b0b4b2a4bec40322b2a0b310a0a312a0a0a0a0a0a0a0a0a0b310a312a2a2a0b5d0a0b0b0a312a0b310a312a0b0a4e4541530b310a5df5ced70a0a0a0a0a4f520a0a0a0a0a0a0a312a0b0a4e4541520b310a5d616161610a0a0a0a4f520a0a0a0a0a0a312b0a312a312a0a0a0a0a0a0a004a0b0a310b220a0b0a310a4a22310a0b0a7e6fe0e0e030e0e0e0e0e01176e02000e0e0e0e0e01131320226310a0b0a310a4a22310a0b0a310a766f8b8b4ee0e0300ae0090909090909090909090909090909090909090909090909090909090909090947aaaa540b09090909090909090909090909090909090909090909090909090909090909fae0e0f2f22164e0e0f273e07fefefef7d6dfafafafa6d6d6d6d' AS TEXT);
+} {0}
+
+do_execsql_test 1.2 {
+ CREATE VIRTUAL TABLE t1 USING fts3(col0 INTEGER PRIMARY KEY,col1 VARCHAR(8),col2 BINARY,col3 BINARY);
+ INSERT INTO t1_content VALUES(0,NULL,NULL,NULL,NULL);
+ INSERT INTO t1_segdir VALUES(0,0,0,0,'0 42',X'000131030102000103323334050101010200000461616161050101020200000462626262050101030200');
+}
+
+do_execsql_test 1.3 {
+ SELECT 42+matchinfo(t1,'yxyyxy') FROM t1 WHERE t1 MATCH x'2b0a312b0a312a312a2a0b5d0a0b0b0a312a0a0b0b0a312a0b310a392a0b0a27312a2a0b5d0a312a0b310a31315d0b310a312a316d2a0b313b15bceaa50a312a0b0a27312a2a0b5d0a312a0b310a312b0b2a310a312a0b2a0b2a0b2e5d0a0bff313336e34a2a312a0b0a3c310b0a0b4b4b0b4b2a4bec40322b2a0b310a0a312a0a0a0a0a0a0a0a0a0b310a312a2a2a0b5d0a0b0b0a312a0b310a312a0b0a4e4541530b310a5df5ced70a0a0a0a0a4f520a0a0a0a0a0a0a312a0b0a4e4541520b310a5d616161610a0a0a0a4f520a0a0a0a0a0a312b0a312a312a0a0a0a0a0a0a004a0b0a310b220a0b0a310a4a22310a0b0a7e6fe0e0e030e0e0e0e0e01176e02000e0e0e0e0e01131320226310a0b0a310a4a22310a0b0a310a766f8b8b4ee0e0300ae0090909090909090909090909090909090909090909090909090909090909090947aaaa540b09090909090909090909090909090909090909090909090909090909090909fae0e0f2f22164e0e0f273e07fefefef7d6dfafafafa6d6d6d6d';
+} {42}
+
+set sqlite_fts3_enable_parentheses $saved_sqlite_fts3_enable_parentheses
+finish_test
+
+

View File

@ -0,0 +1,302 @@
https://sqlite.org/src/info/30735432bc33cb95
https://sqlite.org/src/info/1bd18ca35bdbf303
https://sqlite.org/src/info/49da8bdce17ced91
https://sqlite.org/src/info/f25a56c26e28abd4
--- /ext/fts5/fts5_index.c
+++ /ext/fts5/fts5_index.c
@@ -2321,11 +2321,11 @@
}
search_success:
- pIter->iLeafOffset = iOff + nNew;
- if( pIter->iLeafOffset>n || nNew<1 ){
+ if( (i64)iOff+nNew>n || nNew<1 ){
p->rc = FTS5_CORRUPT;
return;
}
+ pIter->iLeafOffset = iOff + nNew;
pIter->iTermLeafOffset = pIter->iLeafOffset;
pIter->iTermLeafPgno = pIter->iLeafPgno;
--- /ext/fts5/test/fts5corrupt3.test
+++ /ext/fts5/test/fts5corrupt3.test
@@ -10108,6 +10108,221 @@
INSERT INTO t1(t1) SELECT x FROM t2;
} {1 {database disk image is malformed}}
+#-------------------------------------------------------------------------
+reset_db
+do_test 69.0 {
+ sqlite3 db {}
+ db deserialize [decode_hexdb {
+.open --hexdb
+| size 32768 pagesize 4096 filename crash-31c462b8b665d0.db
+| page 1 offset 0
+| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3.
+| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 08 .....@ ........
+| 32: 00 00 00 02 00 00 00 00 00 00 00 00 00 00 00 00 ................
+| 96: 00 00 00 00 0d 0f c7 00 07 0d 92 00 0f 8d 0f 36 ...............6
+| 112: 0e cb 0e 6b 0e 0e 0d b6 0d 92 00 00 00 00 00 00 ...k............
+| 3472: 00 00 22 08 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet
+| 3488: 32 74 32 08 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE
+| 3504: 20 74 32 28 78 29 56 07 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta
+| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c
+| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB
+| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k
+| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v)
+| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[.
+| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d
+| 3616: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize
+| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't
+| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN
+| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE
+| 3680: 59 2c 20 73 7a 20 42 4c 4f 42 29 5e 05 07 17 21 Y, sz BLOB)^...!
+| 3696: 21 01 81 07 74 61 62 6c 65 74 31 5f 63 6f 6e 74 !...tablet1_cont
+| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR
+| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c
+| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG
+| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY,
+| 3776: 63 39 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19 c9, c1, c2)i....
+| 3792: 19 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 ...-tablet1_idxt
+| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB
+| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi
+| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P
+| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid
+| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT
+| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t
+| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da
+| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE
+| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT
+| 3952: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY
+| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)8..
+| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR
+| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB
+| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 LE t1 USING fts5
+| 4032: 28 61 2c 62 2c 63 29 00 00 00 00 00 00 00 00 00 (a,b,c).........
+| page 3 offset 8192
+| 0: 0d 00 00 00 03 0c 94 00 0f e6 0f ef 0c 94 00 00 ................
+| 3216: 00 00 00 00 86 4a 84 80 80 80 80 01 04 00 8d 18 .....J..........
+| 3232: 00 00 03 2b 02 30 30 01 02 06 01 02 06 01 02 06 ...+.00.........
+| 3248: 1f 02 03 01 02 03 01 02 03 01 08 32 30 31 36 30 ...........20160
+| 3264: 36 30 39 01 02 07 01 02 07 01 02 07 01 01 34 01 609...........4.
+| 3280: 02 05 01 02 05 01 02 05 01 01 35 01 02 04 01 02 ..........5.....
+| 3296: 04 01 02 04 02 07 30 30 30 30 30 30 30 1c 02 04 ......0000000...
+| 3312: 01 02 04 01 02 04 01 06 62 69 6e 61 72 79 03 06 ........binary..
+| 3328: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................
+| 3344: 02 02 03 06 00 02 02 03 06 01 02 02 03 06 01 02 ................
+| 3360: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................
+| 3376: 03 06 01 02 02 03 06 01 02 02 01 08 63 6f 6d 70 ............comp
+| 3392: 69 6c 65 72 01 02 02 01 02 02 01 02 02 01 06 64 iler...........d
+| 3408: 62 73 74 61 74 07 02 03 01 02 03 01 02 03 02 04 bstat...........
+| 3424: 65 62 75 67 04 02 02 01 02 02 01 02 02 01 06 65 ebug...........e
+| 3440: 6e 61 62 6c 65 07 02 02 01 02 02 01 02 02 01 02 nable...........
+| 3456: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 ................
+| 3472: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 ................
+| 3488: 01 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 ................
+| 3504: 02 01 02 02 02 08 78 74 65 6e 73 69 6f 6e 1f 02 ......xtension..
+| 3520: 04 01 02 04 01 02 04 01 04 66 74 73 34 1a 02 03 .........fts4...
+| 3536: 01 02 03 01 02 03 04 01 35 0d 02 03 01 02 03 01 ........5.......
+| 3552: 02 03 01 03 67 63 63 01 aa 03 01 02 03 01 02 03 ....gcc.........
+| 3568: 02 06 65 6f 70 6f 6c 79 10 02 03 02 02 03 01 02 ..eopoly........
+| 3584: 03 01 05 6a 73 6f 6e 31 13 02 03 01 02 03 01 02 ...json1........
+| 3600: 03 01 04 6c 6f 61 64 1f 02 03 01 02 03 01 02 03 ...load.........
+| 3616: 01 03 6d 61 78 1c 02 02 01 02 02 01 02 02 02 05 ..max...........
+| 3632: 65 6d 6f 72 79 1c 02 03 01 02 03 01 02 03 04 04 emory...........
+| 3648: 73 79 73 35 16 02 03 01 02 03 01 02 03 01 06 6e sys5...........n
+| 3664: 6f 63 61 73 65 02 06 01 02 02 03 06 01 02 02 03 ocase...........
+| 3680: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 ................
+| 3696: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................
+| 3712: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................
+| 3728: 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 02 01 ...omit.........
+| 3744: ff ff ff ff ff ff ff ff f0 00 00 00 00 00 01 02 ................
+| 3760: 58 81 96 4d 01 06 01 02 02 03 06 01 02 02 03 06 X..M............
+| 3776: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................
+| 3792: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................
+| 3808: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................
+| 3824: 01 0a 74 68 72 65 61 64 73 61 66 65 22 02 02 01 ..threadsafe....
+| 3840: 02 02 01 02 02 01 04 76 74 61 62 07 02 04 01 02 .......vtab.....
+| 3856: 04 01 02 04 01 01 78 01 06 01 01 02 01 06 01 01 ......x.........
+| 3872: 02 01 06 01 1e 02 01 06 01 01 02 01 06 01 01 02 ................
+| 3888: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................
+| 3904: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................
+| 3920: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................
+| 3936: 00 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................
+| 3952: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................
+| 3968: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................
+| 3984: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................
+| 4000: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................
+| 4016: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................
+| 4032: 02 01 06 01 01 02 01 06 01 01 02 04 15 13 0c 0c ................
+| 4048: 12 44 13 11 0f 47 13 0f 0b 0e 11 10 0f 0e 10 0f .D...G..........
+| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 24 5a 24 24 0f D..@.......$Z$$.
+| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............
+| page 4 offset 12288
+| 0: 0a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
+| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................
+| page 5 offset 16384
+| 0: 0d 00 00 00 24 0c 0a 00 0f d8 0f af 0f 86 0f 74 ....$..........t
+| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./..........
+| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d5 ...t.[.@.$......
+| 48: 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 00 00 00 00 00 .......h.O......
+| 3072: 00 00 00 00 00 00 00 00 00 00 18 24 05 00 25 0f ...........$..%.
+| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI
+| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA
+| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE..
+| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE=
+| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM
+| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO
+| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 d3 19 4f NXBINARY. ..3..O
+| 3200: 4d 49 54 28 2c 4f 41 44 b2 04 55 85 44 54 e5 34 MIT(,OAD..U.DT.4
+| 3216: 94 f4 e5 84 e4 f4 34 15 34 51 e1 f0 50 03 30 f1 ......4.4Q..P.0.
+| 3232: 74 f4 d4 95 42 04 c4 f4 14 42 04 55 85 44 54 e5 t...B....B.U.DT.
+| 3248: 34 94 f4 e5 85 25 45 24 94 d1 f1 e0 50 03 30 f1 4....%E$....P.0.
+| 3264: 94 d4 15 82 04 d4 54 d4 f5 25 93 d3 53 03 03 03 ......T..%..S...
+| 3280: 03 03 03 05 84 24 94 e4 15 25 91 f1 d0 50 03 30 .....$...%...P.0
+| 3296: f1 94 d4 15 82 04 d4 54 d4 f5 25 93 d3 53 03 03 .......T..%..S..
+| 3312: 03 03 03 03 05 84 e4 f4 34 15 34 51 e1 c0 50 03 ........4.4Q..P.
+| 3328: 30 f1 74 d4 15 82 04 d4 54 d4 f5 25 93 d3 53 03 0.t.....T..%..S.
+| 3344: 03 03 03 03 03 05 85 25 45 24 94 d1 81 b0 50 02 .......%E$....P.
+| 3360: 50 f1 94 54 e4 14 24 c4 52 05 25 45 24 54 55 84 P..T..$.R.%E$TU.
+| 3376: 24 94 e4 15 25 91 81 a0 50 02 50 f1 94 54 e4 14 $...%...P.P..T..
+| 3392: 24 c4 52 05 25 45 24 54 55 84 e4 f4 34 15 34 51 $.R.%E$TU...4.4Q
+| 3408: 71 90 50 02 50 f1 74 54 e4 14 24 c4 52 05 25 45 q.P.P.tT..$.R.%E
+| 3424: 24 54 55 85 25 45 24 94 d1 a1 80 50 02 90 f1 94 $TU.%E$....P....
+| 3440: 54 e4 14 24 c4 52 04 d4 54 d5 35 95 33 55 84 24 T..$.R..T.5.3U.$
+| 3456: 94 e4 15 25 91 a1 70 50 02 90 f1 94 54 e4 14 24 ...%..pP....T..$
+| 3472: c4 52 04 d4 54 d5 35 95 33 55 84 e4 f4 34 15 34 .R..T.5.3U...4.4
+| 3488: 51 91 60 50 02 90 f1 74 54 e4 14 24 c4 52 04 d4 Q.`P...tT..$.R..
+| 3504: 54 d5 35 95 33 55 85 25 45 24 94 d1 81 50 50 02 T.5.3U.%E$...PP.
+| 3520: 50 f1 94 54 e4 14 24 c4 52 04 a5 34 f4 e3 15 84 P..T..$.R..4....
+| 3536: 24 94 e4 15 25 91 81 40 50 02 50 f1 94 54 e4 14 $...%..@P.P..T..
+| 3552: 24 c4 52 04 a5 34 f4 e3 15 84 e4 f4 34 15 34 51 $.R..4......4.4Q
+| 3568: 71 30 50 02 4f f1 74 54 e4 14 24 c4 52 04 a5 34 q0P.O.tT..$.R..4
+| 3584: f4 e3 15 85 25 45 24 94 d1 a1 20 50 02 90 f1 94 ....%E$... P....
+| 3600: 54 e4 14 24 c4 52 04 74 54 f5 04 f4 c5 95 84 24 T..$.R.tT......$
+| 3616: 94 e4 15 25 91 a1 10 50 02 90 f1 94 54 e4 14 24 ...%...P....T..$
+| 3632: c4 52 04 74 54 f5 04 f4 c5 95 84 e4 f4 34 15 34 .R.tT........4.4
+| 3648: 51 91 00 50 02 90 f1 74 54 e4 14 24 c4 51 f4 74 Q..P...tT..$.Q.t
+| 3664: 54 f5 04 f4 c5 95 85 25 45 24 94 d1 70 f0 50 02 T......%E$..p.P.
+| 3680: 30 f1 94 54 e4 14 24 c5 20 46 54 53 35 58 42 49 0..T..$. FTS5XBI
+| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL
+| 3712: 45 20 46 54 53 35 58 4f 4f 43 41 53 45 16 0d 05 E FTS5XOOCASE...
+| 3728: 00 23 0f 17 45 4e 41 42 4c 45 20 46 54 53 35 58 .#..ENABLE FTS5X
+| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB
+| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 97 0b LE FTS4XBINARY..
+| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 34 ..#..ENABLE FTS4
+| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN
+| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM.
+| 3824: 09 05 00 3e 5f 19 45 4e 41 42 4c 45 20 44 42 53 ...>_.ENABLE DBS
+| 3840: 44 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e DAT VTABXBINARY.
+| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS
+| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 4d e3 45 1d TAT VTABXNOCM.E.
+| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS
+| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM..
+| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR
+| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO
+| 3952: 43 41 53 45 10 02 02 50 08 5f 17 44 45 42 55 47 CASE...P._.DEBUG
+| 3968: 58 52 54 52 49 4d 27 03 05 00 44 0f 19 43 4f 4d XRTRIM'...D..COM
+| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0
+| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY'
+| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g
+| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060
+| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 c9 17 43 9XNOCASE&...C..C
+| 4064: 4f 4d 50 49 4c 47 02 3d 67 63 63 2d 35 2e 34 2e OMPILG.=gcc-5.4.
+| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM
+| page 6 offset 20480
+| 0: 0d 00 00 00 24 0e e0 00 0f f8 0f f0 0f e8 0f e0 ....$...........
+| 16: 0f d8 0f d0 0f c8 0f c0 0f b8 0f b0 0f a8 0f a0 ................
+| 32: 0f 98 0f 90 0f 88 0f 80 0f 78 0f 70 0f 68 0f 60 .........x.p.h.`
+| 48: 0f 58 0f 50 0f 48 0f 40 0f 38 00 00 00 00 00 00 .X.P.H.@.8......
+| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#......
+| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!......
+| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . ..............
+| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................
+| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................
+| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................
+| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................
+| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................
+| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................
+| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................
+| 3968: 06 10 03 00 12 02 01 01 06 1f 03 00 12 02 01 01 ................
+| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................
+| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................
+| 4016: 06 0a 03 00 12 02 01 01 06 09 03 00 12 03 01 01 ................
+| 4032: 06 08 03 00 12 03 01 01 06 07 03 00 12 03 01 01 ................
+| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................
+| 4064: 06 04 03 00 12 01 01 01 06 03 03 00 12 06 01 01 ................
+| 4080: 06 02 03 00 12 06 01 01 06 01 03 00 12 06 01 01 ................
+| page 7 offset 24576
+| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................
+| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version.
+| page 8 offset 28672
+| 0: 0d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
+| 4048: 00 00 00 00 00 00 11 03 02 2b 69 6e 74 65 67 72 .........+integr
+| 4064: 69 74 79 2d 63 68 65 63 6b 09 00 00 00 00 00 00 ity-check.......
+| end crash-31c462b8b665d0.db
+}]} {}
+
+
+do_catchsql_test 69.2 {
+ SELECT * FROM t1 WHERE a MATCH 'fx*'
+} {1 {database disk image is malformed}}
sqlite3_fts5_may_be_corrupt 0
finish_test
--- /src/btree.c
+++ /src/btree.c
@@ -3886,7 +3886,7 @@
Pgno nFree = get4byte(&pBt->pPage1->aData[36]);
Pgno nFin = finalDbSize(pBt, nOrig, nFree);
- if( nOrig<nFin ){
+ if( nOrig<nFin || nFree>=nOrig ){
rc = SQLITE_CORRUPT_BKPT;
}else if( nFree>0 ){
rc = saveAllCursors(pBt, 0, 0);
@@ -8772,7 +8772,11 @@
assert( pPage->intKey || pX->nKey>=0 );
assert( pPage->leaf || !pPage->intKey );
if( pPage->nFree<0 ){
- rc = btreeComputeFreeSpace(pPage);
+ if( pCur->eState>CURSOR_INVALID ){
+ rc = SQLITE_CORRUPT_BKPT;
+ }else{
+ rc = btreeComputeFreeSpace(pPage);
+ }
if( rc ) return rc;
}
--- /test/corruptL.test
+++ /test/corruptL.test
@@ -1266,5 +1266,30 @@
do_execsql_test 15.1 {
UPDATE c1 SET c= NOT EXISTS(SELECT 1 FROM c1 ORDER BY (SELECT 1 FROM c1 ORDER BY a)) +10 WHERE d BETWEEN 4 AND 7;
} {}
+
+#-------------------------------------------------------------------------
+reset_db
+do_execsql_test 16.0 {
+ CREATE TABLE t1(w, x, y, z, UNIQUE(w, x), UNIQUE(y, z));
+ INSERT INTO t1 VALUES(1, 1, 1, 1);
+
+ CREATE TABLE t1idx(x, y, i INTEGER, PRIMARY KEY(x)) WITHOUT ROWID;
+ INSERT INTO t1idx VALUES(10, NULL, 5);
+
+ PRAGMA writable_schema = 1;
+ UPDATE sqlite_master SET rootpage = (
+ SELECT rootpage FROM sqlite_master WHERE name='t1idx'
+ ) WHERE type = 'index';
+}
+
+db close
+sqlite3 db test.db
+
+do_catchsql_test 16.1 {
+ PRAGMA writable_schema = ON;
+ INSERT INTO t1(rowid, w, x, y, z) VALUES(5, 10, 11, 10, NULL);
+} {1 {database disk image is malformed}}
+
finish_test
+

View File

@ -0,0 +1,220 @@
https://sqlite.org/src/info/14eed318aa9e6e16
https://sqlite.org/src/info/9679c0c61131f0e9
https://sqlite.org/src/info/28515bbbae4fbc26
https://sqlite.org/src/info/892e9191dc8f8056
https://sqlite.org/src/info/270ac1a0f232d755
--- /ext/fts3/fts3.c
+++ /ext/fts3/fts3.c
@@ -5831,7 +5831,8 @@
fts3EvalRestart(pCsr, pRoot, &rc);
do {
fts3EvalNextRow(pCsr, pRoot, &rc);
- assert( pRoot->bEof==0 );
+ assert_fts3_nc( pRoot->bEof==0 );
+ if( pRoot->bEof ) rc = FTS_CORRUPT_VTAB;
}while( pRoot->iDocid!=iDocid && rc==SQLITE_OK );
}
}
--- /ext/misc/appendvfs.c
+++ /ext/misc/appendvfs.c
@@ -439,7 +439,7 @@
p = (ApndFile*)pFile;
memset(p, 0, sizeof(*p));
pSubFile = ORIGFILE(pFile);
- p->base.pMethods = &apnd_io_methods;
+ pFile->pMethods = &apnd_io_methods;
rc = pSubVfs->xOpen(pSubVfs, zName, pSubFile, flags, pOutFlags);
if( rc ) goto apnd_open_done;
rc = pSubFile->pMethods->xFileSize(pSubFile, &sz);
--- /ext/misc/cksumvfs.c
+++ /ext/misc/cksumvfs.c
@@ -634,7 +634,7 @@
p = (CksmFile*)pFile;
memset(p, 0, sizeof(*p));
pSubFile = ORIGFILE(pFile);
- p->base.pMethods = &cksm_io_methods;
+ pFile->pMethods = &cksm_io_methods;
rc = pSubVfs->xOpen(pSubVfs, zName, pSubFile, flags, pOutFlags);
if( rc ) goto cksm_open_done;
if( flags & SQLITE_OPEN_WAL ){
--- /src/date.c
+++ /src/date.c
@@ -1112,8 +1112,8 @@
case 'm': sqlite3_snprintf(3, &z[j],"%02d",x.M); j+=2; break;
case 'M': sqlite3_snprintf(3, &z[j],"%02d",x.m); j+=2; break;
case 's': {
- sqlite3_snprintf(30,&z[j],"%lld",
- (i64)(x.iJD/1000 - 21086676*(i64)10000));
+ i64 iS = (i64)(x.iJD/1000 - 21086676*(i64)10000);
+ sqlite3Int64ToText(iS, &z[j]);
j += sqlite3Strlen30(&z[j]);
break;
}
--- /src/memdb.c
+++ /src/memdb.c
@@ -339,7 +339,7 @@
p->mFlags = SQLITE_DESERIALIZE_RESIZEABLE | SQLITE_DESERIALIZE_FREEONCLOSE;
assert( pOutFlags!=0 ); /* True because flags==SQLITE_OPEN_MAIN_DB */
*pOutFlags = flags | SQLITE_OPEN_MEMORY;
- p->base.pMethods = &memdb_io_methods;
+ pFile->pMethods = &memdb_io_methods;
p->szMax = sqlite3GlobalConfig.mxMemdbSize;
return SQLITE_OK;
}
--- /src/memjournal.c
+++ /src/memjournal.c
@@ -366,7 +366,7 @@
assert( MEMJOURNAL_DFLT_FILECHUNKSIZE==fileChunkSize(p->nChunkSize) );
}
- p->pMethod = (const sqlite3_io_methods*)&MemJournalMethods;
+ pJfd->pMethods = (const sqlite3_io_methods*)&MemJournalMethods;
p->nSpill = nSpill;
p->flags = flags;
p->zJournal = zName;
@@ -392,7 +392,7 @@
int sqlite3JournalCreate(sqlite3_file *pJfd){
int rc = SQLITE_OK;
MemJournal *p = (MemJournal*)pJfd;
- if( p->pMethod==&MemJournalMethods && (
+ if( pJfd->pMethods==&MemJournalMethods && (
#ifdef SQLITE_ENABLE_ATOMIC_WRITE
p->nSpill>0
#else
--- /src/os_unix.c
+++ /src/os_unix.c
@@ -5689,7 +5689,7 @@
if( rc!=SQLITE_OK ){
if( h>=0 ) robust_close(pNew, h, __LINE__);
}else{
- pNew->pMethod = pLockingStyle;
+ pId->pMethods = pLockingStyle;
OpenCounter(+1);
verifyDbFile(pNew);
}
--- /src/os_win.c
+++ /src/os_win.c
@@ -5266,7 +5266,7 @@
}
sqlite3_free(zTmpname);
- pFile->pMethod = pAppData ? pAppData->pMethod : &winIoMethod;
+ id->pMethods = pAppData ? pAppData->pMethod : &winIoMethod;
pFile->pVfs = pVfs;
pFile->h = h;
if( isReadonly ){
--- /src/sqliteInt.h
+++ /src/sqliteInt.h
@@ -4437,6 +4437,7 @@
int sqlite3FixExprList(DbFixer*, ExprList*);
int sqlite3FixTriggerStep(DbFixer*, TriggerStep*);
int sqlite3RealSameAsInt(double,sqlite3_int64);
+void sqlite3Int64ToText(i64,char*);
int sqlite3AtoF(const char *z, double*, int, u8);
int sqlite3GetInt32(const char *, int*);
int sqlite3Atoi(const char*);
--- /src/test_multiplex.c
+++ /src/test_multiplex.c
@@ -591,9 +591,9 @@
if( rc==SQLITE_OK ){
if( pSubOpen->pMethods->iVersion==1 ){
- pMultiplexOpen->base.pMethods = &gMultiplex.sIoMethodsV1;
+ pConn->pMethods = &gMultiplex.sIoMethodsV1;
}else{
- pMultiplexOpen->base.pMethods = &gMultiplex.sIoMethodsV2;
+ pConn->pMethods = &gMultiplex.sIoMethodsV2;
}
}else{
multiplexFreeComponents(pGroup);
--- /src/util.c
+++ /src/util.c
@@ -596,6 +596,30 @@
#endif
/*
+** Render an signed 64-bit integer as text. Store the result in zOut[].
+**
+** The caller must ensure that zOut[] is at least 21 bytes in size.
+*/
+void sqlite3Int64ToText(i64 v, char *zOut){
+ int i;
+ u64 x;
+ char zTemp[22];
+ if( v<0 ){
+ x = (v==SMALLEST_INT64) ? ((u64)1)<<63 : -v;
+ }else{
+ x = v;
+ }
+ i = sizeof(zTemp)-2;
+ zTemp[sizeof(zTemp)-1] = 0;
+ do{
+ zTemp[i--] = (x%10) + '0';
+ x = x/10;
+ }while( x );
+ if( v<0 ) zTemp[i--] = '-';
+ memcpy(zOut, &zTemp[i+1], sizeof(zTemp)-1-i);
+}
+
+/*
** Compare the 19-character string zNum against the text representation
** value 2^63: 9223372036854775808. Return negative, zero, or positive
** if zNum is less than, equal to, or greater than the string.
--- /src/vdbemem.c
+++ /src/vdbemem.c
@@ -104,16 +104,25 @@
static void vdbeMemRenderNum(int sz, char *zBuf, Mem *p){
StrAccum acc;
assert( p->flags & (MEM_Int|MEM_Real|MEM_IntReal) );
- sqlite3StrAccumInit(&acc, 0, zBuf, sz, 0);
+ assert( sz>22 );
if( p->flags & MEM_Int ){
- sqlite3_str_appendf(&acc, "%lld", p->u.i);
- }else if( p->flags & MEM_IntReal ){
- sqlite3_str_appendf(&acc, "%!.15g", (double)p->u.i);
+#if GCC_VERSION>=7000000
+ /* Work-around for GCC bug
+ ** https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96270 */
+ i64 x;
+ assert( (p->flags&MEM_Int)*2==sizeof(x) );
+ memcpy(&x, (char*)&p->u, (p->flags&MEM_Int)*2);
+ sqlite3Int64ToText(x, zBuf);
+#else
+ sqlite3Int64ToText(p->u.i, zBuf);
+#endif
}else{
- sqlite3_str_appendf(&acc, "%!.15g", p->u.r);
+ sqlite3StrAccumInit(&acc, 0, zBuf, sz, 0);
+ sqlite3_str_appendf(&acc, "%!.15g",
+ (p->flags & MEM_IntReal)!=0 ? (double)p->u.i : p->u.r);
+ assert( acc.zText==zBuf && acc.mxAlloc<=0 );
+ zBuf[acc.nChar] = 0; /* Fast version of sqlite3StrAccumFinish(&acc) */
}
- assert( acc.zText==zBuf && acc.mxAlloc<=0 );
- zBuf[acc.nChar] = 0; /* Fast version of sqlite3StrAccumFinish(&acc) */
}
#ifdef SQLITE_DEBUG
--- /test/fts3corrupt4.test
+++ /test/fts3corrupt4.test
@@ -6282,4 +6282,19 @@
set sqlite_fts3_enable_parentheses $saved
+#-------------------------------------------------------------------------
+reset_db
+do_execsql_test 47.1 {
+ CREATE VIRTUAL TABLE t1 USING fts3(a,b,c);
+}
+do_execsql_test 47.2 {
+ INSERT INTO t1_segdir VALUES(0,0,0,0,0,X'000130120106000106000106001f030001030001030000083230313630363039090107000107000107000001340901050001050001050000013509010400010400010400010730303030303030091c0400010400010400000662696e6172793c0301020200030102020003010202000301020200030102020003010202000301020200030102020003010202000301020200030102020003010202000008636f6d70696c657209010200010200010200000664627374617409070300010300010300010465627567090402000102000102000006656e61626c653f07020001020001020001020001020001020001020001020001020001020001020001020001010001020001020001020001020001020001020001020001020001087874656e73696f6e091f0400010400010400000466747334090a0300010300010300030135090d03000103000103000003676363090103000103000103000106656f706f6c790910030001030001030000056a736f6e310913030001030001030000046c6f6164091f030001030001030000036d6178091c02000102000102000105656d6f7279091c03000103000103000304737973350916030001030001030000066e6f636173653c02010202000301020200030102020003010202000301020200030102020003010202000301020200030102020003010202000301020200030102020000046f6d6974091f020001020001020000057274726565091903000103000103000302696d3c01010202000301020200030102020003010202000301020200030102020003010202000301a202000301020200030102020003010202000301020200000a746872656164736166650922020001020001020000047674616209070400010400010400000178b401010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200010101020001010102000101010200');
+ INSERT INTO t1_segdir VALUES(0,1,0,0,0,X'0001300425061b000008323031363036303903250700000134032505000001350325040001073030303030303003251a000008636f6d70696c657203250200000664627374617403250a00010465627567032508000006656e61626c650925090504040404040001087874656e73696f6e03251d0000046674733403250d0003013503250f000003676363032503000106656f706f6c790325110000056a736f6e310325130000046c6f616403251c0000036d6178032518000105656d6f7279032519000304737973350325150000046f6d697403251b000005727472656503251700000a7468726561647361666503251e0000047674616333250b00');
+}
+
+do_catchsql_test 47.3 {
+ SELECT matchinfo(t1) FROM t1 WHERE t1 MATCH '"json1 enable"';
+} {1 {database disk image is malformed}}
+
+
finish_test

View File

@ -0,0 +1,413 @@
Add initialization functions for internal usage in libsqlite3.so.
--- /ext/misc/amatch.c
+++ /ext/misc/amatch.c
@@ -1480,9 +1480,18 @@
#endif /* SQLITE_OMIT_VIRTUALTABLE */
+int sqlite3AmatchInit(sqlite3 *db){
+ int rc = SQLITE_OK;
+#ifndef SQLITE_OMIT_VIRTUALTABLE
+ rc = sqlite3_create_module(db, "approximate_match", &amatchModule, 0);
+#endif /* SQLITE_OMIT_VIRTUALTABLE */
+ return rc;
+}
+
/*
** Register the amatch virtual table
*/
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
#ifdef _WIN32
__declspec(dllexport)
#endif
@@ -1491,11 +1500,8 @@
char **pzErrMsg,
const sqlite3_api_routines *pApi
){
- int rc = SQLITE_OK;
SQLITE_EXTENSION_INIT2(pApi);
(void)pzErrMsg; /* Not used */
-#ifndef SQLITE_OMIT_VIRTUALTABLE
- rc = sqlite3_create_module(db, "approximate_match", &amatchModule, 0);
-#endif /* SQLITE_OMIT_VIRTUALTABLE */
- return rc;
+ return sqlite3AmatchInit(db);
}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/carray.c
+++ /ext/misc/carray.c
@@ -383,16 +383,8 @@
#endif /* SQLITE_OMIT_VIRTUALTABLE */
-#ifdef _WIN32
-__declspec(dllexport)
-#endif
-int sqlite3_carray_init(
- sqlite3 *db,
- char **pzErrMsg,
- const sqlite3_api_routines *pApi
-){
+int sqlite3CarrayInit(sqlite3 *db){
int rc = SQLITE_OK;
- SQLITE_EXTENSION_INIT2(pApi);
#ifndef SQLITE_OMIT_VIRTUALTABLE
rc = sqlite3_create_module(db, "carray", &carrayModule, 0);
#ifdef SQLITE_TEST
@@ -404,3 +396,18 @@
#endif /* SQLITE_OMIT_VIRTUALTABLE */
return rc;
}
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
+int sqlite3_carray_init(
+ sqlite3 *db,
+ char **pzErrMsg,
+ const sqlite3_api_routines *pApi
+){
+ SQLITE_EXTENSION_INIT2(pApi);
+ (void)pzErrMsg; /* Unused parameter */
+ return sqlite3CarrayInit(db);
+}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/completion.c
+++ /ext/misc/completion.c
@@ -483,12 +483,13 @@
return rc;
}
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
#ifdef _WIN32
__declspec(dllexport)
#endif
int sqlite3_completion_init(
- sqlite3 *db,
- char **pzErrMsg,
+ sqlite3 *db,
+ char **pzErrMsg,
const sqlite3_api_routines *pApi
){
int rc = SQLITE_OK;
@@ -499,3 +500,4 @@
#endif
return rc;
}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/csv.c
+++ /ext/misc/csv.c
@@ -928,6 +928,22 @@
#endif /* !defined(SQLITE_OMIT_VIRTUALTABLE) */
+int sqlite3CsvInit(sqlite3 *db){
+#ifndef SQLITE_OMIT_VIRTUALTABLE
+ int rc;
+ rc = sqlite3_create_module(db, "csv", &CsvModule, 0);
+#ifdef SQLITE_TEST
+ if( rc==SQLITE_OK ){
+ rc = sqlite3_create_module(db, "csv_wr", &CsvModuleFauxWrite, 0);
+ }
+#endif
+ return rc;
+#else
+ return SQLITE_OK;
+#endif
+}
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
#ifdef _WIN32
__declspec(dllexport)
#endif
@@ -941,17 +957,8 @@
char **pzErrMsg,
const sqlite3_api_routines *pApi
){
-#ifndef SQLITE_OMIT_VIRTUALTABLE
- int rc;
SQLITE_EXTENSION_INIT2(pApi);
- rc = sqlite3_create_module(db, "csv", &CsvModule, 0);
-#ifdef SQLITE_TEST
- if( rc==SQLITE_OK ){
- rc = sqlite3_create_module(db, "csv_wr", &CsvModuleFauxWrite, 0);
- }
-#endif
- return rc;
-#else
- return SQLITE_OK;
-#endif
+ (void)pzErrMsg; /* Unused parameter */
+ return sqlite3CsvInit(db);
}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/dbdata.c
+++ /ext/misc/dbdata.c
@@ -803,7 +803,7 @@
/*
** Invoke this routine to register the "sqlite_dbdata" virtual table module
*/
-static int sqlite3DbdataRegister(sqlite3 *db){
+int sqlite3DbdataRegister(sqlite3 *db){
static sqlite3_module dbdata_module = {
0, /* iVersion */
0, /* xCreate */
@@ -838,6 +838,7 @@
return rc;
}
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
#ifdef _WIN32
__declspec(dllexport)
#endif
@@ -849,3 +850,4 @@
SQLITE_EXTENSION_INIT2(pApi);
return sqlite3DbdataRegister(db);
}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/decimal.c
+++ /ext/misc/decimal.c
@@ -590,14 +590,7 @@
decimal_free(pB);
}
-#ifdef _WIN32
-__declspec(dllexport)
-#endif
-int sqlite3_decimal_init(
- sqlite3 *db,
- char **pzErrMsg,
- const sqlite3_api_routines *pApi
-){
+int sqlite3DecimalInit(sqlite3 *db){
int rc = SQLITE_OK;
static const struct {
const char *zFuncName;
@@ -611,10 +604,6 @@
{ "decimal_mul", 2, decimalMulFunc },
};
unsigned int i;
- (void)pzErrMsg; /* Unused parameter */
-
- SQLITE_EXTENSION_INIT2(pApi);
-
for(i=0; i<sizeof(aFunc)/sizeof(aFunc[0]) && rc==SQLITE_OK; i++){
rc = sqlite3_create_function(db, aFunc[i].zFuncName, aFunc[i].nArg,
SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC,
@@ -632,3 +621,20 @@
}
return rc;
}
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
+int sqlite3_decimal_init(
+ sqlite3 *db,
+ char **pzErrMsg,
+ const sqlite3_api_routines *pApi
+){
+ (void)pzErrMsg; /* Unused parameter */
+
+ SQLITE_EXTENSION_INIT2(pApi);
+
+ return sqlite3DecimalInit(db);
+}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/eval.c
+++ /ext/misc/eval.c
@@ -102,6 +102,20 @@
}
+int sqlite3EvalInit(sqlite3 *db){
+ int rc = SQLITE_OK;
+ rc = sqlite3_create_function(db, "eval", 1,
+ SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
+ sqlEvalFunc, 0, 0);
+ if( rc==SQLITE_OK ){
+ rc = sqlite3_create_function(db, "eval", 2,
+ SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
+ sqlEvalFunc, 0, 0);
+ }
+ return rc;
+}
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
#ifdef _WIN32
__declspec(dllexport)
#endif
@@ -110,16 +124,8 @@
char **pzErrMsg,
const sqlite3_api_routines *pApi
){
- int rc = SQLITE_OK;
SQLITE_EXTENSION_INIT2(pApi);
(void)pzErrMsg; /* Unused parameter */
- rc = sqlite3_create_function(db, "eval", 1,
- SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
- sqlEvalFunc, 0, 0);
- if( rc==SQLITE_OK ){
- rc = sqlite3_create_function(db, "eval", 2,
- SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
- sqlEvalFunc, 0, 0);
- }
- return rc;
+ return sqlite3EvalInit(db);
}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/fileio.c
+++ /ext/misc/fileio.c
@@ -340,7 +340,7 @@
** This function does the work for the writefile() UDF. Refer to
** header comments at the top of this file for details.
*/
-static int writeFile(
+static int writeFileContents(
sqlite3_context *pCtx, /* Context to return bytes written in */
const char *zFile, /* File to write */
sqlite3_value *pData, /* Data to write */
@@ -480,10 +480,10 @@
mtime = sqlite3_value_int64(argv[3]);
}
- res = writeFile(context, zFile, argv[1], mode, mtime);
+ res = writeFileContents(context, zFile, argv[1], mode, mtime);
if( res==1 && errno==ENOENT ){
if( makeDirectory(zFile)==SQLITE_OK ){
- res = writeFile(context, zFile, argv[1], mode, mtime);
+ res = writeFileContents(context, zFile, argv[1], mode, mtime);
}
}
@@ -970,18 +970,9 @@
# define fsdirRegister(x) SQLITE_OK
#endif
-#ifdef _WIN32
-__declspec(dllexport)
-#endif
-int sqlite3_fileio_init(
- sqlite3 *db,
- char **pzErrMsg,
- const sqlite3_api_routines *pApi
-){
+int sqlite3FileioInit(sqlite3 *db){
int rc = SQLITE_OK;
- SQLITE_EXTENSION_INIT2(pApi);
- (void)pzErrMsg; /* Unused parameter */
- rc = sqlite3_create_function(db, "readfile", 1,
+ rc = sqlite3_create_function(db, "readfile", 1,
SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
readfileFunc, 0, 0);
if( rc==SQLITE_OK ){
@@ -998,3 +989,18 @@
}
return rc;
}
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
+int sqlite3_fileio_init(
+ sqlite3 *db,
+ char **pzErrMsg,
+ const sqlite3_api_routines *pApi
+){
+ SQLITE_EXTENSION_INIT2(pApi);
+ (void)pzErrMsg; /* Unused parameter */
+ return sqlite3FileioInit(db);
+}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/ieee754.c
+++ /ext/misc/ieee754.c
@@ -245,14 +245,7 @@
}
-#ifdef _WIN32
-__declspec(dllexport)
-#endif
-int sqlite3_ieee_init(
- sqlite3 *db,
- char **pzErrMsg,
- const sqlite3_api_routines *pApi
-){
+int sqlite3IeeeInit(sqlite3 *db){
static const struct {
char *zFName;
int nArg;
@@ -269,13 +262,26 @@
};
unsigned int i;
int rc = SQLITE_OK;
- SQLITE_EXTENSION_INIT2(pApi);
- (void)pzErrMsg; /* Unused parameter */
for(i=0; i<sizeof(aFunc)/sizeof(aFunc[0]) && rc==SQLITE_OK; i++){
- rc = sqlite3_create_function(db, aFunc[i].zFName, aFunc[i].nArg,
+ rc = sqlite3_create_function(db, aFunc[i].zFName, aFunc[i].nArg,
SQLITE_UTF8|SQLITE_INNOCUOUS,
(void*)&aFunc[i].iAux,
aFunc[i].xFunc, 0, 0);
}
return rc;
}
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
+int sqlite3_ieee_init(
+ sqlite3 *db,
+ char **pzErrMsg,
+ const sqlite3_api_routines *pApi
+){
+ SQLITE_EXTENSION_INIT2(pApi);
+ (void)pzErrMsg; /* Unused parameter */
+ return sqlite3IeeeInit(db);
+}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/nextchar.c
+++ /ext/misc/nextchar.c
@@ -286,17 +286,8 @@
sqlite3_free(c.aResult);
}
-#ifdef _WIN32
-__declspec(dllexport)
-#endif
-int sqlite3_nextchar_init(
- sqlite3 *db,
- char **pzErrMsg,
- const sqlite3_api_routines *pApi
-){
+int sqlite3NextcharInit(sqlite3 *db){
int rc = SQLITE_OK;
- SQLITE_EXTENSION_INIT2(pApi);
- (void)pzErrMsg; /* Unused parameter */
rc = sqlite3_create_function(db, "next_char", 3,
SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
nextCharFunc, 0, 0);
@@ -312,3 +303,18 @@
}
return rc;
}
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
+int sqlite3_nextchar_init(
+ sqlite3 *db,
+ char **pzErrMsg,
+ const sqlite3_api_routines *pApi
+){
+ SQLITE_EXTENSION_INIT2(pApi);
+ (void)pzErrMsg; /* Unused parameter */
+ return sqlite3NextcharInit(db);
+}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */

View File

@ -0,0 +1,422 @@
Add initialization functions for internal usage in libsqlite3.so.
--- /ext/misc/percentile.c
+++ /ext/misc/percentile.c
@@ -202,6 +202,15 @@
}
+int sqlite3PercentileInit(sqlite3 *db){
+ int rc = SQLITE_OK;
+ rc = sqlite3_create_function(db, "percentile", 2,
+ SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
+ 0, percentStep, percentFinal);
+ return rc;
+}
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
#ifdef _WIN32
__declspec(dllexport)
#endif
@@ -210,11 +219,8 @@
char **pzErrMsg,
const sqlite3_api_routines *pApi
){
- int rc = SQLITE_OK;
SQLITE_EXTENSION_INIT2(pApi);
(void)pzErrMsg; /* Unused parameter */
- rc = sqlite3_create_function(db, "percentile", 2,
- SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
- 0, percentStep, percentFinal);
- return rc;
+ return sqlite3PercentileInit(db);
}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/regexp.c
+++ /ext/misc/regexp.c
@@ -740,10 +740,18 @@
}
}
+int sqlite3RegexpInit(sqlite3 *db){
+ int rc = SQLITE_OK;
+ rc = sqlite3_create_function(db, "regexp", 2, SQLITE_UTF8|SQLITE_INNOCUOUS,
+ 0, re_sql_func, 0, 0);
+ return rc;
+}
+
/*
** Invoke this routine to register the regexp() function with the
** SQLite database connection.
*/
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
#ifdef _WIN32
__declspec(dllexport)
#endif
@@ -752,9 +760,8 @@
char **pzErrMsg,
const sqlite3_api_routines *pApi
){
- int rc = SQLITE_OK;
SQLITE_EXTENSION_INIT2(pApi);
- rc = sqlite3_create_function(db, "regexp", 2, SQLITE_UTF8|SQLITE_INNOCUOUS,
- 0, re_sql_func, 0, 0);
- return rc;
+ (void)pzErrMsg; /* Unused parameter */
+ return sqlite3RegexpInit(db);
}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/sha1.c
+++ /ext/misc/sha1.c
@@ -175,7 +175,7 @@
}
/* Compute a string using sqlite3_vsnprintf() and hash it */
-static void hash_step_vformat(
+static void sha1_hash_step_vformat(
SHA1Context *p, /* Add content to this context */
const char *zFormat,
...
@@ -306,7 +306,7 @@
nCol = sqlite3_column_count(pStmt);
z = sqlite3_sql(pStmt);
n = (int)strlen(z);
- hash_step_vformat(&cx,"S%d:",n);
+ sha1_hash_step_vformat(&cx,"S%d:",n);
hash_step(&cx,(unsigned char*)z,n);
/* Compute a hash over the result of the query */
@@ -349,14 +349,14 @@
case SQLITE_TEXT: {
int n2 = sqlite3_column_bytes(pStmt, i);
const unsigned char *z2 = sqlite3_column_text(pStmt, i);
- hash_step_vformat(&cx,"T%d:",n2);
+ sha1_hash_step_vformat(&cx,"T%d:",n2);
hash_step(&cx, z2, n2);
break;
}
case SQLITE_BLOB: {
int n2 = sqlite3_column_bytes(pStmt, i);
const unsigned char *z2 = sqlite3_column_blob(pStmt, i);
- hash_step_vformat(&cx,"B%d:",n2);
+ sha1_hash_step_vformat(&cx,"B%d:",n2);
hash_step(&cx, z2, n2);
break;
}
@@ -370,6 +370,20 @@
}
+int sqlite3ShaInit(sqlite3 *db){
+ int rc = SQLITE_OK;
+ rc = sqlite3_create_function(db, "sha1", 1,
+ SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC,
+ 0, sha1Func, 0, 0);
+ if( rc==SQLITE_OK ){
+ rc = sqlite3_create_function(db, "sha1_query", 1,
+ SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
+ sha1QueryFunc, 0, 0);
+ }
+ return rc;
+}
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
#ifdef _WIN32
__declspec(dllexport)
#endif
@@ -378,16 +392,8 @@
char **pzErrMsg,
const sqlite3_api_routines *pApi
){
- int rc = SQLITE_OK;
SQLITE_EXTENSION_INIT2(pApi);
(void)pzErrMsg; /* Unused parameter */
- rc = sqlite3_create_function(db, "sha1", 1,
- SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC,
- 0, sha1Func, 0, 0);
- if( rc==SQLITE_OK ){
- rc = sqlite3_create_function(db, "sha1_query", 1,
- SQLITE_UTF8|SQLITE_DIRECTONLY, 0,
- sha1QueryFunc, 0, 0);
- }
- return rc;
+ return sqlite3ShaInit(db);
}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/shathree.c
+++ /ext/misc/shathree.c
@@ -527,7 +527,7 @@
/* Compute a string using sqlite3_vsnprintf() with a maximum length
** of 50 bytes and add it to the hash.
*/
-static void hash_step_vformat(
+static void sha3_hash_step_vformat(
SHA3Context *p, /* Add content to this context */
const char *zFormat,
...
@@ -622,7 +622,7 @@
nCol = sqlite3_column_count(pStmt);
z = sqlite3_sql(pStmt);
n = (int)strlen(z);
- hash_step_vformat(&cx,"S%d:",n);
+ sha3_hash_step_vformat(&cx,"S%d:",n);
SHA3Update(&cx,(unsigned char*)z,n);
/* Compute a hash over the result of the query */
@@ -665,14 +665,14 @@
case SQLITE_TEXT: {
int n2 = sqlite3_column_bytes(pStmt, i);
const unsigned char *z2 = sqlite3_column_text(pStmt, i);
- hash_step_vformat(&cx,"T%d:",n2);
+ sha3_hash_step_vformat(&cx,"T%d:",n2);
SHA3Update(&cx, z2, n2);
break;
}
case SQLITE_BLOB: {
int n2 = sqlite3_column_bytes(pStmt, i);
const unsigned char *z2 = sqlite3_column_blob(pStmt, i);
- hash_step_vformat(&cx,"B%d:",n2);
+ sha3_hash_step_vformat(&cx,"B%d:",n2);
SHA3Update(&cx, z2, n2);
break;
}
@@ -685,17 +685,8 @@
}
-#ifdef _WIN32
-__declspec(dllexport)
-#endif
-int sqlite3_shathree_init(
- sqlite3 *db,
- char **pzErrMsg,
- const sqlite3_api_routines *pApi
-){
+int sqlite3ShathreeInit(sqlite3 *db){
int rc = SQLITE_OK;
- SQLITE_EXTENSION_INIT2(pApi);
- (void)pzErrMsg; /* Unused parameter */
rc = sqlite3_create_function(db, "sha3", 1,
SQLITE_UTF8 | SQLITE_INNOCUOUS | SQLITE_DETERMINISTIC,
0, sha3Func, 0, 0);
@@ -716,3 +707,18 @@
}
return rc;
}
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
+int sqlite3_shathree_init(
+ sqlite3 *db,
+ char **pzErrMsg,
+ const sqlite3_api_routines *pApi
+){
+ SQLITE_EXTENSION_INIT2(pApi);
+ (void)pzErrMsg; /* Unused parameter */
+ return sqlite3ShathreeInit(db);
+}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/sqlar.c
+++ /ext/misc/sqlar.c
@@ -14,6 +14,8 @@
** for working with sqlar archives and used by the shell tool's built-in
** sqlar support.
*/
+#ifdef SQLITE_HAVE_ZLIB
+
#include "sqlite3ext.h"
SQLITE_EXTENSION_INIT1
#include <zlib.h>
@@ -101,6 +103,20 @@
}
+int sqlite3SqlarInit(sqlite3 *db){
+ int rc = SQLITE_OK;
+ rc = sqlite3_create_function(db, "sqlar_compress", 1,
+ SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
+ sqlarCompressFunc, 0, 0);
+ if( rc==SQLITE_OK ){
+ rc = sqlite3_create_function(db, "sqlar_uncompress", 2,
+ SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
+ sqlarUncompressFunc, 0, 0);
+ }
+ return rc;
+}
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
#ifdef _WIN32
__declspec(dllexport)
#endif
@@ -109,16 +125,10 @@
char **pzErrMsg,
const sqlite3_api_routines *pApi
){
- int rc = SQLITE_OK;
SQLITE_EXTENSION_INIT2(pApi);
(void)pzErrMsg; /* Unused parameter */
- rc = sqlite3_create_function(db, "sqlar_compress", 1,
- SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
- sqlarCompressFunc, 0, 0);
- if( rc==SQLITE_OK ){
- rc = sqlite3_create_function(db, "sqlar_uncompress", 2,
- SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
- sqlarUncompressFunc, 0, 0);
- }
- return rc;
+ return sqlite3SqlarInit(db);
}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
+
+#endif /* SQLITE_HAVE_ZLIB */
--- /ext/misc/totype.c
+++ /ext/misc/totype.c
@@ -491,17 +491,8 @@
#pragma warning(default: 4748)
#endif
-#ifdef _WIN32
-__declspec(dllexport)
-#endif
-int sqlite3_totype_init(
- sqlite3 *db,
- char **pzErrMsg,
- const sqlite3_api_routines *pApi
-){
+int sqlite3TotypeInit(sqlite3 *db){
int rc = SQLITE_OK;
- SQLITE_EXTENSION_INIT2(pApi);
- (void)pzErrMsg; /* Unused parameter */
rc = sqlite3_create_function(db, "tointeger", 1,
SQLITE_UTF8 | SQLITE_DETERMINISTIC | SQLITE_INNOCUOUS, 0,
tointegerFunc, 0, 0);
@@ -512,3 +503,18 @@
}
return rc;
}
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
+int sqlite3_totype_init(
+ sqlite3 *db,
+ char **pzErrMsg,
+ const sqlite3_api_routines *pApi
+){
+ SQLITE_EXTENSION_INIT2(pApi);
+ (void)pzErrMsg; /* Unused parameter */
+ return sqlite3TotypeInit(db);
+}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/uint.c
+++ /ext/misc/uint.c
@@ -78,6 +78,11 @@
return (nKey1 - i) - (nKey2 - j);
}
+int sqlite3UintInit(sqlite3 *db){
+ return sqlite3_create_collation(db, "UINT", SQLITE_UTF8, 0, uintCollFunc);
+}
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
#ifdef _WIN32
__declspec(dllexport)
#endif
@@ -88,5 +93,6 @@
){
SQLITE_EXTENSION_INIT2(pApi);
(void)pzErrMsg; /* Unused parameter */
- return sqlite3_create_collation(db, "uint", SQLITE_UTF8, 0, uintCollFunc);
+ return sqlite3UintInit(db);
}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/uuid.c
+++ /ext/misc/uuid.c
@@ -206,21 +206,12 @@
sqlite3_result_blob(context, pBlob, 16, SQLITE_TRANSIENT);
}
-#ifdef _WIN32
-__declspec(dllexport)
-#endif
-int sqlite3_uuid_init(
- sqlite3 *db,
- char **pzErrMsg,
- const sqlite3_api_routines *pApi
-){
+int sqlite3UuidInit(sqlite3 *db){
int rc = SQLITE_OK;
- SQLITE_EXTENSION_INIT2(pApi);
- (void)pzErrMsg; /* Unused parameter */
rc = sqlite3_create_function(db, "uuid", 0, SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
sqlite3UuidFunc, 0, 0);
if( rc==SQLITE_OK ){
- rc = sqlite3_create_function(db, "uuid_str", 1,
+ rc = sqlite3_create_function(db, "uuid_str", 1,
SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_DETERMINISTIC,
0, sqlite3UuidStrFunc, 0, 0);
}
@@ -231,3 +222,18 @@
}
return rc;
}
+
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
+#ifdef _WIN32
+__declspec(dllexport)
+#endif
+int sqlite3_uuid_init(
+ sqlite3 *db,
+ char **pzErrMsg,
+ const sqlite3_api_routines *pApi
+){
+ SQLITE_EXTENSION_INIT2(pApi);
+ (void)pzErrMsg; /* Unused parameter */
+ return sqlite3UuidInit(db);
+}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
--- /ext/misc/zipfile.c
+++ /ext/misc/zipfile.c
@@ -24,6 +24,8 @@
** * No support for zip64 extensions
** * Only the "inflate/deflate" (zlib) compression method is supported
*/
+#ifdef SQLITE_HAVE_ZLIB
+
#include "sqlite3ext.h"
SQLITE_EXTENSION_INIT1
#include <stdio.h>
@@ -2137,7 +2139,7 @@
/*
** Register the "zipfile" virtual table.
*/
-static int zipfileRegister(sqlite3 *db){
+int sqlite3ZipfileInit(sqlite3 *db){
static sqlite3_module zipfileModule = {
1, /* iVersion */
zipfileConnect, /* xCreate */
@@ -2171,9 +2173,10 @@
return rc;
}
#else /* SQLITE_OMIT_VIRTUALTABLE */
-# define zipfileRegister(x) SQLITE_OK
+# define sqlite3ZipfileInit(x) SQLITE_OK
#endif
+#if !defined(SQLITE_CORE) || defined(SQLITE_TEST)
#ifdef _WIN32
__declspec(dllexport)
#endif
@@ -2184,5 +2187,8 @@
){
SQLITE_EXTENSION_INIT2(pApi);
(void)pzErrMsg; /* Unused parameter */
- return zipfileRegister(db);
+ return sqlite3ZipfileInit(db);
}
+#endif /* !defined(SQLITE_CORE) || defined(SQLITE_TEST) */
+
+#endif /* SQLITE_HAVE_ZLIB */

View File

@ -1,11 +1,12 @@
Move some code to libsqlite3.so to avoid duplication. Move some code to libsqlite3.so to avoid duplication.
Link executables against libsqlite3.so. Link executables against libsqlite3.so.
Increase timeout for fuzzcheck. Increase timeout for fuzzcheck.
Update list of optionally available functions.
Fix building with dlopen() not available. Fix building with dlopen() not available.
--- /Makefile.in --- /Makefile.in
+++ /Makefile.in +++ /Makefile.in
@@ -311,6 +311,9 @@ @@ -313,6 +313,9 @@
# Source code for extensions # Source code for extensions
# #
SRC += \ SRC += \
@ -15,37 +16,72 @@ Fix building with dlopen() not available.
$(TOP)/ext/fts1/fts1.c \ $(TOP)/ext/fts1/fts1.c \
$(TOP)/ext/fts1/fts1.h \ $(TOP)/ext/fts1/fts1.h \
$(TOP)/ext/fts1/fts1_hash.c \ $(TOP)/ext/fts1/fts1_hash.c \
@@ -363,8 +366,12 @@ @@ -365,8 +368,28 @@
$(TOP)/ext/rbu/sqlite3rbu.h \ $(TOP)/ext/rbu/sqlite3rbu.h \
$(TOP)/ext/rbu/sqlite3rbu.c $(TOP)/ext/rbu/sqlite3rbu.c
SRC += \ SRC += \
+ $(TOP)/ext/misc/amatch.c \
+ $(TOP)/ext/misc/appendvfs.c \ + $(TOP)/ext/misc/appendvfs.c \
+ $(TOP)/ext/misc/carray.c \
+ $(TOP)/ext/misc/completion.c \
+ $(TOP)/ext/misc/csv.c \
+ $(TOP)/ext/misc/dbdata.c \ + $(TOP)/ext/misc/dbdata.c \
+ $(TOP)/ext/misc/decimal.c \
+ $(TOP)/ext/misc/eval.c \
+ $(TOP)/ext/misc/fileio.c \
+ $(TOP)/ext/misc/ieee754.c \
$(TOP)/ext/misc/json1.c \ $(TOP)/ext/misc/json1.c \
- $(TOP)/ext/misc/stmt.c - $(TOP)/ext/misc/stmt.c
+ $(TOP)/ext/misc/nextchar.c \
+ $(TOP)/ext/misc/percentile.c \
+ $(TOP)/ext/misc/regexp.c \
+ $(TOP)/ext/misc/sha1.c \
+ $(TOP)/ext/misc/shathree.c \
+ $(TOP)/ext/misc/sqlar.c \ + $(TOP)/ext/misc/sqlar.c \
+ $(TOP)/ext/misc/stmt.c \ + $(TOP)/ext/misc/stmt.c \
+ $(TOP)/ext/misc/totype.c \
+ $(TOP)/ext/misc/uint.c \
+ $(TOP)/ext/misc/uuid.c \
+ $(TOP)/ext/misc/zipfile.c + $(TOP)/ext/misc/zipfile.c
# Generated source code files # Generated source code files
# #
@@ -435,7 +442,6 @@ @@ -437,34 +460,21 @@
# Statically linked extensions # Statically linked extensions
# #
TESTSRC += \ TESTSRC += \
- $(TOP)/ext/expert/sqlite3expert.c \ - $(TOP)/ext/expert/sqlite3expert.c \
$(TOP)/ext/expert/test_expert.c \ $(TOP)/ext/expert/test_expert.c \
$(TOP)/ext/misc/amatch.c \ - $(TOP)/ext/misc/amatch.c \
$(TOP)/ext/misc/carray.c \ - $(TOP)/ext/misc/carray.c \
@@ -461,7 +467,6 @@ $(TOP)/ext/misc/closure.c \
$(TOP)/ext/misc/totype.c \ - $(TOP)/ext/misc/csv.c \
- $(TOP)/ext/misc/decimal.c \
- $(TOP)/ext/misc/eval.c \
$(TOP)/ext/misc/explain.c \
- $(TOP)/ext/misc/fileio.c \
$(TOP)/ext/misc/fuzzer.c \
$(TOP)/ext/fts5/fts5_tcl.c \
$(TOP)/ext/fts5/fts5_test_mi.c \
$(TOP)/ext/fts5/fts5_test_tok.c \
- $(TOP)/ext/misc/ieee754.c \
$(TOP)/ext/misc/mmapwarm.c \
- $(TOP)/ext/misc/nextchar.c \
$(TOP)/ext/misc/normalize.c \
- $(TOP)/ext/misc/percentile.c \
$(TOP)/ext/misc/prefixes.c \
- $(TOP)/ext/misc/regexp.c \
$(TOP)/ext/misc/remember.c \
$(TOP)/ext/misc/series.c \
$(TOP)/ext/misc/spellfix.c \
- $(TOP)/ext/misc/totype.c \
$(TOP)/ext/misc/unionvtab.c \ $(TOP)/ext/misc/unionvtab.c \
$(TOP)/ext/misc/wholenumber.c \ $(TOP)/ext/misc/wholenumber.c \
- $(TOP)/ext/misc/zipfile.c \ - $(TOP)/ext/misc/zipfile.c \
$(TOP)/ext/userauth/userauth.c $(TOP)/ext/userauth/userauth.c
# Source code to the library files needed by the test fixture # Source code to the library files needed by the test fixture
@@ -639,25 +644,25 @@ @@ -646,25 +656,25 @@
libtclsqlite3.la: tclsqlite.lo libsqlite3.la libtclsqlite3.la: tclsqlite.lo libsqlite3.la
$(LTLINK) -no-undefined -o $@ tclsqlite.lo \ $(LTLINK) -no-undefined -o $@ tclsqlite.lo \
@ -82,7 +118,7 @@ Fix building with dlopen() not available.
srcck1$(BEXE): $(TOP)/tool/srcck1.c srcck1$(BEXE): $(TOP)/tool/srcck1.c
$(BCC) -o srcck1$(BEXE) $(TOP)/tool/srcck1.c $(BCC) -o srcck1$(BEXE) $(TOP)/tool/srcck1.c
@@ -767,7 +772,7 @@ @@ -775,7 +785,7 @@
# Rule to build the amalgamation # Rule to build the amalgamation
# #
sqlite3.lo: sqlite3.c sqlite3.lo: sqlite3.c
@ -91,22 +127,25 @@ Fix building with dlopen() not available.
# Rules to build the LEMON compiler generator # Rules to build the LEMON compiler generator
# #
@@ -1064,14 +1069,9 @@ @@ -1081,17 +1091,6 @@
# Source files that go into making shell.c # Source files that go into making shell.c
SHELL_SRC = \ SHELL_SRC = \
$(TOP)/src/shell.c.in \ $(TOP)/src/shell.c.in \
- $(TOP)/ext/misc/appendvfs.c \ - $(TOP)/ext/misc/appendvfs.c \
$(TOP)/ext/misc/shathree.c \ - $(TOP)/ext/misc/completion.c \
$(TOP)/ext/misc/fileio.c \ - $(TOP)/ext/misc/decimal.c \
$(TOP)/ext/misc/completion.c \ - $(TOP)/ext/misc/fileio.c \
- $(TOP)/ext/misc/ieee754.c \
- $(TOP)/ext/misc/shathree.c \
- $(TOP)/ext/misc/sqlar.c \ - $(TOP)/ext/misc/sqlar.c \
- $(TOP)/ext/misc/uint.c \
- $(TOP)/ext/expert/sqlite3expert.c \ - $(TOP)/ext/expert/sqlite3expert.c \
- $(TOP)/ext/expert/sqlite3expert.h \ - $(TOP)/ext/expert/sqlite3expert.h \
- $(TOP)/ext/misc/zipfile.c \ - $(TOP)/ext/misc/zipfile.c \
$(TOP)/ext/misc/memtrace.c \ $(TOP)/ext/misc/memtrace.c \
$(TOP)/src/test_windirent.c $(TOP)/src/test_windirent.c
@@ -1239,11 +1239,11 @@ @@ -1260,11 +1259,11 @@
# Fuzz testing # Fuzz testing
fuzztest: fuzzcheck$(TEXE) $(FUZZDATA) sessionfuzz$(TEXE) $(TOP)/test/sessionfuzz-data1.db fuzztest: fuzzcheck$(TEXE) $(FUZZDATA) sessionfuzz$(TEXE) $(TOP)/test/sessionfuzz-data1.db
@ -120,9 +159,9 @@ Fix building with dlopen() not available.
valgrind ./sessionfuzz$(TEXE) run $(TOP)/test/sessionfuzz-data1.db valgrind ./sessionfuzz$(TEXE) run $(TOP)/test/sessionfuzz-data1.db
# The veryquick.test TCL tests. # The veryquick.test TCL tests.
@@ -1274,24 +1274,23 @@ @@ -1298,24 +1297,23 @@
smoketest: $(TESTPROGS) fuzzcheck$(TEXE) shelltest: $(TESTPROGS)
./testfixture$(TEXE) $(TOP)/test/main.test $(TESTOPTS) ./testfixture$(TEXT) $(TOP)/test/permutations.test shell
-sqlite3_analyzer.c: sqlite3.c $(TOP)/src/tclsqlite.c $(TOP)/tool/spaceanal.tcl $(TOP)/tool/mkccode.tcl $(TOP)/tool/sqlite3_analyzer.c.in -sqlite3_analyzer.c: sqlite3.c $(TOP)/src/tclsqlite.c $(TOP)/tool/spaceanal.tcl $(TOP)/tool/mkccode.tcl $(TOP)/tool/sqlite3_analyzer.c.in
+sqlite3_analyzer.c: $(TOP)/src/tclsqlite.c $(TOP)/tool/spaceanal.tcl $(TOP)/tool/mkccode.tcl $(TOP)/tool/sqlite3_analyzer.c.in +sqlite3_analyzer.c: $(TOP)/src/tclsqlite.c $(TOP)/tool/spaceanal.tcl $(TOP)/tool/mkccode.tcl $(TOP)/tool/sqlite3_analyzer.c.in
@ -153,7 +192,7 @@ Fix building with dlopen() not available.
$(TOP)/src/tclsqlite.c \ $(TOP)/src/tclsqlite.c \
$(TOP)/ext/repair/sqlite3_checker.tcl \ $(TOP)/ext/repair/sqlite3_checker.tcl \
$(TOP)/ext/repair/checkindex.c \ $(TOP)/ext/repair/checkindex.c \
@@ -1302,36 +1301,36 @@ @@ -1326,36 +1324,36 @@
sqlite3_checker.c: $(CHECKER_DEPS) sqlite3_checker.c: $(CHECKER_DEPS)
$(TCLSH_CMD) $(TOP)/tool/mkccode.tcl $(TOP)/ext/repair/sqlite3_checker.c.in >$@ $(TCLSH_CMD) $(TOP)/tool/mkccode.tcl $(TOP)/ext/repair/sqlite3_checker.c.in >$@
@ -208,7 +247,7 @@ Fix building with dlopen() not available.
changesetfuzz$(TEXE): $(TOP)/ext/session/changesetfuzz.c sqlite3.lo changesetfuzz$(TEXE): $(TOP)/ext/session/changesetfuzz.c sqlite3.lo
$(LTLINK) -o $@ $(TOP)/ext/session/changesetfuzz.c sqlite3.lo $(TLIBS) $(LTLINK) -o $@ $(TOP)/ext/session/changesetfuzz.c sqlite3.lo $(TLIBS)
@@ -1356,11 +1355,11 @@ @@ -1380,11 +1378,11 @@
kvtest$(TEXE): $(TOP)/test/kvtest.c sqlite3.c kvtest$(TEXE): $(TOP)/test/kvtest.c sqlite3.c
$(LTLINK) $(KV_OPT) -o $@ $(TOP)/test/kvtest.c sqlite3.c $(TLIBS) $(LTLINK) $(KV_OPT) -o $@ $(TOP)/test/kvtest.c sqlite3.c $(TLIBS)
@ -226,6 +265,15 @@ Fix building with dlopen() not available.
# symbols that do not begin with "sqlite3_". It is run as part of the # symbols that do not begin with "sqlite3_". It is run as part of the
--- /configure.ac --- /configure.ac
+++ /configure.ac +++ /configure.ac
@@ -108,7 +108,7 @@
#########
# Figure out whether or not we have these functions
#
-AC_CHECK_FUNCS([fdatasync gmtime_r isnan localtime_r localtime_s malloc_usable_size strchrnul usleep utime pread pread64 pwrite pwrite64])
+AC_CHECK_FUNCS([fdatasync fullfsync gmtime_r isnan localtime_r localtime_s malloc_usable_size posix_fallocate pread pread64 pwrite pwrite64 strchrnul usleep utime])
#########
# By default, we use the amalgamation (this may be changed below...)
@@ -587,6 +587,9 @@ @@ -587,6 +587,9 @@
if test "${enable_load_extension}" = "yes" ; then if test "${enable_load_extension}" = "yes" ; then
OPT_FEATURE_FLAGS="" OPT_FEATURE_FLAGS=""
@ -236,231 +284,3 @@ Fix building with dlopen() not available.
else else
OPT_FEATURE_FLAGS="-DSQLITE_OMIT_LOAD_EXTENSION=1" OPT_FEATURE_FLAGS="-DSQLITE_OMIT_LOAD_EXTENSION=1"
fi fi
--- /ext/misc/sqlar.c
+++ /ext/misc/sqlar.c
@@ -14,6 +14,8 @@
** for working with sqlar archives and used by the shell tool's built-in
** sqlar support.
*/
+#ifdef SQLITE_HAVE_ZLIB
+
#include "sqlite3ext.h"
SQLITE_EXTENSION_INIT1
#include <zlib.h>
@@ -121,3 +123,5 @@
}
return rc;
}
+
+#endif /* SQLITE_HAVE_ZLIB */
--- /ext/misc/zipfile.c
+++ /ext/misc/zipfile.c
@@ -24,6 +24,8 @@
** * No support for zip64 extensions
** * Only the "inflate/deflate" (zlib) compression method is supported
*/
+#ifdef SQLITE_HAVE_ZLIB
+
#include "sqlite3ext.h"
SQLITE_EXTENSION_INIT1
#include <stdio.h>
@@ -2186,3 +2188,5 @@
(void)pzErrMsg; /* Unused parameter */
return zipfileRegister(db);
}
+
+#endif /* SQLITE_HAVE_ZLIB */
--- /ext/repair/sqlite3_checker.c.in
+++ /ext/repair/sqlite3_checker.c.in
@@ -2,6 +2,7 @@
** Read an SQLite database file and analyze its space utilization. Generate
** text on standard output.
*/
+#define SQLITE_CORE 1
#define TCLSH_INIT_PROC sqlite3_checker_init_proc
#define SQLITE_ENABLE_DBPAGE_VTAB 1
#define SQLITE_ENABLE_JSON1 1
@@ -14,7 +15,7 @@
#define SQLITE_OMIT_SHARED_CACHE 1
#define SQLITE_DEFAULT_MEMSTATUS 0
#define SQLITE_MAX_EXPR_DEPTH 0
-INCLUDE sqlite3.c
+#include "sqlite3.h"
INCLUDE $ROOT/src/tclsqlite.c
INCLUDE $ROOT/ext/misc/btreeinfo.c
INCLUDE $ROOT/ext/repair/checkindex.c
--- /src/shell.c.in
+++ /src/shell.c.in
@@ -61,6 +61,7 @@
#include <stdio.h>
#include <assert.h>
#include "sqlite3.h"
+#include "ext/expert/sqlite3expert.h"
typedef sqlite3_int64 i64;
typedef sqlite3_uint64 u64;
typedef unsigned char u8;
@@ -127,6 +128,10 @@
# define SHELL_USE_LOCAL_GETLINE 1
#endif
+#ifdef SQLITE_HAVE_ZLIB
+#include <zlib.h>
+#endif
+
#if defined(_WIN32) || defined(WIN32)
# include <io.h>
@@ -939,18 +944,7 @@
INCLUDE ../ext/misc/shathree.c
INCLUDE ../ext/misc/fileio.c
INCLUDE ../ext/misc/completion.c
-INCLUDE ../ext/misc/appendvfs.c
INCLUDE ../ext/misc/memtrace.c
-#ifdef SQLITE_HAVE_ZLIB
-INCLUDE ../ext/misc/zipfile.c
-INCLUDE ../ext/misc/sqlar.c
-#endif
-INCLUDE ../ext/expert/sqlite3expert.h
-INCLUDE ../ext/expert/sqlite3expert.c
-
-#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
-INCLUDE ../ext/misc/dbdata.c
-#endif
#if defined(SQLITE_ENABLE_SESSION)
/*
@@ -4173,10 +4167,13 @@
sqlite3_shathree_init(p->db, 0, 0);
sqlite3_completion_init(p->db, 0, 0);
#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
+ extern int sqlite3_dbdata_init(sqlite3 *, char **, const sqlite3_api_routines *);
sqlite3_dbdata_init(p->db, 0, 0);
#endif
#ifdef SQLITE_HAVE_ZLIB
+ extern int sqlite3_zipfile_init(sqlite3 *, char **, const sqlite3_api_routines *);
sqlite3_zipfile_init(p->db, 0, 0);
+ extern int sqlite3_sqlar_init(sqlite3 *, char **, const sqlite3_api_routines *);
sqlite3_sqlar_init(p->db, 0, 0);
#endif
sqlite3_create_function(p->db, "shell_add_schema", 3, SQLITE_UTF8, 0,
@@ -6176,6 +6173,7 @@
goto end_ar_command;
}
sqlite3_fileio_init(cmd.db, 0, 0);
+ extern int sqlite3_sqlar_init(sqlite3 *, char **, const sqlite3_api_routines *);
sqlite3_sqlar_init(cmd.db, 0, 0);
sqlite3_create_function(cmd.db, "shell_putsnl", 1, SQLITE_UTF8, cmd.p,
shellPutsFunc, 0, 0);
@@ -10354,6 +10352,7 @@
#endif
}
data.out = stdout;
+ extern int sqlite3_appendvfs_init(sqlite3 *, char **, const sqlite3_api_routines *);
sqlite3_appendvfs_init(0,0,0);
/* Go ahead and open the database file if it already exists. If the
--- /test/sessionfuzz.c
+++ /test/sessionfuzz.c
@@ -700,42 +700,6 @@
#include <assert.h>
#include "zlib.h"
-/*
-** Implementation of the "sqlar_uncompress(X,SZ)" SQL function
-**
-** Parameter SZ is interpreted as an integer. If it is less than or
-** equal to zero, then this function returns a copy of X. Or, if
-** SZ is equal to the size of X when interpreted as a blob, also
-** return a copy of X. Otherwise, decompress blob X using zlib
-** utility function uncompress() and return the results (another
-** blob).
-*/
-static void sqlarUncompressFunc(
- sqlite3_context *context,
- int argc,
- sqlite3_value **argv
-){
- uLong nData;
- uLongf sz;
-
- assert( argc==2 );
- sz = sqlite3_value_int(argv[1]);
-
- if( sz<=0 || sz==(nData = sqlite3_value_bytes(argv[0])) ){
- sqlite3_result_value(context, argv[0]);
- }else{
- const Bytef *pData= sqlite3_value_blob(argv[0]);
- Bytef *pOut = sqlite3_malloc(sz);
- if( Z_OK!=uncompress(pOut, &sz, pData, nData) ){
- sqlite3_result_error(context, "error in uncompress()", -1);
- }else{
- sqlite3_result_blob(context, pOut, sz, SQLITE_TRANSIENT);
- }
- sqlite3_free(pOut);
- }
-}
-
-
/* Run a chunk of SQL. If any errors happen, print an error message
** and exit.
*/
--- /tool/mksqlite3c.tcl
+++ /tool/mksqlite3c.tcl
@@ -117,6 +117,7 @@
rtree.h
sqlite3session.h
sqlite3.h
+ sqlite3expert.h
sqlite3ext.h
sqlite3rbu.h
sqliteicu.h
@@ -403,6 +404,11 @@
sqlite3session.c
fts5.c
stmt.c
+ appendvfs.c
+ dbdata.c
+ sqlar.c
+ sqlite3expert.c
+ zipfile.c
} {
copy_file tsrc/$file
}
--- /tool/sqlite3_analyzer.c.in
+++ /tool/sqlite3_analyzer.c.in
@@ -14,9 +14,6 @@
#define SQLITE_DEFAULT_MEMSTATUS 0
#define SQLITE_MAX_EXPR_DEPTH 0
#define SQLITE_OMIT_LOAD_EXTENSION 1
-#ifndef USE_EXTERNAL_SQLITE
-INCLUDE sqlite3.c
-#endif
INCLUDE $ROOT/src/tclsqlite.c
const char *sqlite3_analyzer_init_proc(Tcl_Interp *interp){
--- /tool/sqltclsh.c.in
+++ /tool/sqltclsh.c.in
@@ -27,19 +27,17 @@
#define SQLITE_OMIT_SHARED_CACHE 1
#define SQLITE_DEFAULT_MEMSTATUS 0
#define SQLITE_MAX_EXPR_DEPTH 0
-INCLUDE sqlite3.c
-INCLUDE $ROOT/ext/misc/appendvfs.c
-#ifdef SQLITE_HAVE_ZLIB
-INCLUDE $ROOT/ext/misc/zipfile.c
-INCLUDE $ROOT/ext/misc/sqlar.c
-#endif
+#include "sqlite3.h"
INCLUDE $ROOT/src/tclsqlite.c
const char *sqlite3_tclapp_init_proc(Tcl_Interp *interp){
(void)interp;
+ extern int sqlite3_appendvfs_init(sqlite3 *,char **, const sqlite3_api_routines *);
sqlite3_appendvfs_init(0,0,0);
#ifdef SQLITE_HAVE_ZLIB
+ extern int sqlite3_sqlar_init(sqlite3 *, char **, const sqlite3_api_routines *);
sqlite3_auto_extension((void(*)(void))sqlite3_sqlar_init);
+ extern int sqlite3_zipfile_init(sqlite3 *, char **, const sqlite3_api_routines *);
sqlite3_auto_extension((void(*)(void))sqlite3_zipfile_init);
#endif

View File

@ -0,0 +1,434 @@
Move some code to libsqlite3.so to avoid duplication.
Initialize some extensions in libsqlite3.so.
Update test suite.
--- /ext/repair/sqlite3_checker.c.in
+++ /ext/repair/sqlite3_checker.c.in
@@ -2,6 +2,7 @@
** Read an SQLite database file and analyze its space utilization. Generate
** text on standard output.
*/
+#define SQLITE_CORE 1
#define TCLSH_INIT_PROC sqlite3_checker_init_proc
#define SQLITE_ENABLE_DBPAGE_VTAB 1
#define SQLITE_ENABLE_JSON1 1
@@ -14,7 +15,7 @@
#define SQLITE_OMIT_SHARED_CACHE 1
#define SQLITE_DEFAULT_MEMSTATUS 0
#define SQLITE_MAX_EXPR_DEPTH 0
-INCLUDE sqlite3.c
+#include "sqlite3.h"
INCLUDE $ROOT/src/tclsqlite.c
INCLUDE $ROOT/ext/misc/btreeinfo.c
INCLUDE $ROOT/ext/repair/checkindex.c
--- /src/main.c
+++ /src/main.c
@@ -50,12 +50,35 @@
#ifdef SQLITE_ENABLE_FTS5
int sqlite3Fts5Init(sqlite3*);
#endif
+#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
+int sqlite3DbdataRegister(sqlite3*);
+#endif
#ifdef SQLITE_ENABLE_JSON1
int sqlite3Json1Init(sqlite3*);
#endif
#ifdef SQLITE_ENABLE_STMTVTAB
int sqlite3StmtVtabInit(sqlite3*);
#endif
+int sqlite3AmatchInit(sqlite3*);
+int sqlite3CarrayInit(sqlite3*);
+int sqlite3CompletionVtabInit(sqlite3*);
+int sqlite3CsvInit(sqlite3*);
+int sqlite3DecimalInit(sqlite3*);
+int sqlite3EvalInit(sqlite3*);
+int sqlite3FileioInit(sqlite3*);
+int sqlite3IeeeInit(sqlite3*);
+int sqlite3NextcharInit(sqlite3*);
+int sqlite3PercentileInit(sqlite3*);
+int sqlite3RegexpInit(sqlite3*);
+int sqlite3ShaInit(sqlite3*);
+int sqlite3ShathreeInit(sqlite3*);
+int sqlite3TotypeInit(sqlite3*);
+int sqlite3UintInit(sqlite3*);
+int sqlite3UuidInit(sqlite3*);
+#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
+int sqlite3ZipfileInit(sqlite3*);
+int sqlite3SqlarInit(sqlite3*);
+#endif
/*
** An array of pointers to extension initializer functions for
@@ -83,6 +106,9 @@
#ifdef SQLITE_ENABLE_DBPAGE_VTAB
sqlite3DbpageRegister,
#endif
+#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
+ sqlite3DbdataRegister,
+#endif
#ifdef SQLITE_ENABLE_DBSTAT_VTAB
sqlite3DbstatRegister,
#endif
@@ -96,6 +122,26 @@
#ifdef SQLITE_ENABLE_BYTECODE_VTAB
sqlite3VdbeBytecodeVtabInit,
#endif
+ sqlite3AmatchInit,
+ sqlite3CarrayInit,
+ sqlite3CompletionVtabInit,
+ sqlite3CsvInit,
+ sqlite3DecimalInit,
+ sqlite3EvalInit,
+ sqlite3FileioInit,
+ sqlite3IeeeInit,
+ sqlite3NextcharInit,
+ sqlite3PercentileInit,
+ sqlite3RegexpInit,
+ sqlite3ShaInit,
+ sqlite3ShathreeInit,
+ sqlite3TotypeInit,
+ sqlite3UintInit,
+ sqlite3UuidInit,
+#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_HAVE_ZLIB)
+ sqlite3ZipfileInit,
+ sqlite3SqlarInit,
+#endif
};
#ifndef SQLITE_AMALGAMATION
--- /src/shell.c.in
+++ /src/shell.c.in
@@ -69,6 +69,7 @@
#include <stdio.h>
#include <assert.h>
#include "sqlite3.h"
+#include "ext/expert/sqlite3expert.h"
typedef sqlite3_int64 i64;
typedef sqlite3_uint64 u64;
typedef unsigned char u8;
@@ -135,6 +136,10 @@
# define SHELL_USE_LOCAL_GETLINE 1
#endif
+#ifdef SQLITE_HAVE_ZLIB
+#include <zlib.h>
+#endif
+
#if defined(_WIN32) || defined(WIN32)
# if SQLITE_OS_WINRT
@@ -1020,24 +1025,7 @@
INCLUDE test_windirent.c
#define dirent DIRENT
#endif
-INCLUDE ../ext/misc/shathree.c
-INCLUDE ../ext/misc/fileio.c
-INCLUDE ../ext/misc/completion.c
-INCLUDE ../ext/misc/appendvfs.c
INCLUDE ../ext/misc/memtrace.c
-INCLUDE ../ext/misc/uint.c
-INCLUDE ../ext/misc/decimal.c
-INCLUDE ../ext/misc/ieee754.c
-#ifdef SQLITE_HAVE_ZLIB
-INCLUDE ../ext/misc/zipfile.c
-INCLUDE ../ext/misc/sqlar.c
-#endif
-INCLUDE ../ext/expert/sqlite3expert.h
-INCLUDE ../ext/expert/sqlite3expert.c
-
-#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
-INCLUDE ../ext/misc/dbdata.c
-#endif
#if defined(SQLITE_ENABLE_SESSION)
/*
@@ -4584,19 +4572,6 @@
#ifndef SQLITE_OMIT_LOAD_EXTENSION
sqlite3_enable_load_extension(p->db, 1);
#endif
- sqlite3_fileio_init(p->db, 0, 0);
- sqlite3_shathree_init(p->db, 0, 0);
- sqlite3_completion_init(p->db, 0, 0);
- sqlite3_uint_init(p->db, 0, 0);
- sqlite3_decimal_init(p->db, 0, 0);
- sqlite3_ieee_init(p->db, 0, 0);
-#if !defined(SQLITE_OMIT_VIRTUALTABLE) && defined(SQLITE_ENABLE_DBPAGE_VTAB)
- sqlite3_dbdata_init(p->db, 0, 0);
-#endif
-#ifdef SQLITE_HAVE_ZLIB
- sqlite3_zipfile_init(p->db, 0, 0);
- sqlite3_sqlar_init(p->db, 0, 0);
-#endif
sqlite3_create_function(p->db, "shell_add_schema", 3, SQLITE_UTF8, 0,
shellAddSchemaName, 0, 0);
sqlite3_create_function(p->db, "shell_module_schema", 1, SQLITE_UTF8, 0,
@@ -6617,8 +6592,6 @@
);
goto end_ar_command;
}
- sqlite3_fileio_init(cmd.db, 0, 0);
- sqlite3_sqlar_init(cmd.db, 0, 0);
sqlite3_create_function(cmd.db, "shell_putsnl", 1, SQLITE_UTF8, cmd.p,
shellPutsFunc, 0, 0);
@@ -10981,6 +10954,7 @@
#endif
}
data.out = stdout;
+ extern int sqlite3_appendvfs_init(sqlite3 *, char **, const sqlite3_api_routines *);
sqlite3_appendvfs_init(0,0,0);
/* Go ahead and open the database file if it already exists. If the
--- /src/test_config.c
+++ /src/test_config.c
@@ -353,6 +353,8 @@
Tcl_SetVar2(interp, "sqlite_options", "datetime", "1", TCL_GLOBAL_ONLY);
#endif
+ Tcl_SetVar2(interp, "sqlite_options", "decimal", "1", TCL_GLOBAL_ONLY);
+
#ifdef SQLITE_OMIT_DECLTYPE
Tcl_SetVar2(interp, "sqlite_options", "decltype", "0", TCL_GLOBAL_ONLY);
#else
@@ -540,6 +542,8 @@
Tcl_SetVar2(interp, "sqlite_options", "progress", "1", TCL_GLOBAL_ONLY);
#endif
+ Tcl_SetVar2(interp, "sqlite_options", "regexp", "1", TCL_GLOBAL_ONLY);
+
#ifdef SQLITE_OMIT_REINDEX
Tcl_SetVar2(interp, "sqlite_options", "reindex", "0", TCL_GLOBAL_ONLY);
#else
@@ -662,6 +666,8 @@
Tcl_SetVar2(interp, "sqlite_options", "truncate_opt", "1", TCL_GLOBAL_ONLY);
#endif
+ Tcl_SetVar2(interp, "sqlite_options", "uint", "1", TCL_GLOBAL_ONLY);
+
#ifdef SQLITE_OMIT_UTF16
Tcl_SetVar2(interp, "sqlite_options", "utf16", "0", TCL_GLOBAL_ONLY);
#else
--- /test/e_expr.test
+++ /test/e_expr.test
@@ -1078,7 +1078,7 @@
#
# There is a regexp function if ICU is enabled though.
#
-ifcapable !icu {
+ifcapable !icu&&!regexp {
do_catchsql_test e_expr-18.1.1 {
SELECT regexp('abc', 'def')
} {1 {no such function: regexp}}
--- /test/icu.test
+++ /test/icu.test
@@ -41,7 +41,7 @@
#
test_expr icu-1.1 {i1='hello'} {i1 REGEXP 'hello'} 1
test_expr icu-1.2 {i1='hello'} {i1 REGEXP '.ello'} 1
- test_expr icu-1.3 {i1='hello'} {i1 REGEXP '.ell'} 0
+ test_expr icu-1.3 {i1='hello'} {i1 REGEXP '.ell$'} 0
test_expr icu-1.4 {i1='hello'} {i1 REGEXP '.ell.*'} 1
test_expr icu-1.5 {i1=NULL} {i1 REGEXP '.ell.*'} {}
--- /test/pragma.test
+++ /test/pragma.test
@@ -1370,17 +1370,62 @@
} ;# ifcapable trigger
ifcapable schema_pragmas {
- do_test pragma-11.1 {
- execsql2 {
- pragma collation_list;
+ ifcapable decimal {
+ ifcapable uint {
+ do_test pragma-11.1 {
+ execsql2 {
+ pragma collation_list;
+ }
+ } {seq 0 name UINT seq 1 name decimal seq 2 name RTRIM seq 3 name NOCASE seq 4 name BINARY}
+ do_test pragma-11.2 {
+ db collate New_Collation blah...
+ execsql {
+ pragma collation_list;
+ }
+ } {0 New_Collation 1 UINT 2 decimal 3 RTRIM 4 NOCASE 5 BINARY}
}
- } {seq 0 name RTRIM seq 1 name NOCASE seq 2 name BINARY}
- do_test pragma-11.2 {
- db collate New_Collation blah...
- execsql {
- pragma collation_list;
+ ifcapable !uint {
+ do_test pragma-11.1 {
+ execsql2 {
+ pragma collation_list;
+ }
+ } {seq 0 name decimal seq 1 name RTRIM seq 2 name NOCASE seq 3 name BINARY}
+ do_test pragma-11.2 {
+ db collate New_Collation blah...
+ execsql {
+ pragma collation_list;
+ }
+ } {0 New_Collation 1 decimal 2 RTRIM 3 NOCASE 4 BINARY}
}
- } {0 New_Collation 1 RTRIM 2 NOCASE 3 BINARY}
+ }
+ ifcapable !decimal {
+ ifcapable uint {
+ do_test pragma-11.1 {
+ execsql2 {
+ pragma collation_list;
+ }
+ } {seq 0 name UINT seq 1 name RTRIM seq 2 name NOCASE seq 3 name BINARY}
+ do_test pragma-11.2 {
+ db collate New_Collation blah...
+ execsql {
+ pragma collation_list;
+ }
+ } {0 New_Collation 1 UINT 2 RTRIM 3 NOCASE 4 BINARY}
+ }
+ ifcapable !uint {
+ do_test pragma-11.1 {
+ execsql2 {
+ pragma collation_list;
+ }
+ } {seq 0 name RTRIM seq 1 name NOCASE seq 2 name BINARY}
+ do_test pragma-11.2 {
+ db collate New_Collation blah...
+ execsql {
+ pragma collation_list;
+ }
+ } {0 New_Collation 1 RTRIM 2 NOCASE 3 BINARY}
+ }
+ }
}
ifcapable schema_pragmas&&tempdb {
--- /test/sessionfuzz.c
+++ /test/sessionfuzz.c
@@ -698,49 +698,6 @@
#include <stdio.h>
#include <string.h>
#include <assert.h>
-#ifndef OMIT_ZLIB
-#include "zlib.h"
-#endif
-
-/*
-** Implementation of the "sqlar_uncompress(X,SZ)" SQL function
-**
-** Parameter SZ is interpreted as an integer. If it is less than or
-** equal to zero, then this function returns a copy of X. Or, if
-** SZ is equal to the size of X when interpreted as a blob, also
-** return a copy of X. Otherwise, decompress blob X using zlib
-** utility function uncompress() and return the results (another
-** blob).
-*/
-static void sqlarUncompressFunc(
- sqlite3_context *context,
- int argc,
- sqlite3_value **argv
-){
-#ifdef OMIT_ZLIB
- sqlite3_result_value(context, argv[0]);
-#else
- uLong nData;
- uLongf sz;
-
- assert( argc==2 );
- sz = sqlite3_value_int(argv[1]);
-
- if( sz<=0 || sz==(nData = sqlite3_value_bytes(argv[0])) ){
- sqlite3_result_value(context, argv[0]);
- }else{
- const Bytef *pData= sqlite3_value_blob(argv[0]);
- Bytef *pOut = sqlite3_malloc(sz);
- if( Z_OK!=uncompress(pOut, &sz, pData, nData) ){
- sqlite3_result_error(context, "error in uncompress()", -1);
- }else{
- sqlite3_result_blob(context, pOut, sz, SQLITE_TRANSIENT);
- }
- sqlite3_free(pOut);
- }
-#endif
-}
-
/* Run a chunk of SQL. If any errors happen, print an error message
** and exit.
--- /tool/mksqlite3c.tcl
+++ /tool/mksqlite3c.tcl
@@ -117,6 +117,7 @@
rtree.h
sqlite3session.h
sqlite3.h
+ sqlite3expert.h
sqlite3ext.h
sqlite3rbu.h
sqliteicu.h
@@ -404,6 +405,27 @@
sqlite3session.c
fts5.c
stmt.c
+ amatch.c
+ appendvfs.c
+ carray.c
+ completion.c
+ csv.c
+ dbdata.c
+ decimal.c
+ eval.c
+ fileio.c
+ ieee754.c
+ nextchar.c
+ percentile.c
+ regexp.c
+ sha1.c
+ shathree.c
+ sqlar.c
+ sqlite3expert.c
+ totype.c
+ uint.c
+ uuid.c
+ zipfile.c
} {
copy_file tsrc/$file
}
--- /tool/sqlite3_analyzer.c.in
+++ /tool/sqlite3_analyzer.c.in
@@ -14,9 +14,6 @@
#define SQLITE_DEFAULT_MEMSTATUS 0
#define SQLITE_MAX_EXPR_DEPTH 0
#define SQLITE_OMIT_LOAD_EXTENSION 1
-#ifndef USE_EXTERNAL_SQLITE
-INCLUDE sqlite3.c
-#endif
INCLUDE $ROOT/src/tclsqlite.c
const char *sqlite3_analyzer_init_proc(Tcl_Interp *interp){
--- /tool/sqltclsh.c.in
+++ /tool/sqltclsh.c.in
@@ -27,21 +27,13 @@
#define SQLITE_OMIT_SHARED_CACHE 1
#define SQLITE_DEFAULT_MEMSTATUS 0
#define SQLITE_MAX_EXPR_DEPTH 0
-INCLUDE sqlite3.c
-INCLUDE $ROOT/ext/misc/appendvfs.c
-#ifdef SQLITE_HAVE_ZLIB
-INCLUDE $ROOT/ext/misc/zipfile.c
-INCLUDE $ROOT/ext/misc/sqlar.c
-#endif
+#include "sqlite3.h"
INCLUDE $ROOT/src/tclsqlite.c
const char *sqlite3_tclapp_init_proc(Tcl_Interp *interp){
(void)interp;
+ extern int sqlite3_appendvfs_init(sqlite3 *,char **, const sqlite3_api_routines *);
sqlite3_appendvfs_init(0,0,0);
-#ifdef SQLITE_HAVE_ZLIB
- sqlite3_auto_extension((void(*)(void))sqlite3_sqlar_init);
- sqlite3_auto_extension((void(*)(void))sqlite3_zipfile_init);
-#endif
return
BEGIN_STRING

View File

@ -1,395 +0,0 @@
# Copyright 1999-2020 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2
EAPI="7"
inherit autotools flag-o-matic multilib-minimal toolchain-funcs
if [[ "${PV}" != "9999" ]]; then
SRC_PV="$(printf "%u%02u%02u%02u" $(ver_rs 1- " "))"
DOC_PV="${SRC_PV}"
# DOC_PV="$(printf "%u%02u%02u00" $(ver_rs 1-3 " "))"
fi
DESCRIPTION="SQL database engine"
HOMEPAGE="https://sqlite.org/"
if [[ "${PV}" == "9999" ]]; then
SRC_URI=""
else
SRC_URI="doc? ( https://sqlite.org/2019/${PN}-doc-${DOC_PV}.zip )
tcl? ( https://sqlite.org/2019/${PN}-src-${SRC_PV}.zip )
test? ( https://sqlite.org/2019/${PN}-src-${SRC_PV}.zip )
tools? ( https://sqlite.org/2019/${PN}-src-${SRC_PV}.zip )
!tcl? ( !test? ( !tools? ( https://sqlite.org/2019/${PN}-autoconf-${SRC_PV}.tar.gz ) ) )"
fi
LICENSE="public-domain"
SLOT="3"
KEYWORDS="~alpha amd64 arm arm64 hppa ~ia64 m68k ~mips ppc ppc64 ~riscv s390 sparc x86 ~ppc-aix ~x64-cygwin ~amd64-linux ~x86-linux ~ppc-macos ~x64-macos ~x86-macos ~m68k-mint ~sparc-solaris ~sparc64-solaris ~x64-solaris ~x86-solaris"
IUSE="debug doc icu +readline secure-delete static-libs tcl test tools"
if [[ "${PV}" == "9999" ]]; then
PROPERTIES="live"
fi
RESTRICT="!test? ( test )"
if [[ "${PV}" == "9999" ]]; then
BDEPEND=">=dev-lang/tcl-8.6:0
dev-vcs/fossil"
else
BDEPEND="doc? ( app-arch/unzip )
tcl? (
app-arch/unzip
>=dev-lang/tcl-8.6:0
)
test? (
app-arch/unzip
>=dev-lang/tcl-8.6:0
)
tools? (
app-arch/unzip
>=dev-lang/tcl-8.6:0
)"
fi
RDEPEND="sys-libs/zlib:0=[${MULTILIB_USEDEP}]
icu? ( dev-libs/icu:0=[${MULTILIB_USEDEP}] )
readline? ( sys-libs/readline:0=[${MULTILIB_USEDEP}] )
tcl? ( dev-lang/tcl:0=[${MULTILIB_USEDEP}] )
tools? ( dev-lang/tcl:0=[${MULTILIB_USEDEP}] )"
DEPEND="${RDEPEND}
test? ( >=dev-lang/tcl-8.6:0[${MULTILIB_USEDEP}] )"
full_archive() {
[[ "${PV}" == "9999" ]] || use tcl || use test || use tools
}
pkg_setup() {
if [[ "${PV}" == "9999" ]]; then
S="${WORKDIR}/${PN}"
else
if full_archive; then
S="${WORKDIR}/${PN}-src-${SRC_PV}"
else
S="${WORKDIR}/${PN}-autoconf-${SRC_PV}"
fi
fi
}
src_unpack() {
if [[ "${PV}" == "9999" ]]; then
local distdir="${PORTAGE_ACTUAL_DISTDIR:-${DISTDIR}}"
addwrite "${distdir}"
mkdir -p "${distdir}/fossil-src/${PN}" || die
mkdir "${WORKDIR}/${PN}" || die
pushd "${WORKDIR}/${PN}" > /dev/null || die
if [[ ! -f "${distdir}/fossil-src/${PN}/sqlite.fossil" ]]; then
einfo fossil clone --verbose https://sqlite.org/src sqlite.fossil
fossil clone --verbose https://sqlite.org/src sqlite.fossil || die
echo
else
cp -p "${distdir}/fossil-src/${PN}/sqlite.fossil" . || die
einfo fossil pull --repository sqlite.fossil --verbose https://sqlite.org/src
fossil pull --repository sqlite.fossil --verbose https://sqlite.org/src || die
echo
fi
cp -p sqlite.fossil "${distdir}/fossil-src/${PN}" || die
einfo fossil open --quiet sqlite.fossil
fossil open --quiet sqlite.fossil || die
echo
popd > /dev/null || die
if use doc; then
mkdir "${WORKDIR}/${PN}-doc" || die
pushd "${WORKDIR}/${PN}-doc" > /dev/null || die
if [[ ! -f "${distdir}/fossil-src/${PN}/sqlite-doc.fossil" ]]; then
einfo fossil clone --verbose https://sqlite.org/docsrc sqlite-doc.fossil
fossil clone --verbose https://sqlite.org/docsrc sqlite-doc.fossil || die
echo
else
cp -p "${distdir}/fossil-src/${PN}/sqlite-doc.fossil" . || die
einfo fossil pull --repository sqlite-doc.fossil --verbose https://sqlite.org/docsrc
fossil pull --repository sqlite-doc.fossil --verbose https://sqlite.org/docsrc || die
echo
fi
cp -p sqlite-doc.fossil "${distdir}/fossil-src/${PN}" || die
einfo fossil open --quiet sqlite-doc.fossil
fossil open --quiet sqlite-doc.fossil || die
echo
popd > /dev/null || die
fi
else
default
fi
}
src_prepare() {
if full_archive; then
eapply "${FILESDIR}/${PN}-3.29.0-full_archive-build.patch"
eapply "${FILESDIR}/${PN}-3.29.0-full_archive-tests.patch"
eapply_user
# Fix AC_CHECK_FUNCS.
# https://mailinglists.sqlite.org/cgi-bin/mailman/private/sqlite-dev/2016-March/002762.html
sed -e "s/AC_CHECK_FUNCS(.*)/AC_CHECK_FUNCS([fdatasync fullfsync gmtime_r isnan localtime_r localtime_s malloc_usable_size posix_fallocate pread pread64 pwrite pwrite64 strchrnul usleep utime])/" -i configure.ac || die "sed failed"
else
eapply "${FILESDIR}/${PN}-3.25.0-nonfull_archive-build.patch"
eapply_user
# Fix AC_CHECK_FUNCS.
# https://mailinglists.sqlite.org/cgi-bin/mailman/private/sqlite-dev/2016-March/002762.html
sed \
-e "s/AC_CHECK_FUNCS(\[fdatasync.*/AC_CHECK_FUNCS([fdatasync fullfsync gmtime_r isnan localtime_r localtime_s malloc_usable_size posix_fallocate pread pread64 pwrite pwrite64 strchrnul usleep utime])/" \
-e "/AC_CHECK_FUNCS(posix_fallocate)/d" \
-i configure.ac || die "sed failed"
fi
eautoreconf
multilib_copy_sources
}
multilib_src_configure() {
local -x CPPFLAGS="${CPPFLAGS}" CFLAGS="${CFLAGS}"
local options=()
options+=(
--enable-$(full_archive && echo load-extension || echo dynamic-extensions)
--enable-threadsafe
)
if ! full_archive; then
options+=(--disable-static-shell)
fi
# Support detection of misuse of SQLite API.
# https://sqlite.org/compile.html#enable_api_armor
append-cppflags -DSQLITE_ENABLE_API_ARMOR
# Support column metadata functions.
# https://sqlite.org/c3ref/column_database_name.html
append-cppflags -DSQLITE_ENABLE_COLUMN_METADATA
# Support sqlite_dbpage virtual table.
# https://sqlite.org/compile.html#enable_dbpage_vtab
append-cppflags -DSQLITE_ENABLE_DBPAGE_VTAB
# Support dbstat virtual table.
# https://sqlite.org/dbstat.html
append-cppflags -DSQLITE_ENABLE_DBSTAT_VTAB
# Support sqlite3_serialize() and sqlite3_deserialize() functions.
# https://sqlite.org/compile.html#enable_deserialize
# https://sqlite.org/c3ref/serialize.html
# https://sqlite.org/c3ref/deserialize.html
append-cppflags -DSQLITE_ENABLE_DESERIALIZE
# Support comments in output of EXPLAIN.
# https://sqlite.org/compile.html#enable_explain_comments
append-cppflags -DSQLITE_ENABLE_EXPLAIN_COMMENTS
# Support Full-Text Search versions 3, 4 and 5.
# https://sqlite.org/fts3.html
# https://sqlite.org/fts5.html
append-cppflags -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_FTS4
options+=(--enable-fts5)
# Support hidden columns.
append-cppflags -DSQLITE_ENABLE_HIDDEN_COLUMNS
# Support JSON1 extension.
# https://sqlite.org/json1.html
append-cppflags -DSQLITE_ENABLE_JSON1
# Support memsys5 memory allocator.
# https://sqlite.org/malloc.html#memsys5
append-cppflags -DSQLITE_ENABLE_MEMSYS5
# Support sqlite3_normalized_sql() function.
# https://sqlite.org/c3ref/expanded_sql.html
append-cppflags -DSQLITE_ENABLE_NORMALIZE
# Support sqlite_offset() function.
# https://sqlite.org/lang_corefunc.html#sqlite_offset
append-cppflags -DSQLITE_ENABLE_OFFSET_SQL_FUNC
# Support pre-update hook functions.
# https://sqlite.org/c3ref/preupdate_count.html
append-cppflags -DSQLITE_ENABLE_PREUPDATE_HOOK
# Support Resumable Bulk Update extension.
# https://sqlite.org/rbu.html
append-cppflags -DSQLITE_ENABLE_RBU
# Support R*Trees.
# https://sqlite.org/rtree.html
# https://sqlite.org/geopoly.html
append-cppflags -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_GEOPOLY
# Support scan status functions.
# https://sqlite.org/c3ref/stmt_scanstatus.html
# https://sqlite.org/c3ref/stmt_scanstatus_reset.html
append-cppflags -DSQLITE_ENABLE_STMT_SCANSTATUS
# Support sqlite_stmt virtual table.
# https://sqlite.org/stmt.html
append-cppflags -DSQLITE_ENABLE_STMTVTAB
# Support Session extension.
# https://sqlite.org/sessionintro.html
options+=(--enable-session)
# Support unknown() function.
# https://sqlite.org/compile.html#enable_unknown_sql_function
append-cppflags -DSQLITE_ENABLE_UNKNOWN_SQL_FUNCTION
# Support unlock notification.
# https://sqlite.org/unlock_notify.html
append-cppflags -DSQLITE_ENABLE_UNLOCK_NOTIFY
# Support LIMIT and ORDER BY clauses on DELETE and UPDATE statements.
# https://sqlite.org/compile.html#enable_update_delete_limit
append-cppflags -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT
# Support PRAGMA function_list, PRAGMA module_list and PRAGMA pragma_list statements.
# https://sqlite.org/pragma.html#pragma_function_list
# https://sqlite.org/pragma.html#pragma_module_list
# https://sqlite.org/pragma.html#pragma_pragma_list
append-cppflags -DSQLITE_INTROSPECTION_PRAGMAS
# Support soundex() function.
# https://sqlite.org/lang_corefunc.html#soundex
append-cppflags -DSQLITE_SOUNDEX
# Support URI filenames.
# https://sqlite.org/uri.html
append-cppflags -DSQLITE_USE_URI
# debug USE flag.
if full_archive; then
options+=($(use_enable debug))
else
if use debug; then
append-cppflags -DSQLITE_DEBUG
else
append-cppflags -DNDEBUG
fi
fi
# icu USE flag.
if use icu; then
# Support ICU extension.
# https://sqlite.org/compile.html#enable_icu
append-cppflags -DSQLITE_ENABLE_ICU
if full_archive; then
sed -e "s/^TLIBS = @LIBS@/& -licui18n -licuuc/" -i Makefile.in || die "sed failed"
else
sed -e "s/^LIBS = @LIBS@/& -licui18n -licuuc/" -i Makefile.in || die "sed failed"
fi
fi
# readline USE flag.
options+=(
--disable-editline
$(use_enable readline)
)
if full_archive && use readline; then
options+=(--with-readline-inc="-I${EPREFIX}/usr/include/readline")
fi
# secure-delete USE flag.
if use secure-delete; then
# Enable secure_delete pragma by default.
# https://sqlite.org/pragma.html#pragma_secure_delete
append-cppflags -DSQLITE_SECURE_DELETE
fi
# static-libs USE flag.
options+=($(use_enable static-libs static))
# tcl, test, tools USE flags.
if full_archive; then
options+=(--enable-tcl)
fi
if [[ "${CHOST}" == *-mint* ]]; then
append-cppflags -DSQLITE_OMIT_WAL
fi
if [[ "${ABI}" == "x86" ]]; then
if $(tc-getCC) ${CPPFLAGS} ${CFLAGS} -E -P -dM - < /dev/null 2> /dev/null | grep -q "^#define __SSE__ 1$"; then
append-cflags -mfpmath=sse
else
append-cflags -ffloat-store
fi
fi
econf "${options[@]}"
}
multilib_src_compile() {
emake HAVE_TCL="$(usex tcl 1 "")" TCLLIBDIR="${EPREFIX}/usr/$(get_libdir)/${P}"
if use tools && multilib_is_native_abi; then
emake changeset dbdump dbhash dbtotxt index_usage rbu scrub showdb showjournal showshm showstat4 showwal sqldiff sqlite3_analyzer sqlite3_checker sqlite3_expert sqltclsh
fi
}
multilib_src_test() {
if [[ "${EUID}" -eq 0 ]]; then
ewarn "Skipping tests due to root permissions"
return
fi
local -x SQLITE_HISTORY="${T}/sqlite_history_${ABI}"
emake HAVE_TCL="$(usex tcl 1 "")" $(use debug && echo fulltest || echo test)
}
multilib_src_install() {
emake DESTDIR="${D}" HAVE_TCL="$(usex tcl 1 "")" TCLLIBDIR="${EPREFIX}/usr/$(get_libdir)/${P}" install
if use tools && multilib_is_native_abi; then
install_tool() {
if [[ -f ".libs/${1}" ]]; then
newbin ".libs/${1}" "${2}"
else
newbin "${1}" "${2}"
fi
}
install_tool changeset sqlite3-changeset
install_tool dbdump sqlite3-db-dump
install_tool dbhash sqlite3-db-hash
install_tool dbtotxt sqlite3-db-to-txt
install_tool index_usage sqlite3-index-usage
install_tool rbu sqlite3-rbu
install_tool scrub sqlite3-scrub
install_tool showdb sqlite3-show-db
install_tool showjournal sqlite3-show-journal
install_tool showshm sqlite3-show-shm
install_tool showstat4 sqlite3-show-stat4
install_tool showwal sqlite3-show-wal
install_tool sqldiff sqlite3-diff
install_tool sqlite3_analyzer sqlite3-analyzer
install_tool sqlite3_checker sqlite3-checker
install_tool sqlite3_expert sqlite3-expert
install_tool sqltclsh sqlite3-tclsh
unset -f install_tool
fi
}
multilib_src_install_all() {
find "${D}" -name "*.la" -type f -delete || die
doman sqlite3.1
if use doc; then
rm "${WORKDIR}/${PN}-doc-${DOC_PV}/"*.{db,txt} || die
(
docinto html
dodoc -r "${WORKDIR}/${PN}-doc-${DOC_PV}/"*
)
fi
}

View File

@ -16,11 +16,8 @@ HOMEPAGE="https://sqlite.org/"
if [[ "${PV}" == "9999" ]]; then if [[ "${PV}" == "9999" ]]; then
SRC_URI="" SRC_URI=""
else else
SRC_URI="doc? ( https://sqlite.org/2020/${PN}-doc-${DOC_PV}.zip ) SRC_URI="https://sqlite.org/2020/${PN}-src-${SRC_PV}.zip
tcl? ( https://sqlite.org/2020/${PN}-src-${SRC_PV}.zip ) doc? ( https://sqlite.org/2020/${PN}-doc-${DOC_PV}.zip )"
test? ( https://sqlite.org/2020/${PN}-src-${SRC_PV}.zip )
tools? ( https://sqlite.org/2020/${PN}-src-${SRC_PV}.zip )
!tcl? ( !test? ( !tools? ( https://sqlite.org/2020/${PN}-autoconf-${SRC_PV}.tar.gz ) ) )"
fi fi
LICENSE="public-domain" LICENSE="public-domain"
@ -36,19 +33,8 @@ if [[ "${PV}" == "9999" ]]; then
BDEPEND=">=dev-lang/tcl-8.6:0 BDEPEND=">=dev-lang/tcl-8.6:0
dev-vcs/fossil" dev-vcs/fossil"
else else
BDEPEND="doc? ( app-arch/unzip ) BDEPEND="app-arch/unzip
tcl? ( >=dev-lang/tcl-8.6:0"
app-arch/unzip
>=dev-lang/tcl-8.6:0
)
test? (
app-arch/unzip
>=dev-lang/tcl-8.6:0
)
tools? (
app-arch/unzip
>=dev-lang/tcl-8.6:0
)"
fi fi
RDEPEND="sys-libs/zlib:0=[${MULTILIB_USEDEP}] RDEPEND="sys-libs/zlib:0=[${MULTILIB_USEDEP}]
icu? ( dev-libs/icu:0=[${MULTILIB_USEDEP}] ) icu? ( dev-libs/icu:0=[${MULTILIB_USEDEP}] )
@ -58,21 +44,11 @@ RDEPEND="sys-libs/zlib:0=[${MULTILIB_USEDEP}]
DEPEND="${RDEPEND} DEPEND="${RDEPEND}
test? ( >=dev-lang/tcl-8.6:0[${MULTILIB_USEDEP}] )" test? ( >=dev-lang/tcl-8.6:0[${MULTILIB_USEDEP}] )"
full_archive() {
[[ "${PV}" == "9999" ]] || use tcl || use test || use tools
}
pkg_setup() {
if [[ "${PV}" == "9999" ]]; then if [[ "${PV}" == "9999" ]]; then
S="${WORKDIR}/${PN}" S="${WORKDIR}/${PN}"
else else
if full_archive; then
S="${WORKDIR}/${PN}-src-${SRC_PV}" S="${WORKDIR}/${PN}-src-${SRC_PV}"
else
S="${WORKDIR}/${PN}-autoconf-${SRC_PV}"
fi fi
fi
}
src_unpack() { src_unpack() {
if [[ "${PV}" == "9999" ]]; then if [[ "${PV}" == "9999" ]]; then
@ -123,30 +99,14 @@ src_unpack() {
} }
src_prepare() { src_prepare() {
if full_archive; then eapply "${FILESDIR}/"${PN}-3.32.1-full_archive-build_{1,2}.patch
eapply "${FILESDIR}/${PN}-3.31.0-full_archive-build.patch" eapply "${FILESDIR}/"${PN}-3.32.3-backports_{1,2,3}.patch
eapply "${FILESDIR}/${PN}-3.31.1-full_archive-architectures.patch"
eapply "${FILESDIR}/${PN}-3.31.1-full_archive-security_fixes.patch"
eapply_user eapply_user
# Fix AC_CHECK_FUNCS. # Fix AC_CHECK_FUNCS.
# https://mailinglists.sqlite.org/cgi-bin/mailman/private/sqlite-dev/2016-March/002762.html # https://mailinglists.sqlite.org/cgi-bin/mailman/private/sqlite-dev/2016-March/002762.html
sed -e "s/AC_CHECK_FUNCS(.*)/AC_CHECK_FUNCS([fdatasync fullfsync gmtime_r isnan localtime_r localtime_s malloc_usable_size posix_fallocate pread pread64 pwrite pwrite64 strchrnul usleep utime])/" -i configure.ac || die "sed failed" sed -e "s/AC_CHECK_FUNCS(.*)/AC_CHECK_FUNCS([fdatasync fullfsync gmtime_r isnan localtime_r localtime_s malloc_usable_size posix_fallocate pread pread64 pwrite pwrite64 strchrnul usleep utime])/" -i configure.ac || die "sed failed"
else
eapply "${FILESDIR}/${PN}-3.25.0-nonfull_archive-build.patch"
eapply "${FILESDIR}/${PN}-3.31.1-nonfull_archive-architectures.patch"
eapply "${FILESDIR}/${PN}-3.31.1-nonfull_archive-security_fixes.patch"
eapply_user
# Fix AC_CHECK_FUNCS.
# https://mailinglists.sqlite.org/cgi-bin/mailman/private/sqlite-dev/2016-March/002762.html
sed \
-e "s/AC_CHECK_FUNCS(\[fdatasync.*/AC_CHECK_FUNCS([fdatasync fullfsync gmtime_r isnan localtime_r localtime_s malloc_usable_size posix_fallocate pread pread64 pwrite pwrite64 strchrnul usleep utime])/" \
-e "/AC_CHECK_FUNCS(posix_fallocate)/d" \
-i configure.ac || die "sed failed"
fi
eautoreconf eautoreconf
@ -158,23 +118,24 @@ multilib_src_configure() {
local options=() local options=()
options+=( options+=(
--enable-$(full_archive && echo load-extension || echo dynamic-extensions) --enable-load-extension
--enable-threadsafe --enable-threadsafe
) )
if ! full_archive; then
options+=(--disable-static-shell)
fi
# Support detection of misuse of SQLite API. # Support detection of misuse of SQLite API.
# https://sqlite.org/compile.html#enable_api_armor # https://sqlite.org/compile.html#enable_api_armor
append-cppflags -DSQLITE_ENABLE_API_ARMOR append-cppflags -DSQLITE_ENABLE_API_ARMOR
# Support bytecode and tables_used virtual tables.
# https://sqlite.org/bytecodevtab.html
append-cppflags -DSQLITE_ENABLE_BYTECODE_VTAB
# Support column metadata functions. # Support column metadata functions.
# https://sqlite.org/c3ref/column_database_name.html # https://sqlite.org/c3ref/column_database_name.html
append-cppflags -DSQLITE_ENABLE_COLUMN_METADATA append-cppflags -DSQLITE_ENABLE_COLUMN_METADATA
# Support sqlite_dbpage virtual table. # Support sqlite_dbpage virtual table.
# https://sqlite.org/compile.html#enable_dbpage_vtab # https://sqlite.org/dbpage.html
append-cppflags -DSQLITE_ENABLE_DBPAGE_VTAB append-cppflags -DSQLITE_ENABLE_DBPAGE_VTAB
# Support dbstat virtual table. # Support dbstat virtual table.
@ -182,7 +143,6 @@ multilib_src_configure() {
append-cppflags -DSQLITE_ENABLE_DBSTAT_VTAB append-cppflags -DSQLITE_ENABLE_DBSTAT_VTAB
# Support sqlite3_serialize() and sqlite3_deserialize() functions. # Support sqlite3_serialize() and sqlite3_deserialize() functions.
# https://sqlite.org/compile.html#enable_deserialize
# https://sqlite.org/c3ref/serialize.html # https://sqlite.org/c3ref/serialize.html
# https://sqlite.org/c3ref/deserialize.html # https://sqlite.org/c3ref/deserialize.html
append-cppflags -DSQLITE_ENABLE_DESERIALIZE append-cppflags -DSQLITE_ENABLE_DESERIALIZE
@ -251,7 +211,8 @@ multilib_src_configure() {
append-cppflags -DSQLITE_ENABLE_UNLOCK_NOTIFY append-cppflags -DSQLITE_ENABLE_UNLOCK_NOTIFY
# Support LIMIT and ORDER BY clauses on DELETE and UPDATE statements. # Support LIMIT and ORDER BY clauses on DELETE and UPDATE statements.
# https://sqlite.org/compile.html#enable_update_delete_limit # https://sqlite.org/lang_delete.html#optional_limit_and_order_by_clauses
# https://sqlite.org/lang_update.html#optional_limit_and_order_by_clauses
append-cppflags -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT append-cppflags -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT
# Support soundex() function. # Support soundex() function.
@ -263,26 +224,14 @@ multilib_src_configure() {
append-cppflags -DSQLITE_USE_URI append-cppflags -DSQLITE_USE_URI
# debug USE flag. # debug USE flag.
if full_archive; then
options+=($(use_enable debug)) options+=($(use_enable debug))
else
if use debug; then
append-cppflags -DSQLITE_DEBUG
else
append-cppflags -DNDEBUG
fi
fi
# icu USE flag. # icu USE flag.
if use icu; then if use icu; then
# Support ICU extension. # Support ICU extension.
# https://sqlite.org/compile.html#enable_icu # https://sqlite.org/compile.html#enable_icu
append-cppflags -DSQLITE_ENABLE_ICU append-cppflags -DSQLITE_ENABLE_ICU
if full_archive; then
sed -e "s/^TLIBS = @LIBS@/& -licui18n -licuuc/" -i Makefile.in || die "sed failed" sed -e "s/^TLIBS = @LIBS@/& -licui18n -licuuc/" -i Makefile.in || die "sed failed"
else
sed -e "s/^LIBS = @LIBS@/& -licui18n -licuuc/" -i Makefile.in || die "sed failed"
fi
fi fi
# readline USE flag. # readline USE flag.
@ -290,8 +239,8 @@ multilib_src_configure() {
--disable-editline --disable-editline
$(use_enable readline) $(use_enable readline)
) )
if full_archive && use readline; then if use readline; then
options+=(--with-readline-inc="-I${EPREFIX}/usr/include/readline") options+=(--with-readline-inc="-I${ESYSROOT}/usr/include/readline")
fi fi
# secure-delete USE flag. # secure-delete USE flag.
@ -305,9 +254,7 @@ multilib_src_configure() {
options+=($(use_enable static-libs static)) options+=($(use_enable static-libs static))
# tcl, test, tools USE flags. # tcl, test, tools USE flags.
if full_archive; then
options+=(--enable-tcl) options+=(--enable-tcl)
fi
if [[ "${CHOST}" == *-mint* ]]; then if [[ "${CHOST}" == *-mint* ]]; then
append-cppflags -DSQLITE_OMIT_WAL append-cppflags -DSQLITE_OMIT_WAL

View File

@ -16,11 +16,8 @@ HOMEPAGE="https://sqlite.org/"
if [[ "${PV}" == "9999" ]]; then if [[ "${PV}" == "9999" ]]; then
SRC_URI="" SRC_URI=""
else else
SRC_URI="doc? ( https://sqlite.org/2019/${PN}-doc-${DOC_PV}.zip ) SRC_URI="https://sqlite.org/2020/${PN}-src-${SRC_PV}.zip
tcl? ( https://sqlite.org/2019/${PN}-src-${SRC_PV}.zip ) doc? ( https://sqlite.org/2020/${PN}-doc-${DOC_PV}.zip )"
test? ( https://sqlite.org/2019/${PN}-src-${SRC_PV}.zip )
tools? ( https://sqlite.org/2019/${PN}-src-${SRC_PV}.zip )
!tcl? ( !test? ( !tools? ( https://sqlite.org/2019/${PN}-autoconf-${SRC_PV}.tar.gz ) ) )"
fi fi
LICENSE="public-domain" LICENSE="public-domain"
@ -36,19 +33,8 @@ if [[ "${PV}" == "9999" ]]; then
BDEPEND=">=dev-lang/tcl-8.6:0 BDEPEND=">=dev-lang/tcl-8.6:0
dev-vcs/fossil" dev-vcs/fossil"
else else
BDEPEND="doc? ( app-arch/unzip ) BDEPEND="app-arch/unzip
tcl? ( >=dev-lang/tcl-8.6:0"
app-arch/unzip
>=dev-lang/tcl-8.6:0
)
test? (
app-arch/unzip
>=dev-lang/tcl-8.6:0
)
tools? (
app-arch/unzip
>=dev-lang/tcl-8.6:0
)"
fi fi
RDEPEND="sys-libs/zlib:0=[${MULTILIB_USEDEP}] RDEPEND="sys-libs/zlib:0=[${MULTILIB_USEDEP}]
icu? ( dev-libs/icu:0=[${MULTILIB_USEDEP}] ) icu? ( dev-libs/icu:0=[${MULTILIB_USEDEP}] )
@ -58,21 +44,11 @@ RDEPEND="sys-libs/zlib:0=[${MULTILIB_USEDEP}]
DEPEND="${RDEPEND} DEPEND="${RDEPEND}
test? ( >=dev-lang/tcl-8.6:0[${MULTILIB_USEDEP}] )" test? ( >=dev-lang/tcl-8.6:0[${MULTILIB_USEDEP}] )"
full_archive() {
[[ "${PV}" == "9999" ]] || use tcl || use test || use tools
}
pkg_setup() {
if [[ "${PV}" == "9999" ]]; then if [[ "${PV}" == "9999" ]]; then
S="${WORKDIR}/${PN}" S="${WORKDIR}/${PN}"
else else
if full_archive; then
S="${WORKDIR}/${PN}-src-${SRC_PV}" S="${WORKDIR}/${PN}-src-${SRC_PV}"
else
S="${WORKDIR}/${PN}-autoconf-${SRC_PV}"
fi fi
fi
}
src_unpack() { src_unpack() {
if [[ "${PV}" == "9999" ]]; then if [[ "${PV}" == "9999" ]]; then
@ -123,27 +99,10 @@ src_unpack() {
} }
src_prepare() { src_prepare() {
if full_archive; then eapply "${FILESDIR}/"${PN}-3.33.0-build_{1.1,1.2,2.1,2.2}.patch
eapply "${FILESDIR}/${PN}-3.29.0-full_archive-build.patch"
eapply_user eapply_user
# Fix AC_CHECK_FUNCS.
# https://mailinglists.sqlite.org/cgi-bin/mailman/private/sqlite-dev/2016-March/002762.html
sed -e "s/AC_CHECK_FUNCS(.*)/AC_CHECK_FUNCS([fdatasync fullfsync gmtime_r isnan localtime_r localtime_s malloc_usable_size posix_fallocate pread pread64 pwrite pwrite64 strchrnul usleep utime])/" -i configure.ac || die "sed failed"
else
eapply "${FILESDIR}/${PN}-3.25.0-nonfull_archive-build.patch"
eapply_user
# Fix AC_CHECK_FUNCS.
# https://mailinglists.sqlite.org/cgi-bin/mailman/private/sqlite-dev/2016-March/002762.html
sed \
-e "s/AC_CHECK_FUNCS(\[fdatasync.*/AC_CHECK_FUNCS([fdatasync fullfsync gmtime_r isnan localtime_r localtime_s malloc_usable_size posix_fallocate pread pread64 pwrite pwrite64 strchrnul usleep utime])/" \
-e "/AC_CHECK_FUNCS(posix_fallocate)/d" \
-i configure.ac || die "sed failed"
fi
eautoreconf eautoreconf
multilib_copy_sources multilib_copy_sources
@ -154,26 +113,31 @@ multilib_src_configure() {
local options=() local options=()
options+=( options+=(
--enable-$(full_archive && echo load-extension || echo dynamic-extensions) --enable-load-extension
--enable-threadsafe --enable-threadsafe
) )
if ! full_archive; then
options+=(--disable-static-shell)
fi
# Support detection of misuse of SQLite API. # Support detection of misuse of SQLite API.
# https://sqlite.org/compile.html#enable_api_armor # https://sqlite.org/compile.html#enable_api_armor
append-cppflags -DSQLITE_ENABLE_API_ARMOR append-cppflags -DSQLITE_ENABLE_API_ARMOR
# Support bytecode and tables_used virtual tables.
# https://sqlite.org/compile.html#enable_bytecode_vtab
# https://sqlite.org/bytecodevtab.html
append-cppflags -DSQLITE_ENABLE_BYTECODE_VTAB
# Support column metadata functions. # Support column metadata functions.
# https://sqlite.org/compile.html#enable_column_metadata
# https://sqlite.org/c3ref/column_database_name.html # https://sqlite.org/c3ref/column_database_name.html
append-cppflags -DSQLITE_ENABLE_COLUMN_METADATA append-cppflags -DSQLITE_ENABLE_COLUMN_METADATA
# Support sqlite_dbpage virtual table. # Support sqlite_dbpage virtual table.
# https://sqlite.org/compile.html#enable_dbpage_vtab # https://sqlite.org/compile.html#enable_dbpage_vtab
# https://sqlite.org/dbpage.html
append-cppflags -DSQLITE_ENABLE_DBPAGE_VTAB append-cppflags -DSQLITE_ENABLE_DBPAGE_VTAB
# Support dbstat virtual table. # Support dbstat virtual table.
# https://sqlite.org/compile.html#enable_dbstat_vtab
# https://sqlite.org/dbstat.html # https://sqlite.org/dbstat.html
append-cppflags -DSQLITE_ENABLE_DBSTAT_VTAB append-cppflags -DSQLITE_ENABLE_DBSTAT_VTAB
@ -188,6 +152,10 @@ multilib_src_configure() {
append-cppflags -DSQLITE_ENABLE_EXPLAIN_COMMENTS append-cppflags -DSQLITE_ENABLE_EXPLAIN_COMMENTS
# Support Full-Text Search versions 3, 4 and 5. # Support Full-Text Search versions 3, 4 and 5.
# https://sqlite.org/compile.html#enable_fts3
# https://sqlite.org/compile.html#enable_fts3_parenthesis
# https://sqlite.org/compile.html#enable_fts4
# https://sqlite.org/compile.html#enable_fts5
# https://sqlite.org/fts3.html # https://sqlite.org/fts3.html
# https://sqlite.org/fts5.html # https://sqlite.org/fts5.html
append-cppflags -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_FTS4 append-cppflags -DSQLITE_ENABLE_FTS3 -DSQLITE_ENABLE_FTS3_PARENTHESIS -DSQLITE_ENABLE_FTS4
@ -197,10 +165,12 @@ multilib_src_configure() {
append-cppflags -DSQLITE_ENABLE_HIDDEN_COLUMNS append-cppflags -DSQLITE_ENABLE_HIDDEN_COLUMNS
# Support JSON1 extension. # Support JSON1 extension.
# https://sqlite.org/compile.html#enable_json1
# https://sqlite.org/json1.html # https://sqlite.org/json1.html
append-cppflags -DSQLITE_ENABLE_JSON1 append-cppflags -DSQLITE_ENABLE_JSON1
# Support memsys5 memory allocator. # Support memsys5 memory allocator.
# https://sqlite.org/compile.html#enable_memsys5
# https://sqlite.org/malloc.html#memsys5 # https://sqlite.org/malloc.html#memsys5
append-cppflags -DSQLITE_ENABLE_MEMSYS5 append-cppflags -DSQLITE_ENABLE_MEMSYS5
@ -209,76 +179,78 @@ multilib_src_configure() {
append-cppflags -DSQLITE_ENABLE_NORMALIZE append-cppflags -DSQLITE_ENABLE_NORMALIZE
# Support sqlite_offset() function. # Support sqlite_offset() function.
# https://sqlite.org/compile.html#enable_offset_sql_func
# https://sqlite.org/lang_corefunc.html#sqlite_offset # https://sqlite.org/lang_corefunc.html#sqlite_offset
append-cppflags -DSQLITE_ENABLE_OFFSET_SQL_FUNC append-cppflags -DSQLITE_ENABLE_OFFSET_SQL_FUNC
# Support pre-update hook functions. # Support pre-update hook functions.
# https://sqlite.org/compile.html#enable_preupdate_hook
# https://sqlite.org/c3ref/preupdate_count.html # https://sqlite.org/c3ref/preupdate_count.html
append-cppflags -DSQLITE_ENABLE_PREUPDATE_HOOK append-cppflags -DSQLITE_ENABLE_PREUPDATE_HOOK
# Support Resumable Bulk Update extension. # Support Resumable Bulk Update extension.
# https://sqlite.org/compile.html#enable_rbu
# https://sqlite.org/rbu.html # https://sqlite.org/rbu.html
append-cppflags -DSQLITE_ENABLE_RBU append-cppflags -DSQLITE_ENABLE_RBU
# Support R*Trees. # Support R*Trees.
# https://sqlite.org/compile.html#enable_rtree
# https://sqlite.org/compile.html#enable_geopoly
# https://sqlite.org/rtree.html # https://sqlite.org/rtree.html
# https://sqlite.org/geopoly.html # https://sqlite.org/geopoly.html
append-cppflags -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_GEOPOLY append-cppflags -DSQLITE_ENABLE_RTREE -DSQLITE_ENABLE_GEOPOLY
# Support Session extension.
# https://sqlite.org/compile.html#enable_session
# https://sqlite.org/sessionintro.html
append-cppflags -DSQLITE_ENABLE_SESSION
# Support scan status functions. # Support scan status functions.
# https://sqlite.org/compile.html#enable_stmt_scanstatus
# https://sqlite.org/c3ref/stmt_scanstatus.html # https://sqlite.org/c3ref/stmt_scanstatus.html
# https://sqlite.org/c3ref/stmt_scanstatus_reset.html # https://sqlite.org/c3ref/stmt_scanstatus_reset.html
append-cppflags -DSQLITE_ENABLE_STMT_SCANSTATUS append-cppflags -DSQLITE_ENABLE_STMT_SCANSTATUS
# Support sqlite_stmt virtual table. # Support sqlite_stmt virtual table.
# https://sqlite.org/compile.html#enable_stmtvtab
# https://sqlite.org/stmt.html # https://sqlite.org/stmt.html
append-cppflags -DSQLITE_ENABLE_STMTVTAB append-cppflags -DSQLITE_ENABLE_STMTVTAB
# Support Session extension.
# https://sqlite.org/sessionintro.html
options+=(--enable-session)
# Support unknown() function. # Support unknown() function.
# https://sqlite.org/compile.html#enable_unknown_sql_function # https://sqlite.org/compile.html#enable_unknown_sql_function
append-cppflags -DSQLITE_ENABLE_UNKNOWN_SQL_FUNCTION append-cppflags -DSQLITE_ENABLE_UNKNOWN_SQL_FUNCTION
# Support unlock notification. # Support unlock notification.
# https://sqlite.org/compile.html#enable_unlock_notify
# https://sqlite.org/c3ref/unlock_notify.html
# https://sqlite.org/unlock_notify.html # https://sqlite.org/unlock_notify.html
append-cppflags -DSQLITE_ENABLE_UNLOCK_NOTIFY append-cppflags -DSQLITE_ENABLE_UNLOCK_NOTIFY
# Support LIMIT and ORDER BY clauses on DELETE and UPDATE statements. # Support LIMIT and ORDER BY clauses on DELETE and UPDATE statements.
# https://sqlite.org/compile.html#enable_update_delete_limit # https://sqlite.org/compile.html#enable_update_delete_limit
# https://sqlite.org/lang_delete.html#optional_limit_and_order_by_clauses
# https://sqlite.org/lang_update.html#optional_limit_and_order_by_clauses
append-cppflags -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT append-cppflags -DSQLITE_ENABLE_UPDATE_DELETE_LIMIT
# Support soundex() function. # Support soundex() function.
# https://sqlite.org/compile.html#soundex
# https://sqlite.org/lang_corefunc.html#soundex # https://sqlite.org/lang_corefunc.html#soundex
append-cppflags -DSQLITE_SOUNDEX append-cppflags -DSQLITE_SOUNDEX
# Support URI filenames. # Support URI filenames.
# https://sqlite.org/compile.html#use_uri
# https://sqlite.org/uri.html # https://sqlite.org/uri.html
append-cppflags -DSQLITE_USE_URI append-cppflags -DSQLITE_USE_URI
# debug USE flag. # debug USE flag.
if full_archive; then
options+=($(use_enable debug)) options+=($(use_enable debug))
else
if use debug; then
append-cppflags -DSQLITE_DEBUG
else
append-cppflags -DNDEBUG
fi
fi
# icu USE flag. # icu USE flag.
if use icu; then if use icu; then
# Support ICU extension. # Support ICU extension.
# https://sqlite.org/compile.html#enable_icu # https://sqlite.org/compile.html#enable_icu
append-cppflags -DSQLITE_ENABLE_ICU append-cppflags -DSQLITE_ENABLE_ICU
if full_archive; then
sed -e "s/^TLIBS = @LIBS@/& -licui18n -licuuc/" -i Makefile.in || die "sed failed" sed -e "s/^TLIBS = @LIBS@/& -licui18n -licuuc/" -i Makefile.in || die "sed failed"
else
sed -e "s/^LIBS = @LIBS@/& -licui18n -licuuc/" -i Makefile.in || die "sed failed"
fi
fi fi
# readline USE flag. # readline USE flag.
@ -286,13 +258,14 @@ multilib_src_configure() {
--disable-editline --disable-editline
$(use_enable readline) $(use_enable readline)
) )
if full_archive && use readline; then if use readline; then
options+=(--with-readline-inc="-I${EPREFIX}/usr/include/readline") options+=(--with-readline-inc="-I${ESYSROOT}/usr/include/readline")
fi fi
# secure-delete USE flag. # secure-delete USE flag.
if use secure-delete; then if use secure-delete; then
# Enable secure_delete pragma by default. # Enable secure_delete pragma by default.
# https://sqlite.org/compile.html#secure_delete
# https://sqlite.org/pragma.html#pragma_secure_delete # https://sqlite.org/pragma.html#pragma_secure_delete
append-cppflags -DSQLITE_SECURE_DELETE append-cppflags -DSQLITE_SECURE_DELETE
fi fi
@ -301,11 +274,11 @@ multilib_src_configure() {
options+=($(use_enable static-libs static)) options+=($(use_enable static-libs static))
# tcl, test, tools USE flags. # tcl, test, tools USE flags.
if full_archive; then
options+=(--enable-tcl) options+=(--enable-tcl)
fi
if [[ "${CHOST}" == *-mint* ]]; then if [[ "${CHOST}" == *-mint* ]]; then
# sys/mman.h not available in MiNTLib.
# https://sqlite.org/compile.html#omit_wal
append-cppflags -DSQLITE_OMIT_WAL append-cppflags -DSQLITE_OMIT_WAL
fi fi
@ -379,10 +352,16 @@ multilib_src_install_all() {
doman sqlite3.1 doman sqlite3.1
if use doc; then if use doc; then
rm "${WORKDIR}/${PN}-doc-${DOC_PV}/"*.{db,txt} || die if [[ "${PV}" == "9999" ]]; then
pushd "${WORKDIR}/${PN}-doc" > /dev/null || die
else
pushd "${WORKDIR}/${PN}-doc-${DOC_PV}" > /dev/null || die
fi
rm *.db *.txt || die
( (
docinto html docinto html
dodoc -r "${WORKDIR}/${PN}-doc-${DOC_PV}/"* dodoc -r *
) )
popd > /dev/null || die
fi fi
} }