From a11499a1566f3e4b351550462e5b2ea7f1e15a82 Mon Sep 17 00:00:00 2001
From: dan
Date: Thu, 12 Oct 2023 18:09:27 +0000
Subject: [PATCH 01/66] Add test case for [29937081].
FossilOrigin-Name: d3b983edf7164d30ddb8b4b745a3feff9737149d85b1c428d6ad488ac6a1960a
---
manifest | 14 +++++++-------
manifest.uuid | 2 +-
test/dbfuzz001.test | 23 +++++++++++++++++++++++
3 files changed, 31 insertions(+), 8 deletions(-)
diff --git a/manifest b/manifest
index 35a1ad45df..a6806b5df3 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Make\ssure\sthe\sjournal\sfile\sis\sclosed\swhen\stransitioning\sinto\sMEMORY\sjournal\nmode,\sto\savoid\san\sassertion\sfault\sin\sthe\snew\ssqlite3_randomness()\savoidance\ncode\sadded\sby\s[c84e4483cb44f827].
-D 2023-10-12T17:41:18.510
+C Add\stest\scase\sfor\s[29937081].
+D 2023-10-12T18:09:27.355
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -1010,7 +1010,7 @@ F test/date3.test a1b77abf05c6772fe5ca2337cac1398892f2a41e62bce7e6be0f4a08a0e64a
F test/date4.test db9e5760cf6f480fcf36bb7ca8e215880ff44354a31be6fb3d7e58f9d2e057e9
F test/dbdata.test 042f49acff3438f940eeba5868d3af080ae64ddf26ae78f80c92bec3ca7d8603
F test/dbfuzz.c 73047c920d6210e5912c87cdffd9a1c281d4252e
-F test/dbfuzz001.test 55e1a3504f8dea84155e09912fe3b1c3ad77e0b1a938ec42ca03b8e51b321e30
+F test/dbfuzz001.test 6c9a4622029d69dc38926f115864b055cb2f39badd25ec22cbfb130c8ba8e9c3
F test/dbfuzz2-seed1.db e6225c6f3d7b63f9c5b6867146a5f329d997ab105bee64644dc2b3a2f2aebaee
F test/dbfuzz2.c 4b3c12de4d98b1b2d908ab03d217d4619e47c8b23d5e67f8a6f2b1bdee7cae23
F test/dbpage.test fce29035c7566fd7835ec0f19422cb4b9c6944ce0e1b936ff8452443f92e887d
@@ -2128,8 +2128,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 286d1e8012a5f5d9e1fe6dce1a732f725b8a1837f66daf6aefb792e19e96f2d4
-R 63c272f1ac84380bbc1d2409b6f281ca
-U drh
-Z 6db7b813ea2dc81e78e187c7332821c2
+P 29937081a986d88f495ad48748c35ff5829f0ac31dd4ad3e48d180ae2fcb9a0c
+R 3a4380c41a5098a65122508f2e34e284
+U dan
+Z 90a5fb07a2b44dcefd3540a88cf86f78
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index d8626240d8..a3b96cae38 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-29937081a986d88f495ad48748c35ff5829f0ac31dd4ad3e48d180ae2fcb9a0c
\ No newline at end of file
+d3b983edf7164d30ddb8b4b745a3feff9737149d85b1c428d6ad488ac6a1960a
\ No newline at end of file
diff --git a/test/dbfuzz001.test b/test/dbfuzz001.test
index 2a430de12e..228dd16db6 100644
--- a/test/dbfuzz001.test
+++ b/test/dbfuzz001.test
@@ -371,4 +371,27 @@ do_catchsql_test dbfuzz001-330 {
} {1 {database disk image is malformed}}
extra_schema_checks 1
+#-------------------------------------------------------------------------
+reset_db
+
+do_execsql_test dbfuzz001-430 {
+ CREATE TABLE t1(a INTEGER, b INT, c DEFAULT 0);
+}
+
+do_execsql_test dbfuzz001-420 {
+ PRAGMA locking_mode=EXCLUSIVE;
+ PRAGMA journal_mode = memory;
+ INSERT INTO t1 VALUES(1,2,3);
+ PRAGMA journal_mode=PERSIST;
+} {exclusive memory persist}
+
+do_execsql_test dbfuzz001-430 {
+ INSERT INTO t1 VALUES(4, 5, 6);
+}
+
+do_execsql_test dbfuzz001-440 {
+ PRAGMA journal_mode=MEMORY;
+ INSERT INTO t1 VALUES(7, 8, 9);
+} {memory}
+
finish_test
From 4b136ed70a1eb656efca8cc4079e515d6fc33dd6 Mon Sep 17 00:00:00 2001
From: drh <>
Date: Thu, 12 Oct 2023 18:46:27 +0000
Subject: [PATCH 02/66] Enable SQLITE_VTAB_INNOCUOUS for FTS3, FTS5, and RTREE.
FossilOrigin-Name: f34c533b6c1f8ef3f69c75c1039406c12751cdde1fbdcb4d9776b24455facf8a
---
ext/fts3/fts3.c | 1 +
ext/fts5/fts5_main.c | 3 +++
ext/rtree/geopoly.c | 1 +
ext/rtree/rtree.c | 2 ++
manifest | 20 ++++++++++----------
manifest.uuid | 2 +-
6 files changed, 18 insertions(+), 11 deletions(-)
diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c
index 8aa824bce4..aa2653050b 100644
--- a/ext/fts3/fts3.c
+++ b/ext/fts3/fts3.c
@@ -640,6 +640,7 @@ static void fts3DeclareVtab(int *pRc, Fts3Table *p){
zLanguageid = (p->zLanguageid ? p->zLanguageid : "__langid");
sqlite3_vtab_config(p->db, SQLITE_VTAB_CONSTRAINT_SUPPORT, 1);
+ sqlite3_vtab_config(p->db, SQLITE_VTAB_INNOCUOUS);
/* Create a list of user columns for the virtual table */
zCols = sqlite3_mprintf("%Q, ", p->azColumn[0]);
diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c
index 6a8ed37b54..3f14300043 100644
--- a/ext/fts5/fts5_main.c
+++ b/ext/fts5/fts5_main.c
@@ -408,6 +408,9 @@ static int fts5InitVtab(
if( rc==SQLITE_OK && pConfig->eContent==FTS5_CONTENT_NORMAL ){
rc = sqlite3_vtab_config(db, SQLITE_VTAB_CONSTRAINT_SUPPORT, (int)1);
}
+ if( rc==SQLITE_OK ){
+ rc = sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS);
+ }
if( rc!=SQLITE_OK ){
fts5FreeVtab(pTab);
diff --git a/ext/rtree/geopoly.c b/ext/rtree/geopoly.c
index 7bda24a8cb..3e9c2a2713 100644
--- a/ext/rtree/geopoly.c
+++ b/ext/rtree/geopoly.c
@@ -1252,6 +1252,7 @@ static int geopolyInit(
(void)pAux;
sqlite3_vtab_config(db, SQLITE_VTAB_CONSTRAINT_SUPPORT, 1);
+ sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS);
/* Allocate the sqlite3_vtab structure */
nDb = strlen(argv[1]);
diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c
index 8f01be37f6..b2667527bc 100644
--- a/ext/rtree/rtree.c
+++ b/ext/rtree/rtree.c
@@ -3615,6 +3615,8 @@ static int rtreeInit(
}
sqlite3_vtab_config(db, SQLITE_VTAB_CONSTRAINT_SUPPORT, 1);
+ sqlite3_vtab_config(db, SQLITE_VTAB_INNOCUOUS);
+
/* Allocate the sqlite3_vtab structure */
nDb = (int)strlen(argv[1]);
diff --git a/manifest b/manifest
index a6806b5df3..d9b10b76b5 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\stest\scase\sfor\s[29937081].
-D 2023-10-12T18:09:27.355
+C Enable\sSQLITE_VTAB_INNOCUOUS\sfor\sFTS3,\sFTS5,\sand\sRTREE.
+D 2023-10-12T18:46:27.294
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -60,7 +60,7 @@ F ext/fts3/README.content b9078d0843a094d86af0d48dffbff13c906702b4c3558012e67b9c
F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a
F ext/fts3/README.tokenizers b92bdeb8b46503f0dd301d364efc5ef59ef9fa8e2758b8e742f39fa93a2e422d
F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d
-F ext/fts3/fts3.c 4095c97f2960f508bd34fc06d40f61d54e2ad09e7fbab75dc0114f57ebb6040d
+F ext/fts3/fts3.c 89298f42a071d4f08588a308cf2904fc5014f59b47ea48949a127b5747e9b90a
F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe
F ext/fts3/fts3Int.h e573c6d881f7238d77cc3fd2396cbb9b2fe13efef7d2ad295a155151c4e7efbd
F ext/fts3/fts3_aux.c 7eab82a9cf0830f6551ba3abfdbe73ed39e322a4d3940ee82fbf723674ecd9f3
@@ -95,7 +95,7 @@ F ext/fts5/fts5_config.c 054359543566cbff1ba65a188330660a5457299513ac71c53b3a07d
F ext/fts5/fts5_expr.c bd3b81ce669c4104e34ffe66570af1999a317b142c15fccb112de9fb0caa57a6
F ext/fts5/fts5_hash.c 65e7707bc8774706574346d18c20218facf87de3599b995963c3e6d6809f203d
F ext/fts5/fts5_index.c 5c3872a01ae519af9839b675408163aab8eb1e31917c8b3d0ce726b4ad11d942
-F ext/fts5/fts5_main.c 799ec88d2309055f6406bddb0bd6ed80148c5da5eb14594c3c5309a6e944d489
+F ext/fts5/fts5_main.c 1ea6636a1f528e9042cc6992d57b5a97c4a4e401ab1d2836c0cc805a1d27a982
F ext/fts5/fts5_storage.c 3c9b41fce41b6410f2e8f82eb035c6a29b2560483f773e6dc98cf3cb2e4ddbb5
F ext/fts5/fts5_tcl.c b1445cbe69908c411df8084a10b2485500ac70a9c747cdc8cda175a3da59d8ae
F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee
@@ -474,8 +474,8 @@ F ext/repair/test/checkfreelist01.test 3e8aa6aeb4007680c94a8d07b41c339aa635cc782
F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c335096108c12c01bddbadcec
F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c
F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761
-F ext/rtree/geopoly.c a7f8b4951e283300caf347cdc6097b66da9f6649797b12905fd528413b7ce267
-F ext/rtree/rtree.c b3b1c96e46fc820b57851b4fbab546c5317d40d1a2d54e23c9bb50be6090b3e0
+F ext/rtree/geopoly.c 0dd4775e896cee6067979d67aff7c998e75c2c9d9cd8d62a1a790c09cde7adca
+F ext/rtree/rtree.c 9fdb03b602ca128c4b5b786c10675cf97cd0990d18db3b8c7a312551c3cf2f59
F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412
F ext/rtree/rtree1.test 877d40b8b61b1f88cec9d4dc0ff8334f5b05299fac12a35141532e2881860e9d
F ext/rtree/rtree2.test 9d9deddbb16fd0c30c36e6b4fdc3ee3132d765567f0f9432ee71e1303d32603d
@@ -2128,8 +2128,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 29937081a986d88f495ad48748c35ff5829f0ac31dd4ad3e48d180ae2fcb9a0c
-R 3a4380c41a5098a65122508f2e34e284
-U dan
-Z 90a5fb07a2b44dcefd3540a88cf86f78
+P d3b983edf7164d30ddb8b4b745a3feff9737149d85b1c428d6ad488ac6a1960a
+R d66c3f0c591f0a5c79818d4ec908dabb
+U drh
+Z 715f0eac07de34228b29f32483ef26b6
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index a3b96cae38..f80a5cef58 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-d3b983edf7164d30ddb8b4b745a3feff9737149d85b1c428d6ad488ac6a1960a
\ No newline at end of file
+f34c533b6c1f8ef3f69c75c1039406c12751cdde1fbdcb4d9776b24455facf8a
\ No newline at end of file
From 3046039309ff2dc5c3dcd17828020281c5a42954 Mon Sep 17 00:00:00 2001
From: dan
Date: Thu, 12 Oct 2023 19:46:58 +0000
Subject: [PATCH 03/66] Fix a problem with an fts5 secure-delete on a
rowid/term pair that follows a legacy delete of the same pair.
FossilOrigin-Name: 579aea0c28e01a79620ac758edc02db3a01baaa073e7773b8f0b6f610479520b
---
ext/fts5/fts5_index.c | 77 +++++++++++++++++++++-------------
ext/fts5/test/fts5secure6.test | 24 +++++++++--
manifest | 16 +++----
manifest.uuid | 2 +-
4 files changed, 78 insertions(+), 41 deletions(-)
diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c
index 2b32965638..0500d54a9e 100644
--- a/ext/fts5/fts5_index.c
+++ b/ext/fts5/fts5_index.c
@@ -2904,7 +2904,6 @@ static int fts5MultiIterDoCompare(Fts5Iter *pIter, int iOut){
assert_nc( i2!=0 );
pRes->bTermEq = 1;
if( p1->iRowid==p2->iRowid ){
- p1->bDel = p2->bDel;
return i2;
}
res = ((p1->iRowid > p2->iRowid)==pIter->bRev) ? -1 : +1;
@@ -5132,34 +5131,39 @@ static void fts5DoSecureDelete(
/* Set variable bLastInDoclist to true if this entry happens to be
** the last rowid in the doclist for its term. */
- if( iNextOff>=iPgIdx ){
- int pgno = pSeg->iLeafPgno+1;
- fts5SecureDeleteOverflow(p, pSeg->pSeg, pgno, &bLastInDoclist);
- iNextOff = iPgIdx;
- }else{
- /* Loop through the page-footer. If iNextOff (offset of the
- ** entry following the one we are removing) is equal to the
- ** offset of a key on this page, then the entry is the last
- ** in its doclist. */
- int iKeyOff = 0;
- for(iIdx=0; iIdxbDel==0 ){
+ if( iNextOff>=iPgIdx ){
+ int pgno = pSeg->iLeafPgno+1;
+ fts5SecureDeleteOverflow(p, pSeg->pSeg, pgno, &bLastInDoclist);
+ iNextOff = iPgIdx;
+ }else{
+ /* Loop through the page-footer. If iNextOff (offset of the
+ ** entry following the one we are removing) is equal to the
+ ** offset of a key on this page, then the entry is the last
+ ** in its doclist. */
+ int iKeyOff = 0;
+ for(iIdx=0; iIdxbDel ){
+ iOff += sqlite3Fts5PutVarint(&aPg[iOff], iDelta);
+ aPg[iOff++] = 0x01;
+ }else if( bLastInDoclist==0 ){
if( iNextOff!=iPgIdx ){
u64 iNextDelta = 0;
iNextOff += fts5GetVarint(&aPg[iNextOff], &iNextDelta);
@@ -5271,6 +5275,15 @@ static void fts5DoSecureDelete(
}
}
+ /* Assuming no error has occurred, this block does final edits to the
+ ** leaf page before writing it back to disk. Input variables are:
+ **
+ ** nPg: Total initial size of leaf page.
+ ** iPgIdx: Initial offset of page footer.
+ **
+ ** iOff: Offset to move data to
+ ** iNextOff: Offset to move data from
+ */
if( p->rc==SQLITE_OK ){
const int nMove = nPg - iNextOff; /* Number of bytes to move */
int nShift = iNextOff - iOff; /* Distance to move them */
@@ -5471,10 +5484,16 @@ static void fts5FlushOneHash(Fts5Index *p){
fts5WriteFlushLeaf(p, &writer);
}
}else{
- int bDummy;
- int nPos;
- int nCopy = fts5GetPoslistSize(&pDoclist[iOff], &nPos, &bDummy);
- nCopy += nPos;
+ int bDel = 0;
+ int nPos = 0;
+ int nCopy = fts5GetPoslistSize(&pDoclist[iOff], &nPos, &bDel);
+ if( bDel && bSecureDelete ){
+ fts5BufferAppendVarint(&p->rc, pBuf, nPos*2);
+ iOff += nCopy;
+ nCopy = nPos;
+ }else{
+ nCopy += nPos;
+ }
if( (pBuf->n + pPgidx->n + nCopy) <= pgsz ){
/* The entire poslist will fit on the current leaf. So copy
** it in one go. */
diff --git a/ext/fts5/test/fts5secure6.test b/ext/fts5/test/fts5secure6.test
index ffb10cb24a..43d4f075e8 100644
--- a/ext/fts5/test/fts5secure6.test
+++ b/ext/fts5/test/fts5secure6.test
@@ -18,7 +18,7 @@ db progress 1 progress_handler
set ::PHC 0
proc progress_handler {args} {
incr ::PHC
- if {($::PHC % 100000)==0} breakpoint
+ # if {($::PHC % 100000)==0} breakpoint
return 0
}
@@ -73,12 +73,12 @@ do_execsql_test 2.2 {
#-------------------------------------------------------------------------
reset_db
-do_execsql_test 2.0 {
+do_execsql_test 3.0 {
CREATE VIRTUAL TABLE t1 USING fts5(x);
INSERT INTO t1(t1, rank) VALUES('secure-delete', $sd)
}
-do_execsql_test 2.1 {
+do_execsql_test 3.1 {
BEGIN;
INSERT INTO t1(rowid, x)
VALUES(51869, 'when whenever where weress what turn'),
@@ -91,5 +91,23 @@ do_execsql_test 3.2 {
INSERT INTO t1(t1) VALUES('integrity-check');
}
+#-------------------------------------------------------------------------
+reset_db
+
+do_execsql_test 4.0 {
+ CREATE VIRTUAL TABLE t1 USING fts5(x);
+ INSERT INTO t1(rowid, x) VALUES(10, 'one two');
+}
+do_execsql_test 4.1 {
+ UPDATE t1 SET x = 'one three' WHERE rowid=10;
+ INSERT INTO t1(t1, rank) VALUES('secure-delete', 1);
+}
+do_execsql_test 4.2 {
+ DELETE FROM t1 WHERE rowid=10;
+}
+do_execsql_test 4.3 {
+ INSERT INTO t1(t1) VALUES('integrity-check');
+}
+
finish_test
diff --git a/manifest b/manifest
index d9b10b76b5..1976ce0af1 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Enable\sSQLITE_VTAB_INNOCUOUS\sfor\sFTS3,\sFTS5,\sand\sRTREE.
-D 2023-10-12T18:46:27.294
+C Fix\sa\sproblem\swith\san\sfts5\ssecure-delete\son\sa\srowid/term\spair\sthat\sfollows\sa\slegacy\sdelete\sof\sthe\ssame\spair.
+D 2023-10-12T19:46:58.003
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -94,7 +94,7 @@ F ext/fts5/fts5_buffer.c 3001fbabb585d6de52947b44b455235072b741038391f830d6b7292
F ext/fts5/fts5_config.c 054359543566cbff1ba65a188330660a5457299513ac71c53b3a07d934c7b081
F ext/fts5/fts5_expr.c bd3b81ce669c4104e34ffe66570af1999a317b142c15fccb112de9fb0caa57a6
F ext/fts5/fts5_hash.c 65e7707bc8774706574346d18c20218facf87de3599b995963c3e6d6809f203d
-F ext/fts5/fts5_index.c 5c3872a01ae519af9839b675408163aab8eb1e31917c8b3d0ce726b4ad11d942
+F ext/fts5/fts5_index.c a0f8e58e1c101d0b7959264f76b8c0c3c44914a999b29ec4264a6f55f1bccfe1
F ext/fts5/fts5_main.c 1ea6636a1f528e9042cc6992d57b5a97c4a4e401ab1d2836c0cc805a1d27a982
F ext/fts5/fts5_storage.c 3c9b41fce41b6410f2e8f82eb035c6a29b2560483f773e6dc98cf3cb2e4ddbb5
F ext/fts5/fts5_tcl.c b1445cbe69908c411df8084a10b2485500ac70a9c747cdc8cda175a3da59d8ae
@@ -204,7 +204,7 @@ F ext/fts5/test/fts5secure2.test 2e961d7eef939f294c56b5d895cac7f1c3a60b934ee2cfd
F ext/fts5/test/fts5secure3.test c7e1080a6912f2a3ac68f2e05b88b72a99de38543509b2bbf427cac5c9c1c610
F ext/fts5/test/fts5secure4.test 0d10a80590c07891478700af7793b232962042677432b9846cf7fc8337b67c97
F ext/fts5/test/fts5secure5.test c07a68ced5951567ac116c22f2d2aafae497e47fe9fcb6a335c22f9c7a4f2c3a
-F ext/fts5/test/fts5secure6.test 120feecc8c55b4774f858721e6c62c2094b059ecbcfd7fdc24bde886f55ef6ca
+F ext/fts5/test/fts5secure6.test 6f7fbb1f96910ccbdbfd2097f761f4c77c150c03734503331e2d428f77fa2a6e
F ext/fts5/test/fts5secure7.test fd03d0868d64340a1db8615b02e5508fea409de13910114e4f19eaefc120777a
F ext/fts5/test/fts5securefault.test dbca2b6a1c16700017f5051138991b705410889933f2a37c57ae8a23b296b10b
F ext/fts5/test/fts5simple.test a298670508c1458b88ce6030440f26a30673931884eb5f4094ac1773b3ba217b
@@ -2128,8 +2128,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P d3b983edf7164d30ddb8b4b745a3feff9737149d85b1c428d6ad488ac6a1960a
-R d66c3f0c591f0a5c79818d4ec908dabb
-U drh
-Z 715f0eac07de34228b29f32483ef26b6
+P f34c533b6c1f8ef3f69c75c1039406c12751cdde1fbdcb4d9776b24455facf8a
+R 042a80d2d5719fd8ae111fd1b613eb4b
+U dan
+Z a5f84e7c870f4185af46feb29cb8159d
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index f80a5cef58..3ef20a6660 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-f34c533b6c1f8ef3f69c75c1039406c12751cdde1fbdcb4d9776b24455facf8a
\ No newline at end of file
+579aea0c28e01a79620ac758edc02db3a01baaa073e7773b8f0b6f610479520b
\ No newline at end of file
From 5dc4a405c59a2a8fe171efaf3bd25b1013c160c4 Mon Sep 17 00:00:00 2001
From: drh <>
Date: Thu, 12 Oct 2023 20:51:17 +0000
Subject: [PATCH 04/66] Make sure virtual tables have been connected before
trying to invoke the xIntegrity method during PRAGMA integrity_check.
FossilOrigin-Name: 4a4eccb681741917c6771101d4e329f91eae9b035f4d345218e522bb55fff6da
---
manifest | 14 +++++++-------
manifest.uuid | 2 +-
src/pragma.c | 1 +
3 files changed, 9 insertions(+), 8 deletions(-)
diff --git a/manifest b/manifest
index 1976ce0af1..78fcd72b68 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sa\sproblem\swith\san\sfts5\ssecure-delete\son\sa\srowid/term\spair\sthat\sfollows\sa\slegacy\sdelete\sof\sthe\ssame\spair.
-D 2023-10-12T19:46:58.003
+C Make\ssure\svirtual\stables\shave\sbeen\sconnected\sbefore\strying\sto\sinvoke\nthe\sxIntegrity\smethod\sduring\sPRAGMA\sintegrity_check.
+D 2023-10-12T20:51:17.229
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -707,7 +707,7 @@ F src/parse.y aeb7760d41cfa86465e3adba506500c021597049fd55f82a30e5b7045862c28c
F src/pcache.c 040b165f30622a21b7a9a77c6f2e4877a32fb7f22d4c7f0d2a6fa6833a156a75
F src/pcache.h 1497ce1b823cf00094bb0cf3bac37b345937e6f910890c626b16512316d3abf5
F src/pcache1.c 602acb23c471bb8d557a6f0083cc2be641d6cafcafa19e481eba7ef4c9ca0f00
-F src/pragma.c 48becc9b683e1b4a786b5e01a3133e747acba95d3d7182271d1bb67231251114
+F src/pragma.c db6ce4f9d67722a5d46428d21dc1eaff919a92a9e009168fbb6ad227a5d781be
F src/pragma.h e690a356c18e98414d2e870ea791c1be1545a714ba623719deb63f7f226d8bb7
F src/prepare.c bde74add20fc0e8ce0c4e937a1f70a36d17413afe4f71d3e103f5cb74b17c8d9
F src/printf.c e3ba080e2f409f9bfcc8d34724e6fc160e9c718dc92d0548f6b71b8b6f860ce2
@@ -2128,8 +2128,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P f34c533b6c1f8ef3f69c75c1039406c12751cdde1fbdcb4d9776b24455facf8a
-R 042a80d2d5719fd8ae111fd1b613eb4b
-U dan
-Z a5f84e7c870f4185af46feb29cb8159d
+P 579aea0c28e01a79620ac758edc02db3a01baaa073e7773b8f0b6f610479520b
+R f6cfb323187380b15d71317c15cb2d7b
+U drh
+Z b1397a2832808c4669dcf4c9bd643e96
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 3ef20a6660..bfa8f62025 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-579aea0c28e01a79620ac758edc02db3a01baaa073e7773b8f0b6f610479520b
\ No newline at end of file
+4a4eccb681741917c6771101d4e329f91eae9b035f4d345218e522bb55fff6da
\ No newline at end of file
diff --git a/src/pragma.c b/src/pragma.c
index 7c8911b2ca..3b6190b2e7 100644
--- a/src/pragma.c
+++ b/src/pragma.c
@@ -1762,6 +1762,7 @@ void sqlite3Pragma(
sqlite3_vtab *pVTab;
int a1;
if( !IsVirtual(pTab) ) continue;
+ sqlite3ViewGetColumnNames(pParse, pTab);
if( pTab->u.vtab.p==0 ) continue;
pVTab = pTab->u.vtab.p->pVtab;
if( NEVER(pVTab==0) ) continue;
From 99d43979d37b1aad05407f8b5523cfd44d9e64f3 Mon Sep 17 00:00:00 2001
From: larrybr
Date: Fri, 13 Oct 2023 01:39:47 +0000
Subject: [PATCH 05/66] Avoid potential overflow in hex().
[forum:/forumpost/7ac0c9c5ea|See forum post 7ac0c9c5ea.]
FossilOrigin-Name: 2e968114fd0e60eebcc088dec02684e10b06ac1ec42d6bedb5287362f5cbf032
---
manifest | 16 ++++++++--------
manifest.uuid | 2 +-
src/func.c | 3 ++-
test/unhex.test | 2 ++
4 files changed, 13 insertions(+), 10 deletions(-)
diff --git a/manifest b/manifest
index 78fcd72b68..667e06fa71 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Make\ssure\svirtual\stables\shave\sbeen\sconnected\sbefore\strying\sto\sinvoke\nthe\sxIntegrity\smethod\sduring\sPRAGMA\sintegrity_check.
-D 2023-10-12T20:51:17.229
+C Avoid\spotential\soverflow\sin\shex().\s[forum:/forumpost/7ac0c9c5ea|See\sforum\spost\s7ac0c9c5ea.]
+D 2023-10-13T01:39:47.068
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -667,7 +667,7 @@ F src/delete.c cb766727c78e715f9fb7ec8a7d03658ed2a3016343ca687acfcec9083cdca500
F src/expr.c 8a5045ac7aae5ecebe7236ec05841693b5a0012af70a4d73933333172546c50d
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
F src/fkey.c a7fcbf7e66d14dbb73cf49f31489ebf66d0e6006c62b95246924a3bae9f37b36
-F src/func.c 490341f0ad2d0a937ce03c9fd3d9396fd3be9b5a6b90228011830b3a7bf0dca2
+F src/func.c e8d7b3587a225f4f1116f720b72090511fe9feb936e960bd26a053cea6a17a63
F src/global.c 29f56a330ed9d1b5cd9b79ac0ca36f97ac3afc730ff8bfa987b0db9e559d684d
F src/hash.c 9ee4269fb1d6632a6fecfb9479c93a1f29271bddbbaf215dd60420bcb80c7220
F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51
@@ -1834,7 +1834,7 @@ F test/tt3_vacuum.c 71b254cde1fc49d6c8c44efd54f4668f3e57d7b3a8f4601ade069f75a999
F test/types.test bf816ce73c7dfcfe26b700c19f97ef4050d194ff
F test/types2.test 1aeb81976841a91eef292723649b5c4fe3bc3cac
F test/types3.test 99e009491a54f4dc02c06bdbc0c5eea56ae3e25a
-F test/unhex.test 47b547f4b35e4f6525ecac7c7839bd3ae4eb4613d4e8932592eff55da83308f1
+F test/unhex.test 777af0bad767e4ab6219e6086ea073f8836d8c34de12f9507bd39c442e89fcf2
F test/unionall.test eb9afa030897af75fd2f0dd28354ef63c8a5897b6c76aa1f15acae61a12eabcf
F test/unionall2.test 71e8fa08d5699d50dc9f9dc0c9799c2e7a6bb7931a330d369307a4df7f157fa1
F test/unionallfault.test 652bfbb630e6c43135965dc1e8f0a9a791da83aec885d626a632fe1909c56f73
@@ -2128,8 +2128,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 579aea0c28e01a79620ac758edc02db3a01baaa073e7773b8f0b6f610479520b
-R f6cfb323187380b15d71317c15cb2d7b
-U drh
-Z b1397a2832808c4669dcf4c9bd643e96
+P 4a4eccb681741917c6771101d4e329f91eae9b035f4d345218e522bb55fff6da
+R b8db52c4af481f11a25564ae1b4169f0
+U larrybr
+Z e40ad0deba084d2d357f307fa10fdd72
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index bfa8f62025..1d7dc6eb7c 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-4a4eccb681741917c6771101d4e329f91eae9b035f4d345218e522bb55fff6da
\ No newline at end of file
+2e968114fd0e60eebcc088dec02684e10b06ac1ec42d6bedb5287362f5cbf032
\ No newline at end of file
diff --git a/src/func.c b/src/func.c
index dcf195f983..eed67941b4 100644
--- a/src/func.c
+++ b/src/func.c
@@ -1256,7 +1256,8 @@ static void hexFunc(
*(z++) = hexdigits[c&0xf];
}
*z = 0;
- sqlite3_result_text(context, zHex, n*2, sqlite3_free);
+ sqlite3_result_text64(context, zHex, (u64)(z-zHex),
+ sqlite3_free, SQLITE_UTF8);
}
}
diff --git a/test/unhex.test b/test/unhex.test
index f41e906a8f..d97438f0d6 100644
--- a/test/unhex.test
+++ b/test/unhex.test
@@ -55,6 +55,8 @@ do_catchsql_test 3.1 {
#--------------------------------------------------------------------------
# Test the 2-argument version.
#
+# Zap global x array set in some previous test.
+if {[array exists x]} {array unset x}
foreach {tn hex} {
1 "FFFF ABCD"
2 "FFFF ABCD"
From 7dc0cc45f30a310dba12dcd3aaa554a146a5bf8e Mon Sep 17 00:00:00 2001
From: stephan
Date: Fri, 13 Oct 2023 12:48:35 +0000
Subject: [PATCH 06/66] Round one of an audit for SQLITE_ENABLE_API_ARMOR for
functions exposed by JNI and those functions missing armor, as
[forum:5e3fc453a69b49ca|reported in several forum posts].
FossilOrigin-Name: 8c25c4b18ad07861bf0e47f99f3db04b569b9b859ad0690602f748ddf3576939
---
ext/jni/src/c/sqlite3-jni.c | 76 +++++++++++++++++++++----------------
manifest | 25 ++++++------
manifest.uuid | 2 +-
src/loadext.c | 11 +++++-
src/main.c | 10 +++++
src/notify.c | 3 ++
src/vdbeapi.c | 37 +++++++++++++++---
7 files changed, 114 insertions(+), 50 deletions(-)
diff --git a/ext/jni/src/c/sqlite3-jni.c b/ext/jni/src/c/sqlite3-jni.c
index 7afc9a0f0f..1465c9e651 100644
--- a/ext/jni/src/c/sqlite3-jni.c
+++ b/ext/jni/src/c/sqlite3-jni.c
@@ -972,6 +972,7 @@ static jstring s3jni__utf8_to_jstring(JNIEnv * const env,
hypothetically do this for any strings where n<4 and z is
NUL-terminated and none of z[0..3] are NUL bytes. */
rv = (*env)->NewStringUTF(env, "");
+ s3jni_oom_check( rv );
}else if( z ){
jbyteArray jba;
if( n<0 ) n = sqlite3Strlen30(z);
@@ -985,8 +986,8 @@ static jstring s3jni__utf8_to_jstring(JNIEnv * const env,
}
S3JniUnrefLocal(jba);
}
+ s3jni_oom_check( rv );
}
- s3jni_oom_check( rv );
return rv;
}
#define s3jni_utf8_to_jstring(CStr,n) s3jni__utf8_to_jstring(env, CStr, n)
@@ -1468,12 +1469,14 @@ static void * NativePointerHolder__get(JNIEnv * env, jobject jNph,
#define PtrGet_sqlite3_stmt(OBJ) PtrGet_T(sqlite3_stmt, OBJ)
#define PtrGet_sqlite3_value(OBJ) PtrGet_T(sqlite3_value, OBJ)
/*
-** S3JniLongPtr_T(X,Y) expects X to be an unqualified sqlite3
-** struct type name and Y to be a native pointer to such an object in
-** the form of a jlong value. The jlong is simply cast to (X*). This
+** S3JniLongPtr_T(X,Y) expects X to be an unqualified sqlite3 struct
+** type name and Y to be a native pointer to such an object in the
+** form of a jlong value. The jlong is simply cast to (X*). This
** approach is, as of 2023-09-27, supplanting the former approach. We
** now do the native pointer extraction in the Java side, rather than
-** the C side, because it's reportedly significantly faster.
+** the C side, because it's reportedly significantly faster. The
+** intptr_t part here is necessary for compatibility with (at least)
+** ARM32.
*/
#define S3JniLongPtr_T(T,JLongAsPtr) (T*)((intptr_t)(JLongAsPtr))
#define S3JniLongPtr_sqlite3(JLongAsPtr) S3JniLongPtr_T(sqlite3,JLongAsPtr)
@@ -2616,6 +2619,10 @@ S3JniApi(sqlite3_cancel_auto_extension(),jboolean,1cancel_1auto_1extension)(
S3JniAutoExtension * ax;
jboolean rc = JNI_FALSE;
int i;
+
+ if( !jAutoExt ){
+ return rc;
+ }
S3JniAutoExt_mutex_enter;
/* This algo corresponds to the one in the core. */
for( i = SJG.autoExt.nExt-1; i >= 0; --i ){
@@ -2778,8 +2785,8 @@ S3JniApi(sqlite3_column_text(),jbyteArray,1column_1text)(
JniArgsEnvClass, jobject jpStmt, jint ndx
){
sqlite3_stmt * const stmt = PtrGet_sqlite3_stmt(jpStmt);
- const unsigned char * const p = sqlite3_column_text(stmt, (int)ndx);
- const int n = sqlite3_column_bytes(stmt, (int)ndx);
+ const unsigned char * const p = stmt ? sqlite3_column_text(stmt, (int)ndx) : 0;
+ const int n = p ? sqlite3_column_bytes(stmt, (int)ndx) : 0;
return p ? s3jni_new_jbyteArray(p, n) : NULL;
}
@@ -2789,8 +2796,8 @@ S3JniApi(sqlite3_column_text(),jstring,1column_1text)(
JniArgsEnvClass, jobject jpStmt, jint ndx
){
sqlite3_stmt * const stmt = PtrGet_sqlite3_stmt(jpStmt);
- const unsigned char * const p = sqlite3_column_text(stmt, (int)ndx);
- const int n = sqlite3_column_bytes(stmt, (int)ndx);
+ const unsigned char * const p = stmt ? sqlite3_column_text(stmt, (int)ndx) : 0;
+ const int n = p ? sqlite3_column_bytes(stmt, (int)ndx) : 0;
return p ? s3jni_utf8_to_jstring( (const char *)p, n) : 0;
}
#endif
@@ -2799,8 +2806,8 @@ S3JniApi(sqlite3_column_text16(),jstring,1column_1text16)(
JniArgsEnvClass, jobject jpStmt, jint ndx
){
sqlite3_stmt * const stmt = PtrGet_sqlite3_stmt(jpStmt);
- const void * const p = sqlite3_column_text16(stmt, (int)ndx);
- const int n = sqlite3_column_bytes16(stmt, (int)ndx);
+ const void * const p = stmt ? sqlite3_column_text16(stmt, (int)ndx) : 0;
+ const int n = p ? sqlite3_column_bytes16(stmt, (int)ndx) : 0;
return s3jni_text16_to_jstring(env, p, n);
}
@@ -2808,7 +2815,8 @@ S3JniApi(sqlite3_column_value(),jobject,1column_1value)(
JniArgsEnvClass, jobject jpStmt, jint ndx
){
sqlite3_value * const sv =
- sqlite3_column_value(PtrGet_sqlite3_stmt(jpStmt), (int)ndx);
+ sqlite3_column_value(PtrGet_sqlite3_stmt(jpStmt), (int)ndx)
+ /* reminder: returns an SQL NULL if jpStmt==NULL */;
return new_java_sqlite3_value(env, sv);
}
@@ -2919,6 +2927,18 @@ S3JniApi(sqlite3_compileoption_get(),jstring,1compileoption_1get)(
return rv;
}
+S3JniApi(sqlite3_compileoption_used(),jboolean,1compileoption_1used)(
+ JniArgsEnvClass, jstring name
+){
+ const char *zUtf8 = s3jni_jstring_to_mutf8(name)
+ /* We know these to be ASCII, so MUTF-8 is fine (and
+ hypothetically faster to convert). */;
+ const jboolean rc =
+ 0==sqlite3_compileoption_used(zUtf8) ? JNI_FALSE : JNI_TRUE;
+ s3jni_mutf8_release(name, zUtf8);
+ return rc;
+}
+
S3JniApi(sqlite3_complete(),int,1complete)(
JniArgsEnvClass, jbyteArray jSql
){
@@ -2935,18 +2955,6 @@ S3JniApi(sqlite3_complete(),int,1complete)(
return rc;
}
-S3JniApi(sqlite3_compileoption_used(),jboolean,1compileoption_1used)(
- JniArgsEnvClass, jstring name
-){
- const char *zUtf8 = s3jni_jstring_to_mutf8(name)
- /* We know these to be ASCII, so MUTF-8 is fine (and
- hypothetically faster to convert). */;
- const jboolean rc =
- 0==sqlite3_compileoption_used(zUtf8) ? JNI_FALSE : JNI_TRUE;
- s3jni_mutf8_release(name, zUtf8);
- return rc;
-}
-
S3JniApi(sqlite3_config() /*for a small subset of options.*/,
jint,1config__I)(JniArgsEnvClass, jint n){
switch( n ){
@@ -3151,6 +3159,9 @@ S3JniApi(sqlite3_create_collation() sqlite3_create_collation_v2(),
int rc;
S3JniDb * ps;
+ if( !jDb || !name || !encodingTypeIsValid(eTextRep) ){
+ return (jint)SQLITE_MISUSE;
+ }
S3JniDb_mutex_enter;
ps = S3JniDb_from_java(jDb);
jclass const klazz = (*env)->GetObjectClass(env, oCollation);
@@ -3574,6 +3585,7 @@ static int s3jni_open_pre(JNIEnv * const env, S3JniEnv **jc,
S3JniDb ** ps){
int rc = 0;
jobject jDb = 0;
+
*jc = S3JniEnv_get();
if( !*jc ){
rc = SQLITE_NOMEM;
@@ -3650,6 +3662,8 @@ S3JniApi(sqlite3_open(),jint,1open)(
S3JniDb * ps = 0;
S3JniEnv * jc = 0;
int rc;
+
+ if( 0==jOut ) return SQLITE_MISUSE;
rc = s3jni_open_pre(env, &jc, strName, &zName, &ps);
if( 0==rc ){
rc = s3jni_open_post(env, jc, ps, &pOut, jOut,
@@ -3662,14 +3676,17 @@ S3JniApi(sqlite3_open(),jint,1open)(
S3JniApi(sqlite3_open_v2(),jint,1open_1v2)(
JniArgsEnvClass, jstring strName,
- jobject jOut, jint flags, jstring strVfs
+ jobject jOut, jint flags, jstring strVfs
){
sqlite3 * pOut = 0;
char *zName = 0;
S3JniDb * ps = 0;
S3JniEnv * jc = 0;
char *zVfs = 0;
- int rc = s3jni_open_pre(env, &jc, strName, &zName, &ps);
+ int rc;
+
+ if( 0==jOut ) return SQLITE_MISUSE;
+ rc = s3jni_open_pre(env, &jc, strName, &zName, &ps);
if( 0==rc ){
if( strVfs ){
zVfs = s3jni_jstring_to_utf8( strVfs, 0);
@@ -4469,7 +4486,6 @@ static int s3jni_strlike_glob(int isLike, JNIEnv *const env,
jbyte * const pG = s3jni_jbyteArray_bytes(baG);
jbyte * const pT = pG ? s3jni_jbyteArray_bytes(baT) : 0;
- s3jni_oom_fatal(pT);
/* Note that we're relying on the byte arrays having been
NUL-terminated on the Java side. */
rc = isLike
@@ -4509,12 +4525,8 @@ S3JniApi(sqlite3_sql(),jstring,1sql)(
S3JniApi(sqlite3_step(),jint,1step)(
JniArgsEnvClass,jobject jStmt
){
- int rc = SQLITE_MISUSE;
sqlite3_stmt * const pStmt = PtrGet_sqlite3_stmt(jStmt);
- if( pStmt ){
- rc = sqlite3_step(pStmt);
- }
- return rc;
+ return pStmt ? (jint)sqlite3_step(pStmt) : (jint)SQLITE_MISUSE;
}
S3JniApi(sqlite3_table_column_metadata(),int,1table_1column_1metadata)(
diff --git a/manifest b/manifest
index 667e06fa71..f9baa60087 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Avoid\spotential\soverflow\sin\shex().\s[forum:/forumpost/7ac0c9c5ea|See\sforum\spost\s7ac0c9c5ea.]
-D 2023-10-13T01:39:47.068
+C Round\sone\sof\san\saudit\sfor\sSQLITE_ENABLE_API_ARMOR\sfor\sfunctions\sexposed\sby\sJNI\sand\sthose\sfunctions\smissing\sarmor,\sas\s[forum:5e3fc453a69b49ca|reported\sin\sseveral\sforum\sposts].
+D 2023-10-13T12:48:35.298
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -238,7 +238,7 @@ F ext/icu/sqliteicu.h fa373836ed5a1ee7478bdf8a1650689294e41d0c89c1daab26e9ae78a3
F ext/jni/GNUmakefile 6da240c9a11701f3ed569384cd15ef611e8b3c5e3897d265923b14bf0e1eb272
F ext/jni/README.md ef9ac115e97704ea995d743b4a8334e23c659e5534c3b64065a5405256d5f2f4
F ext/jni/jar-dist.make 030aaa4ae71dd86e4ec5e7c1e6cd86f9dfa47c4592c070d2e35157e42498e1fa
-F ext/jni/src/c/sqlite3-jni.c bf432771fbc84da2b5f4037e0bcf20757548aac2fa782b272c4894a9c279964a
+F ext/jni/src/c/sqlite3-jni.c eabd48ced29954fb4f6173c4f350f7f1fce218ce19f48a75367cb560cf2da77e
F ext/jni/src/c/sqlite3-jni.h be1fdff7ab3a2bb357197271c8ac5d2bf6ff59380c106dde3a13be88724bad22
F ext/jni/src/org/sqlite/jni/AbstractCollationCallback.java 95e88ba04f4aac51ffec65693e878e234088b2f21b387f4e4285c8b72b33e436
F ext/jni/src/org/sqlite/jni/AggregateFunction.java 7312486bc65fecdb91753c0a4515799194e031f45edbe16a6373cea18f404dc4
@@ -676,8 +676,8 @@ F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71
F src/insert.c 3f0a94082d978bbdd33c38fefea15346c6c6bffb70bc645a71dc0f1f87dd3276
F src/json.c 799430345d16fed21713416318e6ca616f1264224f708555f387bfa2ab2496c7
F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa
-F src/loadext.c 98cfba10989b3da6f1807ad42444017742db7f100a54f1032af7a8b1295912c0
-F src/main.c 618aeb399e993cf561864f4b0cf6a331ee4f355cf663635f8d9da3193a46aa40
+F src/loadext.c 7d56c6f28aaf9b42e2772289e0d0a12a77b57c2baed021dbfd1fcafec69c156a
+F src/main.c 7a91b372dd1bada07c5b5e36082dc0d695161c3807efe2386f563a5b32446ae6
F src/malloc.c f016922435dc7d1f1f5083a03338a3e91f8c67ce2c5bdcfa4cdef62e612f5fcc
F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
F src/mem1.c 3bb59158c38e05f6270e761a9f435bf19827a264c13d1631c58b84bdc96d73b2
@@ -692,7 +692,7 @@ F src/mutex.h a7b2293c48db5f27007c3bdb21d438873637d12658f5a0bf8ad025bb96803c4a
F src/mutex_noop.c 9d4309c075ba9cc7249e19412d3d62f7f94839c4
F src/mutex_unix.c bd52ec50e44a41fe1e3deb5a6e3fe98edb6f2059da3e46d196363d0fa3192cda
F src/mutex_w32.c 38b56d0bc8d54c17c20cbaaad3719b0c36b92fd07a7e34360d0c6a18d5589912
-F src/notify.c 89a97dc854c3aa62ad5f384ef50c5a4a11d70fcc69f86de3e991573421130ed6
+F src/notify.c 57c2d1a2805d6dee32acd5d250d928ab94e02d76369ae057dee7d445fd64e878
F src/os.c 509452169d5ea739723e213b8e2481cf0e587f0e88579a912d200db5269f5f6d
F src/os.h 1ff5ae51d339d0e30d8a9d814f4b8f8e448169304d83a7ed9db66a65732f3e63
F src/os_common.h 6c0eb8dd40ef3e12fe585a13e709710267a258e2c8dd1c40b1948a1d14582e06
@@ -787,7 +787,7 @@ F src/vacuum.c 604fcdaebe76f3497c855afcbf91b8fa5046b32de3045bab89cc008d68e40104
F src/vdbe.c cd112eb00d20fc5cc44f631d0e713838602637328b0f127c2f3c2aa8cea3cc91
F src/vdbe.h 41485521f68e9437fdb7ec4a90f9d86ab294e9bb8281e33b235915e29122cfc0
F src/vdbeInt.h 949669dfd8a41550d27dcb905b494f2ccde9a2e6c1b0b04daa1227e2e74c2b2c
-F src/vdbeapi.c 4184402246172220418c0ef49ff4cf1a19ced9a4ac6c843c2f0773fb5c543f37
+F src/vdbeapi.c be7d88a05df51cb3940304f74e4b0534817b51213b3406143a67eecd6f82fe21
F src/vdbeaux.c 5b415e09b5b9d5be6c0f4fcbf18ea9d7d16f6a29ced2f14a3b2041020f63e9c1
F src/vdbeblob.c 4cf5aa130e96e3b52ba3fb54b7f9606c942ab988dbb32cb19cff4db24e06aeec
F src/vdbemem.c 317b9f48708139db6239ade40c7980b4bc8233168383690d588dad6d8437f722
@@ -2128,8 +2128,11 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 4a4eccb681741917c6771101d4e329f91eae9b035f4d345218e522bb55fff6da
-R b8db52c4af481f11a25564ae1b4169f0
-U larrybr
-Z e40ad0deba084d2d357f307fa10fdd72
+P 2e968114fd0e60eebcc088dec02684e10b06ac1ec42d6bedb5287362f5cbf032
+R 64d7e862f198f312cf375ff0e1b4824a
+T *branch * api-armor-audit
+T *sym-api-armor-audit *
+T -sym-trunk * Cancelled\sby\sbranch.
+U stephan
+Z fb0f8b82a9c86be7bcd5823447ca13df
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 1d7dc6eb7c..7b111488b3 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-2e968114fd0e60eebcc088dec02684e10b06ac1ec42d6bedb5287362f5cbf032
\ No newline at end of file
+8c25c4b18ad07861bf0e47f99f3db04b569b9b859ad0690602f748ddf3576939
\ No newline at end of file
diff --git a/src/loadext.c b/src/loadext.c
index e792fa5a98..cfa8ba4ca8 100644
--- a/src/loadext.c
+++ b/src/loadext.c
@@ -730,6 +730,9 @@ void sqlite3CloseExtensions(sqlite3 *db){
** default so as not to open security holes in older applications.
*/
int sqlite3_enable_load_extension(sqlite3 *db, int onoff){
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT;
+#endif
sqlite3_mutex_enter(db->mutex);
if( onoff ){
db->flags |= SQLITE_LoadExtension|SQLITE_LoadExtFunc;
@@ -751,7 +754,7 @@ int sqlite3_enable_load_extension(sqlite3 *db, int onoff){
*/
typedef struct sqlite3AutoExtList sqlite3AutoExtList;
static SQLITE_WSD struct sqlite3AutoExtList {
- u32 nExt; /* Number of entries in aExt[] */
+ u32 nExt; /* Number of entries in aExt[] */
void (**aExt)(void); /* Pointers to the extension init functions */
} sqlite3Autoext = { 0, 0 };
@@ -779,6 +782,9 @@ int sqlite3_auto_extension(
void (*xInit)(void)
){
int rc = SQLITE_OK;
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( xInit==0 ) return SQLITE_MISUSE_BKPT;
+#endif
#ifndef SQLITE_OMIT_AUTOINIT
rc = sqlite3_initialize();
if( rc ){
@@ -831,6 +837,9 @@ int sqlite3_cancel_auto_extension(
int i;
int n = 0;
wsdAutoextInit;
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( xInit==0 ) return 0;
+#endif
sqlite3_mutex_enter(mutex);
for(i=(int)wsdAutoext.nExt-1; i>=0; i--){
if( wsdAutoext.aExt[i]==xInit ){
diff --git a/src/main.c b/src/main.c
index a43afab168..4ddf7e24d3 100644
--- a/src/main.c
+++ b/src/main.c
@@ -954,6 +954,10 @@ int sqlite3_db_cacheflush(sqlite3 *db){
int sqlite3_db_config(sqlite3 *db, int op, ...){
va_list ap;
int rc;
+
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT;
+#endif
sqlite3_mutex_enter(db->mutex);
va_start(ap, op);
switch( op ){
@@ -2365,6 +2369,12 @@ void *sqlite3_preupdate_hook(
void *pArg /* First callback argument */
){
void *pRet;
+
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( db==0 || xCallback==0 ){
+ return;
+ }
+#endif
sqlite3_mutex_enter(db->mutex);
pRet = db->pPreUpdateArg;
db->xPreUpdateCallback = xCallback;
diff --git a/src/notify.c b/src/notify.c
index 4960ab76b1..6a4cab8755 100644
--- a/src/notify.c
+++ b/src/notify.c
@@ -152,6 +152,9 @@ int sqlite3_unlock_notify(
){
int rc = SQLITE_OK;
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( !sqlite3SafetyCheckOk(db) ) return SQLITE_MISUSE_BKPT;
+#endif
sqlite3_mutex_enter(db->mutex);
enterMutex();
diff --git a/src/vdbeapi.c b/src/vdbeapi.c
index 1213dbe6d1..f8e66df87a 100644
--- a/src/vdbeapi.c
+++ b/src/vdbeapi.c
@@ -2029,10 +2029,16 @@ static UnpackedRecord *vdbeUnpackRecord(
** a field of the row currently being updated or deleted.
*/
int sqlite3_preupdate_old(sqlite3 *db, int iIdx, sqlite3_value **ppValue){
- PreUpdate *p = db->pPreUpdate;
+ PreUpdate *p;
Mem *pMem;
int rc = SQLITE_OK;
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( db==0 || ppValue==0 ){
+ return SQLITE_MISUSE_BKPT;
+ }
+#endif
+ p = db->pPreUpdate;
/* Test that this call is being made from within an SQLITE_DELETE or
** SQLITE_UPDATE pre-update callback, and that iIdx is within range. */
if( !p || p->op==SQLITE_INSERT ){
@@ -2093,7 +2099,12 @@ int sqlite3_preupdate_old(sqlite3 *db, int iIdx, sqlite3_value **ppValue){
** the number of columns in the row being updated, deleted or inserted.
*/
int sqlite3_preupdate_count(sqlite3 *db){
- PreUpdate *p = db->pPreUpdate;
+ PreUpdate *p;
+#ifdef SQLITE_ENABLE_API_ARMOR
+ p = db!=0 ? db->pPreUpdate : 0;
+#else
+ p = db->pPreUpdate;
+#endif
return (p ? p->keyinfo.nKeyField : 0);
}
#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */
@@ -2111,7 +2122,12 @@ int sqlite3_preupdate_count(sqlite3 *db){
** or SET DEFAULT action is considered a trigger.
*/
int sqlite3_preupdate_depth(sqlite3 *db){
- PreUpdate *p = db->pPreUpdate;
+ PreUpdate *p;
+#ifdef SQLITE_ENABLE_API_ARMOR
+ p = db!=0 ? db->pPreUpdate : 0;
+#else
+ p = db->pPreUpdate;
+#endif
return (p ? p->v->nFrame : 0);
}
#endif /* SQLITE_ENABLE_PREUPDATE_HOOK */
@@ -2122,7 +2138,12 @@ int sqlite3_preupdate_depth(sqlite3 *db){
** only.
*/
int sqlite3_preupdate_blobwrite(sqlite3 *db){
- PreUpdate *p = db->pPreUpdate;
+ PreUpdate *p;
+#ifdef SQLITE_ENABLE_API_ARMOR
+ p = db!=0 ? db->pPreUpdate : 0;
+#else
+ p = db->pPreUpdate;
+#endif
return (p ? p->iBlobWrite : -1);
}
#endif
@@ -2133,10 +2154,16 @@ int sqlite3_preupdate_blobwrite(sqlite3 *db){
** a field of the row currently being updated or inserted.
*/
int sqlite3_preupdate_new(sqlite3 *db, int iIdx, sqlite3_value **ppValue){
- PreUpdate *p = db->pPreUpdate;
+ PreUpdate *p;
int rc = SQLITE_OK;
Mem *pMem;
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( db==0 || ppValue==0 ){
+ return SQLITE_MISUSE_BKPT;
+ }
+#endif
+ p = db->pPreUpdate;
if( !p || p->op==SQLITE_DELETE ){
rc = SQLITE_MISUSE_BKPT;
goto preupdate_new_out;
From 98170653405fc5f0aad29bf6a9513364c50b1191 Mon Sep 17 00:00:00 2001
From: drh <>
Date: Fri, 13 Oct 2023 12:57:23 +0000
Subject: [PATCH 07/66] Actually prevent PRAGMA writable_schema=ON from being
set in defensive mode, rather than just preventing it from functioning.
FossilOrigin-Name: 2b574d9e7e922d0961ea27bfc0148d3098157ff8d4feefba469489c81d43f3e0
---
manifest | 14 +++++++-------
manifest.uuid | 2 +-
src/pragma.c | 6 +++++-
3 files changed, 13 insertions(+), 9 deletions(-)
diff --git a/manifest b/manifest
index 667e06fa71..618601adcf 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Avoid\spotential\soverflow\sin\shex().\s[forum:/forumpost/7ac0c9c5ea|See\sforum\spost\s7ac0c9c5ea.]
-D 2023-10-13T01:39:47.068
+C Actually\sprevent\sPRAGMA\swritable_schema=ON\sfrom\sbeing\sset\sin\sdefensive\smode,\nrather\sthan\sjust\spreventing\sit\sfrom\sfunctioning.
+D 2023-10-13T12:57:23.459
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -707,7 +707,7 @@ F src/parse.y aeb7760d41cfa86465e3adba506500c021597049fd55f82a30e5b7045862c28c
F src/pcache.c 040b165f30622a21b7a9a77c6f2e4877a32fb7f22d4c7f0d2a6fa6833a156a75
F src/pcache.h 1497ce1b823cf00094bb0cf3bac37b345937e6f910890c626b16512316d3abf5
F src/pcache1.c 602acb23c471bb8d557a6f0083cc2be641d6cafcafa19e481eba7ef4c9ca0f00
-F src/pragma.c db6ce4f9d67722a5d46428d21dc1eaff919a92a9e009168fbb6ad227a5d781be
+F src/pragma.c 9f9b8828624ee98de22a2a9793a651daa39bc06cd9e701b6eda23c6d75260f1d
F src/pragma.h e690a356c18e98414d2e870ea791c1be1545a714ba623719deb63f7f226d8bb7
F src/prepare.c bde74add20fc0e8ce0c4e937a1f70a36d17413afe4f71d3e103f5cb74b17c8d9
F src/printf.c e3ba080e2f409f9bfcc8d34724e6fc160e9c718dc92d0548f6b71b8b6f860ce2
@@ -2128,8 +2128,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 4a4eccb681741917c6771101d4e329f91eae9b035f4d345218e522bb55fff6da
-R b8db52c4af481f11a25564ae1b4169f0
-U larrybr
-Z e40ad0deba084d2d357f307fa10fdd72
+P 2e968114fd0e60eebcc088dec02684e10b06ac1ec42d6bedb5287362f5cbf032
+R 7b01763f55834ca6495d297b6d47ecf8
+U drh
+Z e23aaad11f5de862bcdfc4d2c2927a81
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 1d7dc6eb7c..3de2f46833 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-2e968114fd0e60eebcc088dec02684e10b06ac1ec42d6bedb5287362f5cbf032
\ No newline at end of file
+2b574d9e7e922d0961ea27bfc0148d3098157ff8d4feefba469489c81d43f3e0
\ No newline at end of file
diff --git a/src/pragma.c b/src/pragma.c
index 3b6190b2e7..576080e10a 100644
--- a/src/pragma.c
+++ b/src/pragma.c
@@ -1124,7 +1124,11 @@ void sqlite3Pragma(
#endif
if( sqlite3GetBoolean(zRight, 0) ){
- db->flags |= mask;
+ if( (mask & SQLITE_WriteSchema)==0
+ || (db->flags & SQLITE_Defensive)==0
+ ){
+ db->flags |= mask;
+ }
}else{
db->flags &= ~mask;
if( mask==SQLITE_DeferFKs ) db->nDeferredImmCons = 0;
From af527231c14206ec6ab9564c93e731cc7ea56001 Mon Sep 17 00:00:00 2001
From: drh <>
Date: Fri, 13 Oct 2023 13:49:46 +0000
Subject: [PATCH 08/66] Immediately fail a CREATE TABLE statement that attempts
to create a table that has a generated column loop. Legacy allows the table
to be created but the table would not be usable for anything.
FossilOrigin-Name: 3237bf964117c1ef71143042837ef21872bb3d04bfd682075672e768953ec802
---
manifest | 16 ++++++++--------
manifest.uuid | 2 +-
src/build.c | 7 +++++++
src/vdbe.c | 11 +++++++++--
test/gencol1.test | 5 +----
5 files changed, 26 insertions(+), 15 deletions(-)
diff --git a/manifest b/manifest
index 618601adcf..ac9ec8cf34 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Actually\sprevent\sPRAGMA\swritable_schema=ON\sfrom\sbeing\sset\sin\sdefensive\smode,\nrather\sthan\sjust\spreventing\sit\sfrom\sfunctioning.
-D 2023-10-13T12:57:23.459
+C Immediately\sfail\sa\sCREATE\sTABLE\sstatement\sthat\sattempts\sto\screate\sa\ntable\sthat\shas\sa\sgenerated\scolumn\sloop.\s\sLegacy\sallows\sthe\stable\sto\sbe\ncreated\sbut\sthe\stable\swould\snot\sbe\susable\sfor\sanything.
+D 2023-10-13T13:49:46.914
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -656,7 +656,7 @@ F src/btmutex.c 79a43670447eacc651519a429f6ece9fd638563cf95b469d6891185ddae2b522
F src/btree.c fbbbfc51d2fed03c29f20960857d97659d9c682523f32911d5a8e7c5be6436be
F src/btree.h 03e3356f5208bcab8eed4e094240fdac4a7f9f5ddf5e91045ce589f67d47c240
F src/btreeInt.h 91a9e0c41a0e71fa91a742ec285c63dd8dcb38b73d14fae0ed7209174ff0fdc1
-F src/build.c 79a4edcee69df5f20963d7b11faf0820d25e6f8c11ef3a9f868d14be87834711
+F src/build.c 4b1d6f8d2b2fcd3267ec54254ad78383c6e758f2be479f849e763947344f68d8
F src/callback.c db3a45e376deff6a16c0058163fe0ae2b73a2945f3f408ca32cf74960b28d490
F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
F src/ctime.c 23331529e654be40ca97d171cbbffe9b3d4c71cc53b78fe5501230675952da8b
@@ -784,7 +784,7 @@ F src/upsert.c fa125a8d3410ce9a97b02cb50f7ae68a2476c405c76aa692d3acf6b8586e9242
F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0
F src/util.c e87f66258c37f87724f46e849572c3ece4c74ef5614ba41eb221e98f0dbc95de
F src/vacuum.c 604fcdaebe76f3497c855afcbf91b8fa5046b32de3045bab89cc008d68e40104
-F src/vdbe.c cd112eb00d20fc5cc44f631d0e713838602637328b0f127c2f3c2aa8cea3cc91
+F src/vdbe.c 4c688500c530ba8b62a4bb8f561be34a4afe7175fbdaa890b046cb15fb383c19
F src/vdbe.h 41485521f68e9437fdb7ec4a90f9d86ab294e9bb8281e33b235915e29122cfc0
F src/vdbeInt.h 949669dfd8a41550d27dcb905b494f2ccde9a2e6c1b0b04daa1227e2e74c2b2c
F src/vdbeapi.c 4184402246172220418c0ef49ff4cf1a19ced9a4ac6c843c2f0773fb5c543f37
@@ -1217,7 +1217,7 @@ F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14
F test/fuzzerfault.test f64c4aef4c9e9edf1d6dc0d3f1e65dcc81e67c996403c88d14f09b74807a42bc
F test/fuzzinvariants.c b34530e8431f2cf3591eff588fc7684d6fdef466916fb46141c8c5374a3d8099
F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c
-F test/gencol1.test aef8b0670abd4b1ae4cae786b15a43758d86f6cd9f12b381d45d96bb51e597c9
+F test/gencol1.test e169bdfa11c7ed5e9f322a98a7db3afe9e66235750b68c923efee8e1876b46ec
F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98
F test/having.test a89236dd8d55aa50c4805f82ac9daf64d477a44d712d8209c118978d0ca21ec9
F test/hexlit.test 4a6a5f46e3c65c4bf1fa06f5dd5a9507a5627751
@@ -2128,8 +2128,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 2e968114fd0e60eebcc088dec02684e10b06ac1ec42d6bedb5287362f5cbf032
-R 7b01763f55834ca6495d297b6d47ecf8
+P 2b574d9e7e922d0961ea27bfc0148d3098157ff8d4feefba469489c81d43f3e0
+R 2fc76f86f477974c5358ee799986121c
U drh
-Z e23aaad11f5de862bcdfc4d2c2927a81
+Z 113df2c1f11316814ff8cfbf0e8ca298
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 3de2f46833..7f1ac31d9d 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-2b574d9e7e922d0961ea27bfc0148d3098157ff8d4feefba469489c81d43f3e0
\ No newline at end of file
+3237bf964117c1ef71143042837ef21872bb3d04bfd682075672e768953ec802
\ No newline at end of file
diff --git a/src/build.c b/src/build.c
index 59e3e23f09..0920b0f224 100644
--- a/src/build.c
+++ b/src/build.c
@@ -2920,6 +2920,13 @@ void sqlite3EndTable(
/* Reparse everything to update our internal data structures */
sqlite3VdbeAddParseSchemaOp(v, iDb,
sqlite3MPrintf(db, "tbl_name='%q' AND type!='trigger'", p->zName),0);
+
+ /* Test for cycles in generated columns */
+ if( p->tabFlags & TF_HasGenerated ){
+ sqlite3VdbeAddOp4(v, OP_SqlExec, 0, 0, 0,
+ sqlite3MPrintf(db, "SELECT*FROM\"%w\".\"%s\"",
+ db->aDb[iDb].zDbSName, p->zName), P4_DYNAMIC);
+ }
}
/* Add the table to the in-memory representation of the database.
diff --git a/src/vdbe.c b/src/vdbe.c
index 6463136507..00d365680b 100644
--- a/src/vdbe.c
+++ b/src/vdbe.c
@@ -6908,11 +6908,18 @@ case OP_CreateBtree: { /* out2 */
** Run the SQL statement or statements specified in the P4 string.
*/
case OP_SqlExec: {
+ char *zErr;
+
sqlite3VdbeIncrWriteCounter(p, 0);
db->nSqlExec++;
- rc = sqlite3_exec(db, pOp->p4.z, 0, 0, 0);
+ zErr = 0;
+ rc = sqlite3_exec(db, pOp->p4.z, 0, 0, &zErr);
db->nSqlExec--;
- if( rc ) goto abort_due_to_error;
+ if( rc || zErr ){
+ sqlite3VdbeError(p, "%s", zErr);
+ sqlite3_free(zErr);
+ goto abort_due_to_error;
+ }
break;
}
diff --git a/test/gencol1.test b/test/gencol1.test
index f3fbb0dfba..ed7ea567d4 100644
--- a/test/gencol1.test
+++ b/test/gencol1.test
@@ -662,11 +662,8 @@ do_execsql_test gencol1-23.4 {
# 2023-03-07 https://sqlite.org/forum/forumpost/b312e075b5
#
-do_execsql_test gencol1-23.5 {
+do_catchsql_test gencol1-23.5 {
CREATE TABLE v0(c1 INT, c2 AS (RAISE(IGNORE)));
-}
-do_catchsql_test gencol1-23.6 {
- SELECT * FROM v0;
} {1 {RAISE() may only be used within a trigger-program}}
finish_test
From d7cdfe74f66312f9be3a8a9e9e983cd48b0f90c0 Mon Sep 17 00:00:00 2001
From: dan
Date: Fri, 13 Oct 2023 15:59:11 +0000
Subject: [PATCH 09/66] Fix an fts5 problem caused by a 'rebuild' followed by a
DELETE in secure-delete mode.
FossilOrigin-Name: 18be505c628d9b13431ca6cfe822d4aeae119c53ae08aef26a67f310a8bd7bd3
---
ext/fts5/fts5_main.c | 9 +++++++++
ext/fts5/test/fts5secure6.test | 28 ++++++++++++++++++++++++++++
manifest | 16 ++++++++--------
manifest.uuid | 2 +-
4 files changed, 46 insertions(+), 9 deletions(-)
diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c
index 3f14300043..1c21367df1 100644
--- a/ext/fts5/fts5_main.c
+++ b/ext/fts5/fts5_main.c
@@ -1533,6 +1533,7 @@ static int fts5SpecialInsert(
Fts5Config *pConfig = pTab->p.pConfig;
int rc = SQLITE_OK;
int bError = 0;
+ int bLoadConfig = 0;
if( 0==sqlite3_stricmp("delete-all", zCmd) ){
if( pConfig->eContent==FTS5_CONTENT_NORMAL ){
@@ -1544,6 +1545,7 @@ static int fts5SpecialInsert(
}else{
rc = sqlite3Fts5StorageDeleteAll(pTab->pStorage);
}
+ bLoadConfig = 1;
}else if( 0==sqlite3_stricmp("rebuild", zCmd) ){
if( pConfig->eContent==FTS5_CONTENT_NONE ){
fts5SetVtabError(pTab,
@@ -1553,6 +1555,7 @@ static int fts5SpecialInsert(
}else{
rc = sqlite3Fts5StorageRebuild(pTab->pStorage);
}
+ bLoadConfig = 1;
}else if( 0==sqlite3_stricmp("optimize", zCmd) ){
rc = sqlite3Fts5StorageOptimize(pTab->pStorage);
}else if( 0==sqlite3_stricmp("merge", zCmd) ){
@@ -1578,6 +1581,12 @@ static int fts5SpecialInsert(
}
}
}
+
+ if( rc==SQLITE_OK && bLoadConfig ){
+ pTab->p.pConfig->iCookie--;
+ rc = sqlite3Fts5IndexLoadConfig(pTab->p.pIndex);
+ }
+
return rc;
}
diff --git a/ext/fts5/test/fts5secure6.test b/ext/fts5/test/fts5secure6.test
index 43d4f075e8..e2f4ceabc8 100644
--- a/ext/fts5/test/fts5secure6.test
+++ b/ext/fts5/test/fts5secure6.test
@@ -109,5 +109,33 @@ do_execsql_test 4.3 {
INSERT INTO t1(t1) VALUES('integrity-check');
}
+#-------------------------------------------------------------------------
+reset_db
+
+do_execsql_test 5.0 {
+ CREATE VIRTUAL TABLE t1 USING fts5(content);
+
+ INSERT INTO t1(t1,rank) VALUES('secure-delete',1);
+ INSERT INTO t1 VALUES('active'),('boomer'),('atom'),('atomic'),
+ ('alpha channel backup abandon test aback boomer atom alpha active');
+ DELETE FROM t1 WHERE t1 MATCH 'abandon';
+}
+
+do_execsql_test 5.1 {
+ INSERT INTO t1(t1) VALUES('rebuild');
+}
+
+do_execsql_test 5.2 {
+ DELETE FROM t1 WHERE rowid NOTNULL<5;
+}
+
+db close
+sqlite3 db test.db
+
+do_execsql_test 5.3 {
+ PRAGMA integrity_check;
+} {ok}
+
+
finish_test
diff --git a/manifest b/manifest
index ac9ec8cf34..c9d01ed2aa 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Immediately\sfail\sa\sCREATE\sTABLE\sstatement\sthat\sattempts\sto\screate\sa\ntable\sthat\shas\sa\sgenerated\scolumn\sloop.\s\sLegacy\sallows\sthe\stable\sto\sbe\ncreated\sbut\sthe\stable\swould\snot\sbe\susable\sfor\sanything.
-D 2023-10-13T13:49:46.914
+C Fix\san\sfts5\sproblem\scaused\sby\sa\s'rebuild'\sfollowed\sby\sa\sDELETE\sin\ssecure-delete\smode.
+D 2023-10-13T15:59:11.452
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -95,7 +95,7 @@ F ext/fts5/fts5_config.c 054359543566cbff1ba65a188330660a5457299513ac71c53b3a07d
F ext/fts5/fts5_expr.c bd3b81ce669c4104e34ffe66570af1999a317b142c15fccb112de9fb0caa57a6
F ext/fts5/fts5_hash.c 65e7707bc8774706574346d18c20218facf87de3599b995963c3e6d6809f203d
F ext/fts5/fts5_index.c a0f8e58e1c101d0b7959264f76b8c0c3c44914a999b29ec4264a6f55f1bccfe1
-F ext/fts5/fts5_main.c 1ea6636a1f528e9042cc6992d57b5a97c4a4e401ab1d2836c0cc805a1d27a982
+F ext/fts5/fts5_main.c 95b479e4cc1ae5d22084caa9d85295ed759044d24a0c1679115aea4910792a1f
F ext/fts5/fts5_storage.c 3c9b41fce41b6410f2e8f82eb035c6a29b2560483f773e6dc98cf3cb2e4ddbb5
F ext/fts5/fts5_tcl.c b1445cbe69908c411df8084a10b2485500ac70a9c747cdc8cda175a3da59d8ae
F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee
@@ -204,7 +204,7 @@ F ext/fts5/test/fts5secure2.test 2e961d7eef939f294c56b5d895cac7f1c3a60b934ee2cfd
F ext/fts5/test/fts5secure3.test c7e1080a6912f2a3ac68f2e05b88b72a99de38543509b2bbf427cac5c9c1c610
F ext/fts5/test/fts5secure4.test 0d10a80590c07891478700af7793b232962042677432b9846cf7fc8337b67c97
F ext/fts5/test/fts5secure5.test c07a68ced5951567ac116c22f2d2aafae497e47fe9fcb6a335c22f9c7a4f2c3a
-F ext/fts5/test/fts5secure6.test 6f7fbb1f96910ccbdbfd2097f761f4c77c150c03734503331e2d428f77fa2a6e
+F ext/fts5/test/fts5secure6.test 74bf04733cc523bccca519bb03d3b4e2ed6f6e3db7c59bf6be82c88a0ac857fd
F ext/fts5/test/fts5secure7.test fd03d0868d64340a1db8615b02e5508fea409de13910114e4f19eaefc120777a
F ext/fts5/test/fts5securefault.test dbca2b6a1c16700017f5051138991b705410889933f2a37c57ae8a23b296b10b
F ext/fts5/test/fts5simple.test a298670508c1458b88ce6030440f26a30673931884eb5f4094ac1773b3ba217b
@@ -2128,8 +2128,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 2b574d9e7e922d0961ea27bfc0148d3098157ff8d4feefba469489c81d43f3e0
-R 2fc76f86f477974c5358ee799986121c
-U drh
-Z 113df2c1f11316814ff8cfbf0e8ca298
+P 3237bf964117c1ef71143042837ef21872bb3d04bfd682075672e768953ec802
+R 8c9ca99981e8bfe505c808816a46e21d
+U dan
+Z 7d08aebab325ced76a3693b193b8d8cb
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 7f1ac31d9d..305ace854d 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-3237bf964117c1ef71143042837ef21872bb3d04bfd682075672e768953ec802
\ No newline at end of file
+18be505c628d9b13431ca6cfe822d4aeae119c53ae08aef26a67f310a8bd7bd3
\ No newline at end of file
From 6f12e51313287931e6a5728c5165ace04caf681d Mon Sep 17 00:00:00 2001
From: drh <>
Date: Fri, 13 Oct 2023 18:29:18 +0000
Subject: [PATCH 10/66] Do not allow triggers on shadow tables under defensive
mode.
FossilOrigin-Name: 44b932ff16e35814febd842d11215cf243393f173aade33ceded473598221e88
---
manifest | 14 +++++++-------
manifest.uuid | 2 +-
src/trigger.c | 4 ++++
3 files changed, 12 insertions(+), 8 deletions(-)
diff --git a/manifest b/manifest
index c9d01ed2aa..0e69b9ce9a 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\san\sfts5\sproblem\scaused\sby\sa\s'rebuild'\sfollowed\sby\sa\sDELETE\sin\ssecure-delete\smode.
-D 2023-10-13T15:59:11.452
+C Do\snot\sallow\striggers\son\sshadow\stables\sunder\sdefensive\smode.
+D 2023-10-13T18:29:18.041
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -778,7 +778,7 @@ F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c
F src/tokenize.c 23d9f4539880b40226254ad9072f4ecf12eb1902e62aea47aac29928afafcfd5
F src/treeview.c 1d52fbc4e97161e65858d36e3424ea6e3fc045dd8a679c82b4b9593dc30de3bd
-F src/trigger.c ad6ab9452715fa9a8075442e15196022275b414b9141b566af8cdb7a1605f2b0
+F src/trigger.c 5286019b152f622a38900284109e4aae1e5f566deb7ad9ba7e931f0660771f32
F src/update.c 6904814dd62a7a93bbb86d9f1419c7f134a9119582645854ab02b36b676d9f92
F src/upsert.c fa125a8d3410ce9a97b02cb50f7ae68a2476c405c76aa692d3acf6b8586e9242
F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0
@@ -2128,8 +2128,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 3237bf964117c1ef71143042837ef21872bb3d04bfd682075672e768953ec802
-R 8c9ca99981e8bfe505c808816a46e21d
-U dan
-Z 7d08aebab325ced76a3693b193b8d8cb
+P 18be505c628d9b13431ca6cfe822d4aeae119c53ae08aef26a67f310a8bd7bd3
+R e5fc1c8bca38142f52450113ed88aad4
+U drh
+Z 4766bec696af50a50338444506de89e1
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 305ace854d..70647abd29 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-18be505c628d9b13431ca6cfe822d4aeae119c53ae08aef26a67f310a8bd7bd3
\ No newline at end of file
+44b932ff16e35814febd842d11215cf243393f173aade33ceded473598221e88
\ No newline at end of file
diff --git a/src/trigger.c b/src/trigger.c
index bcb2132f0b..2decea8206 100644
--- a/src/trigger.c
+++ b/src/trigger.c
@@ -183,6 +183,10 @@ void sqlite3BeginTrigger(
sqlite3ErrorMsg(pParse, "cannot create triggers on virtual tables");
goto trigger_orphan_error;
}
+ if( (pTab->tabFlags & TF_Shadow)!=0 && sqlite3ReadOnlyShadowTables(db) ){
+ sqlite3ErrorMsg(pParse, "cannot create triggers on shadow tables");
+ goto trigger_orphan_error;
+ }
/* Check that the trigger name is not reserved and that no trigger of the
** specified name exists */
From cc67a62fa01ecf2ebab6ddb52adc58d41d95f66a Mon Sep 17 00:00:00 2001
From: drh <>
Date: Fri, 13 Oct 2023 19:41:20 +0000
Subject: [PATCH 11/66] Apply the correct affinity to DEFAULT values that are
TRUE or FALSE.
FossilOrigin-Name: 4958db70c8103e249748fdeffc35f1c385e2e550e8a48697b82fcd797f3016be
---
manifest | 12 ++++++------
manifest.uuid | 2 +-
src/vdbemem.c | 1 +
3 files changed, 8 insertions(+), 7 deletions(-)
diff --git a/manifest b/manifest
index 0e69b9ce9a..506e60566b 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Do\snot\sallow\striggers\son\sshadow\stables\sunder\sdefensive\smode.
-D 2023-10-13T18:29:18.041
+C Apply\sthe\scorrect\saffinity\sto\sDEFAULT\svalues\sthat\sare\sTRUE\sor\sFALSE.
+D 2023-10-13T19:41:20.296
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -790,7 +790,7 @@ F src/vdbeInt.h 949669dfd8a41550d27dcb905b494f2ccde9a2e6c1b0b04daa1227e2e74c2b2c
F src/vdbeapi.c 4184402246172220418c0ef49ff4cf1a19ced9a4ac6c843c2f0773fb5c543f37
F src/vdbeaux.c 5b415e09b5b9d5be6c0f4fcbf18ea9d7d16f6a29ced2f14a3b2041020f63e9c1
F src/vdbeblob.c 4cf5aa130e96e3b52ba3fb54b7f9606c942ab988dbb32cb19cff4db24e06aeec
-F src/vdbemem.c 317b9f48708139db6239ade40c7980b4bc8233168383690d588dad6d8437f722
+F src/vdbemem.c ba9e21c579b58979a63d85e79088c9a9860b0ff4359f59a0db37427fb7807f66
F src/vdbesort.c 237840ca1947511fa59bd4e18b9eeae93f2af2468c34d2427b059f896230a547
F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823
F src/vdbevtab.c 2143db7db0ceed69b21422581f434baffc507a08d831565193a7a02882a1b6a7
@@ -2128,8 +2128,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 18be505c628d9b13431ca6cfe822d4aeae119c53ae08aef26a67f310a8bd7bd3
-R e5fc1c8bca38142f52450113ed88aad4
+P 44b932ff16e35814febd842d11215cf243393f173aade33ceded473598221e88
+R 47a32fc26da21940b710878ed0c79b18
U drh
-Z 4766bec696af50a50338444506de89e1
+Z 63c76777fa129ac386380e87c8a0efdb
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 70647abd29..c606ba903c 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-44b932ff16e35814febd842d11215cf243393f173aade33ceded473598221e88
\ No newline at end of file
+4958db70c8103e249748fdeffc35f1c385e2e550e8a48697b82fcd797f3016be
\ No newline at end of file
diff --git a/src/vdbemem.c b/src/vdbemem.c
index e25efc9771..27dfc73fd0 100644
--- a/src/vdbemem.c
+++ b/src/vdbemem.c
@@ -1716,6 +1716,7 @@ static int valueFromExpr(
if( pVal ){
pVal->flags = MEM_Int;
pVal->u.i = pExpr->u.zToken[4]==0;
+ sqlite3ValueApplyAffinity(pVal, affinity, enc);
}
}
From 9132b8816aba57e5f00d22637008d2eb588e768b Mon Sep 17 00:00:00 2001
From: drh <>
Date: Fri, 13 Oct 2023 22:19:23 +0000
Subject: [PATCH 12/66] Earlier detection of a host of errors in CREATE TABLE,
such the CREATE TABLE statement itself fails, rather than generating an error
on the first attempted use of the created table.
FossilOrigin-Name: 348fa7aaf7958b3fb689ed023d946064ae8d92718a497a346e95114a2410cbf5
---
manifest | 16 ++++++++--------
manifest.uuid | 2 +-
src/btree.c | 1 +
src/build.c | 10 +++++++---
src/vdbe.c | 13 +++++++++++++
5 files changed, 30 insertions(+), 12 deletions(-)
diff --git a/manifest b/manifest
index 506e60566b..dba744e3b8 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Apply\sthe\scorrect\saffinity\sto\sDEFAULT\svalues\sthat\sare\sTRUE\sor\sFALSE.
-D 2023-10-13T19:41:20.296
+C Earlier\sdetection\sof\sa\shost\sof\serrors\sin\sCREATE\sTABLE,\ssuch\sthe\sCREATE\sTABLE\nstatement\sitself\sfails,\srather\sthan\sgenerating\san\serror\son\sthe\sfirst\sattempted\nuse\sof\sthe\screated\stable.
+D 2023-10-13T22:19:23.580
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -653,10 +653,10 @@ F src/auth.c 19b7ccacae3dfba23fc6f1d0af68134fa216e9040e53b0681b4715445ea030b4
F src/backup.c 5c97e8023aab1ce14a42387eb3ae00ba5a0644569e3476f38661fa6f824c3523
F src/bitvec.c 9eac5f42c11914d5ef00a75605bb205e934f435c579687f985f1f8b0995c8645
F src/btmutex.c 79a43670447eacc651519a429f6ece9fd638563cf95b469d6891185ddae2b522
-F src/btree.c fbbbfc51d2fed03c29f20960857d97659d9c682523f32911d5a8e7c5be6436be
+F src/btree.c 63fb3269c93924e734e0586c22816effa530cee933df4aeb2b2e045de0339280
F src/btree.h 03e3356f5208bcab8eed4e094240fdac4a7f9f5ddf5e91045ce589f67d47c240
F src/btreeInt.h 91a9e0c41a0e71fa91a742ec285c63dd8dcb38b73d14fae0ed7209174ff0fdc1
-F src/build.c 4b1d6f8d2b2fcd3267ec54254ad78383c6e758f2be479f849e763947344f68d8
+F src/build.c 1a9061ab67987cfa9c7f9d52ccc862a31d37ad2b05faaf0d72eeb4b4b5ee37cf
F src/callback.c db3a45e376deff6a16c0058163fe0ae2b73a2945f3f408ca32cf74960b28d490
F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
F src/ctime.c 23331529e654be40ca97d171cbbffe9b3d4c71cc53b78fe5501230675952da8b
@@ -784,7 +784,7 @@ F src/upsert.c fa125a8d3410ce9a97b02cb50f7ae68a2476c405c76aa692d3acf6b8586e9242
F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0
F src/util.c e87f66258c37f87724f46e849572c3ece4c74ef5614ba41eb221e98f0dbc95de
F src/vacuum.c 604fcdaebe76f3497c855afcbf91b8fa5046b32de3045bab89cc008d68e40104
-F src/vdbe.c 4c688500c530ba8b62a4bb8f561be34a4afe7175fbdaa890b046cb15fb383c19
+F src/vdbe.c ae873b02ade06478b217ea38d90229dff68180d7a1fe526910b0d62a0fe0595a
F src/vdbe.h 41485521f68e9437fdb7ec4a90f9d86ab294e9bb8281e33b235915e29122cfc0
F src/vdbeInt.h 949669dfd8a41550d27dcb905b494f2ccde9a2e6c1b0b04daa1227e2e74c2b2c
F src/vdbeapi.c 4184402246172220418c0ef49ff4cf1a19ced9a4ac6c843c2f0773fb5c543f37
@@ -2128,8 +2128,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 44b932ff16e35814febd842d11215cf243393f173aade33ceded473598221e88
-R 47a32fc26da21940b710878ed0c79b18
+P 4958db70c8103e249748fdeffc35f1c385e2e550e8a48697b82fcd797f3016be
+R 341f9d0d74439d9b617811c449fe1fb8
U drh
-Z 63c76777fa129ac386380e87c8a0efdb
+Z bbfdb16e7d47445e024bdf790c59ad23
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index c606ba903c..01e58cbbf3 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-4958db70c8103e249748fdeffc35f1c385e2e550e8a48697b82fcd797f3016be
\ No newline at end of file
+348fa7aaf7958b3fb689ed023d946064ae8d92718a497a346e95114a2410cbf5
\ No newline at end of file
diff --git a/src/btree.c b/src/btree.c
index 1575d7d942..3c4f00d154 100644
--- a/src/btree.c
+++ b/src/btree.c
@@ -10708,6 +10708,7 @@ static int checkTreePage(
if( (rc = btreeGetPage(pBt, iPage, &pPage, 0))!=0 ){
checkAppendMsg(pCheck,
"unable to get the page. error code=%d", rc);
+ if( rc==SQLITE_IOERR_NOMEM ) pCheck->rc = SQLITE_NOMEM;
goto end_of_check;
}
diff --git a/src/build.c b/src/build.c
index 0920b0f224..24f5d3f96a 100644
--- a/src/build.c
+++ b/src/build.c
@@ -2921,12 +2921,16 @@ void sqlite3EndTable(
sqlite3VdbeAddParseSchemaOp(v, iDb,
sqlite3MPrintf(db, "tbl_name='%q' AND type!='trigger'", p->zName),0);
- /* Test for cycles in generated columns */
+ /* Test for cycles in generated columns and illegal expressions
+ ** in CHECK constraints and in DEFAULT clauses. */
if( p->tabFlags & TF_HasGenerated ){
- sqlite3VdbeAddOp4(v, OP_SqlExec, 0, 0, 0,
- sqlite3MPrintf(db, "SELECT*FROM\"%w\".\"%s\"",
+ sqlite3VdbeAddOp4(v, OP_SqlExec, 1, 0, 0,
+ sqlite3MPrintf(db, "SELECT*FROM\"%w\".\"%w\"",
db->aDb[iDb].zDbSName, p->zName), P4_DYNAMIC);
}
+ sqlite3VdbeAddOp4(v, OP_SqlExec, 1, 0, 0,
+ sqlite3MPrintf(db, "PRAGMA \"%w\".integrity_check(%Q)",
+ db->aDb[iDb].zDbSName, p->zName), P4_DYNAMIC);
}
/* Add the table to the in-memory representation of the database.
diff --git a/src/vdbe.c b/src/vdbe.c
index 00d365680b..ce094f9970 100644
--- a/src/vdbe.c
+++ b/src/vdbe.c
@@ -6906,18 +6906,31 @@ case OP_CreateBtree: { /* out2 */
/* Opcode: SqlExec * * * P4 *
**
** Run the SQL statement or statements specified in the P4 string.
+** Disable Auth and Trace callbacks while those statements are running if
+** P1 is true.
*/
case OP_SqlExec: {
char *zErr;
+ sqlite3_xauth xAuth;
+ u8 mTrace;
sqlite3VdbeIncrWriteCounter(p, 0);
db->nSqlExec++;
zErr = 0;
+ xAuth = db->xAuth;
+ mTrace = db->mTrace;
+ if( pOp->p1 ){
+ db->xAuth = 0;
+ db->mTrace = 0;
+ }
rc = sqlite3_exec(db, pOp->p4.z, 0, 0, &zErr);
db->nSqlExec--;
+ db->xAuth = xAuth;
+ db->mTrace = mTrace;
if( rc || zErr ){
sqlite3VdbeError(p, "%s", zErr);
sqlite3_free(zErr);
+ if( rc==SQLITE_NOMEM ) goto no_mem;
goto abort_due_to_error;
}
break;
From c84a0b2195055e76df9772b030b59fe0221cb394 Mon Sep 17 00:00:00 2001
From: drh <>
Date: Sat, 14 Oct 2023 10:54:37 +0000
Subject: [PATCH 13/66] Bug fix in sqlite3_analyzer: for databases larger than
1GiB, take into account the lock-byte page when calculating the number of
freelist pages.
FossilOrigin-Name: 26a909cdd32afee0f15968ca6f611eb259373b2a2195d0b3d47cfba103f1e6d6
---
manifest | 12 ++++++------
manifest.uuid | 2 +-
tool/spaceanal.tcl | 1 +
3 files changed, 8 insertions(+), 7 deletions(-)
diff --git a/manifest b/manifest
index dba744e3b8..3f1b563ebc 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Earlier\sdetection\sof\sa\shost\sof\serrors\sin\sCREATE\sTABLE,\ssuch\sthe\sCREATE\sTABLE\nstatement\sitself\sfails,\srather\sthan\sgenerating\san\serror\son\sthe\sfirst\sattempted\nuse\sof\sthe\screated\stable.
-D 2023-10-13T22:19:23.580
+C Bug\sfix\sin\ssqlite3_analyzer:\sfor\sdatabases\slarger\sthan\s1GiB,\stake\sinto\naccount\sthe\slock-byte\spage\swhen\scalculating\sthe\snumber\sof\sfreelist\spages.
+D 2023-10-14T10:54:37.378
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -2080,7 +2080,7 @@ F tool/showshm.c a0ab6ec32dd1f11218ca2a4018f8fb875b59414801ab8ceed8b2e69b7b45a80
F tool/showstat4.c 0682ebea7abf4d3657f53c4a243f2e7eab48eab344ed36a94bb75dcd19a5c2a1
F tool/showwal.c 65ecabae3a2dcff4116301d5a8dbb8c4964814da1b2aff6d85c806a88b71fa4e
F tool/soak1.tcl 8d407956e1a45b485a8e072470a3e629a27037fe
-F tool/spaceanal.tcl 1b5be34c6223cb1af06da2a10fb77863eb869b1962d055820b0a11cf2336ab45
+F tool/spaceanal.tcl 70c87c04cfd2e77b3e6f21c33ca768296aa8f67d4ab4874786ac8fbb28433477
F tool/speed-check.sh 72dc85b2c0484af971ee3e7d10775f72b4e771e27e162c2099b3bf25517c25fb
F tool/speedtest.tcl 06c76698485ccf597b9e7dbb1ac70706eb873355
F tool/speedtest16.c ecb6542862151c3e6509bbc00509b234562ae81e
@@ -2128,8 +2128,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 4958db70c8103e249748fdeffc35f1c385e2e550e8a48697b82fcd797f3016be
-R 341f9d0d74439d9b617811c449fe1fb8
+P 348fa7aaf7958b3fb689ed023d946064ae8d92718a497a346e95114a2410cbf5
+R 491b395fcb54d24388cea619b1896c53
U drh
-Z bbfdb16e7d47445e024bdf790c59ad23
+Z 11377a3945484d066aca86a95198dde7
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 01e58cbbf3..5e9c11cf71 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-348fa7aaf7958b3fb689ed023d946064ae8d92718a497a346e95114a2410cbf5
\ No newline at end of file
+26a909cdd32afee0f15968ca6f611eb259373b2a2195d0b3d47cfba103f1e6d6
\ No newline at end of file
diff --git a/tool/spaceanal.tcl b/tool/spaceanal.tcl
index d0c5e65e38..8fe72b99b1 100644
--- a/tool/spaceanal.tcl
+++ b/tool/spaceanal.tcl
@@ -581,6 +581,7 @@ set inuse_pgcnt [expr wide([mem eval $sql])]
set inuse_percent [percent $inuse_pgcnt $file_pgcnt]
set free_pgcnt [expr {$file_pgcnt-$inuse_pgcnt-$av_pgcnt}]
+if {$file_bytes>1073741824 && $free_pgcnt>0} {incr free_pgcnt -1}
set free_percent [percent $free_pgcnt $file_pgcnt]
set free_pgcnt2 [db one {PRAGMA freelist_count}]
set free_percent2 [percent $free_pgcnt2 $file_pgcnt]
From 2ba1acce81f9b043a3aba36fd28f372f3132a297 Mon Sep 17 00:00:00 2001
From: stephan
Date: Sat, 14 Oct 2023 12:19:59 +0000
Subject: [PATCH 14/66] Add missing JNI bindings for sqlite3_db_readonly() and
sqlite3_db_name(). Code-adjacent tweaks for the API_ARMOR audit.
FossilOrigin-Name: e5eace747ae656f1e05a346e53a2827242e57107567d2c3470e292cf0b40858d
---
ext/jni/src/c/sqlite3-jni.c | 87 ++++++++++++++++---------
ext/jni/src/c/sqlite3-jni.h | 16 +++++
ext/jni/src/org/sqlite/jni/CApi.java | 9 +++
ext/jni/src/org/sqlite/jni/Tester1.java | 8 +++
manifest | 21 +++---
manifest.uuid | 2 +-
6 files changed, 98 insertions(+), 45 deletions(-)
diff --git a/ext/jni/src/c/sqlite3-jni.c b/ext/jni/src/c/sqlite3-jni.c
index 1465c9e651..919f48bc13 100644
--- a/ext/jni/src/c/sqlite3-jni.c
+++ b/ext/jni/src/c/sqlite3-jni.c
@@ -909,7 +909,7 @@ static S3JniEnv * S3JniEnv__get(JNIEnv * const env){
**
** For purposes of certain hand-crafted JNI function bindings, we
** need a way of reporting errors which is consistent with the rest of
-** the C API, as opposed to throwing JS exceptions. To that end, this
+** the C API, as opposed to throwing Java exceptions. To that end, this
** internal-use-only function is a thin proxy around
** sqlite3ErrorWithMessage(). The intent is that it only be used from
** JNI bindings such as sqlite3_prepare_v2/v3(), and definitely not
@@ -2057,6 +2057,13 @@ static void udf_xInverse(sqlite3_context* cx, int argc,
JniDecl(jlong,JniNameSuffix)(JniArgsEnvClass, jlong jpDb){ \
return (jlong)CName(S3JniLongPtr_sqlite3(jpDb)); \
}
+/** Create a trivial JNI wrapper for (jstring CName(sqlite3*,int)). */
+#define WRAP_STR_DB_INT(JniNameSuffix,CName) \
+ JniDecl(jstring,JniNameSuffix)(JniArgsEnvClass, jlong jpDb, jint ndx){ \
+ return s3jni_utf8_to_jstring( \
+ CName(S3JniLongPtr_sqlite3(jpDb), (int)ndx), \
+ -1); \
+ }
/** Create a trivial JNI wrapper for (int CName(sqlite3_value*)). */
#define WRAP_INT_SVALUE(JniNameSuffix,CName) \
JniDecl(jint,JniNameSuffix)(JniArgsEnvClass, jlong jpSValue){ \
@@ -2082,6 +2089,7 @@ WRAP_STR_STMT_INT(1column_1origin_1name, sqlite3_column_origin_name)
WRAP_STR_STMT_INT(1column_1table_1name, sqlite3_column_table_name)
WRAP_INT_STMT_INT(1column_1type, sqlite3_column_type)
WRAP_INT_STMT(1data_1count, sqlite3_data_count)
+WRAP_STR_DB_INT(1db_1name, sqlite3_db_name)
WRAP_INT_DB(1error_1offset, sqlite3_error_offset)
WRAP_INT_DB(1extended_1errcode, sqlite3_extended_errcode)
WRAP_BOOL_DB(1get_1autocommit, sqlite3_get_autocommit)
@@ -2125,6 +2133,7 @@ WRAP_INT_SVALUE(1value_1type, sqlite3_value_type)
#undef WRAP_INT_VOID
#undef WRAP_MUTF8_VOID
#undef WRAP_STR_STMT_INT
+#undef WRAP_STR_DB_INT
S3JniApi(sqlite3_aggregate_context(),jlong,1aggregate_1context)(
JniArgsEnvClass, jobject jCx, jboolean initialize
@@ -2866,7 +2875,7 @@ static jobject s3jni_commit_rollback_hook(int isCommit, JNIEnv * const env,
S3JniDb_mutex_enter;
ps = S3JniDb_from_jlong(jpDb);
if( !ps ){
- s3jni_db_error(ps->pDb, SQLITE_NOMEM, 0);
+ s3jni_db_error(ps->pDb, SQLITE_MISUSE, 0);
S3JniDb_mutex_leave;
return 0;
}
@@ -3252,36 +3261,6 @@ error_cleanup:
return (jint)rc;
}
-S3JniApi(sqlite3_db_filename(),jstring,1db_1filename)(
- JniArgsEnvClass, jobject jDb, jstring jDbName
-){
- S3JniDb * const ps = S3JniDb_from_java(jDb);
- char *zDbName;
- jstring jRv = 0;
- int nStr = 0;
-
- if( !ps || !jDbName ){
- return 0;
- }
- zDbName = s3jni_jstring_to_utf8( jDbName, &nStr);
- if( zDbName ){
- char const * zRv = sqlite3_db_filename(ps->pDb, zDbName);
- sqlite3_free(zDbName);
- if( zRv ){
- jRv = s3jni_utf8_to_jstring( zRv, -1);
- }
- }
- return jRv;
-}
-
-S3JniApi(sqlite3_db_handle(),jobject,1db_1handle)(
- JniArgsEnvClass, jobject jpStmt
-){
- sqlite3_stmt * const pStmt = PtrGet_sqlite3_stmt(jpStmt);
- sqlite3 * const pDb = pStmt ? sqlite3_db_handle(pStmt) : 0;
- S3JniDb * const ps = pDb ? S3JniDb_from_c(pDb) : 0;
- return ps ? ps->jDb : 0;
-}
S3JniApi(sqlite3_db_config() /*for MAINDBNAME*/,
jint,1db_1config__Lorg_sqlite_jni_sqlite3_2ILjava_lang_String_2
@@ -3309,6 +3288,7 @@ S3JniApi(sqlite3_db_config() /*for MAINDBNAME*/,
}
S3JniDb_mutex_leave;
break;
+ case 0:
default:
rc = SQLITE_MISUSE;
}
@@ -3352,6 +3332,7 @@ S3JniApi(
}
break;
}
+ case 0:
default:
rc = SQLITE_MISUSE;
}
@@ -3372,6 +3353,48 @@ JniDecl(jint,1db_1config__Lorg_sqlite_jni_sqlite3_2IILorg_sqlite_jni_OutputPoint
);
}
+S3JniApi(sqlite3_db_filename(),jstring,1db_1filename)(
+ JniArgsEnvClass, jobject jDb, jstring jDbName
+){
+ S3JniDb * const ps = S3JniDb_from_java(jDb);
+ char *zDbName;
+ jstring jRv = 0;
+ int nStr = 0;
+
+ if( !ps || !jDbName ){
+ return 0;
+ }
+ zDbName = s3jni_jstring_to_utf8( jDbName, &nStr);
+ if( zDbName ){
+ char const * zRv = sqlite3_db_filename(ps->pDb, zDbName);
+ sqlite3_free(zDbName);
+ if( zRv ){
+ jRv = s3jni_utf8_to_jstring( zRv, -1);
+ }
+ }
+ return jRv;
+}
+
+S3JniApi(sqlite3_db_handle(),jobject,1db_1handle)(
+ JniArgsEnvClass, jobject jpStmt
+){
+ sqlite3_stmt * const pStmt = PtrGet_sqlite3_stmt(jpStmt);
+ sqlite3 * const pDb = pStmt ? sqlite3_db_handle(pStmt) : 0;
+ S3JniDb * const ps = pDb ? S3JniDb_from_c(pDb) : 0;
+ return ps ? ps->jDb : 0;
+}
+
+S3JniApi(sqlite3_db_readonly(),jint,1db_1readonly)(
+ JniArgsEnvClass, jobject jDb, jstring jDbName
+){
+ int rc = 0;
+ S3JniDb * const ps = S3JniDb_from_java(jDb);
+ char *zDbName = jDbName ? s3jni_jstring_to_utf8( jDbName, 0 ) : 0;
+ rc = sqlite3_db_readonly(ps ? ps->pDb : 0, zDbName);
+ sqlite3_free(zDbName);
+ return (jint)rc;
+}
+
S3JniApi(sqlite3_db_release_memory(),int,1db_1release_1memory)(
JniArgsEnvClass, jobject jDb
){
diff --git a/ext/jni/src/c/sqlite3-jni.h b/ext/jni/src/c/sqlite3-jni.h
index 6d38adf06e..4195ad6dba 100644
--- a/ext/jni/src/c/sqlite3-jni.h
+++ b/ext/jni/src/c/sqlite3-jni.h
@@ -1307,6 +1307,14 @@ JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1db_1config__Lorg_sqlite
JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1db_1config__Lorg_sqlite_jni_sqlite3_2ILjava_lang_String_2
(JNIEnv *, jclass, jobject, jint, jstring);
+/*
+ * Class: org_sqlite_jni_CApi
+ * Method: sqlite3_db_name
+ * Signature: (JI)Ljava/lang/String;
+ */
+JNIEXPORT jstring JNICALL Java_org_sqlite_jni_CApi_sqlite3_1db_1name
+ (JNIEnv *, jclass, jlong, jint);
+
/*
* Class: org_sqlite_jni_CApi
* Method: sqlite3_db_filename
@@ -1323,6 +1331,14 @@ JNIEXPORT jstring JNICALL Java_org_sqlite_jni_CApi_sqlite3_1db_1filename
JNIEXPORT jobject JNICALL Java_org_sqlite_jni_CApi_sqlite3_1db_1handle
(JNIEnv *, jclass, jobject);
+/*
+ * Class: org_sqlite_jni_CApi
+ * Method: sqlite3_db_readonly
+ * Signature: (Lorg/sqlite/jni/sqlite3;Ljava/lang/String;)I
+ */
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1db_1readonly
+ (JNIEnv *, jclass, jobject, jstring);
+
/*
* Class: org_sqlite_jni_CApi
* Method: sqlite3_db_release_memory
diff --git a/ext/jni/src/org/sqlite/jni/CApi.java b/ext/jni/src/org/sqlite/jni/CApi.java
index 8149d624ad..90e8339799 100644
--- a/ext/jni/src/org/sqlite/jni/CApi.java
+++ b/ext/jni/src/org/sqlite/jni/CApi.java
@@ -811,12 +811,21 @@ final class CApi {
@NotNull sqlite3 db, int op, @NotNull String val
);
+ private static native String sqlite3_db_name(@NotNull long ptrToDb, int ndx);
+
+ public static String sqlite3_db_name(@NotNull sqlite3 db, int ndx){
+ return null==db ? null : sqlite3_db_name(db.getNativePointer(), ndx);
+ }
+
+
public static native String sqlite3_db_filename(
@NotNull sqlite3 db, @NotNull String dbName
);
public static native sqlite3 sqlite3_db_handle(@NotNull sqlite3_stmt stmt);
+ public static native int sqlite3_db_readonly(@NotNull sqlite3 db, String dbName);
+
public static native int sqlite3_db_release_memory(sqlite3 db);
public static native int sqlite3_db_status(
diff --git a/ext/jni/src/org/sqlite/jni/Tester1.java b/ext/jni/src/org/sqlite/jni/Tester1.java
index 0ff1c98dbe..4d9061538b 100644
--- a/ext/jni/src/org/sqlite/jni/Tester1.java
+++ b/ext/jni/src/org/sqlite/jni/Tester1.java
@@ -255,6 +255,11 @@ public class Tester1 implements Runnable {
and this call is here to ensure that the build fails
if it cannot find both names. */;
+ affirm( 0==sqlite3_db_readonly(db,"main") );
+ affirm( 0==sqlite3_db_readonly(db,null) );
+ affirm( 0>sqlite3_db_readonly(db,"nope") );
+ affirm( 0>sqlite3_db_readonly(null,null) );
+
// These interrupt checks are only to make sure that the JNI binding
// has the proper exported symbol names. They don't actually test
// anything useful.
@@ -1028,8 +1033,11 @@ public class Tester1 implements Runnable {
affirm( 0 == rc );
affirm( outDb.get() != db1 );
final sqlite3 db2 = outDb.get();
+
+ affirm( "main".equals( sqlite3_db_name(db1, 0) ) );
rc = sqlite3_db_config(db1, SQLITE_DBCONFIG_MAINDBNAME, "foo");
affirm( sqlite3_db_filename(db1, "foo").endsWith(dbName) );
+ affirm( "foo".equals( sqlite3_db_name(db1, 0) ) );
final ValueHolder xBusyCalled = new ValueHolder<>(0);
BusyHandlerCallback handler = new BusyHandlerCallback(){
diff --git a/manifest b/manifest
index f9baa60087..92c7ea1eed 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Round\sone\sof\san\saudit\sfor\sSQLITE_ENABLE_API_ARMOR\sfor\sfunctions\sexposed\sby\sJNI\sand\sthose\sfunctions\smissing\sarmor,\sas\s[forum:5e3fc453a69b49ca|reported\sin\sseveral\sforum\sposts].
-D 2023-10-13T12:48:35.298
+C Add\smissing\sJNI\sbindings\sfor\ssqlite3_db_readonly()\sand\ssqlite3_db_name().\sCode-adjacent\stweaks\sfor\sthe\sAPI_ARMOR\saudit.
+D 2023-10-14T12:19:59.876
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -238,14 +238,14 @@ F ext/icu/sqliteicu.h fa373836ed5a1ee7478bdf8a1650689294e41d0c89c1daab26e9ae78a3
F ext/jni/GNUmakefile 6da240c9a11701f3ed569384cd15ef611e8b3c5e3897d265923b14bf0e1eb272
F ext/jni/README.md ef9ac115e97704ea995d743b4a8334e23c659e5534c3b64065a5405256d5f2f4
F ext/jni/jar-dist.make 030aaa4ae71dd86e4ec5e7c1e6cd86f9dfa47c4592c070d2e35157e42498e1fa
-F ext/jni/src/c/sqlite3-jni.c eabd48ced29954fb4f6173c4f350f7f1fce218ce19f48a75367cb560cf2da77e
-F ext/jni/src/c/sqlite3-jni.h be1fdff7ab3a2bb357197271c8ac5d2bf6ff59380c106dde3a13be88724bad22
+F ext/jni/src/c/sqlite3-jni.c 2a01d42df24718d69eafe836643de272b14fca57135ce0f1f6521fecf9002e29
+F ext/jni/src/c/sqlite3-jni.h 8bd34a6fe3b51059690be31ac5bd6e454a738dd1ff9916f490e05cf63c4f8e37
F ext/jni/src/org/sqlite/jni/AbstractCollationCallback.java 95e88ba04f4aac51ffec65693e878e234088b2f21b387f4e4285c8b72b33e436
F ext/jni/src/org/sqlite/jni/AggregateFunction.java 7312486bc65fecdb91753c0a4515799194e031f45edbe16a6373cea18f404dc4
F ext/jni/src/org/sqlite/jni/AuthorizerCallback.java fde5f758ad170ca45ae00b12194c8ba8d8f3090bd64cc3e002dd9c5e7dff8568
F ext/jni/src/org/sqlite/jni/AutoExtensionCallback.java c0fbfd3779fc92982c7935325a7484dee43eeb80d716989ed31218f453addb94
F ext/jni/src/org/sqlite/jni/BusyHandlerCallback.java 4cb7fc70efd55583fed6033c34a8719da42975ca97ef4781dda0b9f6cc8ec2e8
-F ext/jni/src/org/sqlite/jni/CApi.java c1dde485a3a3f43c46c8d9c527f9ba5bf303fe0409b2c0de253fb7b6e1055f7e
+F ext/jni/src/org/sqlite/jni/CApi.java 6f878d291642568a06d9a36c15b420f5f867dcc44cee0cc56e8f02b542f67ec4
F ext/jni/src/org/sqlite/jni/CallbackProxy.java 064a8a00e4c63cc501c30504f93ca996d422c5f010067f969b2d0a10f0868153
F ext/jni/src/org/sqlite/jni/CollationCallback.java 8cf57cb014a645ecc12609eed17308852a597bc5e83d82a4fdb90f7fadc25f9d
F ext/jni/src/org/sqlite/jni/CollationNeededCallback.java 0c62245e000d5db52576c728cac20f6a31f31f5cf40ca4cbcd64b22964e82ae5
@@ -265,7 +265,7 @@ F ext/jni/src/org/sqlite/jni/ScalarFunction.java 6d387bb499fbe3bc13c53315335233d
F ext/jni/src/org/sqlite/jni/Sqlite.java 1617ea2bf3dfa493b7f031a3187cbfd6837c39bc1d406c4b3edcf9aab941639d
F ext/jni/src/org/sqlite/jni/SqliteException.java e17500e8bca2c68c260d8d0163fe4b7dc8bd0b1b90211201325c4a5566ce75ca
F ext/jni/src/org/sqlite/jni/TableColumnMetadata.java 54511b4297fa28dcb3f49b24035e34ced10e3fd44fd0e458e784f4d6b0096dab
-F ext/jni/src/org/sqlite/jni/Tester1.java f7b85fe24cf6c3e43bdf7e390617657e8137359f804d76921829c2a8c41b6df1
+F ext/jni/src/org/sqlite/jni/Tester1.java 92d4e9dcf9268e6e2588c1cbd808454926ee40287eb9126b0e5eb823918e538d
F ext/jni/src/org/sqlite/jni/Tester2.java 70e005d41060e398ec0f69bd39a8e1c376fd51f81629cf25e877889ec9cb6ec6
F ext/jni/src/org/sqlite/jni/TesterFts5.java d60fe9944a81156b3b5325dd1b0e8e92a1547468f39fd1266d06f7bb6a95fa70
F ext/jni/src/org/sqlite/jni/TraceV2Callback.java f157edd9c72e7d2243c169061487cd7bb51a0d50f3ac976dbcbbacf748ab1fc2
@@ -2128,11 +2128,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 2e968114fd0e60eebcc088dec02684e10b06ac1ec42d6bedb5287362f5cbf032
-R 64d7e862f198f312cf375ff0e1b4824a
-T *branch * api-armor-audit
-T *sym-api-armor-audit *
-T -sym-trunk * Cancelled\sby\sbranch.
+P 8c25c4b18ad07861bf0e47f99f3db04b569b9b859ad0690602f748ddf3576939
+R 540c998e288c6bc086b36558f89d784a
U stephan
-Z fb0f8b82a9c86be7bcd5823447ca13df
+Z 6aa47de4921539f80453f46d0771c8db
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 7b111488b3..8cb3c75d27 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-8c25c4b18ad07861bf0e47f99f3db04b569b9b859ad0690602f748ddf3576939
\ No newline at end of file
+e5eace747ae656f1e05a346e53a2827242e57107567d2c3470e292cf0b40858d
\ No newline at end of file
From eaebd7fb6aca0762ff85eaf3faaa574fbf7249cb Mon Sep 17 00:00:00 2001
From: stephan
Date: Sat, 14 Oct 2023 12:20:55 +0000
Subject: [PATCH 15/66] Extend API_ARMOR checks on
sqlite3_commit/rollback_hook() to include a check for the callback pointer.
FossilOrigin-Name: f6cd88e6b234560f729ff00da86144a0121ad96d5a07d227c9ffa3f43c22f72d
---
manifest | 12 ++++++------
manifest.uuid | 2 +-
src/main.c | 4 ++--
3 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/manifest b/manifest
index 92c7ea1eed..23f9b55750 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\smissing\sJNI\sbindings\sfor\ssqlite3_db_readonly()\sand\ssqlite3_db_name().\sCode-adjacent\stweaks\sfor\sthe\sAPI_ARMOR\saudit.
-D 2023-10-14T12:19:59.876
+C Extend\sAPI_ARMOR\schecks\son\ssqlite3_commit/rollback_hook()\sto\sinclude\sa\scheck\sfor\sthe\scallback\spointer.
+D 2023-10-14T12:20:55.441
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -677,7 +677,7 @@ F src/insert.c 3f0a94082d978bbdd33c38fefea15346c6c6bffb70bc645a71dc0f1f87dd3276
F src/json.c 799430345d16fed21713416318e6ca616f1264224f708555f387bfa2ab2496c7
F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa
F src/loadext.c 7d56c6f28aaf9b42e2772289e0d0a12a77b57c2baed021dbfd1fcafec69c156a
-F src/main.c 7a91b372dd1bada07c5b5e36082dc0d695161c3807efe2386f563a5b32446ae6
+F src/main.c be4dbe864b9ae973f5611aa6fb478541235ea3eef64f7d3d37bbe96334f556a3
F src/malloc.c f016922435dc7d1f1f5083a03338a3e91f8c67ce2c5bdcfa4cdef62e612f5fcc
F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
F src/mem1.c 3bb59158c38e05f6270e761a9f435bf19827a264c13d1631c58b84bdc96d73b2
@@ -2128,8 +2128,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 8c25c4b18ad07861bf0e47f99f3db04b569b9b859ad0690602f748ddf3576939
-R 540c998e288c6bc086b36558f89d784a
+P e5eace747ae656f1e05a346e53a2827242e57107567d2c3470e292cf0b40858d
+R 30e2307f7d3debecac19515663c6942d
U stephan
-Z 6aa47de4921539f80453f46d0771c8db
+Z 7173d279e961708051d9b4ee103a0383
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 8cb3c75d27..8dd812c93b 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-e5eace747ae656f1e05a346e53a2827242e57107567d2c3470e292cf0b40858d
\ No newline at end of file
+f6cd88e6b234560f729ff00da86144a0121ad96d5a07d227c9ffa3f43c22f72d
\ No newline at end of file
diff --git a/src/main.c b/src/main.c
index 4ddf7e24d3..e764379126 100644
--- a/src/main.c
+++ b/src/main.c
@@ -2294,7 +2294,7 @@ void *sqlite3_commit_hook(
void *pOld;
#ifdef SQLITE_ENABLE_API_ARMOR
- if( !sqlite3SafetyCheckOk(db) ){
+ if( !sqlite3SafetyCheckOk(db) || xCallback==0 ){
(void)SQLITE_MISUSE_BKPT;
return 0;
}
@@ -2344,7 +2344,7 @@ void *sqlite3_rollback_hook(
void *pRet;
#ifdef SQLITE_ENABLE_API_ARMOR
- if( !sqlite3SafetyCheckOk(db) ){
+ if( !sqlite3SafetyCheckOk(db) || xCallback==0 ){
(void)SQLITE_MISUSE_BKPT;
return 0;
}
From 6d035d481f6dd137e30bf30c811d5379894ae34b Mon Sep 17 00:00:00 2001
From: stephan
Date: Sat, 14 Oct 2023 12:40:57 +0000
Subject: [PATCH 16/66] Bring JNI-side sqlite3_last_insert_rowid() and
sqlite3_table_column_metadata() in line with the core's NULL handling.
FossilOrigin-Name: c2afc1c2a2fc9bdf3d7b7701004e0fa40965cf8c6b7cf44b46f2ca37cfa1d2aa
---
ext/jni/src/c/sqlite3-jni.c | 14 +++++---------
ext/jni/src/org/sqlite/jni/Tester1.java | 13 ++++++++++++-
manifest | 14 +++++++-------
manifest.uuid | 2 +-
4 files changed, 25 insertions(+), 18 deletions(-)
diff --git a/ext/jni/src/c/sqlite3-jni.c b/ext/jni/src/c/sqlite3-jni.c
index 919f48bc13..8ff1da193a 100644
--- a/ext/jni/src/c/sqlite3-jni.c
+++ b/ext/jni/src/c/sqlite3-jni.c
@@ -3583,12 +3583,7 @@ S3JniApi(sqlite3_keyword_name(),jstring,1keyword_1name)(
S3JniApi(sqlite3_last_insert_rowid(),jlong,1last_1insert_1rowid)(
JniArgsEnvClass, jobject jpDb
){
- jlong rc = 0;
- sqlite3 * const pDb = PtrGet_sqlite3(jpDb);
- if( pDb ){
- rc = (jlong)sqlite3_last_insert_rowid(pDb);
- }
- return rc;
+ return (jlong)sqlite3_last_insert_rowid(PtrGet_sqlite3(jpDb));
}
S3JniApi(sqlite3_limit(),jint,1limit)(
@@ -4564,11 +4559,12 @@ S3JniApi(sqlite3_table_column_metadata(),int,1table_1column_1metadata)(
int pNotNull = 0, pPrimaryKey = 0, pAutoinc = 0;
int rc;
- if( !db || !jDbName || !jTableName || !jColumnName ) return SQLITE_MISUSE;
+ if( !db || !jDbName || !jTableName ) return SQLITE_MISUSE;
zDbName = s3jni_jstring_to_utf8(jDbName,0);
zTableName = zDbName ? s3jni_jstring_to_utf8(jTableName,0) : 0;
- zColumnName = zTableName ? s3jni_jstring_to_utf8(jColumnName,0) : 0;
- rc = zColumnName
+ zColumnName = (zTableName && jColumnName)
+ ? s3jni_jstring_to_utf8(jColumnName,0) : 0;
+ rc = zTableName
? sqlite3_table_column_metadata(db, zDbName, zTableName,
zColumnName, &pzDataType, &pzCollSeq,
&pNotNull, &pPrimaryKey, &pAutoinc)
diff --git a/ext/jni/src/org/sqlite/jni/Tester1.java b/ext/jni/src/org/sqlite/jni/Tester1.java
index 4d9061538b..d5dffc2d8a 100644
--- a/ext/jni/src/org/sqlite/jni/Tester1.java
+++ b/ext/jni/src/org/sqlite/jni/Tester1.java
@@ -259,6 +259,7 @@ public class Tester1 implements Runnable {
affirm( 0==sqlite3_db_readonly(db,null) );
affirm( 0>sqlite3_db_readonly(db,"nope") );
affirm( 0>sqlite3_db_readonly(null,null) );
+ affirm( 0==sqlite3_last_insert_rowid(null) );
// These interrupt checks are only to make sure that the JNI binding
// has the proper exported symbol names. They don't actually test
@@ -1464,7 +1465,7 @@ public class Tester1 implements Runnable {
affirm( "noCase".equals(zCollSeq.value) );
affirm( "duck".equals(zDataType.value) );
- final TableColumnMetadata m =
+ TableColumnMetadata m =
sqlite3_table_column_metadata(db, "main", "t", "a");
affirm( null != m );
affirm( bPrimaryKey.value == m.isPrimaryKey() );
@@ -1474,6 +1475,16 @@ public class Tester1 implements Runnable {
affirm( zDataType.value.equals(m.getDataType()) );
affirm( null == sqlite3_table_column_metadata(db, "nope", "t", "a") );
+ affirm( null == sqlite3_table_column_metadata(db, "main", "nope", "a") );
+
+ m = sqlite3_table_column_metadata(db, "main", "t", null)
+ /* Check only for existence of table */;
+ affirm( null != m );
+ affirm( m.isPrimaryKey() );
+ affirm( !m.isAutoincrement() );
+ affirm( !m.isNotNull() );
+ affirm( "BINARY".equalsIgnoreCase(m.getCollation()) );
+ affirm( "INTEGER".equalsIgnoreCase(m.getDataType()) );
sqlite3_close_v2(db);
}
diff --git a/manifest b/manifest
index 23f9b55750..9724e9f611 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Extend\sAPI_ARMOR\schecks\son\ssqlite3_commit/rollback_hook()\sto\sinclude\sa\scheck\sfor\sthe\scallback\spointer.
-D 2023-10-14T12:20:55.441
+C Bring\sJNI-side\ssqlite3_last_insert_rowid()\sand\ssqlite3_table_column_metadata()\sin\sline\swith\sthe\score's\sNULL\shandling.
+D 2023-10-14T12:40:57.346
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -238,7 +238,7 @@ F ext/icu/sqliteicu.h fa373836ed5a1ee7478bdf8a1650689294e41d0c89c1daab26e9ae78a3
F ext/jni/GNUmakefile 6da240c9a11701f3ed569384cd15ef611e8b3c5e3897d265923b14bf0e1eb272
F ext/jni/README.md ef9ac115e97704ea995d743b4a8334e23c659e5534c3b64065a5405256d5f2f4
F ext/jni/jar-dist.make 030aaa4ae71dd86e4ec5e7c1e6cd86f9dfa47c4592c070d2e35157e42498e1fa
-F ext/jni/src/c/sqlite3-jni.c 2a01d42df24718d69eafe836643de272b14fca57135ce0f1f6521fecf9002e29
+F ext/jni/src/c/sqlite3-jni.c 3d4640ae9c128326e0f65dade4732734771596371e398a7ae95c4d33ef24928a
F ext/jni/src/c/sqlite3-jni.h 8bd34a6fe3b51059690be31ac5bd6e454a738dd1ff9916f490e05cf63c4f8e37
F ext/jni/src/org/sqlite/jni/AbstractCollationCallback.java 95e88ba04f4aac51ffec65693e878e234088b2f21b387f4e4285c8b72b33e436
F ext/jni/src/org/sqlite/jni/AggregateFunction.java 7312486bc65fecdb91753c0a4515799194e031f45edbe16a6373cea18f404dc4
@@ -265,7 +265,7 @@ F ext/jni/src/org/sqlite/jni/ScalarFunction.java 6d387bb499fbe3bc13c53315335233d
F ext/jni/src/org/sqlite/jni/Sqlite.java 1617ea2bf3dfa493b7f031a3187cbfd6837c39bc1d406c4b3edcf9aab941639d
F ext/jni/src/org/sqlite/jni/SqliteException.java e17500e8bca2c68c260d8d0163fe4b7dc8bd0b1b90211201325c4a5566ce75ca
F ext/jni/src/org/sqlite/jni/TableColumnMetadata.java 54511b4297fa28dcb3f49b24035e34ced10e3fd44fd0e458e784f4d6b0096dab
-F ext/jni/src/org/sqlite/jni/Tester1.java 92d4e9dcf9268e6e2588c1cbd808454926ee40287eb9126b0e5eb823918e538d
+F ext/jni/src/org/sqlite/jni/Tester1.java 7c17a33e044a24d590007e1b4581b8d1e07653ab3f76fc66571b78905d6391b1
F ext/jni/src/org/sqlite/jni/Tester2.java 70e005d41060e398ec0f69bd39a8e1c376fd51f81629cf25e877889ec9cb6ec6
F ext/jni/src/org/sqlite/jni/TesterFts5.java d60fe9944a81156b3b5325dd1b0e8e92a1547468f39fd1266d06f7bb6a95fa70
F ext/jni/src/org/sqlite/jni/TraceV2Callback.java f157edd9c72e7d2243c169061487cd7bb51a0d50f3ac976dbcbbacf748ab1fc2
@@ -2128,8 +2128,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P e5eace747ae656f1e05a346e53a2827242e57107567d2c3470e292cf0b40858d
-R 30e2307f7d3debecac19515663c6942d
+P f6cd88e6b234560f729ff00da86144a0121ad96d5a07d227c9ffa3f43c22f72d
+R d3dd2ae5a14dfec019fa6886cd0b6713
U stephan
-Z 7173d279e961708051d9b4ee103a0383
+Z a2340dd7e5a63c935f9d8e1e3bbbf4f4
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 8dd812c93b..6852d93cfa 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-f6cd88e6b234560f729ff00da86144a0121ad96d5a07d227c9ffa3f43c22f72d
\ No newline at end of file
+c2afc1c2a2fc9bdf3d7b7701004e0fa40965cf8c6b7cf44b46f2ca37cfa1d2aa
\ No newline at end of file
From 067a13c395494a8ee2f1624c3eb9b96d60ad6888 Mon Sep 17 00:00:00 2001
From: stephan
Date: Sat, 14 Oct 2023 12:45:11 +0000
Subject: [PATCH 17/66] Revert [f6cd88e6b234] - the NULL callback case is
perfectly legal.
FossilOrigin-Name: 718ab67607895176e529eb7469832d262a347d030e83e7ee66d3b4704bf933de
---
manifest | 13 +++++++------
manifest.uuid | 2 +-
src/main.c | 4 ++--
3 files changed, 10 insertions(+), 9 deletions(-)
diff --git a/manifest b/manifest
index 9724e9f611..4e35daee46 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Bring\sJNI-side\ssqlite3_last_insert_rowid()\sand\ssqlite3_table_column_metadata()\sin\sline\swith\sthe\score's\sNULL\shandling.
-D 2023-10-14T12:40:57.346
+C Revert\s[f6cd88e6b234]\s-\sthe\sNULL\scallback\scase\sis\sperfectly\slegal.
+D 2023-10-14T12:45:11.220
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -677,7 +677,7 @@ F src/insert.c 3f0a94082d978bbdd33c38fefea15346c6c6bffb70bc645a71dc0f1f87dd3276
F src/json.c 799430345d16fed21713416318e6ca616f1264224f708555f387bfa2ab2496c7
F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa
F src/loadext.c 7d56c6f28aaf9b42e2772289e0d0a12a77b57c2baed021dbfd1fcafec69c156a
-F src/main.c be4dbe864b9ae973f5611aa6fb478541235ea3eef64f7d3d37bbe96334f556a3
+F src/main.c 7a91b372dd1bada07c5b5e36082dc0d695161c3807efe2386f563a5b32446ae6
F src/malloc.c f016922435dc7d1f1f5083a03338a3e91f8c67ce2c5bdcfa4cdef62e612f5fcc
F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
F src/mem1.c 3bb59158c38e05f6270e761a9f435bf19827a264c13d1631c58b84bdc96d73b2
@@ -2128,8 +2128,9 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P f6cd88e6b234560f729ff00da86144a0121ad96d5a07d227c9ffa3f43c22f72d
-R d3dd2ae5a14dfec019fa6886cd0b6713
+P c2afc1c2a2fc9bdf3d7b7701004e0fa40965cf8c6b7cf44b46f2ca37cfa1d2aa
+Q -f6cd88e6b234560f729ff00da86144a0121ad96d5a07d227c9ffa3f43c22f72d
+R e425a976b909e6e9442ecfbc934213d4
U stephan
-Z a2340dd7e5a63c935f9d8e1e3bbbf4f4
+Z d7f2236cb14e3dff65c1d3d5c7a3103b
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 6852d93cfa..b0d12201ae 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-c2afc1c2a2fc9bdf3d7b7701004e0fa40965cf8c6b7cf44b46f2ca37cfa1d2aa
\ No newline at end of file
+718ab67607895176e529eb7469832d262a347d030e83e7ee66d3b4704bf933de
\ No newline at end of file
diff --git a/src/main.c b/src/main.c
index e764379126..4ddf7e24d3 100644
--- a/src/main.c
+++ b/src/main.c
@@ -2294,7 +2294,7 @@ void *sqlite3_commit_hook(
void *pOld;
#ifdef SQLITE_ENABLE_API_ARMOR
- if( !sqlite3SafetyCheckOk(db) || xCallback==0 ){
+ if( !sqlite3SafetyCheckOk(db) ){
(void)SQLITE_MISUSE_BKPT;
return 0;
}
@@ -2344,7 +2344,7 @@ void *sqlite3_rollback_hook(
void *pRet;
#ifdef SQLITE_ENABLE_API_ARMOR
- if( !sqlite3SafetyCheckOk(db) || xCallback==0 ){
+ if( !sqlite3SafetyCheckOk(db) ){
(void)SQLITE_MISUSE_BKPT;
return 0;
}
From a17f63290cd2a13cef5b34cbb84a7ce87de27545 Mon Sep 17 00:00:00 2001
From: stephan
Date: Sat, 14 Oct 2023 13:24:30 +0000
Subject: [PATCH 18/66] Add column name to API_ARMOR check in
sqlite3_blob_open() to avoid a null-pointer deref.
FossilOrigin-Name: 0114a6622afc4588c47e98d804340449417b603dc4831513eab4d8e4ccb15d42
---
manifest | 13 ++++++-------
manifest.uuid | 2 +-
src/vdbeblob.c | 2 +-
3 files changed, 8 insertions(+), 9 deletions(-)
diff --git a/manifest b/manifest
index 4e35daee46..152bb69a2f 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Revert\s[f6cd88e6b234]\s-\sthe\sNULL\scallback\scase\sis\sperfectly\slegal.
-D 2023-10-14T12:45:11.220
+C Add\scolumn\sname\sto\sAPI_ARMOR\scheck\sin\ssqlite3_blob_open()\sto\savoid\sa\snull-pointer\sderef.
+D 2023-10-14T13:24:30.111
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -789,7 +789,7 @@ F src/vdbe.h 41485521f68e9437fdb7ec4a90f9d86ab294e9bb8281e33b235915e29122cfc0
F src/vdbeInt.h 949669dfd8a41550d27dcb905b494f2ccde9a2e6c1b0b04daa1227e2e74c2b2c
F src/vdbeapi.c be7d88a05df51cb3940304f74e4b0534817b51213b3406143a67eecd6f82fe21
F src/vdbeaux.c 5b415e09b5b9d5be6c0f4fcbf18ea9d7d16f6a29ced2f14a3b2041020f63e9c1
-F src/vdbeblob.c 4cf5aa130e96e3b52ba3fb54b7f9606c942ab988dbb32cb19cff4db24e06aeec
+F src/vdbeblob.c 13f9287b55b6356b4b1845410382d6bede203ceb29ef69388a4a3d007ffacbe5
F src/vdbemem.c 317b9f48708139db6239ade40c7980b4bc8233168383690d588dad6d8437f722
F src/vdbesort.c 237840ca1947511fa59bd4e18b9eeae93f2af2468c34d2427b059f896230a547
F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823
@@ -2128,9 +2128,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P c2afc1c2a2fc9bdf3d7b7701004e0fa40965cf8c6b7cf44b46f2ca37cfa1d2aa
-Q -f6cd88e6b234560f729ff00da86144a0121ad96d5a07d227c9ffa3f43c22f72d
-R e425a976b909e6e9442ecfbc934213d4
+P 718ab67607895176e529eb7469832d262a347d030e83e7ee66d3b4704bf933de
+R 6939314c5aa83ebb51a4869d1b741b9d
U stephan
-Z d7f2236cb14e3dff65c1d3d5c7a3103b
+Z 1c92c68280e405080d393332e7ff98bd
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index b0d12201ae..ec21d78cdc 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-718ab67607895176e529eb7469832d262a347d030e83e7ee66d3b4704bf933de
\ No newline at end of file
+0114a6622afc4588c47e98d804340449417b603dc4831513eab4d8e4ccb15d42
\ No newline at end of file
diff --git a/src/vdbeblob.c b/src/vdbeblob.c
index ea6f016e3e..522447dbc1 100644
--- a/src/vdbeblob.c
+++ b/src/vdbeblob.c
@@ -142,7 +142,7 @@ int sqlite3_blob_open(
#endif
*ppBlob = 0;
#ifdef SQLITE_ENABLE_API_ARMOR
- if( !sqlite3SafetyCheckOk(db) || zTable==0 ){
+ if( !sqlite3SafetyCheckOk(db) || zTable==0 || zColumn==0 ){
return SQLITE_MISUSE_BKPT;
}
#endif
From 7a54b1269569abfaac978c0f77d145a4acd5caa7 Mon Sep 17 00:00:00 2001
From: stephan
Date: Sat, 14 Oct 2023 14:53:18 +0000
Subject: [PATCH 19/66] More API_ARMOR additions.
FossilOrigin-Name: 78ebf838f645742f87733665cd72af736df345683b27377a2c8310c893b1769d
---
manifest | 12 ++++++------
manifest.uuid | 2 +-
src/vdbeapi.c | 32 ++++++++++++++++++++++++++++++--
3 files changed, 37 insertions(+), 9 deletions(-)
diff --git a/manifest b/manifest
index 152bb69a2f..6fb15f78f3 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\scolumn\sname\sto\sAPI_ARMOR\scheck\sin\ssqlite3_blob_open()\sto\savoid\sa\snull-pointer\sderef.
-D 2023-10-14T13:24:30.111
+C More\sAPI_ARMOR\sadditions.
+D 2023-10-14T14:53:18.394
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -787,7 +787,7 @@ F src/vacuum.c 604fcdaebe76f3497c855afcbf91b8fa5046b32de3045bab89cc008d68e40104
F src/vdbe.c cd112eb00d20fc5cc44f631d0e713838602637328b0f127c2f3c2aa8cea3cc91
F src/vdbe.h 41485521f68e9437fdb7ec4a90f9d86ab294e9bb8281e33b235915e29122cfc0
F src/vdbeInt.h 949669dfd8a41550d27dcb905b494f2ccde9a2e6c1b0b04daa1227e2e74c2b2c
-F src/vdbeapi.c be7d88a05df51cb3940304f74e4b0534817b51213b3406143a67eecd6f82fe21
+F src/vdbeapi.c dbada91cc9f2e0b76ad4c76aad7b92fbe80c4a439b5dd8d7fa990d4e34b9831c
F src/vdbeaux.c 5b415e09b5b9d5be6c0f4fcbf18ea9d7d16f6a29ced2f14a3b2041020f63e9c1
F src/vdbeblob.c 13f9287b55b6356b4b1845410382d6bede203ceb29ef69388a4a3d007ffacbe5
F src/vdbemem.c 317b9f48708139db6239ade40c7980b4bc8233168383690d588dad6d8437f722
@@ -2128,8 +2128,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 718ab67607895176e529eb7469832d262a347d030e83e7ee66d3b4704bf933de
-R 6939314c5aa83ebb51a4869d1b741b9d
+P 0114a6622afc4588c47e98d804340449417b603dc4831513eab4d8e4ccb15d42
+R 376130abd753bb410df401995b876336
U stephan
-Z 1c92c68280e405080d393332e7ff98bd
+Z fbd9ca46d7a725fcd4bdd4a5ef9f230a
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index ec21d78cdc..a9523053f7 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-0114a6622afc4588c47e98d804340449417b603dc4831513eab4d8e4ccb15d42
\ No newline at end of file
+78ebf838f645742f87733665cd72af736df345683b27377a2c8310c893b1769d
\ No newline at end of file
diff --git a/src/vdbeapi.c b/src/vdbeapi.c
index f8e66df87a..60798e9aa4 100644
--- a/src/vdbeapi.c
+++ b/src/vdbeapi.c
@@ -547,7 +547,16 @@ void sqlite3_result_text16le(
}
#endif /* SQLITE_OMIT_UTF16 */
void sqlite3_result_value(sqlite3_context *pCtx, sqlite3_value *pValue){
- Mem *pOut = pCtx->pOut;
+ Mem *pOut;
+
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( pCtx==0 ) return;
+ if( pValue==0 ){
+ sqlite3_result_null(pCtx);
+ return;
+ }
+#endif
+ pOut = pCtx->pOut;
assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) );
sqlite3VdbeMemCopy(pOut, pValue);
sqlite3VdbeChangeEncoding(pOut, pCtx->enc);
@@ -845,7 +854,11 @@ int sqlite3_step(sqlite3_stmt *pStmt){
** pointer to it.
*/
void *sqlite3_user_data(sqlite3_context *p){
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( p==0 ) return 0;
+#else
assert( p && p->pFunc );
+#endif
return p->pFunc->pUserData;
}
@@ -860,7 +873,11 @@ void *sqlite3_user_data(sqlite3_context *p){
** application defined function.
*/
sqlite3 *sqlite3_context_db_handle(sqlite3_context *p){
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( p==0 ) return 0;
+#else
assert( p && p->pOut );
+#endif
return p->pOut->db;
}
@@ -879,7 +896,11 @@ sqlite3 *sqlite3_context_db_handle(sqlite3_context *p){
** value, as a signal to the xUpdate routine that the column is unchanged.
*/
int sqlite3_vtab_nochange(sqlite3_context *p){
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( p==0 ) return 0;
+#else
assert( p );
+#endif
return sqlite3_value_nochange(p->pOut);
}
@@ -1038,6 +1059,9 @@ void *sqlite3_aggregate_context(sqlite3_context *p, int nByte){
void *sqlite3_get_auxdata(sqlite3_context *pCtx, int iArg){
AuxData *pAuxData;
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( pCtx==0 ) return 0;
+#endif
assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) );
#if SQLITE_ENABLE_STAT4
if( pCtx->pVdbe==0 ) return 0;
@@ -1070,8 +1094,12 @@ void sqlite3_set_auxdata(
void (*xDelete)(void*)
){
AuxData *pAuxData;
- Vdbe *pVdbe = pCtx->pVdbe;
+ Vdbe *pVdbe;
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( pCtx==0 ) return;
+#endif
+ pVdbe= pCtx->pVdbe;
assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) );
#ifdef SQLITE_ENABLE_STAT4
if( pVdbe==0 ) goto failed;
From c76e4509084e184cc6fa59edbff3cb28dbda8d99 Mon Sep 17 00:00:00 2001
From: stephan
Date: Sat, 14 Oct 2023 16:29:36 +0000
Subject: [PATCH 20/66] Add API_ARMOR support to the sqlite3_result_...()
family of functions and sqlite3_bind_zeroblob64().
FossilOrigin-Name: afabe3e35a66625527e2881749cdb6e13300888ab57bc0f05889d0e3ee203d73
---
manifest | 12 ++++----
manifest.uuid | 2 +-
src/vdbeapi.c | 84 +++++++++++++++++++++++++++++++++++++++++++++++----
3 files changed, 85 insertions(+), 13 deletions(-)
diff --git a/manifest b/manifest
index 6fb15f78f3..f33c25c838 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C More\sAPI_ARMOR\sadditions.
-D 2023-10-14T14:53:18.394
+C Add\sAPI_ARMOR\ssupport\sto\sthe\ssqlite3_result_...()\sfamily\sof\sfunctions\sand\ssqlite3_bind_zeroblob64().
+D 2023-10-14T16:29:36.931
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -787,7 +787,7 @@ F src/vacuum.c 604fcdaebe76f3497c855afcbf91b8fa5046b32de3045bab89cc008d68e40104
F src/vdbe.c cd112eb00d20fc5cc44f631d0e713838602637328b0f127c2f3c2aa8cea3cc91
F src/vdbe.h 41485521f68e9437fdb7ec4a90f9d86ab294e9bb8281e33b235915e29122cfc0
F src/vdbeInt.h 949669dfd8a41550d27dcb905b494f2ccde9a2e6c1b0b04daa1227e2e74c2b2c
-F src/vdbeapi.c dbada91cc9f2e0b76ad4c76aad7b92fbe80c4a439b5dd8d7fa990d4e34b9831c
+F src/vdbeapi.c 0204e7247582975797a4b45606b39395c8a4f678d7c2b8dc15129044dcbb508f
F src/vdbeaux.c 5b415e09b5b9d5be6c0f4fcbf18ea9d7d16f6a29ced2f14a3b2041020f63e9c1
F src/vdbeblob.c 13f9287b55b6356b4b1845410382d6bede203ceb29ef69388a4a3d007ffacbe5
F src/vdbemem.c 317b9f48708139db6239ade40c7980b4bc8233168383690d588dad6d8437f722
@@ -2128,8 +2128,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 0114a6622afc4588c47e98d804340449417b603dc4831513eab4d8e4ccb15d42
-R 376130abd753bb410df401995b876336
+P 78ebf838f645742f87733665cd72af736df345683b27377a2c8310c893b1769d
+R 71ff5d4a376fdfcdde5b2514a89cbed8
U stephan
-Z fbd9ca46d7a725fcd4bdd4a5ef9f230a
+Z 2c334c3835eed2b31940cc452708383c
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index a9523053f7..a3560d7197 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-78ebf838f645742f87733665cd72af736df345683b27377a2c8310c893b1769d
\ No newline at end of file
+afabe3e35a66625527e2881749cdb6e13300888ab57bc0f05889d0e3ee203d73
\ No newline at end of file
diff --git a/src/vdbeapi.c b/src/vdbeapi.c
index 60798e9aa4..f878f2a2a7 100644
--- a/src/vdbeapi.c
+++ b/src/vdbeapi.c
@@ -405,7 +405,7 @@ static void setResultStrOrError(
static int invokeValueDestructor(
const void *p, /* Value to destroy */
void (*xDel)(void*), /* The destructor */
- sqlite3_context *pCtx /* Set a SQLITE_TOOBIG error if no NULL */
+ sqlite3_context *pCtx /* Set a SQLITE_TOOBIG error if not NULL */
){
assert( xDel!=SQLITE_DYNAMIC );
if( xDel==0 ){
@@ -415,7 +415,9 @@ static int invokeValueDestructor(
}else{
xDel((void*)p);
}
- sqlite3_result_error_toobig(pCtx);
+ if( pCtx!=0 ){
+ sqlite3_result_error_toobig(pCtx);
+ }
return SQLITE_TOOBIG;
}
void sqlite3_result_blob(
@@ -424,6 +426,12 @@ void sqlite3_result_blob(
int n,
void (*xDel)(void *)
){
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( pCtx==0 || n<0 ){
+ invokeValueDestructor(z, xDel, pCtx);
+ return;
+ }
+#endif
assert( n>=0 );
assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) );
setResultStrOrError(pCtx, z, n, 0, xDel);
@@ -434,8 +442,14 @@ void sqlite3_result_blob64(
sqlite3_uint64 n,
void (*xDel)(void *)
){
- assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) );
assert( xDel!=SQLITE_DYNAMIC );
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( pCtx==0 ){
+ invokeValueDestructor(z, xDel, 0);
+ return;
+ }
+#endif
+ assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) );
if( n>0x7fffffff ){
(void)invokeValueDestructor(z, xDel, pCtx);
}else{
@@ -443,30 +457,48 @@ void sqlite3_result_blob64(
}
}
void sqlite3_result_double(sqlite3_context *pCtx, double rVal){
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( pCtx==0 ) return;
+#endif
assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) );
sqlite3VdbeMemSetDouble(pCtx->pOut, rVal);
}
void sqlite3_result_error(sqlite3_context *pCtx, const char *z, int n){
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( pCtx==0 ) return;
+#endif
assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) );
pCtx->isError = SQLITE_ERROR;
sqlite3VdbeMemSetStr(pCtx->pOut, z, n, SQLITE_UTF8, SQLITE_TRANSIENT);
}
#ifndef SQLITE_OMIT_UTF16
void sqlite3_result_error16(sqlite3_context *pCtx, const void *z, int n){
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( pCtx==0 ) return;
+#endif
assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) );
pCtx->isError = SQLITE_ERROR;
sqlite3VdbeMemSetStr(pCtx->pOut, z, n, SQLITE_UTF16NATIVE, SQLITE_TRANSIENT);
}
#endif
void sqlite3_result_int(sqlite3_context *pCtx, int iVal){
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( pCtx==0 ) return;
+#endif
assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) );
sqlite3VdbeMemSetInt64(pCtx->pOut, (i64)iVal);
}
void sqlite3_result_int64(sqlite3_context *pCtx, i64 iVal){
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( pCtx==0 ) return;
+#endif
assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) );
sqlite3VdbeMemSetInt64(pCtx->pOut, iVal);
}
void sqlite3_result_null(sqlite3_context *pCtx){
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( pCtx==0 ) return;
+#endif
assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) );
sqlite3VdbeMemSetNull(pCtx->pOut);
}
@@ -476,14 +508,25 @@ void sqlite3_result_pointer(
const char *zPType,
void (*xDestructor)(void*)
){
- Mem *pOut = pCtx->pOut;
+ Mem *pOut;
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( pCtx==0 ){
+ invokeValueDestructor(pPtr, xDestructor, 0);
+ return;
+ }
+#endif
+ pOut = pCtx->pOut;
assert( sqlite3_mutex_held(pOut->db->mutex) );
sqlite3VdbeMemRelease(pOut);
pOut->flags = MEM_Null;
sqlite3VdbeMemSetPointer(pOut, pPtr, zPType, xDestructor);
}
void sqlite3_result_subtype(sqlite3_context *pCtx, unsigned int eSubtype){
- Mem *pOut = pCtx->pOut;
+ Mem *pOut;
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( pCtx==0 ) return;
+#endif
+ pOut = pCtx->pOut;
assert( sqlite3_mutex_held(pOut->db->mutex) );
pOut->eSubtype = eSubtype & 0xff;
pOut->flags |= MEM_Subtype;
@@ -494,6 +537,12 @@ void sqlite3_result_text(
int n,
void (*xDel)(void *)
){
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( pCtx==0 ){
+ invokeValueDestructor(z, xDel, 0);
+ return;
+ }
+#endif
assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) );
setResultStrOrError(pCtx, z, n, SQLITE_UTF8, xDel);
}
@@ -504,6 +553,12 @@ void sqlite3_result_text64(
void (*xDel)(void *),
unsigned char enc
){
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( pCtx==0 ){
+ invokeValueDestructor(z, xDel, 0);
+ return;
+ }
+#endif
assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) );
assert( xDel!=SQLITE_DYNAMIC );
if( enc!=SQLITE_UTF8 ){
@@ -568,7 +623,12 @@ void sqlite3_result_zeroblob(sqlite3_context *pCtx, int n){
sqlite3_result_zeroblob64(pCtx, n>0 ? n : 0);
}
int sqlite3_result_zeroblob64(sqlite3_context *pCtx, u64 n){
- Mem *pOut = pCtx->pOut;
+ Mem *pOut;
+
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( pCtx==0 ) return SQLITE_MISUSE_BKPT;
+#endif
+ pOut = pCtx->pOut;
assert( sqlite3_mutex_held(pOut->db->mutex) );
if( n>(u64)pOut->db->aLimit[SQLITE_LIMIT_LENGTH] ){
sqlite3_result_error_toobig(pCtx);
@@ -582,6 +642,9 @@ int sqlite3_result_zeroblob64(sqlite3_context *pCtx, u64 n){
#endif
}
void sqlite3_result_error_code(sqlite3_context *pCtx, int errCode){
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( pCtx==0 ) return;
+#endif
pCtx->isError = errCode ? errCode : -1;
#ifdef SQLITE_DEBUG
if( pCtx->pVdbe ) pCtx->pVdbe->rcApp = errCode;
@@ -594,6 +657,9 @@ void sqlite3_result_error_code(sqlite3_context *pCtx, int errCode){
/* Force an SQLITE_TOOBIG error. */
void sqlite3_result_error_toobig(sqlite3_context *pCtx){
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( pCtx==0 ) return;
+#endif
assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) );
pCtx->isError = SQLITE_TOOBIG;
sqlite3VdbeMemSetStr(pCtx->pOut, "string or blob too big", -1,
@@ -602,6 +668,9 @@ void sqlite3_result_error_toobig(sqlite3_context *pCtx){
/* An SQLITE_NOMEM error. */
void sqlite3_result_error_nomem(sqlite3_context *pCtx){
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( pCtx==0 ) return;
+#endif
assert( sqlite3_mutex_held(pCtx->pOut->db->mutex) );
sqlite3VdbeMemSetNull(pCtx->pOut);
pCtx->isError = SQLITE_NOMEM_BKPT;
@@ -1765,6 +1834,9 @@ int sqlite3_bind_zeroblob(sqlite3_stmt *pStmt, int i, int n){
int sqlite3_bind_zeroblob64(sqlite3_stmt *pStmt, int i, sqlite3_uint64 n){
int rc;
Vdbe *p = (Vdbe *)pStmt;
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( p==0 ) return SQLITE_MISUSE_BKPT;
+#endif
sqlite3_mutex_enter(p->db->mutex);
if( n>(u64)p->db->aLimit[SQLITE_LIMIT_LENGTH] ){
rc = SQLITE_TOOBIG;
From a9000d424eae8438b95fd51b6e12ddcfa7e8b435 Mon Sep 17 00:00:00 2001
From: stephan
Date: Sat, 14 Oct 2023 16:56:12 +0000
Subject: [PATCH 21/66] JNI: add missing sqlite3_bind_value() and minor
memory-safety-related cleanups.
FossilOrigin-Name: 3900031763abf4b2aab7b57e886cc407571d0d5928b74f24dcea8fb7371655af
---
ext/jni/src/c/sqlite3-jni.c | 54 +++++++++++++++++++++-------
ext/jni/src/c/sqlite3-jni.h | 8 +++++
ext/jni/src/org/sqlite/jni/CApi.java | 11 ++++++
manifest | 16 ++++-----
manifest.uuid | 2 +-
5 files changed, 70 insertions(+), 21 deletions(-)
diff --git a/ext/jni/src/c/sqlite3-jni.c b/ext/jni/src/c/sqlite3-jni.c
index 8ff1da193a..f4615329e8 100644
--- a/ext/jni/src/c/sqlite3-jni.c
+++ b/ext/jni/src/c/sqlite3-jni.c
@@ -2378,7 +2378,7 @@ S3JniApi(sqlite3_bind_java_object(),jint,1bind_1java_1object)(
int rc = SQLITE_MISUSE;
if(pStmt){
- jobject const rv = val ? S3JniRefGlobal(val) : 0;
+ jobject const rv = S3JniRefGlobal(val);
if( rv ){
rc = sqlite3_bind_pointer(pStmt, ndx, rv, ResultJavaValuePtrStr,
S3Jni_jobject_finalizer);
@@ -2445,6 +2445,24 @@ S3JniApi(sqlite3_bind_text16(),jint,1bind_1text16)(
return (jint)rc;
}
+S3JniApi(sqlite3_bind_value(),jint,1bind_1value)(
+ JniArgsEnvClass, jlong jpStmt, jint ndx, jlong jpValue
+){
+ int rc = 0;
+ sqlite3_stmt * pStmt = S3JniLongPtr_sqlite3_stmt(jpStmt);
+ if( pStmt ){
+ sqlite3_value *v = S3JniLongPtr_sqlite3_value(jpValue);
+ if( v ){
+ rc = sqlite3_bind_value(pStmt, (int)ndx, v);
+ }else{
+ sqlite3_bind_null(pStmt, (int)ndx);
+ }
+ }else{
+ rc = SQLITE_MISUSE;
+ }
+ return (jint)rc;
+}
+
S3JniApi(sqlite3_bind_zeroblob(),jint,1bind_1zeroblob)(
JniArgsEnvClass, jlong jpStmt, jint ndx, jint n
){
@@ -3731,10 +3749,15 @@ jint sqlite3_jni_prepare_v123( int prepVersion, JNIEnv * const env, jclass self,
sqlite3_stmt * pStmt = 0;
jobject jStmt = 0;
const char * zTail = 0;
- jbyte * const pBuf = s3jni_jbyteArray_bytes(baSql);
+ sqlite3 * const pDb = S3JniLongPtr_sqlite3(jpDb);
+ jbyte * const pBuf = pDb ? s3jni_jbyteArray_bytes(baSql) : 0;
int rc = SQLITE_ERROR;
+
assert(prepVersion==1 || prepVersion==2 || prepVersion==3);
- if( !pBuf ){
+ if( !pDb || !jOutStmt ){
+ rc = SQLITE_MISUSE;
+ goto end;
+ }else if( !pBuf ){
rc = baSql ? SQLITE_NOMEM : SQLITE_MISUSE;
goto end;
}
@@ -3744,13 +3767,13 @@ jint sqlite3_jni_prepare_v123( int prepVersion, JNIEnv * const env, jclass self,
goto end;
}
switch( prepVersion ){
- case 1: rc = sqlite3_prepare(S3JniLongPtr_sqlite3(jpDb), (const char *)pBuf,
+ case 1: rc = sqlite3_prepare(pDb, (const char *)pBuf,
(int)nMax, &pStmt, &zTail);
break;
- case 2: rc = sqlite3_prepare_v2(S3JniLongPtr_sqlite3(jpDb), (const char *)pBuf,
+ case 2: rc = sqlite3_prepare_v2(pDb, (const char *)pBuf,
(int)nMax, &pStmt, &zTail);
break;
- case 3: rc = sqlite3_prepare_v3(S3JniLongPtr_sqlite3(jpDb), (const char *)pBuf,
+ case 3: rc = sqlite3_prepare_v3(pDb, (const char *)pBuf,
(int)nMax, (unsigned int)prepFlags,
&pStmt, &zTail);
break;
@@ -3780,8 +3803,10 @@ end:
S3JniUnrefLocal(jStmt);
jStmt = 0;
}
- OutputPointer_set_obj(env, S3JniNph(OutputPointer_sqlite3_stmt),
- jOutStmt, jStmt);
+ if( jOutStmt ){
+ OutputPointer_set_obj(env, S3JniNph(OutputPointer_sqlite3_stmt),
+ jOutStmt, jStmt);
+ }
return (jint)rc;
}
S3JniApi(sqlite3_prepare(),jint,1prepare)(
@@ -4105,7 +4130,10 @@ static void result_blob_text(int as64 /* true for text64/blob64() mode */,
JNIEnv * const env, sqlite3_context *pCx,
jbyteArray jBa, jlong nMax){
int const asBlob = 0==eTextRep;
- if( jBa ){
+ if( !pCx ){
+ /* We should arguably emit a warning here. But where to log it? */
+ return;
+ }else if( jBa ){
jbyte * const pBuf = s3jni_jbyteArray_bytes(jBa);
jsize nBa = (*env)->GetArrayLength(env, jBa);
if( nMax>=0 && nBa>(jsize)nMax ){
@@ -4121,7 +4149,7 @@ static void result_blob_text(int as64 /* true for text64/blob64() mode */,
Note that the text64() interfaces take an unsigned value for
the length, which Java does not support. This binding takes
the approach of passing on negative values to the C API,
- which will, in turn fail with SQLITE_TOOBIG at some later
+ which will in turn fail with SQLITE_TOOBIG at some later
point (recall that the sqlite3_result_xyz() family do not
have result values).
*/
@@ -4255,10 +4283,12 @@ S3JniApi(sqlite3_result_int64(),void,1result_1int64)(
S3JniApi(sqlite3_result_java_object(),void,1result_1java_1object)(
JniArgsEnvClass, jobject jpCx, jobject v
){
- if( v ){
+ sqlite3_context * pCx = PtrGet_sqlite3_context(jpCx);
+ if( !pCx ) return;
+ else if( v ){
jobject const rjv = S3JniRefGlobal(v);
if( rjv ){
- sqlite3_result_pointer(PtrGet_sqlite3_context(jpCx), rjv,
+ sqlite3_result_pointer(pCx, rjv,
ResultJavaValuePtrStr, S3Jni_jobject_finalizer);
}else{
sqlite3_result_error_nomem(PtrGet_sqlite3_context(jpCx));
diff --git a/ext/jni/src/c/sqlite3-jni.h b/ext/jni/src/c/sqlite3-jni.h
index 4195ad6dba..3a78e0917a 100644
--- a/ext/jni/src/c/sqlite3-jni.h
+++ b/ext/jni/src/c/sqlite3-jni.h
@@ -939,6 +939,14 @@ JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1bind_1text
JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1bind_1text16
(JNIEnv *, jclass, jlong, jint, jbyteArray, jint);
+/*
+ * Class: org_sqlite_jni_CApi
+ * Method: sqlite3_bind_value
+ * Signature: (JIJ)I
+ */
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1bind_1value
+ (JNIEnv *, jclass, jlong, jint, jlong);
+
/*
* Class: org_sqlite_jni_CApi
* Method: sqlite3_bind_zeroblob
diff --git a/ext/jni/src/org/sqlite/jni/CApi.java b/ext/jni/src/org/sqlite/jni/CApi.java
index 90e8339799..b006fceef1 100644
--- a/ext/jni/src/org/sqlite/jni/CApi.java
+++ b/ext/jni/src/org/sqlite/jni/CApi.java
@@ -400,6 +400,17 @@ final class CApi {
: sqlite3_bind_text16(stmt.getNativePointer(), ndx, data, data.length);
}
+ static native int sqlite3_bind_value(@NotNull long ptrToStmt, int ndx, long ptrToValue);
+
+ /**
+ Functions like the C-level sqlite3_bind_value(), or
+ sqlite3_bind_null() if val is null.
+ */
+ public static int sqlite3_bind_value(@NotNull sqlite3_stmt stmt, int ndx, sqlite3_value val){
+ return sqlite3_bind_value(stmt.getNativePointer(), ndx,
+ null==val ? 0L : val.getNativePointer());
+ }
+
static native int sqlite3_bind_zeroblob(@NotNull long ptrToStmt, int ndx, int n);
public static int sqlite3_bind_zeroblob(@NotNull sqlite3_stmt stmt, int ndx, int n){
diff --git a/manifest b/manifest
index f33c25c838..4a030a4c21 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\sAPI_ARMOR\ssupport\sto\sthe\ssqlite3_result_...()\sfamily\sof\sfunctions\sand\ssqlite3_bind_zeroblob64().
-D 2023-10-14T16:29:36.931
+C JNI:\sadd\smissing\ssqlite3_bind_value()\sand\sminor\smemory-safety-related\scleanups.
+D 2023-10-14T16:56:12.307
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -238,14 +238,14 @@ F ext/icu/sqliteicu.h fa373836ed5a1ee7478bdf8a1650689294e41d0c89c1daab26e9ae78a3
F ext/jni/GNUmakefile 6da240c9a11701f3ed569384cd15ef611e8b3c5e3897d265923b14bf0e1eb272
F ext/jni/README.md ef9ac115e97704ea995d743b4a8334e23c659e5534c3b64065a5405256d5f2f4
F ext/jni/jar-dist.make 030aaa4ae71dd86e4ec5e7c1e6cd86f9dfa47c4592c070d2e35157e42498e1fa
-F ext/jni/src/c/sqlite3-jni.c 3d4640ae9c128326e0f65dade4732734771596371e398a7ae95c4d33ef24928a
-F ext/jni/src/c/sqlite3-jni.h 8bd34a6fe3b51059690be31ac5bd6e454a738dd1ff9916f490e05cf63c4f8e37
+F ext/jni/src/c/sqlite3-jni.c fdaad9490dad7b703dcfc98cda1c9a9e82b1bf8e6d9f6b64dd1639878f990f7c
+F ext/jni/src/c/sqlite3-jni.h fefcf0a7116d0c0f097c7ac71ca9ab4d092bf661ac40dd9dafb415d929f9b26d
F ext/jni/src/org/sqlite/jni/AbstractCollationCallback.java 95e88ba04f4aac51ffec65693e878e234088b2f21b387f4e4285c8b72b33e436
F ext/jni/src/org/sqlite/jni/AggregateFunction.java 7312486bc65fecdb91753c0a4515799194e031f45edbe16a6373cea18f404dc4
F ext/jni/src/org/sqlite/jni/AuthorizerCallback.java fde5f758ad170ca45ae00b12194c8ba8d8f3090bd64cc3e002dd9c5e7dff8568
F ext/jni/src/org/sqlite/jni/AutoExtensionCallback.java c0fbfd3779fc92982c7935325a7484dee43eeb80d716989ed31218f453addb94
F ext/jni/src/org/sqlite/jni/BusyHandlerCallback.java 4cb7fc70efd55583fed6033c34a8719da42975ca97ef4781dda0b9f6cc8ec2e8
-F ext/jni/src/org/sqlite/jni/CApi.java 6f878d291642568a06d9a36c15b420f5f867dcc44cee0cc56e8f02b542f67ec4
+F ext/jni/src/org/sqlite/jni/CApi.java 32dcd13be87308fbd98f07cb6f6c25ece21ccb17b5fb9ff81e4c6e574758db0e
F ext/jni/src/org/sqlite/jni/CallbackProxy.java 064a8a00e4c63cc501c30504f93ca996d422c5f010067f969b2d0a10f0868153
F ext/jni/src/org/sqlite/jni/CollationCallback.java 8cf57cb014a645ecc12609eed17308852a597bc5e83d82a4fdb90f7fadc25f9d
F ext/jni/src/org/sqlite/jni/CollationNeededCallback.java 0c62245e000d5db52576c728cac20f6a31f31f5cf40ca4cbcd64b22964e82ae5
@@ -2128,8 +2128,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 78ebf838f645742f87733665cd72af736df345683b27377a2c8310c893b1769d
-R 71ff5d4a376fdfcdde5b2514a89cbed8
+P afabe3e35a66625527e2881749cdb6e13300888ab57bc0f05889d0e3ee203d73
+R e2e3f6e590cd006da1a4ca6fd58b6f1a
U stephan
-Z 2c334c3835eed2b31940cc452708383c
+Z e96ab04282e03aa20daa6385e63d9a19
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index a3560d7197..b56201f927 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-afabe3e35a66625527e2881749cdb6e13300888ab57bc0f05889d0e3ee203d73
\ No newline at end of file
+3900031763abf4b2aab7b57e886cc407571d0d5928b74f24dcea8fb7371655af
\ No newline at end of file
From 4213cc78cde2d9fa8b9ede1e133749f61e09330f Mon Sep 17 00:00:00 2001
From: stephan
Date: Sat, 14 Oct 2023 16:57:48 +0000
Subject: [PATCH 22/66] JNI: add a missing result code check to
sqlite3_bind_value(stmt, null).
FossilOrigin-Name: f1a357f42de58927c33e7047dc4417e3b9549d7529625f30c583e66b7d603b00
---
ext/jni/src/c/sqlite3-jni.c | 2 +-
manifest | 12 ++++++------
manifest.uuid | 2 +-
3 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/ext/jni/src/c/sqlite3-jni.c b/ext/jni/src/c/sqlite3-jni.c
index f4615329e8..b34d2a6ff7 100644
--- a/ext/jni/src/c/sqlite3-jni.c
+++ b/ext/jni/src/c/sqlite3-jni.c
@@ -2455,7 +2455,7 @@ S3JniApi(sqlite3_bind_value(),jint,1bind_1value)(
if( v ){
rc = sqlite3_bind_value(pStmt, (int)ndx, v);
}else{
- sqlite3_bind_null(pStmt, (int)ndx);
+ rc = sqlite3_bind_null(pStmt, (int)ndx);
}
}else{
rc = SQLITE_MISUSE;
diff --git a/manifest b/manifest
index 4a030a4c21..f85658bbd3 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C JNI:\sadd\smissing\ssqlite3_bind_value()\sand\sminor\smemory-safety-related\scleanups.
-D 2023-10-14T16:56:12.307
+C JNI:\sadd\sa\smissing\sresult\scode\scheck\sto\ssqlite3_bind_value(stmt,\snull).
+D 2023-10-14T16:57:48.421
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -238,7 +238,7 @@ F ext/icu/sqliteicu.h fa373836ed5a1ee7478bdf8a1650689294e41d0c89c1daab26e9ae78a3
F ext/jni/GNUmakefile 6da240c9a11701f3ed569384cd15ef611e8b3c5e3897d265923b14bf0e1eb272
F ext/jni/README.md ef9ac115e97704ea995d743b4a8334e23c659e5534c3b64065a5405256d5f2f4
F ext/jni/jar-dist.make 030aaa4ae71dd86e4ec5e7c1e6cd86f9dfa47c4592c070d2e35157e42498e1fa
-F ext/jni/src/c/sqlite3-jni.c fdaad9490dad7b703dcfc98cda1c9a9e82b1bf8e6d9f6b64dd1639878f990f7c
+F ext/jni/src/c/sqlite3-jni.c bc52599bdd0729d74921264d14bda6567235da775050af153feff36fe5a4bd17
F ext/jni/src/c/sqlite3-jni.h fefcf0a7116d0c0f097c7ac71ca9ab4d092bf661ac40dd9dafb415d929f9b26d
F ext/jni/src/org/sqlite/jni/AbstractCollationCallback.java 95e88ba04f4aac51ffec65693e878e234088b2f21b387f4e4285c8b72b33e436
F ext/jni/src/org/sqlite/jni/AggregateFunction.java 7312486bc65fecdb91753c0a4515799194e031f45edbe16a6373cea18f404dc4
@@ -2128,8 +2128,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P afabe3e35a66625527e2881749cdb6e13300888ab57bc0f05889d0e3ee203d73
-R e2e3f6e590cd006da1a4ca6fd58b6f1a
+P 3900031763abf4b2aab7b57e886cc407571d0d5928b74f24dcea8fb7371655af
+R 2d3aef25bfb9da0f56a2961d39d07eaf
U stephan
-Z e96ab04282e03aa20daa6385e63d9a19
+Z db14742ea8ffc7099a6f208879ce0c90
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index b56201f927..0930db6514 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-3900031763abf4b2aab7b57e886cc407571d0d5928b74f24dcea8fb7371655af
\ No newline at end of file
+f1a357f42de58927c33e7047dc4417e3b9549d7529625f30c583e66b7d603b00
\ No newline at end of file
From 153790d9ae7f6e22abf64fe0ab352e4b8df2ae7d Mon Sep 17 00:00:00 2001
From: drh <>
Date: Sat, 14 Oct 2023 17:14:53 +0000
Subject: [PATCH 23/66] The rtreecheck() SQL function should not invoke BEGIN
or COMMIT as this causes issues for statement transactions.
FossilOrigin-Name: b7b2e30b570efda338c62e88446dedb6667640f33855b2422ad20c7b569b025a
---
ext/rtree/rtree.c | 14 --------------
ext/rtree/rtree1.test | 11 +++++++++++
manifest | 14 +++++++-------
manifest.uuid | 2 +-
4 files changed, 19 insertions(+), 22 deletions(-)
diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c
index b2667527bc..682c052c56 100644
--- a/ext/rtree/rtree.c
+++ b/ext/rtree/rtree.c
@@ -4132,7 +4132,6 @@ static int rtreeCheckTable(
){
RtreeCheck check; /* Common context for various routines */
sqlite3_stmt *pStmt = 0; /* Used to find column count of rtree table */
- int bEnd = 0; /* True if transaction should be closed */
int nAux = 0; /* Number of extra columns. */
/* Initialize the context object */
@@ -4141,14 +4140,6 @@ static int rtreeCheckTable(
check.zDb = zDb;
check.zTab = zTab;
- /* If there is not already an open transaction, open one now. This is
- ** to ensure that the queries run as part of this integrity-check operate
- ** on a consistent snapshot. */
- if( sqlite3_get_autocommit(db) ){
- check.rc = sqlite3_exec(db, "BEGIN", 0, 0, 0);
- bEnd = 1;
- }
-
/* Find the number of auxiliary columns */
if( check.rc==SQLITE_OK ){
pStmt = rtreeCheckPrepare(&check, "SELECT * FROM %Q.'%q_rowid'", zDb, zTab);
@@ -4189,11 +4180,6 @@ static int rtreeCheckTable(
sqlite3_finalize(check.aCheckMapping[0]);
sqlite3_finalize(check.aCheckMapping[1]);
- /* If one was opened, close the transaction */
- if( bEnd ){
- int rc = sqlite3_exec(db, "END", 0, 0, 0);
- if( check.rc==SQLITE_OK ) check.rc = rc;
- }
*pzReport = check.zReport;
return check.rc;
}
diff --git a/ext/rtree/rtree1.test b/ext/rtree/rtree1.test
index 633d0a5d5f..2d8458a538 100644
--- a/ext/rtree/rtree1.test
+++ b/ext/rtree/rtree1.test
@@ -784,4 +784,15 @@ do_execsql_test 22.1 {
SELECT id, x0 > 9223372036854775807 AS 'a0' FROM t1;
} {123 1}
+# 2023-10-14 dbsqlfuzz --sql-fuzz find. rtreecheck() should not call
+# BEGIN/COMMIT because that causes problems with statement transactions,
+# and it is unnecessary.
+#
+reset_db
+do_test 23.0 {
+ db eval {CREATE TABLE t1(a,b,c);}
+ catch {db eval {CREATE TABLE t2 AS SELECT rtreecheck('t1') AS y;}}
+ db eval {PRAGMA integrity_check;}
+} {ok}
+
finish_test
diff --git a/manifest b/manifest
index 3f1b563ebc..89be45b112 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Bug\sfix\sin\ssqlite3_analyzer:\sfor\sdatabases\slarger\sthan\s1GiB,\stake\sinto\naccount\sthe\slock-byte\spage\swhen\scalculating\sthe\snumber\sof\sfreelist\spages.
-D 2023-10-14T10:54:37.378
+C The\srtreecheck()\sSQL\sfunction\sshould\snot\sinvoke\sBEGIN\sor\sCOMMIT\sas\sthis\ncauses\sissues\sfor\sstatement\stransactions.
+D 2023-10-14T17:14:53.738
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -475,9 +475,9 @@ F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c3350
F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c
F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761
F ext/rtree/geopoly.c 0dd4775e896cee6067979d67aff7c998e75c2c9d9cd8d62a1a790c09cde7adca
-F ext/rtree/rtree.c 9fdb03b602ca128c4b5b786c10675cf97cd0990d18db3b8c7a312551c3cf2f59
+F ext/rtree/rtree.c da842644466b84391e9fa1b1d5a17f461b475b8e36f1217117d1d98ad5f437e3
F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412
-F ext/rtree/rtree1.test 877d40b8b61b1f88cec9d4dc0ff8334f5b05299fac12a35141532e2881860e9d
+F ext/rtree/rtree1.test ecc881fdd1bc10fc390faa988ad93343739af84384e4cf3619fed7afada66a30
F ext/rtree/rtree2.test 9d9deddbb16fd0c30c36e6b4fdc3ee3132d765567f0f9432ee71e1303d32603d
F ext/rtree/rtree3.test 272594f88c344e973864008bbe4c71fd3a41a264c097d568593ee7886d83d409
F ext/rtree/rtree4.test 304de65d484540111b896827e4261815e5dca4ce28eeecd58be648cd73452c4b
@@ -2128,8 +2128,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 348fa7aaf7958b3fb689ed023d946064ae8d92718a497a346e95114a2410cbf5
-R 491b395fcb54d24388cea619b1896c53
+P 26a909cdd32afee0f15968ca6f611eb259373b2a2195d0b3d47cfba103f1e6d6
+R ad487958c6df4b6717bccb543e9d7836
U drh
-Z 11377a3945484d066aca86a95198dde7
+Z de59a6958b8ef06ef4ebd517456df8ae
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 5e9c11cf71..56d82816e7 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-26a909cdd32afee0f15968ca6f611eb259373b2a2195d0b3d47cfba103f1e6d6
\ No newline at end of file
+b7b2e30b570efda338c62e88446dedb6667640f33855b2422ad20c7b569b025a
\ No newline at end of file
From eb62ccdab5d88ab9962d07194c6a24363ad986d0 Mon Sep 17 00:00:00 2001
From: stephan
Date: Sat, 14 Oct 2023 20:01:55 +0000
Subject: [PATCH 24/66] Add API_ARMOR support to the scanstatus family of
functions.
FossilOrigin-Name: 2f3101f016d5f8d954a262befdf5e0f938a223e444bc534e1d3655b733f4663d
---
manifest | 12 ++++++------
manifest.uuid | 2 +-
src/vdbeapi.c | 14 +++++++++++---
3 files changed, 18 insertions(+), 10 deletions(-)
diff --git a/manifest b/manifest
index f85658bbd3..f8868c0231 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C JNI:\sadd\sa\smissing\sresult\scode\scheck\sto\ssqlite3_bind_value(stmt,\snull).
-D 2023-10-14T16:57:48.421
+C Add\sAPI_ARMOR\ssupport\sto\sthe\sscanstatus\sfamily\sof\sfunctions.
+D 2023-10-14T20:01:55.789
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -787,7 +787,7 @@ F src/vacuum.c 604fcdaebe76f3497c855afcbf91b8fa5046b32de3045bab89cc008d68e40104
F src/vdbe.c cd112eb00d20fc5cc44f631d0e713838602637328b0f127c2f3c2aa8cea3cc91
F src/vdbe.h 41485521f68e9437fdb7ec4a90f9d86ab294e9bb8281e33b235915e29122cfc0
F src/vdbeInt.h 949669dfd8a41550d27dcb905b494f2ccde9a2e6c1b0b04daa1227e2e74c2b2c
-F src/vdbeapi.c 0204e7247582975797a4b45606b39395c8a4f678d7c2b8dc15129044dcbb508f
+F src/vdbeapi.c 56fb801c15af34ba4e7de6804b1a143f045ca9d4b466f32d220d930823e05885
F src/vdbeaux.c 5b415e09b5b9d5be6c0f4fcbf18ea9d7d16f6a29ced2f14a3b2041020f63e9c1
F src/vdbeblob.c 13f9287b55b6356b4b1845410382d6bede203ceb29ef69388a4a3d007ffacbe5
F src/vdbemem.c 317b9f48708139db6239ade40c7980b4bc8233168383690d588dad6d8437f722
@@ -2128,8 +2128,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 3900031763abf4b2aab7b57e886cc407571d0d5928b74f24dcea8fb7371655af
-R 2d3aef25bfb9da0f56a2961d39d07eaf
+P f1a357f42de58927c33e7047dc4417e3b9549d7529625f30c583e66b7d603b00
+R 40cedb778c9752c9ea6047f75e2dc266
U stephan
-Z db14742ea8ffc7099a6f208879ce0c90
+Z da97de50a030a40a20a80ce89a4f774f
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 0930db6514..b3254db94c 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-f1a357f42de58927c33e7047dc4417e3b9549d7529625f30c583e66b7d603b00
\ No newline at end of file
+2f3101f016d5f8d954a262befdf5e0f938a223e444bc534e1d3655b733f4663d
\ No newline at end of file
diff --git a/src/vdbeapi.c b/src/vdbeapi.c
index f878f2a2a7..b0a40cf6db 100644
--- a/src/vdbeapi.c
+++ b/src/vdbeapi.c
@@ -1963,6 +1963,9 @@ int sqlite3_stmt_isexplain(sqlite3_stmt *pStmt){
int sqlite3_stmt_explain(sqlite3_stmt *pStmt, int eMode){
Vdbe *v = (Vdbe*)pStmt;
int rc;
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( pStmt==0 ) return SQLITE_MISUSE_BKPT;
+#endif
sqlite3_mutex_enter(v->db->mutex);
if( ((int)v->explain)==eMode ){
rc = SQLITE_OK;
@@ -2342,11 +2345,16 @@ int sqlite3_stmt_scanstatus_v2(
void *pOut /* OUT: Write the answer here */
){
Vdbe *p = (Vdbe*)pStmt;
- VdbeOp *aOp = p->aOp;
- int nOp = p->nOp;
+ VdbeOp *aOp;
+ int nOp;
ScanStatus *pScan = 0;
int idx;
+#ifdef SQLITE_ENABLE_API_ARMOR
+ if( p==0 ) return 1;
+#endif
+ aOp = p->aOp;
+ nOp = p->nOp;
if( p->pFrame ){
VdbeFrame *pFrame;
for(pFrame=p->pFrame; pFrame->pParent; pFrame=pFrame->pParent);
@@ -2493,7 +2501,7 @@ int sqlite3_stmt_scanstatus(
void sqlite3_stmt_scanstatus_reset(sqlite3_stmt *pStmt){
Vdbe *p = (Vdbe*)pStmt;
int ii;
- for(ii=0; iinOp; ii++){
+ for(ii=0; p!=0 && iinOp; ii++){
Op *pOp = &p->aOp[ii];
pOp->nExec = 0;
pOp->nCycle = 0;
From d718bde6da3f15f8f9862e47e21cf883a9afedde Mon Sep 17 00:00:00 2001
From: drh <>
Date: Sat, 14 Oct 2023 20:24:52 +0000
Subject: [PATCH 25/66] Do not allow an ALTER TABLE ADD COLUMN on a STRICT
table if the added column contains a DEFAULT clause that would violate the
type of the added column.
FossilOrigin-Name: 75b075863eaa56e36635a1d27740d37de8600ba92099b3fad9378a1e6ce12c0e
---
manifest | 14 +++++++-------
manifest.uuid | 2 +-
src/alter.c | 7 ++++++-
test/alter.test | 19 +++++++++++++++++++
4 files changed, 33 insertions(+), 9 deletions(-)
diff --git a/manifest b/manifest
index 89be45b112..de4852e990 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C The\srtreecheck()\sSQL\sfunction\sshould\snot\sinvoke\sBEGIN\sor\sCOMMIT\sas\sthis\ncauses\sissues\sfor\sstatement\stransactions.
-D 2023-10-14T17:14:53.738
+C Do\snot\sallow\san\sALTER\sTABLE\sADD\sCOLUMN\son\sa\sSTRICT\stable\sif\sthe\sadded\scolumn\ncontains\sa\sDEFAULT\sclause\sthat\swould\sviolate\sthe\stype\sof\sthe\sadded\scolumn.
+D 2023-10-14T20:24:52.039
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -646,7 +646,7 @@ F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b
F sqlite3.1 acdff36db796e2d00225b911d3047d580cd136547298435426ce9d40347973cc
F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a
F sqlite_cfg.h.in baf2e409c63d4e7a765e17769b6ff17c5a82bbd9cbf1e284fd2e4cefaff3fcf2
-F src/alter.c 3ff8c2fca0c0636d43459154bb40d79c882df1b34df77f89c4ec47ab2e2389f5
+F src/alter.c 30c2333b8bb3af71e4eb9adeadee8aa20edb15917ed44b8422e5cd15f3dfcddc
F src/analyze.c d4cc28738c29e009640ec20ebb6936ba6fcefff0d11aa93398d9bb9a5ead6c1f
F src/attach.c cc9d00d30da916ff656038211410ccf04ed784b7564639b9b61d1839ed69fd39
F src/auth.c 19b7ccacae3dfba23fc6f1d0af68134fa216e9040e53b0681b4715445ea030b4
@@ -812,7 +812,7 @@ F test/aggfault.test 777f269d0da5b0c2524c7ff6d99ae9a93db4f1b1839a914dd2a12e3035c
F test/aggnested.test 7269d07ac879fce161cb26c8fabe65cba5715742fac8a1fccac570dcdaf28f00
F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87
F test/all.test 2ecb8bbd52416642e41c9081182a8df05d42c75637afd4488aace78cc4b69e13
-F test/alter.test 313073774ab5c3f2ef1d3f0d03757c9d3a81284ae7e1b4a6ca34db088f886896
+F test/alter.test 403a7f8842457044a994d0ffb42963d6e84fcfbf5e8f54556063b25d966cd454
F test/alter2.test a966ccfcddf9ce0a4e0e6ff1aca9e6e7948e0e242cd7e43fc091948521807687
F test/alter3.test ffc4ab29ce78a3517a66afd69b2730667e3471622509c283b2bd4c46f680fba3
F test/alter4.test 716caa071dd8a3c6d57225778d15d3c3cbf5e34b2e84ae44199aeb2bbf50a707
@@ -2128,8 +2128,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 26a909cdd32afee0f15968ca6f611eb259373b2a2195d0b3d47cfba103f1e6d6
-R ad487958c6df4b6717bccb543e9d7836
+P b7b2e30b570efda338c62e88446dedb6667640f33855b2422ad20c7b569b025a
+R 44739401ad1354dd510207d981352cd8
U drh
-Z de59a6958b8ef06ef4ebd517456df8ae
+Z 26263ba5a1d7e41dc561c332fa263ba2
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 56d82816e7..f8f6fa4c78 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-b7b2e30b570efda338c62e88446dedb6667640f33855b2422ad20c7b569b025a
\ No newline at end of file
+75b075863eaa56e36635a1d27740d37de8600ba92099b3fad9378a1e6ce12c0e
\ No newline at end of file
diff --git a/src/alter.c b/src/alter.c
index d0b1f7f696..ec45e14331 100644
--- a/src/alter.c
+++ b/src/alter.c
@@ -446,14 +446,19 @@ void sqlite3AlterFinishAddColumn(Parse *pParse, Token *pColDef){
/* Verify that constraints are still satisfied */
if( pNew->pCheck!=0
|| (pCol->notNull && (pCol->colFlags & COLFLAG_GENERATED)!=0)
+ || (pTab->tabFlags & TF_Strict)!=0
){
sqlite3NestedParse(pParse,
"SELECT CASE WHEN quick_check GLOB 'CHECK*'"
" THEN raise(ABORT,'CHECK constraint failed')"
+ " WHEN quick_check GLOB 'non-* value in*'"
+ " THEN raise(ABORT,'type mismatch on DEFAULT')"
" ELSE raise(ABORT,'NOT NULL constraint failed')"
" END"
" FROM pragma_quick_check(%Q,%Q)"
- " WHERE quick_check GLOB 'CHECK*' OR quick_check GLOB 'NULL*'",
+ " WHERE quick_check GLOB 'CHECK*'"
+ " OR quick_check GLOB 'NULL*'"
+ " OR quick_check GLOB 'non-* value in*'",
zTab, zDb
);
}
diff --git a/test/alter.test b/test/alter.test
index 0088858a15..ee8e6c0b90 100644
--- a/test/alter.test
+++ b/test/alter.test
@@ -934,5 +934,24 @@ do_execsql_test alter-19.3 {
SELECT name FROM sqlite_schema WHERE sql LIKE '%t3%' ORDER BY name;
} {r1 t3}
+# 2023-10-14
+# On an ALTER TABLE ADD COLUMN with a DEFAULT clause on a STRICT table
+# make sure that the DEFAULT has a compatible type.
+#
+reset_db
+do_execsql_test alter-20.1 {
+ CREATE TABLE t1(a INT) STRICT;
+ INSERT INTO t1(a) VALUES(45);
+} {}
+do_catchsql_test alter-20.2 {
+ ALTER TABLE t1 ADD COLUMN b TEXT DEFAULT x'313233';
+} {1 {type mismatch on DEFAULT}}
+do_execsql_test alter-20.2 {
+ DELETE FROM t1;
+ ALTER TABLE t1 ADD COLUMN b TEXT DEFAULT x'313233';
+} {}
+do_catchsql_test alter-20.3 {
+ INSERT INTO t1(a) VALUES(45);
+} {1 {cannot store BLOB value in TEXT column t1.b}}
finish_test
From 4b1e42ef9457347852d397a7f4953c4acdbca505 Mon Sep 17 00:00:00 2001
From: stephan
Date: Sat, 14 Oct 2023 20:34:40 +0000
Subject: [PATCH 26/66] JNI: make the sqlite3_value_...() family of bindings
resistent to NULL arguments.
FossilOrigin-Name: baf220e78a46246c476cd429ac131698db5fa66f62fb5725d4f736fe5246283c
---
ext/jni/src/c/sqlite3-jni.c | 64 ++++++++++++++++++++++++++-----------
manifest | 12 +++----
manifest.uuid | 2 +-
3 files changed, 52 insertions(+), 26 deletions(-)
diff --git a/ext/jni/src/c/sqlite3-jni.c b/ext/jni/src/c/sqlite3-jni.c
index b34d2a6ff7..bfde0cd4b9 100644
--- a/ext/jni/src/c/sqlite3-jni.c
+++ b/ext/jni/src/c/sqlite3-jni.c
@@ -2112,8 +2112,6 @@ WRAP_INT_DB(1system_1errno, sqlite3_system_errno)
WRAP_INT_VOID(1threadsafe, sqlite3_threadsafe)
WRAP_INT_DB(1total_1changes, sqlite3_total_changes)
WRAP_INT64_DB(1total_1changes64, sqlite3_total_changes64)
-WRAP_INT_SVALUE(1value_1bytes, sqlite3_value_bytes)
-WRAP_INT_SVALUE(1value_1bytes16, sqlite3_value_bytes16)
WRAP_INT_SVALUE(1value_1encoding, sqlite3_value_encoding)
WRAP_BOOL_SVALUE(1value_1frombind, sqlite3_value_frombind)
WRAP_INT_SVALUE(1value_1nochange, sqlite3_value_nochange)
@@ -4754,8 +4752,8 @@ S3JniApi(sqlite3_value_blob(),jbyteArray,1value_1blob)(
JniArgsEnvClass, jlong jpSVal
){
sqlite3_value * const sv = S3JniLongPtr_sqlite3_value(jpSVal);
- const jbyte * pBytes = sqlite3_value_blob(sv);
- int const nLen = sqlite3_value_bytes(sv);
+ const jbyte * pBytes = sv ? sqlite3_value_blob(sv) : 0;
+ int const nLen = pBytes ? sqlite3_value_bytes(sv) : 0;
s3jni_oom_check( nLen ? !!pBytes : 1 );
return pBytes
@@ -4763,52 +4761,80 @@ S3JniApi(sqlite3_value_blob(),jbyteArray,1value_1blob)(
: NULL;
}
+S3JniApi(sqlite3_value_bytes(),int,1value_1bytes)(
+ JniArgsEnvClass, jlong jpSVal
+){
+ sqlite3_value * const sv = S3JniLongPtr_sqlite3_value(jpSVal);
+ return sv ? sqlite3_value_bytes(sv) : 0;
+}
+
+S3JniApi(sqlite3_value_bytes16(),int,1value_1bytes16)(
+ JniArgsEnvClass, jlong jpSVal
+){
+ sqlite3_value * const sv = S3JniLongPtr_sqlite3_value(jpSVal);
+ return sv ? sqlite3_value_bytes16(sv) : 0;
+}
+
S3JniApi(sqlite3_value_double(),jdouble,1value_1double)(
JniArgsEnvClass, jlong jpSVal
){
- return (jdouble) sqlite3_value_double(S3JniLongPtr_sqlite3_value(jpSVal));
+ sqlite3_value * const sv = S3JniLongPtr_sqlite3_value(jpSVal);
+ return (jdouble) (sv ? sqlite3_value_double(sv) : 0.0);
}
S3JniApi(sqlite3_value_dup(),jobject,1value_1dup)(
JniArgsEnvClass, jlong jpSVal
){
- sqlite3_value * const sv = sqlite3_value_dup(S3JniLongPtr_sqlite3_value(jpSVal));
- return sv ? new_java_sqlite3_value(env, sv) : 0;
+ sqlite3_value * const sv = S3JniLongPtr_sqlite3_value(jpSVal);
+ sqlite3_value * const sd = sv ? sqlite3_value_dup(sv) : 0;
+ jobject rv = sd ? new_java_sqlite3_value(env, sd) : 0;
+ if( sd && !rv ) {
+ /* OOM */
+ sqlite3_value_free(sd);
+ }
+ return rv;
}
S3JniApi(sqlite3_value_free(),void,1value_1free)(
JniArgsEnvClass, jlong jpSVal
){
- sqlite3_value_free(S3JniLongPtr_sqlite3_value(jpSVal));
+ sqlite3_value * const sv = S3JniLongPtr_sqlite3_value(jpSVal);
+ if( sv ){
+ sqlite3_value_free(sv);
+ }
}
S3JniApi(sqlite3_value_int(),jint,1value_1int)(
JniArgsEnvClass, jlong jpSVal
){
- return (jint) sqlite3_value_int(S3JniLongPtr_sqlite3_value(jpSVal));
+ sqlite3_value * const sv = S3JniLongPtr_sqlite3_value(jpSVal);
+ return (jint) (sv ? sqlite3_value_int(sv) : 0);
}
S3JniApi(sqlite3_value_int64(),jlong,1value_1int64)(
JniArgsEnvClass, jlong jpSVal
){
- return (jlong) sqlite3_value_int64(S3JniLongPtr_sqlite3_value(jpSVal));
+ sqlite3_value * const sv = S3JniLongPtr_sqlite3_value(jpSVal);
+ return (jlong) (sv ? sqlite3_value_int64(sv) : 0LL);
}
S3JniApi(sqlite3_value_java_object(),jobject,1value_1java_1object)(
JniArgsEnvClass, jlong jpSVal
){
- return sqlite3_value_pointer(S3JniLongPtr_sqlite3_value(jpSVal),
- ResultJavaValuePtrStr);
+ sqlite3_value * const sv = S3JniLongPtr_sqlite3_value(jpSVal);
+ return sv
+ ? sqlite3_value_pointer(sv, ResultJavaValuePtrStr)
+ : 0;
}
S3JniApi(sqlite3_value_text(),jbyteArray,1value_1text)(
JniArgsEnvClass, jlong jpSVal
){
sqlite3_value * const sv = S3JniLongPtr_sqlite3_value(jpSVal);
- const unsigned char * const p = sqlite3_value_text(sv);
- int const n = sqlite3_value_bytes(sv);
+ const unsigned char * const p = sv ? sqlite3_value_text(sv) : 0;
+ int const n = p ? sqlite3_value_bytes(sv) : 0;
return p ? s3jni_new_jbyteArray(p, n) : 0;
}
@@ -4818,8 +4844,8 @@ S3JniApi(sqlite3_value_text(),jstring,1value_1text)(
JniArgsEnvClass, jlong jpSVal
){
sqlite3_value * const sv = S3JniLongPtr_sqlite3_value(jpSVal);
- const unsigned char * const p = sqlite3_value_text(sv);
- int const n = sqlite3_value_bytes(sv);
+ const unsigned char * const p = sv ? sqlite3_value_text(sv) : 0;
+ int const n = p ? sqlite3_value_bytes(sv) : 0;
return p ? s3jni_utf8_to_jstring( (const char *)p, n) : 0;
}
#endif
@@ -4828,9 +4854,9 @@ S3JniApi(sqlite3_value_text16(),jstring,1value_1text16)(
JniArgsEnvClass, jlong jpSVal
){
sqlite3_value * const sv = S3JniLongPtr_sqlite3_value(jpSVal);
- const int n = sqlite3_value_bytes16(sv);
- const void * const p = sqlite3_value_text16(sv);
- return s3jni_text16_to_jstring(env, p, n);
+ const int n = sv ? sqlite3_value_bytes16(sv) : 0;
+ const void * const p = sv ? sqlite3_value_text16(sv) : 0;
+ return p ? s3jni_text16_to_jstring(env, p, n) : 0;
}
JniDecl(void,1jni_1internal_1details)(JniArgsEnvClass){
diff --git a/manifest b/manifest
index f8868c0231..22d9f804d6 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\sAPI_ARMOR\ssupport\sto\sthe\sscanstatus\sfamily\sof\sfunctions.
-D 2023-10-14T20:01:55.789
+C JNI:\smake\sthe\ssqlite3_value_...()\sfamily\sof\sbindings\sresistent\sto\sNULL\sarguments.
+D 2023-10-14T20:34:40.465
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -238,7 +238,7 @@ F ext/icu/sqliteicu.h fa373836ed5a1ee7478bdf8a1650689294e41d0c89c1daab26e9ae78a3
F ext/jni/GNUmakefile 6da240c9a11701f3ed569384cd15ef611e8b3c5e3897d265923b14bf0e1eb272
F ext/jni/README.md ef9ac115e97704ea995d743b4a8334e23c659e5534c3b64065a5405256d5f2f4
F ext/jni/jar-dist.make 030aaa4ae71dd86e4ec5e7c1e6cd86f9dfa47c4592c070d2e35157e42498e1fa
-F ext/jni/src/c/sqlite3-jni.c bc52599bdd0729d74921264d14bda6567235da775050af153feff36fe5a4bd17
+F ext/jni/src/c/sqlite3-jni.c 2cd46892020bd9ff62fbd80e0205ab731e2a12c1427b5f2b616493fcd0f41ed7
F ext/jni/src/c/sqlite3-jni.h fefcf0a7116d0c0f097c7ac71ca9ab4d092bf661ac40dd9dafb415d929f9b26d
F ext/jni/src/org/sqlite/jni/AbstractCollationCallback.java 95e88ba04f4aac51ffec65693e878e234088b2f21b387f4e4285c8b72b33e436
F ext/jni/src/org/sqlite/jni/AggregateFunction.java 7312486bc65fecdb91753c0a4515799194e031f45edbe16a6373cea18f404dc4
@@ -2128,8 +2128,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P f1a357f42de58927c33e7047dc4417e3b9549d7529625f30c583e66b7d603b00
-R 40cedb778c9752c9ea6047f75e2dc266
+P 2f3101f016d5f8d954a262befdf5e0f938a223e444bc534e1d3655b733f4663d
+R 9e7d93ca57652f3f6459c7a72e2073a8
U stephan
-Z da97de50a030a40a20a80ce89a4f774f
+Z 389ca2ce91b537dc36ab3381ff35287f
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index b3254db94c..07f28dd40c 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-2f3101f016d5f8d954a262befdf5e0f938a223e444bc534e1d3655b733f4663d
\ No newline at end of file
+baf220e78a46246c476cd429ac131698db5fa66f62fb5725d4f736fe5246283c
\ No newline at end of file
From 8a273bb6e8dc12571e587256d07168d11b64f3c7 Mon Sep 17 00:00:00 2001
From: stephan
Date: Sat, 14 Oct 2023 20:44:13 +0000
Subject: [PATCH 27/66] JNI: extend [baf220e78a46246c47] to include
macro-generated sqlite3_value_...() bindings.
FossilOrigin-Name: ad34b2542e330c22fcf331810ab43e66346b1bad8de1a3989e6208cfa0fc2f92
---
ext/jni/src/c/sqlite3-jni.c | 22 ++++++++++++----------
manifest | 12 ++++++------
manifest.uuid | 2 +-
3 files changed, 19 insertions(+), 17 deletions(-)
diff --git a/ext/jni/src/c/sqlite3-jni.c b/ext/jni/src/c/sqlite3-jni.c
index bfde0cd4b9..792f5d6f78 100644
--- a/ext/jni/src/c/sqlite3-jni.c
+++ b/ext/jni/src/c/sqlite3-jni.c
@@ -2065,14 +2065,16 @@ static void udf_xInverse(sqlite3_context* cx, int argc,
-1); \
}
/** Create a trivial JNI wrapper for (int CName(sqlite3_value*)). */
-#define WRAP_INT_SVALUE(JniNameSuffix,CName) \
+#define WRAP_INT_SVALUE(JniNameSuffix,CName,DfltOnNull) \
JniDecl(jint,JniNameSuffix)(JniArgsEnvClass, jlong jpSValue){ \
- return (jint)CName(S3JniLongPtr_sqlite3_value(jpSValue)); \
+ sqlite3_value * const sv = S3JniLongPtr_sqlite3_value(jpSValue); \
+ return (jint)(sv ? CName(sv): DfltOnNull); \
}
/** Create a trivial JNI wrapper for (boolean CName(sqlite3_value*)). */
-#define WRAP_BOOL_SVALUE(JniNameSuffix,CName) \
+#define WRAP_BOOL_SVALUE(JniNameSuffix,CName,DfltOnNull) \
JniDecl(jboolean,JniNameSuffix)(JniArgsEnvClass, jlong jpSValue){ \
- return (jint)CName(S3JniLongPtr_sqlite3_value(jpSValue)) \
+ sqlite3_value * const sv = S3JniLongPtr_sqlite3_value(jpSValue); \
+ return (jint)(sv ? CName(sv) : DfltOnNull) \
? JNI_TRUE : JNI_FALSE; \
}
@@ -2112,12 +2114,12 @@ WRAP_INT_DB(1system_1errno, sqlite3_system_errno)
WRAP_INT_VOID(1threadsafe, sqlite3_threadsafe)
WRAP_INT_DB(1total_1changes, sqlite3_total_changes)
WRAP_INT64_DB(1total_1changes64, sqlite3_total_changes64)
-WRAP_INT_SVALUE(1value_1encoding, sqlite3_value_encoding)
-WRAP_BOOL_SVALUE(1value_1frombind, sqlite3_value_frombind)
-WRAP_INT_SVALUE(1value_1nochange, sqlite3_value_nochange)
-WRAP_INT_SVALUE(1value_1numeric_1type, sqlite3_value_numeric_type)
-WRAP_INT_SVALUE(1value_1subtype, sqlite3_value_subtype)
-WRAP_INT_SVALUE(1value_1type, sqlite3_value_type)
+WRAP_INT_SVALUE(1value_1encoding, sqlite3_value_encoding,SQLITE_UTF8)
+WRAP_BOOL_SVALUE(1value_1frombind, sqlite3_value_frombind,0)
+WRAP_INT_SVALUE(1value_1nochange, sqlite3_value_nochange,0)
+WRAP_INT_SVALUE(1value_1numeric_1type, sqlite3_value_numeric_type,SQLITE_NULL)
+WRAP_INT_SVALUE(1value_1subtype, sqlite3_value_subtype,0)
+WRAP_INT_SVALUE(1value_1type, sqlite3_value_type,SQLITE_NULL)
#undef WRAP_BOOL_DB
#undef WRAP_BOOL_STMT
diff --git a/manifest b/manifest
index 22d9f804d6..6a4dc8973c 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C JNI:\smake\sthe\ssqlite3_value_...()\sfamily\sof\sbindings\sresistent\sto\sNULL\sarguments.
-D 2023-10-14T20:34:40.465
+C JNI:\sextend\s[baf220e78a46246c47]\sto\sinclude\smacro-generated\ssqlite3_value_...()\sbindings.
+D 2023-10-14T20:44:13.117
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -238,7 +238,7 @@ F ext/icu/sqliteicu.h fa373836ed5a1ee7478bdf8a1650689294e41d0c89c1daab26e9ae78a3
F ext/jni/GNUmakefile 6da240c9a11701f3ed569384cd15ef611e8b3c5e3897d265923b14bf0e1eb272
F ext/jni/README.md ef9ac115e97704ea995d743b4a8334e23c659e5534c3b64065a5405256d5f2f4
F ext/jni/jar-dist.make 030aaa4ae71dd86e4ec5e7c1e6cd86f9dfa47c4592c070d2e35157e42498e1fa
-F ext/jni/src/c/sqlite3-jni.c 2cd46892020bd9ff62fbd80e0205ab731e2a12c1427b5f2b616493fcd0f41ed7
+F ext/jni/src/c/sqlite3-jni.c ff7720536758ab952ed025a0a32a0e9d467d0b9a6bc7801dbdef56d56e074ea2
F ext/jni/src/c/sqlite3-jni.h fefcf0a7116d0c0f097c7ac71ca9ab4d092bf661ac40dd9dafb415d929f9b26d
F ext/jni/src/org/sqlite/jni/AbstractCollationCallback.java 95e88ba04f4aac51ffec65693e878e234088b2f21b387f4e4285c8b72b33e436
F ext/jni/src/org/sqlite/jni/AggregateFunction.java 7312486bc65fecdb91753c0a4515799194e031f45edbe16a6373cea18f404dc4
@@ -2128,8 +2128,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 2f3101f016d5f8d954a262befdf5e0f938a223e444bc534e1d3655b733f4663d
-R 9e7d93ca57652f3f6459c7a72e2073a8
+P baf220e78a46246c476cd429ac131698db5fa66f62fb5725d4f736fe5246283c
+R 0ed9579f1b44c31a901370da9158e25e
U stephan
-Z 389ca2ce91b537dc36ab3381ff35287f
+Z 40c95daefe505f2af1f470e995f85f56
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 07f28dd40c..8b25f2ce76 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-baf220e78a46246c476cd429ac131698db5fa66f62fb5725d4f736fe5246283c
\ No newline at end of file
+ad34b2542e330c22fcf331810ab43e66346b1bad8de1a3989e6208cfa0fc2f92
\ No newline at end of file
From 29aeb620e7c2fb78ecf7664fc410a0694b099ca2 Mon Sep 17 00:00:00 2001
From: stephan
Date: Sun, 15 Oct 2023 13:25:39 +0000
Subject: [PATCH 28/66] Correct non-void return from sqlite3_preupdate_hook()
when API_ARMOR is enabled. Broken by [6cb77503484e].
FossilOrigin-Name: 40f5906f48d3f1f44d54e5b271fe04e7082166e50e3ed250bb57a4760f112e8a
---
manifest | 13 ++++++-------
manifest.uuid | 2 +-
src/main.c | 2 +-
3 files changed, 8 insertions(+), 9 deletions(-)
diff --git a/manifest b/manifest
index 1ad4481602..97464c8306 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\scoverage\sof\smore\sfunctions\sto\sSQLITE_ENABLE_API_ARMOR\sbuilds.
-D 2023-10-15T12:11:10.410
+C Correct\snon-void\sreturn\sfrom\ssqlite3_preupdate_hook()\swhen\sAPI_ARMOR\sis\senabled.\sBroken\sby\s[6cb77503484e].
+D 2023-10-15T13:25:39.766
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -677,7 +677,7 @@ F src/insert.c 3f0a94082d978bbdd33c38fefea15346c6c6bffb70bc645a71dc0f1f87dd3276
F src/json.c 799430345d16fed21713416318e6ca616f1264224f708555f387bfa2ab2496c7
F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa
F src/loadext.c 7d56c6f28aaf9b42e2772289e0d0a12a77b57c2baed021dbfd1fcafec69c156a
-F src/main.c 7a91b372dd1bada07c5b5e36082dc0d695161c3807efe2386f563a5b32446ae6
+F src/main.c b252cd436f6ae873ba115cff62462932d4c50ebbe4ab49767b0b500471789446
F src/malloc.c f016922435dc7d1f1f5083a03338a3e91f8c67ce2c5bdcfa4cdef62e612f5fcc
F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
F src/mem1.c 3bb59158c38e05f6270e761a9f435bf19827a264c13d1631c58b84bdc96d73b2
@@ -2128,9 +2128,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 75b075863eaa56e36635a1d27740d37de8600ba92099b3fad9378a1e6ce12c0e ad34b2542e330c22fcf331810ab43e66346b1bad8de1a3989e6208cfa0fc2f92
-R 4cbaef1f14d50e148b58c1f67f162d61
-T +closed ad34b2542e330c22fcf331810ab43e66346b1bad8de1a3989e6208cfa0fc2f92 Closed\sby\sintegrate-merge.
+P 6cb77503484e104a51f08690974d6e19c336ab5467d327f84be1d042615f008c
+R 6337a5530409955001babbd6d9763171
U stephan
-Z 0e8710bba7e8eb05eba392ba89683365
+Z 3e5e208c26caec77ac5884580b0569f0
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index dc9b79c350..037028a774 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-6cb77503484e104a51f08690974d6e19c336ab5467d327f84be1d042615f008c
\ No newline at end of file
+40f5906f48d3f1f44d54e5b271fe04e7082166e50e3ed250bb57a4760f112e8a
\ No newline at end of file
diff --git a/src/main.c b/src/main.c
index 4ddf7e24d3..4ffef9b418 100644
--- a/src/main.c
+++ b/src/main.c
@@ -2372,7 +2372,7 @@ void *sqlite3_preupdate_hook(
#ifdef SQLITE_ENABLE_API_ARMOR
if( db==0 || xCallback==0 ){
- return;
+ return 0;
}
#endif
sqlite3_mutex_enter(db->mutex);
From 5698e62f9ed056659133d486ef6d12ba484c4e38 Mon Sep 17 00:00:00 2001
From: stephan
Date: Sun, 15 Oct 2023 13:32:38 +0000
Subject: [PATCH 29/66] JNI: enable all optional components in the default
build and fix a test broken by an option toggle.
FossilOrigin-Name: 5586a9df58a400c20a6815e8b0fbc7a7c49e5ef89daf92c452f1990586ca78ae
---
ext/jni/GNUmakefile | 2 +-
ext/jni/src/org/sqlite/jni/Tester1.java | 2 +-
manifest | 14 +++++++-------
manifest.uuid | 2 +-
4 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/ext/jni/GNUmakefile b/ext/jni/GNUmakefile
index bea26745f5..ddc51f727e 100644
--- a/ext/jni/GNUmakefile
+++ b/ext/jni/GNUmakefile
@@ -206,7 +206,7 @@ SQLITE_OPT = \
-DSQLITE_JNI_FATAL_OOM=$(opt.fatal-oom) \
-DSQLITE_JNI_ENABLE_METRICS=$(opt.metrics)
-opt.extras ?= 0
+opt.extras ?= 1
ifeq (1,$(opt.extras))
SQLITE_OPT += -DSQLITE_ENABLE_RTREE \
-DSQLITE_ENABLE_EXPLAIN_COMMENTS \
diff --git a/ext/jni/src/org/sqlite/jni/Tester1.java b/ext/jni/src/org/sqlite/jni/Tester1.java
index d5dffc2d8a..66489407fb 100644
--- a/ext/jni/src/org/sqlite/jni/Tester1.java
+++ b/ext/jni/src/org/sqlite/jni/Tester1.java
@@ -569,7 +569,7 @@ public class Tester1 implements Runnable {
final String expect = "SELECT 'hell😃'";
affirm( expect.equals(sqlite3_expanded_sql(stmt)) );
String n = sqlite3_normalized_sql(stmt);
- affirm( null==n || expect.equals(n) );
+ affirm( null==n || "SELECT?;".equals(n) );
sqlite3_finalize(stmt);
sqlite3_close(db);
}
diff --git a/manifest b/manifest
index 97464c8306..9959891670 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Correct\snon-void\sreturn\sfrom\ssqlite3_preupdate_hook()\swhen\sAPI_ARMOR\sis\senabled.\sBroken\sby\s[6cb77503484e].
-D 2023-10-15T13:25:39.766
+C JNI:\senable\sall\soptional\scomponents\sin\sthe\sdefault\sbuild\sand\sfix\sa\stest\sbroken\sby\san\soption\stoggle.
+D 2023-10-15T13:32:38.959
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -235,7 +235,7 @@ F ext/fts5/tool/showfts5.tcl d54da0e067306663e2d5d523965ca487698e722c
F ext/icu/README.txt 7ab7ced8ae78e3a645b57e78570ff589d4c672b71370f5aa9e1cd7024f400fc9
F ext/icu/icu.c c074519b46baa484bb5396c7e01e051034da8884bad1a1cb7f09bbe6be3f0282
F ext/icu/sqliteicu.h fa373836ed5a1ee7478bdf8a1650689294e41d0c89c1daab26e9ae78a32075a8
-F ext/jni/GNUmakefile 6da240c9a11701f3ed569384cd15ef611e8b3c5e3897d265923b14bf0e1eb272
+F ext/jni/GNUmakefile efaf1db6e3c2bbae4067924b932ee1a0f0640e842002c0dd9f3be824c24084f5
F ext/jni/README.md ef9ac115e97704ea995d743b4a8334e23c659e5534c3b64065a5405256d5f2f4
F ext/jni/jar-dist.make 030aaa4ae71dd86e4ec5e7c1e6cd86f9dfa47c4592c070d2e35157e42498e1fa
F ext/jni/src/c/sqlite3-jni.c ff7720536758ab952ed025a0a32a0e9d467d0b9a6bc7801dbdef56d56e074ea2
@@ -265,7 +265,7 @@ F ext/jni/src/org/sqlite/jni/ScalarFunction.java 6d387bb499fbe3bc13c53315335233d
F ext/jni/src/org/sqlite/jni/Sqlite.java 1617ea2bf3dfa493b7f031a3187cbfd6837c39bc1d406c4b3edcf9aab941639d
F ext/jni/src/org/sqlite/jni/SqliteException.java e17500e8bca2c68c260d8d0163fe4b7dc8bd0b1b90211201325c4a5566ce75ca
F ext/jni/src/org/sqlite/jni/TableColumnMetadata.java 54511b4297fa28dcb3f49b24035e34ced10e3fd44fd0e458e784f4d6b0096dab
-F ext/jni/src/org/sqlite/jni/Tester1.java 7c17a33e044a24d590007e1b4581b8d1e07653ab3f76fc66571b78905d6391b1
+F ext/jni/src/org/sqlite/jni/Tester1.java 034863c36b0cd98af8edadb252358213e7ed3140f2cf81e03ef0e228c45d6a3c
F ext/jni/src/org/sqlite/jni/Tester2.java 70e005d41060e398ec0f69bd39a8e1c376fd51f81629cf25e877889ec9cb6ec6
F ext/jni/src/org/sqlite/jni/TesterFts5.java d60fe9944a81156b3b5325dd1b0e8e92a1547468f39fd1266d06f7bb6a95fa70
F ext/jni/src/org/sqlite/jni/TraceV2Callback.java f157edd9c72e7d2243c169061487cd7bb51a0d50f3ac976dbcbbacf748ab1fc2
@@ -2128,8 +2128,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 6cb77503484e104a51f08690974d6e19c336ab5467d327f84be1d042615f008c
-R 6337a5530409955001babbd6d9763171
+P 40f5906f48d3f1f44d54e5b271fe04e7082166e50e3ed250bb57a4760f112e8a
+R f3587d7c5ef3f59e820876cab93a9847
U stephan
-Z 3e5e208c26caec77ac5884580b0569f0
+Z da5fb0c5e59fff6d3dac9695a0f0123e
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 037028a774..34bb378877 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-40f5906f48d3f1f44d54e5b271fe04e7082166e50e3ed250bb57a4760f112e8a
\ No newline at end of file
+5586a9df58a400c20a6815e8b0fbc7a7c49e5ef89daf92c452f1990586ca78ae
\ No newline at end of file
From 24f6baca164bde519de34be8a95bf018c2c6e445 Mon Sep 17 00:00:00 2001
From: stephan
Date: Sun, 15 Oct 2023 13:36:21 +0000
Subject: [PATCH 30/66] Change 3 instance of #if SQLITE_ENABLE_API_ARMOR to
#ifdef for consistency with how it is normally used.
FossilOrigin-Name: dd766eeb59fec71627dd8ad8f120875b96fda455c6401e5671e086b785e2b2bc
---
manifest | 16 ++++++++--------
manifest.uuid | 2 +-
src/main.c | 2 +-
src/mutex.c | 2 +-
src/mutex_unix.c | 2 +-
5 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/manifest b/manifest
index 9959891670..57fb170b3d 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C JNI:\senable\sall\soptional\scomponents\sin\sthe\sdefault\sbuild\sand\sfix\sa\stest\sbroken\sby\san\soption\stoggle.
-D 2023-10-15T13:32:38.959
+C Change\s3\sinstance\sof\s#if\sSQLITE_ENABLE_API_ARMOR\sto\s#ifdef\sfor\sconsistency\swith\show\sit\sis\snormally\sused.
+D 2023-10-15T13:36:21.836
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -677,7 +677,7 @@ F src/insert.c 3f0a94082d978bbdd33c38fefea15346c6c6bffb70bc645a71dc0f1f87dd3276
F src/json.c 799430345d16fed21713416318e6ca616f1264224f708555f387bfa2ab2496c7
F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa
F src/loadext.c 7d56c6f28aaf9b42e2772289e0d0a12a77b57c2baed021dbfd1fcafec69c156a
-F src/main.c b252cd436f6ae873ba115cff62462932d4c50ebbe4ab49767b0b500471789446
+F src/main.c 73ae4cab166b0fd36352446de7f7d91f89bde86686ae18f0bb7b245173479831
F src/malloc.c f016922435dc7d1f1f5083a03338a3e91f8c67ce2c5bdcfa4cdef62e612f5fcc
F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
F src/mem1.c 3bb59158c38e05f6270e761a9f435bf19827a264c13d1631c58b84bdc96d73b2
@@ -687,10 +687,10 @@ F src/mem5.c b7da5c10a726aacacc9ad7cdcb0667deec643e117591cc69cf9b4b9e7f3e96ff
F src/memdb.c 559c42e61eb70cd6d4bc692b042497133c6d96c09a3d514d92f3dac72268e223
F src/memjournal.c c283c6c95d940eb9dc70f1863eef3ee40382dbd35e5a1108026e7817c206e8a0
F src/msvc.h 80b35f95d93bf996ccb3e498535255f2ef1118c78764719a7cd15ab4106ccac9
-F src/mutex.c 5e3409715552348732e97b9194abe92fdfcd934cfb681df4ba0ab87ac6c18d25
+F src/mutex.c 1b4c7e5e3621b510e0c18397210be27cd54c8084141144fbbafd003fde948e88
F src/mutex.h a7b2293c48db5f27007c3bdb21d438873637d12658f5a0bf8ad025bb96803c4a
F src/mutex_noop.c 9d4309c075ba9cc7249e19412d3d62f7f94839c4
-F src/mutex_unix.c bd52ec50e44a41fe1e3deb5a6e3fe98edb6f2059da3e46d196363d0fa3192cda
+F src/mutex_unix.c f7ee5a2061a4c11815a2bf4fc0e2bfa6fb8d9dc89390eb613ca0cec32fc9a3d1
F src/mutex_w32.c 38b56d0bc8d54c17c20cbaaad3719b0c36b92fd07a7e34360d0c6a18d5589912
F src/notify.c 57c2d1a2805d6dee32acd5d250d928ab94e02d76369ae057dee7d445fd64e878
F src/os.c 509452169d5ea739723e213b8e2481cf0e587f0e88579a912d200db5269f5f6d
@@ -2128,8 +2128,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 40f5906f48d3f1f44d54e5b271fe04e7082166e50e3ed250bb57a4760f112e8a
-R f3587d7c5ef3f59e820876cab93a9847
+P 5586a9df58a400c20a6815e8b0fbc7a7c49e5ef89daf92c452f1990586ca78ae
+R b045a4bd60ecbc07c24e8195605c8e45
U stephan
-Z da5fb0c5e59fff6d3dac9695a0f0123e
+Z b22c2adb863c74eddbb30d84bd9e9ef0
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 34bb378877..a5f927f361 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-5586a9df58a400c20a6815e8b0fbc7a7c49e5ef89daf92c452f1990586ca78ae
\ No newline at end of file
+dd766eeb59fec71627dd8ad8f120875b96fda455c6401e5671e086b785e2b2bc
\ No newline at end of file
diff --git a/src/main.c b/src/main.c
index 4ffef9b418..893326c2b5 100644
--- a/src/main.c
+++ b/src/main.c
@@ -5012,7 +5012,7 @@ int sqlite3_compileoption_used(const char *zOptName){
int nOpt;
const char **azCompileOpt;
-#if SQLITE_ENABLE_API_ARMOR
+#ifdef SQLITE_ENABLE_API_ARMOR
if( zOptName==0 ){
(void)SQLITE_MISUSE_BKPT;
return 0;
diff --git a/src/mutex.c b/src/mutex.c
index 13a9fca15b..381ffbdfd5 100644
--- a/src/mutex.c
+++ b/src/mutex.c
@@ -133,7 +133,7 @@ static void checkMutexFree(sqlite3_mutex *p){
assert( SQLITE_MUTEX_FAST<2 );
assert( SQLITE_MUTEX_WARNONCONTENTION<2 );
-#if SQLITE_ENABLE_API_ARMOR
+#ifdef SQLITE_ENABLE_API_ARMOR
if( ((CheckMutex*)p)->iType<2 )
#endif
{
diff --git a/src/mutex_unix.c b/src/mutex_unix.c
index ac4331a67b..beae877f98 100644
--- a/src/mutex_unix.c
+++ b/src/mutex_unix.c
@@ -223,7 +223,7 @@ static sqlite3_mutex *pthreadMutexAlloc(int iType){
*/
static void pthreadMutexFree(sqlite3_mutex *p){
assert( p->nRef==0 );
-#if SQLITE_ENABLE_API_ARMOR
+#ifdef SQLITE_ENABLE_API_ARMOR
if( p->id==SQLITE_MUTEX_FAST || p->id==SQLITE_MUTEX_RECURSIVE )
#endif
{
From f83a4d850ce288dc26d8acf44cbd7bfde971b7c7 Mon Sep 17 00:00:00 2001
From: stephan
Date: Mon, 16 Oct 2023 08:05:51 +0000
Subject: [PATCH 31/66] JNI: do not expose SQLITE_OPEN_... flags which are
specific to VFSes.
FossilOrigin-Name: 2b4e53d8be42a3bc098317abd8bb58b8ddc25094d80787f784bbc896f4f7b976
---
ext/jni/src/c/sqlite3-jni.h | 24 ++-----------
ext/jni/src/org/sqlite/jni/CApi.java | 50 +++++++++++++++-------------
manifest | 14 ++++----
manifest.uuid | 2 +-
4 files changed, 36 insertions(+), 54 deletions(-)
diff --git a/ext/jni/src/c/sqlite3-jni.h b/ext/jni/src/c/sqlite3-jni.h
index 3a78e0917a..78559a3262 100644
--- a/ext/jni/src/c/sqlite3-jni.h
+++ b/ext/jni/src/c/sqlite3-jni.h
@@ -421,30 +421,10 @@ extern "C" {
#define org_sqlite_jni_CApi_SQLITE_OPEN_SHAREDCACHE 131072L
#undef org_sqlite_jni_CApi_SQLITE_OPEN_PRIVATECACHE
#define org_sqlite_jni_CApi_SQLITE_OPEN_PRIVATECACHE 262144L
-#undef org_sqlite_jni_CApi_SQLITE_OPEN_EXRESCODE
-#define org_sqlite_jni_CApi_SQLITE_OPEN_EXRESCODE 33554432L
#undef org_sqlite_jni_CApi_SQLITE_OPEN_NOFOLLOW
#define org_sqlite_jni_CApi_SQLITE_OPEN_NOFOLLOW 16777216L
-#undef org_sqlite_jni_CApi_SQLITE_OPEN_MAIN_DB
-#define org_sqlite_jni_CApi_SQLITE_OPEN_MAIN_DB 256L
-#undef org_sqlite_jni_CApi_SQLITE_OPEN_MAIN_JOURNAL
-#define org_sqlite_jni_CApi_SQLITE_OPEN_MAIN_JOURNAL 2048L
-#undef org_sqlite_jni_CApi_SQLITE_OPEN_TEMP_DB
-#define org_sqlite_jni_CApi_SQLITE_OPEN_TEMP_DB 512L
-#undef org_sqlite_jni_CApi_SQLITE_OPEN_TEMP_JOURNAL
-#define org_sqlite_jni_CApi_SQLITE_OPEN_TEMP_JOURNAL 4096L
-#undef org_sqlite_jni_CApi_SQLITE_OPEN_TRANSIENT_DB
-#define org_sqlite_jni_CApi_SQLITE_OPEN_TRANSIENT_DB 1024L
-#undef org_sqlite_jni_CApi_SQLITE_OPEN_SUBJOURNAL
-#define org_sqlite_jni_CApi_SQLITE_OPEN_SUBJOURNAL 8192L
-#undef org_sqlite_jni_CApi_SQLITE_OPEN_SUPER_JOURNAL
-#define org_sqlite_jni_CApi_SQLITE_OPEN_SUPER_JOURNAL 16384L
-#undef org_sqlite_jni_CApi_SQLITE_OPEN_WAL
-#define org_sqlite_jni_CApi_SQLITE_OPEN_WAL 524288L
-#undef org_sqlite_jni_CApi_SQLITE_OPEN_DELETEONCLOSE
-#define org_sqlite_jni_CApi_SQLITE_OPEN_DELETEONCLOSE 8L
-#undef org_sqlite_jni_CApi_SQLITE_OPEN_EXCLUSIVE
-#define org_sqlite_jni_CApi_SQLITE_OPEN_EXCLUSIVE 16L
+#undef org_sqlite_jni_CApi_SQLITE_OPEN_EXRESCODE
+#define org_sqlite_jni_CApi_SQLITE_OPEN_EXRESCODE 33554432L
#undef org_sqlite_jni_CApi_SQLITE_PREPARE_PERSISTENT
#define org_sqlite_jni_CApi_SQLITE_PREPARE_PERSISTENT 1L
#undef org_sqlite_jni_CApi_SQLITE_PREPARE_NORMALIZE
diff --git a/ext/jni/src/org/sqlite/jni/CApi.java b/ext/jni/src/org/sqlite/jni/CApi.java
index b006fceef1..aac9b4e071 100644
--- a/ext/jni/src/org/sqlite/jni/CApi.java
+++ b/ext/jni/src/org/sqlite/jni/CApi.java
@@ -2226,27 +2226,29 @@ final class CApi {
public static final int SQLITE_LIMIT_WORKER_THREADS = 11;
// open flags
- public static final int SQLITE_OPEN_READONLY = 1;
- public static final int SQLITE_OPEN_READWRITE = 2;
- public static final int SQLITE_OPEN_CREATE = 4;
- public static final int SQLITE_OPEN_URI = 64;
- public static final int SQLITE_OPEN_MEMORY = 128;
- public static final int SQLITE_OPEN_NOMUTEX = 32768;
- public static final int SQLITE_OPEN_FULLMUTEX = 65536;
- public static final int SQLITE_OPEN_SHAREDCACHE = 131072;
- public static final int SQLITE_OPEN_PRIVATECACHE = 262144;
- public static final int SQLITE_OPEN_EXRESCODE = 33554432;
- public static final int SQLITE_OPEN_NOFOLLOW = 16777216;
- public static final int SQLITE_OPEN_MAIN_DB = 256;
- public static final int SQLITE_OPEN_MAIN_JOURNAL = 2048;
- public static final int SQLITE_OPEN_TEMP_DB = 512;
- public static final int SQLITE_OPEN_TEMP_JOURNAL = 4096;
- public static final int SQLITE_OPEN_TRANSIENT_DB = 1024;
- public static final int SQLITE_OPEN_SUBJOURNAL = 8192;
- public static final int SQLITE_OPEN_SUPER_JOURNAL = 16384;
- public static final int SQLITE_OPEN_WAL = 524288;
- public static final int SQLITE_OPEN_DELETEONCLOSE = 8;
- public static final int SQLITE_OPEN_EXCLUSIVE = 16;
+
+ public static final int SQLITE_OPEN_READONLY = 0x00000001 /* Ok for sqlite3_open_v2() */;
+ public static final int SQLITE_OPEN_READWRITE = 0x00000002 /* Ok for sqlite3_open_v2() */;
+ public static final int SQLITE_OPEN_CREATE = 0x00000004 /* Ok for sqlite3_open_v2() */;
+ //public static final int SQLITE_OPEN_DELETEONCLOSE = 0x00000008 /* VFS only */;
+ //public static final int SQLITE_OPEN_EXCLUSIVE = 0x00000010 /* VFS only */;
+ //public static final int SQLITE_OPEN_AUTOPROXY = 0x00000020 /* VFS only */;
+ public static final int SQLITE_OPEN_URI = 0x00000040 /* Ok for sqlite3_open_v2() */;
+ public static final int SQLITE_OPEN_MEMORY = 0x00000080 /* Ok for sqlite3_open_v2() */;
+ //public static final int SQLITE_OPEN_MAIN_DB = 0x00000100 /* VFS only */;
+ //public static final int SQLITE_OPEN_TEMP_DB = 0x00000200 /* VFS only */;
+ //public static final int SQLITE_OPEN_TRANSIENT_DB = 0x00000400 /* VFS only */;
+ //public static final int SQLITE_OPEN_MAIN_JOURNAL = 0x00000800 /* VFS only */;
+ //public static final int SQLITE_OPEN_TEMP_JOURNAL = 0x00001000 /* VFS only */;
+ //public static final int SQLITE_OPEN_SUBJOURNAL = 0x00002000 /* VFS only */;
+ //public static final int SQLITE_OPEN_SUPER_JOURNAL = 0x00004000 /* VFS only */;
+ public static final int SQLITE_OPEN_NOMUTEX = 0x00008000 /* Ok for sqlite3_open_v2() */;
+ public static final int SQLITE_OPEN_FULLMUTEX = 0x00010000 /* Ok for sqlite3_open_v2() */;
+ public static final int SQLITE_OPEN_SHAREDCACHE = 0x00020000 /* Ok for sqlite3_open_v2() */;
+ public static final int SQLITE_OPEN_PRIVATECACHE = 0x00040000 /* Ok for sqlite3_open_v2() */;
+ //public static final int SQLITE_OPEN_WAL = 0x00080000 /* VFS only */;
+ public static final int SQLITE_OPEN_NOFOLLOW = 0x01000000 /* Ok for sqlite3_open_v2() */;
+ public static final int SQLITE_OPEN_EXRESCODE = 0x02000000 /* Extended result codes */;
// prepare flags
public static final int SQLITE_PREPARE_PERSISTENT = 1;
@@ -2406,9 +2408,9 @@ final class CApi {
public static final int SQLITE_TXN_WRITE = 2;
// udf flags
- public static final int SQLITE_DETERMINISTIC = 2048;
- public static final int SQLITE_DIRECTONLY = 524288;
- public static final int SQLITE_INNOCUOUS = 2097152;
+ public static final int SQLITE_DETERMINISTIC = 0x000000800;
+ public static final int SQLITE_DIRECTONLY = 0x000080000;
+ public static final int SQLITE_INNOCUOUS = 0x000200000;
// virtual tables
public static final int SQLITE_INDEX_SCAN_UNIQUE = 1;
diff --git a/manifest b/manifest
index 57fb170b3d..f5fef60313 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Change\s3\sinstance\sof\s#if\sSQLITE_ENABLE_API_ARMOR\sto\s#ifdef\sfor\sconsistency\swith\show\sit\sis\snormally\sused.
-D 2023-10-15T13:36:21.836
+C JNI:\sdo\snot\sexpose\sSQLITE_OPEN_...\sflags\swhich\sare\sspecific\sto\sVFSes.
+D 2023-10-16T08:05:51.755
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -239,13 +239,13 @@ F ext/jni/GNUmakefile efaf1db6e3c2bbae4067924b932ee1a0f0640e842002c0dd9f3be824c2
F ext/jni/README.md ef9ac115e97704ea995d743b4a8334e23c659e5534c3b64065a5405256d5f2f4
F ext/jni/jar-dist.make 030aaa4ae71dd86e4ec5e7c1e6cd86f9dfa47c4592c070d2e35157e42498e1fa
F ext/jni/src/c/sqlite3-jni.c ff7720536758ab952ed025a0a32a0e9d467d0b9a6bc7801dbdef56d56e074ea2
-F ext/jni/src/c/sqlite3-jni.h fefcf0a7116d0c0f097c7ac71ca9ab4d092bf661ac40dd9dafb415d929f9b26d
+F ext/jni/src/c/sqlite3-jni.h e7c19450b691aeb12a1506521432144b5d07031683e0fbaad7dfcb9a0c8d69d7
F ext/jni/src/org/sqlite/jni/AbstractCollationCallback.java 95e88ba04f4aac51ffec65693e878e234088b2f21b387f4e4285c8b72b33e436
F ext/jni/src/org/sqlite/jni/AggregateFunction.java 7312486bc65fecdb91753c0a4515799194e031f45edbe16a6373cea18f404dc4
F ext/jni/src/org/sqlite/jni/AuthorizerCallback.java fde5f758ad170ca45ae00b12194c8ba8d8f3090bd64cc3e002dd9c5e7dff8568
F ext/jni/src/org/sqlite/jni/AutoExtensionCallback.java c0fbfd3779fc92982c7935325a7484dee43eeb80d716989ed31218f453addb94
F ext/jni/src/org/sqlite/jni/BusyHandlerCallback.java 4cb7fc70efd55583fed6033c34a8719da42975ca97ef4781dda0b9f6cc8ec2e8
-F ext/jni/src/org/sqlite/jni/CApi.java 32dcd13be87308fbd98f07cb6f6c25ece21ccb17b5fb9ff81e4c6e574758db0e
+F ext/jni/src/org/sqlite/jni/CApi.java ab05a2ad4237b95e96ac5acf9ce28f1432f0862546444fc2f6265b6998e14860
F ext/jni/src/org/sqlite/jni/CallbackProxy.java 064a8a00e4c63cc501c30504f93ca996d422c5f010067f969b2d0a10f0868153
F ext/jni/src/org/sqlite/jni/CollationCallback.java 8cf57cb014a645ecc12609eed17308852a597bc5e83d82a4fdb90f7fadc25f9d
F ext/jni/src/org/sqlite/jni/CollationNeededCallback.java 0c62245e000d5db52576c728cac20f6a31f31f5cf40ca4cbcd64b22964e82ae5
@@ -2128,8 +2128,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 5586a9df58a400c20a6815e8b0fbc7a7c49e5ef89daf92c452f1990586ca78ae
-R b045a4bd60ecbc07c24e8195605c8e45
+P dd766eeb59fec71627dd8ad8f120875b96fda455c6401e5671e086b785e2b2bc
+R a3abea6aaad96691a9fd3e93b233f3d2
U stephan
-Z b22c2adb863c74eddbb30d84bd9e9ef0
+Z 11a2a6974b07b2c488e6e36a5cdd602e
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index a5f927f361..0d84e69c19 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-dd766eeb59fec71627dd8ad8f120875b96fda455c6401e5671e086b785e2b2bc
\ No newline at end of file
+2b4e53d8be42a3bc098317abd8bb58b8ddc25094d80787f784bbc896f4f7b976
\ No newline at end of file
From 19179722d6bf7bff82bcf9a72b2d0346346e46ff Mon Sep 17 00:00:00 2001
From: stephan
Date: Mon, 16 Oct 2023 08:10:11 +0000
Subject: [PATCH 32/66] JNI: after calling a Java-side UDF, zero-out the
pointer of the Java-side sqlite3_context and sqlite3_value array entries to
avoid misbehavior if a client makes the mistake of holding a reference to one
of those objects.
FossilOrigin-Name: 9fc3104f76a83d600beb11d91feb97bcea8bc7f7cda8cd73e7a6b81fbba879df
---
ext/jni/src/c/sqlite3-jni.c | 26 ++++++++++++++++++++++++-
ext/jni/src/org/sqlite/jni/Tester1.java | 18 +++++++++++++++++
manifest | 14 ++++++-------
manifest.uuid | 2 +-
4 files changed, 51 insertions(+), 9 deletions(-)
diff --git a/ext/jni/src/c/sqlite3-jni.c b/ext/jni/src/c/sqlite3-jni.c
index 792f5d6f78..dd643c30bd 100644
--- a/ext/jni/src/c/sqlite3-jni.c
+++ b/ext/jni/src/c/sqlite3-jni.c
@@ -1835,7 +1835,7 @@ typedef struct {
** final 2 arguments. Returns 0 on success, SQLITE_NOMEM on allocation
** error. On error *jCx and *jArgv will be set to 0. The output
** objects are of type org.sqlite.jni.sqlite3_context and
-** array-of-org.sqlite3.jni.sqlite3_value, respectively.
+** array-of-org.sqlite.jni.sqlite3_value, respectively.
*/
static int udf_args(JNIEnv *env,
sqlite3_context * const cx,
@@ -1867,6 +1867,28 @@ error_oom:
return SQLITE_NOMEM;
}
+/*
+** Requires that jCx and jArgv are sqlite3_context
+** resp. array-of-sqlite3_value values initialized by udf_args(). This
+** function zeroes out the nativePointer member of jCx and each entry
+** in jArgv. This is a safety-net precaution to avoid undefined
+** behavior if a Java-side UDF holds a reference to one of its
+** arguments. This MUST be called from any function which successfully
+** calls udf_args(), after calling the corresponding UDF and checking
+** its exception status. It MUST NOT be called in any other case.
+*/
+static void udf_unargs(JNIEnv *env, jobject jCx, int argc, jobjectArray jArgv){
+ int i = 0;
+ assert(jCx);
+ NativePointerHolder_set(S3JniNph(sqlite3_context), jCx, 0);
+ for( ; i < argc; ++i ){
+ jobject jsv = (*env)->GetObjectArrayElement(env, jArgv, i);
+ assert(jsv);
+ NativePointerHolder_set(S3JniNph(sqlite3_value), jsv, 0);
+ }
+}
+
+
/*
** Must be called immediately after a Java-side UDF callback throws.
** If translateToErr is true then it sets the exception's message in
@@ -1926,6 +1948,7 @@ static int udf_xFSI(sqlite3_context* const pCx, int argc,
rc = udf_report_exception(env, 'F'==zFuncType[1]/*xFunc*/, pCx,
s->zFuncName, zFuncType);
}
+ udf_unargs(env, args.jcx, argc, args.jargv);
}
S3JniUnrefLocal(args.jcx);
S3JniUnrefLocal(args.jargv);
@@ -5168,6 +5191,7 @@ static void s3jni_fts5_extension_function(Fts5ExtensionApi const *pApi,
S3JniIfThrew{
udf_report_exception(env, 1, pCx, pAux->zFuncName, "call");
}
+ udf_unargs(env, jpCx, argc, jArgv);
S3JniUnrefLocal(jpFts);
S3JniUnrefLocal(jpCx);
S3JniUnrefLocal(jArgv);
diff --git a/ext/jni/src/org/sqlite/jni/Tester1.java b/ext/jni/src/org/sqlite/jni/Tester1.java
index 66489407fb..43ba085fab 100644
--- a/ext/jni/src/org/sqlite/jni/Tester1.java
+++ b/ext/jni/src/org/sqlite/jni/Tester1.java
@@ -694,6 +694,8 @@ public class Tester1 implements Runnable {
// These ValueHolders are just to confirm that the func did what we want...
final ValueHolder xDestroyCalled = new ValueHolder<>(false);
final ValueHolder xFuncAccum = new ValueHolder<>(0);
+ final ValueHolder neverEverDoThisInClientCode = new ValueHolder<>(null);
+ final ValueHolder neverEverDoThisInClientCode2 = new ValueHolder<>(null);
// Create an SQLFunction instance using one of its 3 subclasses:
// Scalar, Aggregate, or Window:
@@ -704,6 +706,15 @@ public class Tester1 implements Runnable {
new ScalarFunction(){
public void xFunc(sqlite3_context cx, sqlite3_value[] args){
affirm(db == sqlite3_context_db_handle(cx));
+ if( null==neverEverDoThisInClientCode.value ){
+ neverEverDoThisInClientCode2.value = cx;
+ neverEverDoThisInClientCode.value = args
+ /* !!!NEVER!!! hold a reference to an sqlite3_value
+ object like this in client code! They are ONLY legal
+ for the duration of their single call. We do it here
+ ONLY to test that the defenses against clients doing
+ this are working. */;
+ }
int result = 0;
for( sqlite3_value v : args ) result += sqlite3_value_int(v);
xFuncAccum.value += result;// just for post-run testing
@@ -729,6 +740,13 @@ public class Tester1 implements Runnable {
affirm(1 == n);
affirm(6 == xFuncAccum.value);
affirm( !xDestroyCalled.value );
+ affirm( null!=neverEverDoThisInClientCode.value );
+ affirm( null!=neverEverDoThisInClientCode2.value );
+ affirm( 0
Date: Mon, 16 Oct 2023 10:27:19 +0000
Subject: [PATCH 33/66] JNI: move the C-style API parts into the capi
subpackage and the higher-level wrapper into (tentatively) wrapper1, so that
CApi.java can support multiple independent higher-level wrappers without name
collisions, and CApi can be made public but have the option to be elided from
wrapper-level javadocs for wrappers which do not wish to expose it.
FossilOrigin-Name: 9fcdf96adca25cc2d2f4b75ec4eea94254fb9671c5ba63b88213d7f62dedff1b
---
ext/jni/GNUmakefile | 46 +-
ext/jni/src/c/sqlite3-jni.c | 87 +-
ext/jni/src/c/sqlite3-jni.h | 2384 ++++++++---------
.../{ => capi}/AbstractCollationCallback.java | 2 +-
.../jni/{ => capi}/AggregateFunction.java | 2 +-
.../jni/{ => capi}/AuthorizerCallback.java | 2 +-
.../jni/{ => capi}/AutoExtensionCallback.java | 2 +-
.../jni/{ => capi}/BusyHandlerCallback.java | 2 +-
.../src/org/sqlite/jni/{ => capi}/CApi.java | 6 +-
.../sqlite/jni/{ => capi}/CallbackProxy.java | 2 +-
.../jni/{ => capi}/CollationCallback.java | 2 +-
.../{ => capi}/CollationNeededCallback.java | 2 +-
.../jni/{ => capi}/CommitHookCallback.java | 2 +-
.../jni/{ => capi}/ConfigLogCallback.java | 2 +-
.../jni/{ => capi}/ConfigSqllogCallback.java | 2 +-
.../jni/{ => capi}/NativePointerHolder.java | 2 +-
.../sqlite/jni/{ => capi}/OutputPointer.java | 34 +-
.../jni/{ => capi}/PrepareMultiCallback.java | 2 +-
.../jni/{ => capi}/PreupdateHookCallback.java | 2 +-
.../{ => capi}/ProgressHandlerCallback.java | 2 +-
.../org/sqlite/jni/{ => capi}/ResultCode.java | 2 +-
.../jni/{ => capi}/RollbackHookCallback.java | 2 +-
.../sqlite/jni/{ => capi}/SQLFunction.java | 2 +-
.../org/sqlite/jni/{ => capi}/SQLTester.java | 6 +-
.../sqlite/jni/{ => capi}/ScalarFunction.java | 2 +-
.../jni/{ => capi}/TableColumnMetadata.java | 2 +-
.../org/sqlite/jni/{ => capi}/Tester1.java | 18 +-
.../jni/{ => capi}/TraceV2Callback.java | 2 +-
.../jni/{ => capi}/UpdateHookCallback.java | 2 +-
.../sqlite/jni/{ => capi}/WindowFunction.java | 2 +-
.../jni/{ => capi}/XDestroyCallback.java | 2 +-
.../sqlite/jni/{ => capi}/package-info.java | 4 +-
.../org/sqlite/jni/{ => capi}/sqlite3.java | 2 +-
.../sqlite/jni/{ => capi}/sqlite3_backup.java | 2 +-
.../sqlite/jni/{ => capi}/sqlite3_blob.java | 2 +-
.../jni/{ => capi}/sqlite3_context.java | 2 +-
.../sqlite/jni/{ => capi}/sqlite3_stmt.java | 2 +-
.../sqlite/jni/{ => capi}/sqlite3_value.java | 2 +-
.../src/org/sqlite/jni/fts5/Fts5Context.java | 2 +-
.../org/sqlite/jni/fts5/Fts5ExtensionApi.java | 2 +-
.../org/sqlite/jni/fts5/Fts5PhraseIter.java | 2 +-
.../org/sqlite/jni/fts5/Fts5Tokenizer.java | 2 +-
.../org/sqlite/jni/{ => fts5}/TesterFts5.java | 8 +-
ext/jni/src/org/sqlite/jni/fts5/fts5_api.java | 2 +-
.../jni/fts5/fts5_extension_function.java | 4 +-
.../org/sqlite/jni/fts5/fts5_tokenizer.java | 2 +-
.../org/sqlite/jni/{ => wrapper1}/Sqlite.java | 7 +-
.../jni/{ => wrapper1}/SqliteException.java | 5 +-
.../sqlite/jni/{ => wrapper1}/Tester2.java | 23 +-
manifest | 108 +-
manifest.uuid | 2 +-
51 files changed, 1421 insertions(+), 1393 deletions(-)
rename ext/jni/src/org/sqlite/jni/{ => capi}/AbstractCollationCallback.java (97%)
rename ext/jni/src/org/sqlite/jni/{ => capi}/AggregateFunction.java (98%)
rename ext/jni/src/org/sqlite/jni/{ => capi}/AuthorizerCallback.java (96%)
rename ext/jni/src/org/sqlite/jni/{ => capi}/AutoExtensionCallback.java (97%)
rename ext/jni/src/org/sqlite/jni/{ => capi}/BusyHandlerCallback.java (96%)
rename ext/jni/src/org/sqlite/jni/{ => capi}/CApi.java (99%)
rename ext/jni/src/org/sqlite/jni/{ => capi}/CallbackProxy.java (98%)
rename ext/jni/src/org/sqlite/jni/{ => capi}/CollationCallback.java (97%)
rename ext/jni/src/org/sqlite/jni/{ => capi}/CollationNeededCallback.java (96%)
rename ext/jni/src/org/sqlite/jni/{ => capi}/CommitHookCallback.java (95%)
rename ext/jni/src/org/sqlite/jni/{ => capi}/ConfigLogCallback.java (96%)
rename ext/jni/src/org/sqlite/jni/{ => capi}/ConfigSqllogCallback.java (96%)
rename ext/jni/src/org/sqlite/jni/{ => capi}/NativePointerHolder.java (98%)
rename ext/jni/src/org/sqlite/jni/{ => capi}/OutputPointer.java (87%)
rename ext/jni/src/org/sqlite/jni/{ => capi}/PrepareMultiCallback.java (98%)
rename ext/jni/src/org/sqlite/jni/{ => capi}/PreupdateHookCallback.java (96%)
rename ext/jni/src/org/sqlite/jni/{ => capi}/ProgressHandlerCallback.java (96%)
rename ext/jni/src/org/sqlite/jni/{ => capi}/ResultCode.java (99%)
rename ext/jni/src/org/sqlite/jni/{ => capi}/RollbackHookCallback.java (95%)
rename ext/jni/src/org/sqlite/jni/{ => capi}/SQLFunction.java (99%)
rename ext/jni/src/org/sqlite/jni/{ => capi}/SQLTester.java (99%)
rename ext/jni/src/org/sqlite/jni/{ => capi}/ScalarFunction.java (97%)
rename ext/jni/src/org/sqlite/jni/{ => capi}/TableColumnMetadata.java (97%)
rename ext/jni/src/org/sqlite/jni/{ => capi}/Tester1.java (99%)
rename ext/jni/src/org/sqlite/jni/{ => capi}/TraceV2Callback.java (98%)
rename ext/jni/src/org/sqlite/jni/{ => capi}/UpdateHookCallback.java (96%)
rename ext/jni/src/org/sqlite/jni/{ => capi}/WindowFunction.java (97%)
rename ext/jni/src/org/sqlite/jni/{ => capi}/XDestroyCallback.java (97%)
rename ext/jni/src/org/sqlite/jni/{ => capi}/package-info.java (98%)
rename ext/jni/src/org/sqlite/jni/{ => capi}/sqlite3.java (97%)
rename ext/jni/src/org/sqlite/jni/{ => capi}/sqlite3_backup.java (96%)
rename ext/jni/src/org/sqlite/jni/{ => capi}/sqlite3_blob.java (96%)
rename ext/jni/src/org/sqlite/jni/{ => capi}/sqlite3_context.java (99%)
rename ext/jni/src/org/sqlite/jni/{ => capi}/sqlite3_stmt.java (96%)
rename ext/jni/src/org/sqlite/jni/{ => capi}/sqlite3_value.java (95%)
rename ext/jni/src/org/sqlite/jni/{ => fts5}/TesterFts5.java (99%)
rename ext/jni/src/org/sqlite/jni/{ => wrapper1}/Sqlite.java (96%)
rename ext/jni/src/org/sqlite/jni/{ => wrapper1}/SqliteException.java (95%)
rename ext/jni/src/org/sqlite/jni/{ => wrapper1}/Tester2.java (94%)
diff --git a/ext/jni/GNUmakefile b/ext/jni/GNUmakefile
index ddc51f727e..6b09514e1c 100644
--- a/ext/jni/GNUmakefile
+++ b/ext/jni/GNUmakefile
@@ -26,6 +26,7 @@ dir.src.c := $(dir.src)/c
dir.bld := $(dir.jni)/bld
dir.bld.c := $(dir.bld)
dir.src.jni := $(dir.src)/org/sqlite/jni
+dir.src.capi := $(dir.src.jni)/capi
dir.src.fts5 := $(dir.src.jni)/fts5
dir.tests := $(dir.src)/tests
mkdir ?= mkdir -p
@@ -45,8 +46,8 @@ DISTCLEAN_FILES := $(dir.jni)/*~ $(dir.src.c)/*~ $(dir.src.jni)/*~
sqlite3-jni.h := $(dir.src.c)/sqlite3-jni.h
.NOTPARALLEL: $(sqlite3-jni.h)
-CApi.java := src/org/sqlite/jni/CApi.java
-SQLTester.java := src/org/sqlite/jni/SQLTester.java
+CApi.java := $(dir.src.capi)/CApi.java
+SQLTester.java := $(dir.src.capi)/SQLTester.java
CApi.class := $(CApi.java:.java=.class)
SQLTester.class := $(SQLTester.java:.java=.class)
@@ -77,9 +78,10 @@ $(bin.version-info): $(dir.tool)/version-info.c $(sqlite3.h) $(dir.top)/Makefile
# Be explicit about which Java files to compile so that we can work on
# in-progress files without requiring them to be in a compilable statae.
-JAVA_FILES.main := $(patsubst %,$(dir.src.jni)/%,\
- annotation/NotNull.java \
- annotation/Nullable.java \
+JAVA_FILES.main := $(patsubst %,$(dir.src.jni)/annotation/%,\
+ NotNull.java \
+ Nullable.java \
+) $(patsubst %,$(dir.src.capi)/%,\
AbstractCollationCallback.java \
AggregateFunction.java \
AuthorizerCallback.java \
@@ -98,8 +100,6 @@ JAVA_FILES.main := $(patsubst %,$(dir.src.jni)/%,\
ResultCode.java \
RollbackHookCallback.java \
ScalarFunction.java \
- Sqlite.java \
- SqliteException.java \
SQLFunction.java \
CallbackProxy.java \
CApi.java \
@@ -112,13 +112,17 @@ JAVA_FILES.main := $(patsubst %,$(dir.src.jni)/%,\
sqlite3_context.java \
sqlite3_stmt.java \
sqlite3_value.java \
+) $(patsubst %,$(dir.src.jni)/wrapper1/%,\
+ Sqlite.java \
+ SqliteException.java \
)
+
JAVA_FILES.unittest := $(patsubst %,$(dir.src.jni)/%,\
- Tester1.java \
- Tester2.java \
+ capi/Tester1.java \
+ wrapper1/Tester2.java \
)
ifeq (1,$(enable.fts5))
- JAVA_FILES.unittest += $(patsubst %,$(dir.src.jni)/%,\
+ JAVA_FILES.unittest += $(patsubst %,$(dir.src.fts5)/%,\
TesterFts5.java \
)
JAVA_FILES.main += $(patsubst %,$(dir.src.fts5)/%,\
@@ -245,8 +249,8 @@ $$(dir.bld.c)/org_sqlite_jni$(3)_$(2).h: $(1)/$(2).java
endef
# Invoke ADD_JNI_H once for each Java file which includes JNI
# declarations:
-$(eval $(call ADD_JNI_H,$(dir.src.jni),CApi,))
-$(eval $(call ADD_JNI_H,$(dir.src.jni),SQLTester,))
+$(eval $(call ADD_JNI_H,$(dir.src.capi),CApi,_capi))
+$(eval $(call ADD_JNI_H,$(dir.src.capi),SQLTester,_capi))
ifeq (1,$(enable.fts5))
$(eval $(call ADD_JNI_H,$(dir.src.fts5),Fts5ExtensionApi,_fts5))
$(eval $(call ADD_JNI_H,$(dir.src.fts5),fts5_api,_fts5))
@@ -303,16 +307,16 @@ test.flags.jvm = -ea -Djava.library.path=$(dir.bld.c) \
$(java.flags) -cp $(classpath)
test.deps := $(CLASS_FILES) $(package.dll)
test-one: $(test.deps)
- $(bin.java) $(test.flags.jvm) org.sqlite.jni.Tester1 $(Tester1.flags)
- $(bin.java) $(test.flags.jvm) org.sqlite.jni.Tester2 $(Tester2.flags)
+ $(bin.java) $(test.flags.jvm) org.sqlite.jni.capi.Tester1 $(Tester1.flags)
+ $(bin.java) $(test.flags.jvm) org.sqlite.jni.wrapper1.Tester2 $(Tester2.flags)
test-sqllog: $(test.deps)
@echo "Testing with -sqllog..."
$(bin.java) $(test.flags.jvm) -sqllog
test-mt: $(test.deps)
@echo "Testing in multi-threaded mode:";
- $(bin.java) $(test.flags.jvm) org.sqlite.jni.Tester1 \
+ $(bin.java) $(test.flags.jvm) org.sqlite.jni.capi.Tester1 \
-t 7 -r 50 -shuffle $(Tester1.flags)
- $(bin.java) $(test.flags.jvm) org.sqlite.jni.Tester2 \
+ $(bin.java) $(test.flags.jvm) org.sqlite.jni.wrapper1.Tester2 \
-t 7 -r 50 -shuffle $(Tester2.flags)
test: test-one test-mt
@@ -325,7 +329,7 @@ ifeq (1,$(enable.tester))
tester-local: $(CLASS_FILES.tester) $(package.dll)
$(bin.java) -ea -Djava.library.path=$(dir.bld.c) \
$(java.flags) -cp $(classpath) \
- org.sqlite.jni.SQLTester $(tester.flags) $(tester.scripts)
+ org.sqlite.jni.capi.SQLTester $(tester.flags) $(tester.scripts)
tester: tester-local
else
tester:
@@ -339,7 +343,7 @@ ifneq (,$(tester.extern-scripts))
tester-ext:
$(bin.java) -ea -Djava.library.path=$(dir.bld.c) \
$(java.flags) -cp $(classpath) \
- org.sqlite.jni.SQLTester $(tester.flags) $(tester.extern-scripts)
+ org.sqlite.jni.capi.SQLTester $(tester.flags) $(tester.extern-scripts)
else
tester-ext:
@echo "******************************************************"; \
@@ -385,7 +389,7 @@ $(package.jar.in): $(package.dll) $(MAKEFILE)
$(package.jar): $(CLASS_FILES.jar) $(MAKEFILE) $(package.jar.in)
@rm -f $(dir.src)/c/*~ $(dir.src.jni)/*~
- cd $(dir.src); $(bin.jar) -cfe ../$@ org.sqlite.jni.Tester1 @$(package.jar.in)
+ cd $(dir.src); $(bin.jar) -cfe ../$@ org.sqlite.jni.capi.Tester1 @$(package.jar.in)
@ls -la $@
@echo "To use this jar you will need the -Djava.library.path=DIR/CONTAINING/libsqlite3-jni.so flag."
@echo "e.g. java -Djava.library.path=bld -jar $@"
@@ -402,6 +406,8 @@ javadoc.exclude := -exclude org.sqlite.jni.fts5
# ^^^^ 2023-09-13: elide the fts5 parts from the public docs for
# the time being, as it's not clear where the Java bindings for
# those bits are going.
+# javadoc.exclude += -exclude org.sqlite.jni.capi
+# ^^^^ exclude the capi API only for certain builds (TBD)
$(doc.index): $(JAVA_FILES.main) $(MAKEFILE)
@if [ -d $(dir.doc) ]; then rm -fr $(dir.doc)/*; fi
$(bin.javadoc) -cp $(classpath) -d $(dir.doc) -quiet \
@@ -422,7 +428,7 @@ docserve: $(doc.index)
# Clean up...
CLEAN_FILES += $(dir.bld.c)/* \
$(dir.src.jni)/*.class \
- $(dir.src.jni.tester)/*.class \
+ $(dir.src.jni)/*/*.class \
$(package.dll) \
hs_err_pid*.log
diff --git a/ext/jni/src/c/sqlite3-jni.c b/ext/jni/src/c/sqlite3-jni.c
index dd643c30bd..8009592b6b 100644
--- a/ext/jni/src/c/sqlite3-jni.c
+++ b/ext/jni/src/c/sqlite3-jni.c
@@ -10,7 +10,7 @@
**
*************************************************************************
** This file implements the JNI bindings declared in
-** org.sqlite.jni.CApi (from which sqlite3-jni.h is generated).
+** org.sqlite.jni.capi.CApi (from which sqlite3-jni.h is generated).
*/
/*
@@ -169,7 +169,7 @@
** prefix seen in this macro.
*/
#define JniFuncName(Suffix) \
- Java_org_sqlite_jni_CApi_sqlite3_ ## Suffix
+ Java_org_sqlite_jni_capi_CApi_sqlite3_ ## Suffix
/* Prologue for JNI function declarations and definitions. */
#define JniDecl(ReturnType,Suffix) \
@@ -386,26 +386,26 @@ static const struct {
#define RefN(INDEX, KLAZZ) MkRef(INDEX, KLAZZ, "nativePointer", "J")
/* OutputPointer.T ref */
#define RefO(INDEX, KLAZZ, SIG) MkRef(INDEX, KLAZZ, "value", SIG)
- RefN(0, "sqlite3"),
- RefN(1, "sqlite3_backup"),
- RefN(2, "sqlite3_blob"),
- RefN(3, "sqlite3_context"),
- RefN(4, "sqlite3_stmt"),
- RefN(5, "sqlite3_value"),
- RefO(6, "OutputPointer$Bool", "Z"),
- RefO(7, "OutputPointer$Int32", "I"),
- RefO(8, "OutputPointer$Int64", "J"),
- RefO(9, "OutputPointer$sqlite3",
- "Lorg/sqlite/jni/sqlite3;"),
- RefO(10, "OutputPointer$sqlite3_blob",
- "Lorg/sqlite/jni/sqlite3_blob;"),
- RefO(11, "OutputPointer$sqlite3_stmt",
- "Lorg/sqlite/jni/sqlite3_stmt;"),
- RefO(12, "OutputPointer$sqlite3_value",
- "Lorg/sqlite/jni/sqlite3_value;"),
- RefO(13, "OutputPointer$String", "Ljava/lang/String;"),
+ RefN(0, "capi/sqlite3"),
+ RefN(1, "capi/sqlite3_backup"),
+ RefN(2, "capi/sqlite3_blob"),
+ RefN(3, "capi/sqlite3_context"),
+ RefN(4, "capi/sqlite3_stmt"),
+ RefN(5, "capi/sqlite3_value"),
+ RefO(6, "capi/OutputPointer$Bool", "Z"),
+ RefO(7, "capi/OutputPointer$Int32", "I"),
+ RefO(8, "capi/OutputPointer$Int64", "J"),
+ RefO(9, "capi/OutputPointer$sqlite3",
+ "Lorg/sqlite/jni/capi/sqlite3;"),
+ RefO(10, "capi/OutputPointer$sqlite3_blob",
+ "Lorg/sqlite/jni/capi/sqlite3_blob;"),
+ RefO(11, "capi/OutputPointer$sqlite3_stmt",
+ "Lorg/sqlite/jni/capi/sqlite3_stmt;"),
+ RefO(12, "capi/OutputPointer$sqlite3_value",
+ "Lorg/sqlite/jni/capi/sqlite3_value;"),
+ RefO(13, "capi/OutputPointer$String", "Ljava/lang/String;"),
#ifdef SQLITE_ENABLE_FTS5
- RefO(14, "OutputPointer$ByteArray", "[B"),
+ RefO(14, "capi/OutputPointer$ByteArray", "[B"),
RefN(15, "fts5/Fts5Context"),
RefN(16, "fts5/Fts5ExtensionApi"),
RefN(17, "fts5/fts5_api"),
@@ -660,7 +660,7 @@ struct S3JniGlobalType {
} g;
/*
** The list of Java-side auto-extensions
- ** (org.sqlite.jni.AutoExtensionCallback objects).
+ ** (org.sqlite.jni.capi.AutoExtensionCallback objects).
*/
struct {
S3JniAutoExtension *aExt /* The auto-extension list. It is
@@ -1371,6 +1371,7 @@ static S3JniNphOp * s3jni__nphop(JNIEnv * const env, S3JniNphOp const* pRef){
S3JniNph_mutex_enter;
if( !pNC->klazz ){
jclass const klazz = (*env)->FindClass(env, pRef->zName);
+ //printf("FindClass %s\n", pRef->zName);
S3JniExceptionIsFatal("FindClass() unexpectedly threw");
pNC->klazz = S3JniRefGlobal(klazz);
}
@@ -1515,7 +1516,7 @@ static S3JniDb * S3JniDb_alloc(JNIEnv * const env, jobject jDb){
}
/*
-** Returns the S3JniDb object for the given org.sqlite.jni.sqlite3
+** Returns the S3JniDb object for the given org.sqlite.jni.capi.sqlite3
** object, or NULL if jDb is NULL, no pointer can be extracted
** from it, or no matching entry can be found.
*/
@@ -1564,7 +1565,7 @@ static int S3JniAutoExtension_init(JNIEnv *const env,
S3JniAutoExt_mutex_assertLocker;
*ax = S3JniHook_empty;
ax->midCallback = (*env)->GetMethodID(env, klazz, "call",
- "(Lorg/sqlite/jni/sqlite3;)I");
+ "(Lorg/sqlite/jni/capi/sqlite3;)I");
S3JniUnrefLocal(klazz);
S3JniExceptionWarnIgnore;
if( !ax->midCallback ){
@@ -1660,7 +1661,7 @@ static int encodingTypeIsValid(int eTextRep){
}
/* For use with sqlite3_result/value_pointer() */
-static const char * const ResultJavaValuePtrStr = "org.sqlite.jni.ResultJavaVal";
+static const char * const ResultJavaValuePtrStr = "org.sqlite.jni.capi.ResultJavaVal";
/*
** If v is not NULL, it must be a jobject global reference. Its
@@ -1758,9 +1759,9 @@ static S3JniUdf * S3JniUdf_alloc(JNIEnv * const env, jobject jObj){
}
if( s ){
const char * zFSI = /* signature for xFunc, xStep, xInverse */
- "(Lorg/sqlite/jni/sqlite3_context;[Lorg/sqlite/jni/sqlite3_value;)V";
+ "(Lorg/sqlite/jni/capi/sqlite3_context;[Lorg/sqlite/jni/capi/sqlite3_value;)V";
const char * zFV = /* signature for xFinal, xValue */
- "(Lorg/sqlite/jni/sqlite3_context;)V";
+ "(Lorg/sqlite/jni/capi/sqlite3_context;)V";
jclass const klazz = (*env)->GetObjectClass(env, jObj);
memset(s, 0, sizeof(*s));
@@ -1834,8 +1835,8 @@ typedef struct {
** UDF, writing the result (Java wrappers for cx and argv) in the
** final 2 arguments. Returns 0 on success, SQLITE_NOMEM on allocation
** error. On error *jCx and *jArgv will be set to 0. The output
-** objects are of type org.sqlite.jni.sqlite3_context and
-** array-of-org.sqlite.jni.sqlite3_value, respectively.
+** objects are of type org.sqlite.jni.capi.sqlite3_context and
+** array-of-org.sqlite.jni.capi.sqlite3_value, respectively.
*/
static int udf_args(JNIEnv *env,
sqlite3_context * const cx,
@@ -2781,7 +2782,7 @@ S3JniApi(sqlite3_collation_needed(),jint,1collation_1needed)(
}else{
jclass const klazz = (*env)->GetObjectClass(env, jHook);
jmethodID const xCallback = (*env)->GetMethodID(
- env, klazz, "call", "(Lorg/sqlite/jni/sqlite3;ILjava/lang/String;)I"
+ env, klazz, "call", "(Lorg/sqlite/jni/capi/sqlite3;ILjava/lang/String;)I"
);
S3JniUnrefLocal(klazz);
S3JniIfThrew {
@@ -3131,7 +3132,7 @@ S3JniApi(sqlite3_config() /* for SQLITE_CONFIG_SQLLOG */,
}else {
jclass const klazz = (*env)->GetObjectClass(env, jLog);
jmethodID const midCallback = (*env)->GetMethodID(env, klazz, "call",
- "(Lorg/sqlite/jni/sqlite3;"
+ "(Lorg/sqlite/jni/capi/sqlite3;"
"Ljava/lang/String;"
"I)V");
S3JniUnrefLocal(klazz);
@@ -3304,7 +3305,7 @@ error_cleanup:
S3JniApi(sqlite3_db_config() /*for MAINDBNAME*/,
- jint,1db_1config__Lorg_sqlite_jni_sqlite3_2ILjava_lang_String_2
+ jint,1db_1config__Lorg_sqlite_jni_capi_sqlite3_2ILjava_lang_String_2
)(JniArgsEnvClass, jobject jDb, jint op, jstring jStr){
S3JniDb * const ps = S3JniDb_from_java(jDb);
int rc;
@@ -3341,7 +3342,7 @@ S3JniApi(
/* WARNING: openjdk v19 creates a different mangled name for this
** function than openjdk v8 does. We account for that by exporting
** both versions of the name. */
- jint,1db_1config__Lorg_sqlite_jni_sqlite3_2IILorg_sqlite_jni_OutputPointer_Int32_2
+ jint,1db_1config__Lorg_sqlite_jni_capi_sqlite3_2IILorg_sqlite_jni_capi_OutputPointer_Int32_2
)(
JniArgsEnvClass, jobject jDb, jint op, jint onOff, jobject jOut
){
@@ -3386,10 +3387,10 @@ S3JniApi(
** install both names for this function then Java will not be able to
** find the function in both environments.
*/
-JniDecl(jint,1db_1config__Lorg_sqlite_jni_sqlite3_2IILorg_sqlite_jni_OutputPointer_00024Int32_2)(
+JniDecl(jint,1db_1config__Lorg_sqlite_jni_capi_sqlite3_2IILorg_sqlite_jni_capi_OutputPointer_00024Int32_2)(
JniArgsEnvClass, jobject jDb, jint op, jint onOff, jobject jOut
){
- return JniFuncName(1db_1config__Lorg_sqlite_jni_sqlite3_2IILorg_sqlite_jni_OutputPointer_Int32_2)(
+ return JniFuncName(1db_1config__Lorg_sqlite_jni_capi_sqlite3_2IILorg_sqlite_jni_capi_OutputPointer_Int32_2)(
env, jKlazz, jDb, op, onOff, jOut
);
}
@@ -3676,7 +3677,7 @@ end:
/*
** Post-open() code common to both the sqlite3_open() and
** sqlite3_open_v2() bindings. ps->jDb must be the
-** org.sqlite.jni.sqlite3 object which will hold the db's native
+** org.sqlite.jni.capi.sqlite3 object which will hold the db's native
** pointer. theRc must be the result code of the open() op. If
** *ppDb is NULL then ps is set aside and its state cleared,
** else ps is associated with *ppDb. If *ppDb is not NULL then
@@ -3979,7 +3980,7 @@ static jobject s3jni_updatepre_hook(JNIEnv * env, int isPre, jlong jpDb, jobject
klazz = (*env)->GetObjectClass(env, jHook);
xCallback = isPre
? (*env)->GetMethodID(env, klazz, "call",
- "(Lorg/sqlite/jni/sqlite3;"
+ "(Lorg/sqlite/jni/capi/sqlite3;"
"I"
"Ljava/lang/String;"
"Ljava/lang/String;"
@@ -5027,8 +5028,8 @@ static Fts5JniAux * Fts5JniAux_alloc(JNIEnv * const env, jobject jObj){
s->jmid = (*env)->GetMethodID(env, klazz, "call",
"(Lorg/sqlite/jni/fts5/Fts5ExtensionApi;"
"Lorg/sqlite/jni/fts5/Fts5Context;"
- "Lorg/sqlite/jni/sqlite3_context;"
- "[Lorg/sqlite/jni/sqlite3_value;)V");
+ "Lorg/sqlite/jni/capi/sqlite3_context;"
+ "[Lorg/sqlite/jni/capi/sqlite3_value;)V");
S3JniUnrefLocal(klazz);
S3JniIfThrew{
S3JniExceptionReport;
@@ -5745,7 +5746,7 @@ static int SQLTester_strnotglob(const char *zGlob, const char *z){
}
JNIEXPORT jint JNICALL
-Java_org_sqlite_jni_SQLTester_strglob(
+Java_org_sqlite_jni_capi_SQLTester_strglob(
JniArgsEnvClass, jbyteArray baG, jbyteArray baT
){
int rc = 0;
@@ -5772,7 +5773,7 @@ static int SQLTester_auto_extension(sqlite3 *pDb, const char **pzErr,
}
JNIEXPORT void JNICALL
-Java_org_sqlite_jni_SQLTester_installCustomExtensions(JniArgsEnvClass){
+Java_org_sqlite_jni_capi_SQLTester_installCustomExtensions(JniArgsEnvClass){
sqlite3_auto_extension( (void(*)(void))SQLTester_auto_extension );
}
@@ -5786,7 +5787,7 @@ Java_org_sqlite_jni_SQLTester_installCustomExtensions(JniArgsEnvClass){
** state.
*/
JNIEXPORT void JNICALL
-Java_org_sqlite_jni_CApi_init(JniArgsEnvClass){
+Java_org_sqlite_jni_capi_CApi_init(JniArgsEnvClass){
jclass klazz;
memset(&S3JniGlobal, 0, sizeof(S3JniGlobal));
@@ -5828,7 +5829,7 @@ Java_org_sqlite_jni_CApi_init(JniArgsEnvClass){
#ifdef SQLITE_ENABLE_FTS5
klazz = (*env)->FindClass(env, "org/sqlite/jni/fts5/Fts5PhraseIter");
- S3JniExceptionIsFatal("Error getting reference to org.sqlite.jni.Fts5PhraseIter.");
+ S3JniExceptionIsFatal("Error getting reference to org.sqlite.jni.fts5.Fts5PhraseIter.");
SJG.fts5.jPhraseIter.fidA = (*env)->GetFieldID(env, klazz, "a", "J");
S3JniExceptionIsFatal("Cannot get Fts5PhraseIter.a field.");
SJG.fts5.jPhraseIter.fidB = (*env)->GetFieldID(env, klazz, "b", "J");
diff --git a/ext/jni/src/c/sqlite3-jni.h b/ext/jni/src/c/sqlite3-jni.h
index 78559a3262..bf6df7ac94 100644
--- a/ext/jni/src/c/sqlite3-jni.h
+++ b/ext/jni/src/c/sqlite3-jni.h
@@ -1,2122 +1,2122 @@
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
-/* Header for class org_sqlite_jni_CApi */
+/* Header for class org_sqlite_jni_capi_CApi */
-#ifndef _Included_org_sqlite_jni_CApi
-#define _Included_org_sqlite_jni_CApi
+#ifndef _Included_org_sqlite_jni_capi_CApi
+#define _Included_org_sqlite_jni_capi_CApi
#ifdef __cplusplus
extern "C" {
#endif
-#undef org_sqlite_jni_CApi_SQLITE_ACCESS_EXISTS
-#define org_sqlite_jni_CApi_SQLITE_ACCESS_EXISTS 0L
-#undef org_sqlite_jni_CApi_SQLITE_ACCESS_READWRITE
-#define org_sqlite_jni_CApi_SQLITE_ACCESS_READWRITE 1L
-#undef org_sqlite_jni_CApi_SQLITE_ACCESS_READ
-#define org_sqlite_jni_CApi_SQLITE_ACCESS_READ 2L
-#undef org_sqlite_jni_CApi_SQLITE_DENY
-#define org_sqlite_jni_CApi_SQLITE_DENY 1L
-#undef org_sqlite_jni_CApi_SQLITE_IGNORE
-#define org_sqlite_jni_CApi_SQLITE_IGNORE 2L
-#undef org_sqlite_jni_CApi_SQLITE_CREATE_INDEX
-#define org_sqlite_jni_CApi_SQLITE_CREATE_INDEX 1L
-#undef org_sqlite_jni_CApi_SQLITE_CREATE_TABLE
-#define org_sqlite_jni_CApi_SQLITE_CREATE_TABLE 2L
-#undef org_sqlite_jni_CApi_SQLITE_CREATE_TEMP_INDEX
-#define org_sqlite_jni_CApi_SQLITE_CREATE_TEMP_INDEX 3L
-#undef org_sqlite_jni_CApi_SQLITE_CREATE_TEMP_TABLE
-#define org_sqlite_jni_CApi_SQLITE_CREATE_TEMP_TABLE 4L
-#undef org_sqlite_jni_CApi_SQLITE_CREATE_TEMP_TRIGGER
-#define org_sqlite_jni_CApi_SQLITE_CREATE_TEMP_TRIGGER 5L
-#undef org_sqlite_jni_CApi_SQLITE_CREATE_TEMP_VIEW
-#define org_sqlite_jni_CApi_SQLITE_CREATE_TEMP_VIEW 6L
-#undef org_sqlite_jni_CApi_SQLITE_CREATE_TRIGGER
-#define org_sqlite_jni_CApi_SQLITE_CREATE_TRIGGER 7L
-#undef org_sqlite_jni_CApi_SQLITE_CREATE_VIEW
-#define org_sqlite_jni_CApi_SQLITE_CREATE_VIEW 8L
-#undef org_sqlite_jni_CApi_SQLITE_DELETE
-#define org_sqlite_jni_CApi_SQLITE_DELETE 9L
-#undef org_sqlite_jni_CApi_SQLITE_DROP_INDEX
-#define org_sqlite_jni_CApi_SQLITE_DROP_INDEX 10L
-#undef org_sqlite_jni_CApi_SQLITE_DROP_TABLE
-#define org_sqlite_jni_CApi_SQLITE_DROP_TABLE 11L
-#undef org_sqlite_jni_CApi_SQLITE_DROP_TEMP_INDEX
-#define org_sqlite_jni_CApi_SQLITE_DROP_TEMP_INDEX 12L
-#undef org_sqlite_jni_CApi_SQLITE_DROP_TEMP_TABLE
-#define org_sqlite_jni_CApi_SQLITE_DROP_TEMP_TABLE 13L
-#undef org_sqlite_jni_CApi_SQLITE_DROP_TEMP_TRIGGER
-#define org_sqlite_jni_CApi_SQLITE_DROP_TEMP_TRIGGER 14L
-#undef org_sqlite_jni_CApi_SQLITE_DROP_TEMP_VIEW
-#define org_sqlite_jni_CApi_SQLITE_DROP_TEMP_VIEW 15L
-#undef org_sqlite_jni_CApi_SQLITE_DROP_TRIGGER
-#define org_sqlite_jni_CApi_SQLITE_DROP_TRIGGER 16L
-#undef org_sqlite_jni_CApi_SQLITE_DROP_VIEW
-#define org_sqlite_jni_CApi_SQLITE_DROP_VIEW 17L
-#undef org_sqlite_jni_CApi_SQLITE_INSERT
-#define org_sqlite_jni_CApi_SQLITE_INSERT 18L
-#undef org_sqlite_jni_CApi_SQLITE_PRAGMA
-#define org_sqlite_jni_CApi_SQLITE_PRAGMA 19L
-#undef org_sqlite_jni_CApi_SQLITE_READ
-#define org_sqlite_jni_CApi_SQLITE_READ 20L
-#undef org_sqlite_jni_CApi_SQLITE_SELECT
-#define org_sqlite_jni_CApi_SQLITE_SELECT 21L
-#undef org_sqlite_jni_CApi_SQLITE_TRANSACTION
-#define org_sqlite_jni_CApi_SQLITE_TRANSACTION 22L
-#undef org_sqlite_jni_CApi_SQLITE_UPDATE
-#define org_sqlite_jni_CApi_SQLITE_UPDATE 23L
-#undef org_sqlite_jni_CApi_SQLITE_ATTACH
-#define org_sqlite_jni_CApi_SQLITE_ATTACH 24L
-#undef org_sqlite_jni_CApi_SQLITE_DETACH
-#define org_sqlite_jni_CApi_SQLITE_DETACH 25L
-#undef org_sqlite_jni_CApi_SQLITE_ALTER_TABLE
-#define org_sqlite_jni_CApi_SQLITE_ALTER_TABLE 26L
-#undef org_sqlite_jni_CApi_SQLITE_REINDEX
-#define org_sqlite_jni_CApi_SQLITE_REINDEX 27L
-#undef org_sqlite_jni_CApi_SQLITE_ANALYZE
-#define org_sqlite_jni_CApi_SQLITE_ANALYZE 28L
-#undef org_sqlite_jni_CApi_SQLITE_CREATE_VTABLE
-#define org_sqlite_jni_CApi_SQLITE_CREATE_VTABLE 29L
-#undef org_sqlite_jni_CApi_SQLITE_DROP_VTABLE
-#define org_sqlite_jni_CApi_SQLITE_DROP_VTABLE 30L
-#undef org_sqlite_jni_CApi_SQLITE_FUNCTION
-#define org_sqlite_jni_CApi_SQLITE_FUNCTION 31L
-#undef org_sqlite_jni_CApi_SQLITE_SAVEPOINT
-#define org_sqlite_jni_CApi_SQLITE_SAVEPOINT 32L
-#undef org_sqlite_jni_CApi_SQLITE_RECURSIVE
-#define org_sqlite_jni_CApi_SQLITE_RECURSIVE 33L
-#undef org_sqlite_jni_CApi_SQLITE_STATIC
-#define org_sqlite_jni_CApi_SQLITE_STATIC 0LL
-#undef org_sqlite_jni_CApi_SQLITE_TRANSIENT
-#define org_sqlite_jni_CApi_SQLITE_TRANSIENT -1LL
-#undef org_sqlite_jni_CApi_SQLITE_CHANGESETSTART_INVERT
-#define org_sqlite_jni_CApi_SQLITE_CHANGESETSTART_INVERT 2L
-#undef org_sqlite_jni_CApi_SQLITE_CHANGESETAPPLY_NOSAVEPOINT
-#define org_sqlite_jni_CApi_SQLITE_CHANGESETAPPLY_NOSAVEPOINT 1L
-#undef org_sqlite_jni_CApi_SQLITE_CHANGESETAPPLY_INVERT
-#define org_sqlite_jni_CApi_SQLITE_CHANGESETAPPLY_INVERT 2L
-#undef org_sqlite_jni_CApi_SQLITE_CHANGESETAPPLY_IGNORENOOP
-#define org_sqlite_jni_CApi_SQLITE_CHANGESETAPPLY_IGNORENOOP 4L
-#undef org_sqlite_jni_CApi_SQLITE_CHANGESET_DATA
-#define org_sqlite_jni_CApi_SQLITE_CHANGESET_DATA 1L
-#undef org_sqlite_jni_CApi_SQLITE_CHANGESET_NOTFOUND
-#define org_sqlite_jni_CApi_SQLITE_CHANGESET_NOTFOUND 2L
-#undef org_sqlite_jni_CApi_SQLITE_CHANGESET_CONFLICT
-#define org_sqlite_jni_CApi_SQLITE_CHANGESET_CONFLICT 3L
-#undef org_sqlite_jni_CApi_SQLITE_CHANGESET_CONSTRAINT
-#define org_sqlite_jni_CApi_SQLITE_CHANGESET_CONSTRAINT 4L
-#undef org_sqlite_jni_CApi_SQLITE_CHANGESET_FOREIGN_KEY
-#define org_sqlite_jni_CApi_SQLITE_CHANGESET_FOREIGN_KEY 5L
-#undef org_sqlite_jni_CApi_SQLITE_CHANGESET_OMIT
-#define org_sqlite_jni_CApi_SQLITE_CHANGESET_OMIT 0L
-#undef org_sqlite_jni_CApi_SQLITE_CHANGESET_REPLACE
-#define org_sqlite_jni_CApi_SQLITE_CHANGESET_REPLACE 1L
-#undef org_sqlite_jni_CApi_SQLITE_CHANGESET_ABORT
-#define org_sqlite_jni_CApi_SQLITE_CHANGESET_ABORT 2L
-#undef org_sqlite_jni_CApi_SQLITE_CONFIG_SINGLETHREAD
-#define org_sqlite_jni_CApi_SQLITE_CONFIG_SINGLETHREAD 1L
-#undef org_sqlite_jni_CApi_SQLITE_CONFIG_MULTITHREAD
-#define org_sqlite_jni_CApi_SQLITE_CONFIG_MULTITHREAD 2L
-#undef org_sqlite_jni_CApi_SQLITE_CONFIG_SERIALIZED
-#define org_sqlite_jni_CApi_SQLITE_CONFIG_SERIALIZED 3L
-#undef org_sqlite_jni_CApi_SQLITE_CONFIG_MALLOC
-#define org_sqlite_jni_CApi_SQLITE_CONFIG_MALLOC 4L
-#undef org_sqlite_jni_CApi_SQLITE_CONFIG_GETMALLOC
-#define org_sqlite_jni_CApi_SQLITE_CONFIG_GETMALLOC 5L
-#undef org_sqlite_jni_CApi_SQLITE_CONFIG_SCRATCH
-#define org_sqlite_jni_CApi_SQLITE_CONFIG_SCRATCH 6L
-#undef org_sqlite_jni_CApi_SQLITE_CONFIG_PAGECACHE
-#define org_sqlite_jni_CApi_SQLITE_CONFIG_PAGECACHE 7L
-#undef org_sqlite_jni_CApi_SQLITE_CONFIG_HEAP
-#define org_sqlite_jni_CApi_SQLITE_CONFIG_HEAP 8L
-#undef org_sqlite_jni_CApi_SQLITE_CONFIG_MEMSTATUS
-#define org_sqlite_jni_CApi_SQLITE_CONFIG_MEMSTATUS 9L
-#undef org_sqlite_jni_CApi_SQLITE_CONFIG_MUTEX
-#define org_sqlite_jni_CApi_SQLITE_CONFIG_MUTEX 10L
-#undef org_sqlite_jni_CApi_SQLITE_CONFIG_GETMUTEX
-#define org_sqlite_jni_CApi_SQLITE_CONFIG_GETMUTEX 11L
-#undef org_sqlite_jni_CApi_SQLITE_CONFIG_LOOKASIDE
-#define org_sqlite_jni_CApi_SQLITE_CONFIG_LOOKASIDE 13L
-#undef org_sqlite_jni_CApi_SQLITE_CONFIG_PCACHE
-#define org_sqlite_jni_CApi_SQLITE_CONFIG_PCACHE 14L
-#undef org_sqlite_jni_CApi_SQLITE_CONFIG_GETPCACHE
-#define org_sqlite_jni_CApi_SQLITE_CONFIG_GETPCACHE 15L
-#undef org_sqlite_jni_CApi_SQLITE_CONFIG_LOG
-#define org_sqlite_jni_CApi_SQLITE_CONFIG_LOG 16L
-#undef org_sqlite_jni_CApi_SQLITE_CONFIG_URI
-#define org_sqlite_jni_CApi_SQLITE_CONFIG_URI 17L
-#undef org_sqlite_jni_CApi_SQLITE_CONFIG_PCACHE2
-#define org_sqlite_jni_CApi_SQLITE_CONFIG_PCACHE2 18L
-#undef org_sqlite_jni_CApi_SQLITE_CONFIG_GETPCACHE2
-#define org_sqlite_jni_CApi_SQLITE_CONFIG_GETPCACHE2 19L
-#undef org_sqlite_jni_CApi_SQLITE_CONFIG_COVERING_INDEX_SCAN
-#define org_sqlite_jni_CApi_SQLITE_CONFIG_COVERING_INDEX_SCAN 20L
-#undef org_sqlite_jni_CApi_SQLITE_CONFIG_SQLLOG
-#define org_sqlite_jni_CApi_SQLITE_CONFIG_SQLLOG 21L
-#undef org_sqlite_jni_CApi_SQLITE_CONFIG_MMAP_SIZE
-#define org_sqlite_jni_CApi_SQLITE_CONFIG_MMAP_SIZE 22L
-#undef org_sqlite_jni_CApi_SQLITE_CONFIG_WIN32_HEAPSIZE
-#define org_sqlite_jni_CApi_SQLITE_CONFIG_WIN32_HEAPSIZE 23L
-#undef org_sqlite_jni_CApi_SQLITE_CONFIG_PCACHE_HDRSZ
-#define org_sqlite_jni_CApi_SQLITE_CONFIG_PCACHE_HDRSZ 24L
-#undef org_sqlite_jni_CApi_SQLITE_CONFIG_PMASZ
-#define org_sqlite_jni_CApi_SQLITE_CONFIG_PMASZ 25L
-#undef org_sqlite_jni_CApi_SQLITE_CONFIG_STMTJRNL_SPILL
-#define org_sqlite_jni_CApi_SQLITE_CONFIG_STMTJRNL_SPILL 26L
-#undef org_sqlite_jni_CApi_SQLITE_CONFIG_SMALL_MALLOC
-#define org_sqlite_jni_CApi_SQLITE_CONFIG_SMALL_MALLOC 27L
-#undef org_sqlite_jni_CApi_SQLITE_CONFIG_SORTERREF_SIZE
-#define org_sqlite_jni_CApi_SQLITE_CONFIG_SORTERREF_SIZE 28L
-#undef org_sqlite_jni_CApi_SQLITE_CONFIG_MEMDB_MAXSIZE
-#define org_sqlite_jni_CApi_SQLITE_CONFIG_MEMDB_MAXSIZE 29L
-#undef org_sqlite_jni_CApi_SQLITE_INTEGER
-#define org_sqlite_jni_CApi_SQLITE_INTEGER 1L
-#undef org_sqlite_jni_CApi_SQLITE_FLOAT
-#define org_sqlite_jni_CApi_SQLITE_FLOAT 2L
-#undef org_sqlite_jni_CApi_SQLITE_TEXT
-#define org_sqlite_jni_CApi_SQLITE_TEXT 3L
-#undef org_sqlite_jni_CApi_SQLITE_BLOB
-#define org_sqlite_jni_CApi_SQLITE_BLOB 4L
-#undef org_sqlite_jni_CApi_SQLITE_NULL
-#define org_sqlite_jni_CApi_SQLITE_NULL 5L
-#undef org_sqlite_jni_CApi_SQLITE_DBCONFIG_MAINDBNAME
-#define org_sqlite_jni_CApi_SQLITE_DBCONFIG_MAINDBNAME 1000L
-#undef org_sqlite_jni_CApi_SQLITE_DBCONFIG_LOOKASIDE
-#define org_sqlite_jni_CApi_SQLITE_DBCONFIG_LOOKASIDE 1001L
-#undef org_sqlite_jni_CApi_SQLITE_DBCONFIG_ENABLE_FKEY
-#define org_sqlite_jni_CApi_SQLITE_DBCONFIG_ENABLE_FKEY 1002L
-#undef org_sqlite_jni_CApi_SQLITE_DBCONFIG_ENABLE_TRIGGER
-#define org_sqlite_jni_CApi_SQLITE_DBCONFIG_ENABLE_TRIGGER 1003L
-#undef org_sqlite_jni_CApi_SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER
-#define org_sqlite_jni_CApi_SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER 1004L
-#undef org_sqlite_jni_CApi_SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION
-#define org_sqlite_jni_CApi_SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION 1005L
-#undef org_sqlite_jni_CApi_SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE
-#define org_sqlite_jni_CApi_SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE 1006L
-#undef org_sqlite_jni_CApi_SQLITE_DBCONFIG_ENABLE_QPSG
-#define org_sqlite_jni_CApi_SQLITE_DBCONFIG_ENABLE_QPSG 1007L
-#undef org_sqlite_jni_CApi_SQLITE_DBCONFIG_TRIGGER_EQP
-#define org_sqlite_jni_CApi_SQLITE_DBCONFIG_TRIGGER_EQP 1008L
-#undef org_sqlite_jni_CApi_SQLITE_DBCONFIG_RESET_DATABASE
-#define org_sqlite_jni_CApi_SQLITE_DBCONFIG_RESET_DATABASE 1009L
-#undef org_sqlite_jni_CApi_SQLITE_DBCONFIG_DEFENSIVE
-#define org_sqlite_jni_CApi_SQLITE_DBCONFIG_DEFENSIVE 1010L
-#undef org_sqlite_jni_CApi_SQLITE_DBCONFIG_WRITABLE_SCHEMA
-#define org_sqlite_jni_CApi_SQLITE_DBCONFIG_WRITABLE_SCHEMA 1011L
-#undef org_sqlite_jni_CApi_SQLITE_DBCONFIG_LEGACY_ALTER_TABLE
-#define org_sqlite_jni_CApi_SQLITE_DBCONFIG_LEGACY_ALTER_TABLE 1012L
-#undef org_sqlite_jni_CApi_SQLITE_DBCONFIG_DQS_DML
-#define org_sqlite_jni_CApi_SQLITE_DBCONFIG_DQS_DML 1013L
-#undef org_sqlite_jni_CApi_SQLITE_DBCONFIG_DQS_DDL
-#define org_sqlite_jni_CApi_SQLITE_DBCONFIG_DQS_DDL 1014L
-#undef org_sqlite_jni_CApi_SQLITE_DBCONFIG_ENABLE_VIEW
-#define org_sqlite_jni_CApi_SQLITE_DBCONFIG_ENABLE_VIEW 1015L
-#undef org_sqlite_jni_CApi_SQLITE_DBCONFIG_LEGACY_FILE_FORMAT
-#define org_sqlite_jni_CApi_SQLITE_DBCONFIG_LEGACY_FILE_FORMAT 1016L
-#undef org_sqlite_jni_CApi_SQLITE_DBCONFIG_TRUSTED_SCHEMA
-#define org_sqlite_jni_CApi_SQLITE_DBCONFIG_TRUSTED_SCHEMA 1017L
-#undef org_sqlite_jni_CApi_SQLITE_DBCONFIG_STMT_SCANSTATUS
-#define org_sqlite_jni_CApi_SQLITE_DBCONFIG_STMT_SCANSTATUS 1018L
-#undef org_sqlite_jni_CApi_SQLITE_DBCONFIG_REVERSE_SCANORDER
-#define org_sqlite_jni_CApi_SQLITE_DBCONFIG_REVERSE_SCANORDER 1019L
-#undef org_sqlite_jni_CApi_SQLITE_DBCONFIG_MAX
-#define org_sqlite_jni_CApi_SQLITE_DBCONFIG_MAX 1019L
-#undef org_sqlite_jni_CApi_SQLITE_DBSTATUS_LOOKASIDE_USED
-#define org_sqlite_jni_CApi_SQLITE_DBSTATUS_LOOKASIDE_USED 0L
-#undef org_sqlite_jni_CApi_SQLITE_DBSTATUS_CACHE_USED
-#define org_sqlite_jni_CApi_SQLITE_DBSTATUS_CACHE_USED 1L
-#undef org_sqlite_jni_CApi_SQLITE_DBSTATUS_SCHEMA_USED
-#define org_sqlite_jni_CApi_SQLITE_DBSTATUS_SCHEMA_USED 2L
-#undef org_sqlite_jni_CApi_SQLITE_DBSTATUS_STMT_USED
-#define org_sqlite_jni_CApi_SQLITE_DBSTATUS_STMT_USED 3L
-#undef org_sqlite_jni_CApi_SQLITE_DBSTATUS_LOOKASIDE_HIT
-#define org_sqlite_jni_CApi_SQLITE_DBSTATUS_LOOKASIDE_HIT 4L
-#undef org_sqlite_jni_CApi_SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE
-#define org_sqlite_jni_CApi_SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE 5L
-#undef org_sqlite_jni_CApi_SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL
-#define org_sqlite_jni_CApi_SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL 6L
-#undef org_sqlite_jni_CApi_SQLITE_DBSTATUS_CACHE_HIT
-#define org_sqlite_jni_CApi_SQLITE_DBSTATUS_CACHE_HIT 7L
-#undef org_sqlite_jni_CApi_SQLITE_DBSTATUS_CACHE_MISS
-#define org_sqlite_jni_CApi_SQLITE_DBSTATUS_CACHE_MISS 8L
-#undef org_sqlite_jni_CApi_SQLITE_DBSTATUS_CACHE_WRITE
-#define org_sqlite_jni_CApi_SQLITE_DBSTATUS_CACHE_WRITE 9L
-#undef org_sqlite_jni_CApi_SQLITE_DBSTATUS_DEFERRED_FKS
-#define org_sqlite_jni_CApi_SQLITE_DBSTATUS_DEFERRED_FKS 10L
-#undef org_sqlite_jni_CApi_SQLITE_DBSTATUS_CACHE_USED_SHARED
-#define org_sqlite_jni_CApi_SQLITE_DBSTATUS_CACHE_USED_SHARED 11L
-#undef org_sqlite_jni_CApi_SQLITE_DBSTATUS_CACHE_SPILL
-#define org_sqlite_jni_CApi_SQLITE_DBSTATUS_CACHE_SPILL 12L
-#undef org_sqlite_jni_CApi_SQLITE_DBSTATUS_MAX
-#define org_sqlite_jni_CApi_SQLITE_DBSTATUS_MAX 12L
-#undef org_sqlite_jni_CApi_SQLITE_UTF8
-#define org_sqlite_jni_CApi_SQLITE_UTF8 1L
-#undef org_sqlite_jni_CApi_SQLITE_UTF16LE
-#define org_sqlite_jni_CApi_SQLITE_UTF16LE 2L
-#undef org_sqlite_jni_CApi_SQLITE_UTF16BE
-#define org_sqlite_jni_CApi_SQLITE_UTF16BE 3L
-#undef org_sqlite_jni_CApi_SQLITE_UTF16
-#define org_sqlite_jni_CApi_SQLITE_UTF16 4L
-#undef org_sqlite_jni_CApi_SQLITE_UTF16_ALIGNED
-#define org_sqlite_jni_CApi_SQLITE_UTF16_ALIGNED 8L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_LOCKSTATE
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_LOCKSTATE 1L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_GET_LOCKPROXYFILE
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_GET_LOCKPROXYFILE 2L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_SET_LOCKPROXYFILE
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_SET_LOCKPROXYFILE 3L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_LAST_ERRNO
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_LAST_ERRNO 4L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_SIZE_HINT
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_SIZE_HINT 5L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_CHUNK_SIZE
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_CHUNK_SIZE 6L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_FILE_POINTER
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_FILE_POINTER 7L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_SYNC_OMITTED
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_SYNC_OMITTED 8L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_WIN32_AV_RETRY
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_WIN32_AV_RETRY 9L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_PERSIST_WAL
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_PERSIST_WAL 10L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_OVERWRITE
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_OVERWRITE 11L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_VFSNAME
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_VFSNAME 12L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_POWERSAFE_OVERWRITE
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_POWERSAFE_OVERWRITE 13L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_PRAGMA
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_PRAGMA 14L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_BUSYHANDLER
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_BUSYHANDLER 15L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_TEMPFILENAME
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_TEMPFILENAME 16L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_MMAP_SIZE
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_MMAP_SIZE 18L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_TRACE
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_TRACE 19L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_HAS_MOVED
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_HAS_MOVED 20L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_SYNC
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_SYNC 21L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_COMMIT_PHASETWO
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_COMMIT_PHASETWO 22L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_WIN32_SET_HANDLE
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_WIN32_SET_HANDLE 23L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_WAL_BLOCK
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_WAL_BLOCK 24L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_ZIPVFS
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_ZIPVFS 25L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_RBU
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_RBU 26L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_VFS_POINTER
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_VFS_POINTER 27L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_JOURNAL_POINTER
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_JOURNAL_POINTER 28L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_WIN32_GET_HANDLE
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_WIN32_GET_HANDLE 29L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_PDB
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_PDB 30L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_BEGIN_ATOMIC_WRITE
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_BEGIN_ATOMIC_WRITE 31L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_COMMIT_ATOMIC_WRITE
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_COMMIT_ATOMIC_WRITE 32L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE 33L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_LOCK_TIMEOUT
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_LOCK_TIMEOUT 34L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_DATA_VERSION
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_DATA_VERSION 35L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_SIZE_LIMIT
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_SIZE_LIMIT 36L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_CKPT_DONE
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_CKPT_DONE 37L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_RESERVE_BYTES
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_RESERVE_BYTES 38L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_CKPT_START
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_CKPT_START 39L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_EXTERNAL_READER
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_EXTERNAL_READER 40L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_CKSM_FILE
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_CKSM_FILE 41L
-#undef org_sqlite_jni_CApi_SQLITE_FCNTL_RESET_CACHE
-#define org_sqlite_jni_CApi_SQLITE_FCNTL_RESET_CACHE 42L
-#undef org_sqlite_jni_CApi_SQLITE_LOCK_NONE
-#define org_sqlite_jni_CApi_SQLITE_LOCK_NONE 0L
-#undef org_sqlite_jni_CApi_SQLITE_LOCK_SHARED
-#define org_sqlite_jni_CApi_SQLITE_LOCK_SHARED 1L
-#undef org_sqlite_jni_CApi_SQLITE_LOCK_RESERVED
-#define org_sqlite_jni_CApi_SQLITE_LOCK_RESERVED 2L
-#undef org_sqlite_jni_CApi_SQLITE_LOCK_PENDING
-#define org_sqlite_jni_CApi_SQLITE_LOCK_PENDING 3L
-#undef org_sqlite_jni_CApi_SQLITE_LOCK_EXCLUSIVE
-#define org_sqlite_jni_CApi_SQLITE_LOCK_EXCLUSIVE 4L
-#undef org_sqlite_jni_CApi_SQLITE_IOCAP_ATOMIC
-#define org_sqlite_jni_CApi_SQLITE_IOCAP_ATOMIC 1L
-#undef org_sqlite_jni_CApi_SQLITE_IOCAP_ATOMIC512
-#define org_sqlite_jni_CApi_SQLITE_IOCAP_ATOMIC512 2L
-#undef org_sqlite_jni_CApi_SQLITE_IOCAP_ATOMIC1K
-#define org_sqlite_jni_CApi_SQLITE_IOCAP_ATOMIC1K 4L
-#undef org_sqlite_jni_CApi_SQLITE_IOCAP_ATOMIC2K
-#define org_sqlite_jni_CApi_SQLITE_IOCAP_ATOMIC2K 8L
-#undef org_sqlite_jni_CApi_SQLITE_IOCAP_ATOMIC4K
-#define org_sqlite_jni_CApi_SQLITE_IOCAP_ATOMIC4K 16L
-#undef org_sqlite_jni_CApi_SQLITE_IOCAP_ATOMIC8K
-#define org_sqlite_jni_CApi_SQLITE_IOCAP_ATOMIC8K 32L
-#undef org_sqlite_jni_CApi_SQLITE_IOCAP_ATOMIC16K
-#define org_sqlite_jni_CApi_SQLITE_IOCAP_ATOMIC16K 64L
-#undef org_sqlite_jni_CApi_SQLITE_IOCAP_ATOMIC32K
-#define org_sqlite_jni_CApi_SQLITE_IOCAP_ATOMIC32K 128L
-#undef org_sqlite_jni_CApi_SQLITE_IOCAP_ATOMIC64K
-#define org_sqlite_jni_CApi_SQLITE_IOCAP_ATOMIC64K 256L
-#undef org_sqlite_jni_CApi_SQLITE_IOCAP_SAFE_APPEND
-#define org_sqlite_jni_CApi_SQLITE_IOCAP_SAFE_APPEND 512L
-#undef org_sqlite_jni_CApi_SQLITE_IOCAP_SEQUENTIAL
-#define org_sqlite_jni_CApi_SQLITE_IOCAP_SEQUENTIAL 1024L
-#undef org_sqlite_jni_CApi_SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN
-#define org_sqlite_jni_CApi_SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN 2048L
-#undef org_sqlite_jni_CApi_SQLITE_IOCAP_POWERSAFE_OVERWRITE
-#define org_sqlite_jni_CApi_SQLITE_IOCAP_POWERSAFE_OVERWRITE 4096L
-#undef org_sqlite_jni_CApi_SQLITE_IOCAP_IMMUTABLE
-#define org_sqlite_jni_CApi_SQLITE_IOCAP_IMMUTABLE 8192L
-#undef org_sqlite_jni_CApi_SQLITE_IOCAP_BATCH_ATOMIC
-#define org_sqlite_jni_CApi_SQLITE_IOCAP_BATCH_ATOMIC 16384L
-#undef org_sqlite_jni_CApi_SQLITE_LIMIT_LENGTH
-#define org_sqlite_jni_CApi_SQLITE_LIMIT_LENGTH 0L
-#undef org_sqlite_jni_CApi_SQLITE_LIMIT_SQL_LENGTH
-#define org_sqlite_jni_CApi_SQLITE_LIMIT_SQL_LENGTH 1L
-#undef org_sqlite_jni_CApi_SQLITE_LIMIT_COLUMN
-#define org_sqlite_jni_CApi_SQLITE_LIMIT_COLUMN 2L
-#undef org_sqlite_jni_CApi_SQLITE_LIMIT_EXPR_DEPTH
-#define org_sqlite_jni_CApi_SQLITE_LIMIT_EXPR_DEPTH 3L
-#undef org_sqlite_jni_CApi_SQLITE_LIMIT_COMPOUND_SELECT
-#define org_sqlite_jni_CApi_SQLITE_LIMIT_COMPOUND_SELECT 4L
-#undef org_sqlite_jni_CApi_SQLITE_LIMIT_VDBE_OP
-#define org_sqlite_jni_CApi_SQLITE_LIMIT_VDBE_OP 5L
-#undef org_sqlite_jni_CApi_SQLITE_LIMIT_FUNCTION_ARG
-#define org_sqlite_jni_CApi_SQLITE_LIMIT_FUNCTION_ARG 6L
-#undef org_sqlite_jni_CApi_SQLITE_LIMIT_ATTACHED
-#define org_sqlite_jni_CApi_SQLITE_LIMIT_ATTACHED 7L
-#undef org_sqlite_jni_CApi_SQLITE_LIMIT_LIKE_PATTERN_LENGTH
-#define org_sqlite_jni_CApi_SQLITE_LIMIT_LIKE_PATTERN_LENGTH 8L
-#undef org_sqlite_jni_CApi_SQLITE_LIMIT_VARIABLE_NUMBER
-#define org_sqlite_jni_CApi_SQLITE_LIMIT_VARIABLE_NUMBER 9L
-#undef org_sqlite_jni_CApi_SQLITE_LIMIT_TRIGGER_DEPTH
-#define org_sqlite_jni_CApi_SQLITE_LIMIT_TRIGGER_DEPTH 10L
-#undef org_sqlite_jni_CApi_SQLITE_LIMIT_WORKER_THREADS
-#define org_sqlite_jni_CApi_SQLITE_LIMIT_WORKER_THREADS 11L
-#undef org_sqlite_jni_CApi_SQLITE_OPEN_READONLY
-#define org_sqlite_jni_CApi_SQLITE_OPEN_READONLY 1L
-#undef org_sqlite_jni_CApi_SQLITE_OPEN_READWRITE
-#define org_sqlite_jni_CApi_SQLITE_OPEN_READWRITE 2L
-#undef org_sqlite_jni_CApi_SQLITE_OPEN_CREATE
-#define org_sqlite_jni_CApi_SQLITE_OPEN_CREATE 4L
-#undef org_sqlite_jni_CApi_SQLITE_OPEN_URI
-#define org_sqlite_jni_CApi_SQLITE_OPEN_URI 64L
-#undef org_sqlite_jni_CApi_SQLITE_OPEN_MEMORY
-#define org_sqlite_jni_CApi_SQLITE_OPEN_MEMORY 128L
-#undef org_sqlite_jni_CApi_SQLITE_OPEN_NOMUTEX
-#define org_sqlite_jni_CApi_SQLITE_OPEN_NOMUTEX 32768L
-#undef org_sqlite_jni_CApi_SQLITE_OPEN_FULLMUTEX
-#define org_sqlite_jni_CApi_SQLITE_OPEN_FULLMUTEX 65536L
-#undef org_sqlite_jni_CApi_SQLITE_OPEN_SHAREDCACHE
-#define org_sqlite_jni_CApi_SQLITE_OPEN_SHAREDCACHE 131072L
-#undef org_sqlite_jni_CApi_SQLITE_OPEN_PRIVATECACHE
-#define org_sqlite_jni_CApi_SQLITE_OPEN_PRIVATECACHE 262144L
-#undef org_sqlite_jni_CApi_SQLITE_OPEN_NOFOLLOW
-#define org_sqlite_jni_CApi_SQLITE_OPEN_NOFOLLOW 16777216L
-#undef org_sqlite_jni_CApi_SQLITE_OPEN_EXRESCODE
-#define org_sqlite_jni_CApi_SQLITE_OPEN_EXRESCODE 33554432L
-#undef org_sqlite_jni_CApi_SQLITE_PREPARE_PERSISTENT
-#define org_sqlite_jni_CApi_SQLITE_PREPARE_PERSISTENT 1L
-#undef org_sqlite_jni_CApi_SQLITE_PREPARE_NORMALIZE
-#define org_sqlite_jni_CApi_SQLITE_PREPARE_NORMALIZE 2L
-#undef org_sqlite_jni_CApi_SQLITE_PREPARE_NO_VTAB
-#define org_sqlite_jni_CApi_SQLITE_PREPARE_NO_VTAB 4L
-#undef org_sqlite_jni_CApi_SQLITE_OK
-#define org_sqlite_jni_CApi_SQLITE_OK 0L
-#undef org_sqlite_jni_CApi_SQLITE_ERROR
-#define org_sqlite_jni_CApi_SQLITE_ERROR 1L
-#undef org_sqlite_jni_CApi_SQLITE_INTERNAL
-#define org_sqlite_jni_CApi_SQLITE_INTERNAL 2L
-#undef org_sqlite_jni_CApi_SQLITE_PERM
-#define org_sqlite_jni_CApi_SQLITE_PERM 3L
-#undef org_sqlite_jni_CApi_SQLITE_ABORT
-#define org_sqlite_jni_CApi_SQLITE_ABORT 4L
-#undef org_sqlite_jni_CApi_SQLITE_BUSY
-#define org_sqlite_jni_CApi_SQLITE_BUSY 5L
-#undef org_sqlite_jni_CApi_SQLITE_LOCKED
-#define org_sqlite_jni_CApi_SQLITE_LOCKED 6L
-#undef org_sqlite_jni_CApi_SQLITE_NOMEM
-#define org_sqlite_jni_CApi_SQLITE_NOMEM 7L
-#undef org_sqlite_jni_CApi_SQLITE_READONLY
-#define org_sqlite_jni_CApi_SQLITE_READONLY 8L
-#undef org_sqlite_jni_CApi_SQLITE_INTERRUPT
-#define org_sqlite_jni_CApi_SQLITE_INTERRUPT 9L
-#undef org_sqlite_jni_CApi_SQLITE_IOERR
-#define org_sqlite_jni_CApi_SQLITE_IOERR 10L
-#undef org_sqlite_jni_CApi_SQLITE_CORRUPT
-#define org_sqlite_jni_CApi_SQLITE_CORRUPT 11L
-#undef org_sqlite_jni_CApi_SQLITE_NOTFOUND
-#define org_sqlite_jni_CApi_SQLITE_NOTFOUND 12L
-#undef org_sqlite_jni_CApi_SQLITE_FULL
-#define org_sqlite_jni_CApi_SQLITE_FULL 13L
-#undef org_sqlite_jni_CApi_SQLITE_CANTOPEN
-#define org_sqlite_jni_CApi_SQLITE_CANTOPEN 14L
-#undef org_sqlite_jni_CApi_SQLITE_PROTOCOL
-#define org_sqlite_jni_CApi_SQLITE_PROTOCOL 15L
-#undef org_sqlite_jni_CApi_SQLITE_EMPTY
-#define org_sqlite_jni_CApi_SQLITE_EMPTY 16L
-#undef org_sqlite_jni_CApi_SQLITE_SCHEMA
-#define org_sqlite_jni_CApi_SQLITE_SCHEMA 17L
-#undef org_sqlite_jni_CApi_SQLITE_TOOBIG
-#define org_sqlite_jni_CApi_SQLITE_TOOBIG 18L
-#undef org_sqlite_jni_CApi_SQLITE_CONSTRAINT
-#define org_sqlite_jni_CApi_SQLITE_CONSTRAINT 19L
-#undef org_sqlite_jni_CApi_SQLITE_MISMATCH
-#define org_sqlite_jni_CApi_SQLITE_MISMATCH 20L
-#undef org_sqlite_jni_CApi_SQLITE_MISUSE
-#define org_sqlite_jni_CApi_SQLITE_MISUSE 21L
-#undef org_sqlite_jni_CApi_SQLITE_NOLFS
-#define org_sqlite_jni_CApi_SQLITE_NOLFS 22L
-#undef org_sqlite_jni_CApi_SQLITE_AUTH
-#define org_sqlite_jni_CApi_SQLITE_AUTH 23L
-#undef org_sqlite_jni_CApi_SQLITE_FORMAT
-#define org_sqlite_jni_CApi_SQLITE_FORMAT 24L
-#undef org_sqlite_jni_CApi_SQLITE_RANGE
-#define org_sqlite_jni_CApi_SQLITE_RANGE 25L
-#undef org_sqlite_jni_CApi_SQLITE_NOTADB
-#define org_sqlite_jni_CApi_SQLITE_NOTADB 26L
-#undef org_sqlite_jni_CApi_SQLITE_NOTICE
-#define org_sqlite_jni_CApi_SQLITE_NOTICE 27L
-#undef org_sqlite_jni_CApi_SQLITE_WARNING
-#define org_sqlite_jni_CApi_SQLITE_WARNING 28L
-#undef org_sqlite_jni_CApi_SQLITE_ROW
-#define org_sqlite_jni_CApi_SQLITE_ROW 100L
-#undef org_sqlite_jni_CApi_SQLITE_DONE
-#define org_sqlite_jni_CApi_SQLITE_DONE 101L
-#undef org_sqlite_jni_CApi_SQLITE_ERROR_MISSING_COLLSEQ
-#define org_sqlite_jni_CApi_SQLITE_ERROR_MISSING_COLLSEQ 257L
-#undef org_sqlite_jni_CApi_SQLITE_ERROR_RETRY
-#define org_sqlite_jni_CApi_SQLITE_ERROR_RETRY 513L
-#undef org_sqlite_jni_CApi_SQLITE_ERROR_SNAPSHOT
-#define org_sqlite_jni_CApi_SQLITE_ERROR_SNAPSHOT 769L
-#undef org_sqlite_jni_CApi_SQLITE_IOERR_READ
-#define org_sqlite_jni_CApi_SQLITE_IOERR_READ 266L
-#undef org_sqlite_jni_CApi_SQLITE_IOERR_SHORT_READ
-#define org_sqlite_jni_CApi_SQLITE_IOERR_SHORT_READ 522L
-#undef org_sqlite_jni_CApi_SQLITE_IOERR_WRITE
-#define org_sqlite_jni_CApi_SQLITE_IOERR_WRITE 778L
-#undef org_sqlite_jni_CApi_SQLITE_IOERR_FSYNC
-#define org_sqlite_jni_CApi_SQLITE_IOERR_FSYNC 1034L
-#undef org_sqlite_jni_CApi_SQLITE_IOERR_DIR_FSYNC
-#define org_sqlite_jni_CApi_SQLITE_IOERR_DIR_FSYNC 1290L
-#undef org_sqlite_jni_CApi_SQLITE_IOERR_TRUNCATE
-#define org_sqlite_jni_CApi_SQLITE_IOERR_TRUNCATE 1546L
-#undef org_sqlite_jni_CApi_SQLITE_IOERR_FSTAT
-#define org_sqlite_jni_CApi_SQLITE_IOERR_FSTAT 1802L
-#undef org_sqlite_jni_CApi_SQLITE_IOERR_UNLOCK
-#define org_sqlite_jni_CApi_SQLITE_IOERR_UNLOCK 2058L
-#undef org_sqlite_jni_CApi_SQLITE_IOERR_RDLOCK
-#define org_sqlite_jni_CApi_SQLITE_IOERR_RDLOCK 2314L
-#undef org_sqlite_jni_CApi_SQLITE_IOERR_DELETE
-#define org_sqlite_jni_CApi_SQLITE_IOERR_DELETE 2570L
-#undef org_sqlite_jni_CApi_SQLITE_IOERR_BLOCKED
-#define org_sqlite_jni_CApi_SQLITE_IOERR_BLOCKED 2826L
-#undef org_sqlite_jni_CApi_SQLITE_IOERR_NOMEM
-#define org_sqlite_jni_CApi_SQLITE_IOERR_NOMEM 3082L
-#undef org_sqlite_jni_CApi_SQLITE_IOERR_ACCESS
-#define org_sqlite_jni_CApi_SQLITE_IOERR_ACCESS 3338L
-#undef org_sqlite_jni_CApi_SQLITE_IOERR_CHECKRESERVEDLOCK
-#define org_sqlite_jni_CApi_SQLITE_IOERR_CHECKRESERVEDLOCK 3594L
-#undef org_sqlite_jni_CApi_SQLITE_IOERR_LOCK
-#define org_sqlite_jni_CApi_SQLITE_IOERR_LOCK 3850L
-#undef org_sqlite_jni_CApi_SQLITE_IOERR_CLOSE
-#define org_sqlite_jni_CApi_SQLITE_IOERR_CLOSE 4106L
-#undef org_sqlite_jni_CApi_SQLITE_IOERR_DIR_CLOSE
-#define org_sqlite_jni_CApi_SQLITE_IOERR_DIR_CLOSE 4362L
-#undef org_sqlite_jni_CApi_SQLITE_IOERR_SHMOPEN
-#define org_sqlite_jni_CApi_SQLITE_IOERR_SHMOPEN 4618L
-#undef org_sqlite_jni_CApi_SQLITE_IOERR_SHMSIZE
-#define org_sqlite_jni_CApi_SQLITE_IOERR_SHMSIZE 4874L
-#undef org_sqlite_jni_CApi_SQLITE_IOERR_SHMLOCK
-#define org_sqlite_jni_CApi_SQLITE_IOERR_SHMLOCK 5130L
-#undef org_sqlite_jni_CApi_SQLITE_IOERR_SHMMAP
-#define org_sqlite_jni_CApi_SQLITE_IOERR_SHMMAP 5386L
-#undef org_sqlite_jni_CApi_SQLITE_IOERR_SEEK
-#define org_sqlite_jni_CApi_SQLITE_IOERR_SEEK 5642L
-#undef org_sqlite_jni_CApi_SQLITE_IOERR_DELETE_NOENT
-#define org_sqlite_jni_CApi_SQLITE_IOERR_DELETE_NOENT 5898L
-#undef org_sqlite_jni_CApi_SQLITE_IOERR_MMAP
-#define org_sqlite_jni_CApi_SQLITE_IOERR_MMAP 6154L
-#undef org_sqlite_jni_CApi_SQLITE_IOERR_GETTEMPPATH
-#define org_sqlite_jni_CApi_SQLITE_IOERR_GETTEMPPATH 6410L
-#undef org_sqlite_jni_CApi_SQLITE_IOERR_CONVPATH
-#define org_sqlite_jni_CApi_SQLITE_IOERR_CONVPATH 6666L
-#undef org_sqlite_jni_CApi_SQLITE_IOERR_VNODE
-#define org_sqlite_jni_CApi_SQLITE_IOERR_VNODE 6922L
-#undef org_sqlite_jni_CApi_SQLITE_IOERR_AUTH
-#define org_sqlite_jni_CApi_SQLITE_IOERR_AUTH 7178L
-#undef org_sqlite_jni_CApi_SQLITE_IOERR_BEGIN_ATOMIC
-#define org_sqlite_jni_CApi_SQLITE_IOERR_BEGIN_ATOMIC 7434L
-#undef org_sqlite_jni_CApi_SQLITE_IOERR_COMMIT_ATOMIC
-#define org_sqlite_jni_CApi_SQLITE_IOERR_COMMIT_ATOMIC 7690L
-#undef org_sqlite_jni_CApi_SQLITE_IOERR_ROLLBACK_ATOMIC
-#define org_sqlite_jni_CApi_SQLITE_IOERR_ROLLBACK_ATOMIC 7946L
-#undef org_sqlite_jni_CApi_SQLITE_IOERR_DATA
-#define org_sqlite_jni_CApi_SQLITE_IOERR_DATA 8202L
-#undef org_sqlite_jni_CApi_SQLITE_IOERR_CORRUPTFS
-#define org_sqlite_jni_CApi_SQLITE_IOERR_CORRUPTFS 8458L
-#undef org_sqlite_jni_CApi_SQLITE_LOCKED_SHAREDCACHE
-#define org_sqlite_jni_CApi_SQLITE_LOCKED_SHAREDCACHE 262L
-#undef org_sqlite_jni_CApi_SQLITE_LOCKED_VTAB
-#define org_sqlite_jni_CApi_SQLITE_LOCKED_VTAB 518L
-#undef org_sqlite_jni_CApi_SQLITE_BUSY_RECOVERY
-#define org_sqlite_jni_CApi_SQLITE_BUSY_RECOVERY 261L
-#undef org_sqlite_jni_CApi_SQLITE_BUSY_SNAPSHOT
-#define org_sqlite_jni_CApi_SQLITE_BUSY_SNAPSHOT 517L
-#undef org_sqlite_jni_CApi_SQLITE_BUSY_TIMEOUT
-#define org_sqlite_jni_CApi_SQLITE_BUSY_TIMEOUT 773L
-#undef org_sqlite_jni_CApi_SQLITE_CANTOPEN_NOTEMPDIR
-#define org_sqlite_jni_CApi_SQLITE_CANTOPEN_NOTEMPDIR 270L
-#undef org_sqlite_jni_CApi_SQLITE_CANTOPEN_ISDIR
-#define org_sqlite_jni_CApi_SQLITE_CANTOPEN_ISDIR 526L
-#undef org_sqlite_jni_CApi_SQLITE_CANTOPEN_FULLPATH
-#define org_sqlite_jni_CApi_SQLITE_CANTOPEN_FULLPATH 782L
-#undef org_sqlite_jni_CApi_SQLITE_CANTOPEN_CONVPATH
-#define org_sqlite_jni_CApi_SQLITE_CANTOPEN_CONVPATH 1038L
-#undef org_sqlite_jni_CApi_SQLITE_CANTOPEN_SYMLINK
-#define org_sqlite_jni_CApi_SQLITE_CANTOPEN_SYMLINK 1550L
-#undef org_sqlite_jni_CApi_SQLITE_CORRUPT_VTAB
-#define org_sqlite_jni_CApi_SQLITE_CORRUPT_VTAB 267L
-#undef org_sqlite_jni_CApi_SQLITE_CORRUPT_SEQUENCE
-#define org_sqlite_jni_CApi_SQLITE_CORRUPT_SEQUENCE 523L
-#undef org_sqlite_jni_CApi_SQLITE_CORRUPT_INDEX
-#define org_sqlite_jni_CApi_SQLITE_CORRUPT_INDEX 779L
-#undef org_sqlite_jni_CApi_SQLITE_READONLY_RECOVERY
-#define org_sqlite_jni_CApi_SQLITE_READONLY_RECOVERY 264L
-#undef org_sqlite_jni_CApi_SQLITE_READONLY_CANTLOCK
-#define org_sqlite_jni_CApi_SQLITE_READONLY_CANTLOCK 520L
-#undef org_sqlite_jni_CApi_SQLITE_READONLY_ROLLBACK
-#define org_sqlite_jni_CApi_SQLITE_READONLY_ROLLBACK 776L
-#undef org_sqlite_jni_CApi_SQLITE_READONLY_DBMOVED
-#define org_sqlite_jni_CApi_SQLITE_READONLY_DBMOVED 1032L
-#undef org_sqlite_jni_CApi_SQLITE_READONLY_CANTINIT
-#define org_sqlite_jni_CApi_SQLITE_READONLY_CANTINIT 1288L
-#undef org_sqlite_jni_CApi_SQLITE_READONLY_DIRECTORY
-#define org_sqlite_jni_CApi_SQLITE_READONLY_DIRECTORY 1544L
-#undef org_sqlite_jni_CApi_SQLITE_ABORT_ROLLBACK
-#define org_sqlite_jni_CApi_SQLITE_ABORT_ROLLBACK 516L
-#undef org_sqlite_jni_CApi_SQLITE_CONSTRAINT_CHECK
-#define org_sqlite_jni_CApi_SQLITE_CONSTRAINT_CHECK 275L
-#undef org_sqlite_jni_CApi_SQLITE_CONSTRAINT_COMMITHOOK
-#define org_sqlite_jni_CApi_SQLITE_CONSTRAINT_COMMITHOOK 531L
-#undef org_sqlite_jni_CApi_SQLITE_CONSTRAINT_FOREIGNKEY
-#define org_sqlite_jni_CApi_SQLITE_CONSTRAINT_FOREIGNKEY 787L
-#undef org_sqlite_jni_CApi_SQLITE_CONSTRAINT_FUNCTION
-#define org_sqlite_jni_CApi_SQLITE_CONSTRAINT_FUNCTION 1043L
-#undef org_sqlite_jni_CApi_SQLITE_CONSTRAINT_NOTNULL
-#define org_sqlite_jni_CApi_SQLITE_CONSTRAINT_NOTNULL 1299L
-#undef org_sqlite_jni_CApi_SQLITE_CONSTRAINT_PRIMARYKEY
-#define org_sqlite_jni_CApi_SQLITE_CONSTRAINT_PRIMARYKEY 1555L
-#undef org_sqlite_jni_CApi_SQLITE_CONSTRAINT_TRIGGER
-#define org_sqlite_jni_CApi_SQLITE_CONSTRAINT_TRIGGER 1811L
-#undef org_sqlite_jni_CApi_SQLITE_CONSTRAINT_UNIQUE
-#define org_sqlite_jni_CApi_SQLITE_CONSTRAINT_UNIQUE 2067L
-#undef org_sqlite_jni_CApi_SQLITE_CONSTRAINT_VTAB
-#define org_sqlite_jni_CApi_SQLITE_CONSTRAINT_VTAB 2323L
-#undef org_sqlite_jni_CApi_SQLITE_CONSTRAINT_ROWID
-#define org_sqlite_jni_CApi_SQLITE_CONSTRAINT_ROWID 2579L
-#undef org_sqlite_jni_CApi_SQLITE_CONSTRAINT_PINNED
-#define org_sqlite_jni_CApi_SQLITE_CONSTRAINT_PINNED 2835L
-#undef org_sqlite_jni_CApi_SQLITE_CONSTRAINT_DATATYPE
-#define org_sqlite_jni_CApi_SQLITE_CONSTRAINT_DATATYPE 3091L
-#undef org_sqlite_jni_CApi_SQLITE_NOTICE_RECOVER_WAL
-#define org_sqlite_jni_CApi_SQLITE_NOTICE_RECOVER_WAL 283L
-#undef org_sqlite_jni_CApi_SQLITE_NOTICE_RECOVER_ROLLBACK
-#define org_sqlite_jni_CApi_SQLITE_NOTICE_RECOVER_ROLLBACK 539L
-#undef org_sqlite_jni_CApi_SQLITE_WARNING_AUTOINDEX
-#define org_sqlite_jni_CApi_SQLITE_WARNING_AUTOINDEX 284L
-#undef org_sqlite_jni_CApi_SQLITE_AUTH_USER
-#define org_sqlite_jni_CApi_SQLITE_AUTH_USER 279L
-#undef org_sqlite_jni_CApi_SQLITE_OK_LOAD_PERMANENTLY
-#define org_sqlite_jni_CApi_SQLITE_OK_LOAD_PERMANENTLY 256L
-#undef org_sqlite_jni_CApi_SQLITE_SERIALIZE_NOCOPY
-#define org_sqlite_jni_CApi_SQLITE_SERIALIZE_NOCOPY 1L
-#undef org_sqlite_jni_CApi_SQLITE_DESERIALIZE_FREEONCLOSE
-#define org_sqlite_jni_CApi_SQLITE_DESERIALIZE_FREEONCLOSE 1L
-#undef org_sqlite_jni_CApi_SQLITE_DESERIALIZE_READONLY
-#define org_sqlite_jni_CApi_SQLITE_DESERIALIZE_READONLY 4L
-#undef org_sqlite_jni_CApi_SQLITE_DESERIALIZE_RESIZEABLE
-#define org_sqlite_jni_CApi_SQLITE_DESERIALIZE_RESIZEABLE 2L
-#undef org_sqlite_jni_CApi_SQLITE_SESSION_CONFIG_STRMSIZE
-#define org_sqlite_jni_CApi_SQLITE_SESSION_CONFIG_STRMSIZE 1L
-#undef org_sqlite_jni_CApi_SQLITE_SESSION_OBJCONFIG_SIZE
-#define org_sqlite_jni_CApi_SQLITE_SESSION_OBJCONFIG_SIZE 1L
-#undef org_sqlite_jni_CApi_SQLITE_STATUS_MEMORY_USED
-#define org_sqlite_jni_CApi_SQLITE_STATUS_MEMORY_USED 0L
-#undef org_sqlite_jni_CApi_SQLITE_STATUS_PAGECACHE_USED
-#define org_sqlite_jni_CApi_SQLITE_STATUS_PAGECACHE_USED 1L
-#undef org_sqlite_jni_CApi_SQLITE_STATUS_PAGECACHE_OVERFLOW
-#define org_sqlite_jni_CApi_SQLITE_STATUS_PAGECACHE_OVERFLOW 2L
-#undef org_sqlite_jni_CApi_SQLITE_STATUS_MALLOC_SIZE
-#define org_sqlite_jni_CApi_SQLITE_STATUS_MALLOC_SIZE 5L
-#undef org_sqlite_jni_CApi_SQLITE_STATUS_PARSER_STACK
-#define org_sqlite_jni_CApi_SQLITE_STATUS_PARSER_STACK 6L
-#undef org_sqlite_jni_CApi_SQLITE_STATUS_PAGECACHE_SIZE
-#define org_sqlite_jni_CApi_SQLITE_STATUS_PAGECACHE_SIZE 7L
-#undef org_sqlite_jni_CApi_SQLITE_STATUS_MALLOC_COUNT
-#define org_sqlite_jni_CApi_SQLITE_STATUS_MALLOC_COUNT 9L
-#undef org_sqlite_jni_CApi_SQLITE_STMTSTATUS_FULLSCAN_STEP
-#define org_sqlite_jni_CApi_SQLITE_STMTSTATUS_FULLSCAN_STEP 1L
-#undef org_sqlite_jni_CApi_SQLITE_STMTSTATUS_SORT
-#define org_sqlite_jni_CApi_SQLITE_STMTSTATUS_SORT 2L
-#undef org_sqlite_jni_CApi_SQLITE_STMTSTATUS_AUTOINDEX
-#define org_sqlite_jni_CApi_SQLITE_STMTSTATUS_AUTOINDEX 3L
-#undef org_sqlite_jni_CApi_SQLITE_STMTSTATUS_VM_STEP
-#define org_sqlite_jni_CApi_SQLITE_STMTSTATUS_VM_STEP 4L
-#undef org_sqlite_jni_CApi_SQLITE_STMTSTATUS_REPREPARE
-#define org_sqlite_jni_CApi_SQLITE_STMTSTATUS_REPREPARE 5L
-#undef org_sqlite_jni_CApi_SQLITE_STMTSTATUS_RUN
-#define org_sqlite_jni_CApi_SQLITE_STMTSTATUS_RUN 6L
-#undef org_sqlite_jni_CApi_SQLITE_STMTSTATUS_FILTER_MISS
-#define org_sqlite_jni_CApi_SQLITE_STMTSTATUS_FILTER_MISS 7L
-#undef org_sqlite_jni_CApi_SQLITE_STMTSTATUS_FILTER_HIT
-#define org_sqlite_jni_CApi_SQLITE_STMTSTATUS_FILTER_HIT 8L
-#undef org_sqlite_jni_CApi_SQLITE_STMTSTATUS_MEMUSED
-#define org_sqlite_jni_CApi_SQLITE_STMTSTATUS_MEMUSED 99L
-#undef org_sqlite_jni_CApi_SQLITE_SYNC_NORMAL
-#define org_sqlite_jni_CApi_SQLITE_SYNC_NORMAL 2L
-#undef org_sqlite_jni_CApi_SQLITE_SYNC_FULL
-#define org_sqlite_jni_CApi_SQLITE_SYNC_FULL 3L
-#undef org_sqlite_jni_CApi_SQLITE_SYNC_DATAONLY
-#define org_sqlite_jni_CApi_SQLITE_SYNC_DATAONLY 16L
-#undef org_sqlite_jni_CApi_SQLITE_TRACE_STMT
-#define org_sqlite_jni_CApi_SQLITE_TRACE_STMT 1L
-#undef org_sqlite_jni_CApi_SQLITE_TRACE_PROFILE
-#define org_sqlite_jni_CApi_SQLITE_TRACE_PROFILE 2L
-#undef org_sqlite_jni_CApi_SQLITE_TRACE_ROW
-#define org_sqlite_jni_CApi_SQLITE_TRACE_ROW 4L
-#undef org_sqlite_jni_CApi_SQLITE_TRACE_CLOSE
-#define org_sqlite_jni_CApi_SQLITE_TRACE_CLOSE 8L
-#undef org_sqlite_jni_CApi_SQLITE_TXN_NONE
-#define org_sqlite_jni_CApi_SQLITE_TXN_NONE 0L
-#undef org_sqlite_jni_CApi_SQLITE_TXN_READ
-#define org_sqlite_jni_CApi_SQLITE_TXN_READ 1L
-#undef org_sqlite_jni_CApi_SQLITE_TXN_WRITE
-#define org_sqlite_jni_CApi_SQLITE_TXN_WRITE 2L
-#undef org_sqlite_jni_CApi_SQLITE_DETERMINISTIC
-#define org_sqlite_jni_CApi_SQLITE_DETERMINISTIC 2048L
-#undef org_sqlite_jni_CApi_SQLITE_DIRECTONLY
-#define org_sqlite_jni_CApi_SQLITE_DIRECTONLY 524288L
-#undef org_sqlite_jni_CApi_SQLITE_INNOCUOUS
-#define org_sqlite_jni_CApi_SQLITE_INNOCUOUS 2097152L
-#undef org_sqlite_jni_CApi_SQLITE_INDEX_SCAN_UNIQUE
-#define org_sqlite_jni_CApi_SQLITE_INDEX_SCAN_UNIQUE 1L
-#undef org_sqlite_jni_CApi_SQLITE_INDEX_CONSTRAINT_EQ
-#define org_sqlite_jni_CApi_SQLITE_INDEX_CONSTRAINT_EQ 2L
-#undef org_sqlite_jni_CApi_SQLITE_INDEX_CONSTRAINT_GT
-#define org_sqlite_jni_CApi_SQLITE_INDEX_CONSTRAINT_GT 4L
-#undef org_sqlite_jni_CApi_SQLITE_INDEX_CONSTRAINT_LE
-#define org_sqlite_jni_CApi_SQLITE_INDEX_CONSTRAINT_LE 8L
-#undef org_sqlite_jni_CApi_SQLITE_INDEX_CONSTRAINT_LT
-#define org_sqlite_jni_CApi_SQLITE_INDEX_CONSTRAINT_LT 16L
-#undef org_sqlite_jni_CApi_SQLITE_INDEX_CONSTRAINT_GE
-#define org_sqlite_jni_CApi_SQLITE_INDEX_CONSTRAINT_GE 32L
-#undef org_sqlite_jni_CApi_SQLITE_INDEX_CONSTRAINT_MATCH
-#define org_sqlite_jni_CApi_SQLITE_INDEX_CONSTRAINT_MATCH 64L
-#undef org_sqlite_jni_CApi_SQLITE_INDEX_CONSTRAINT_LIKE
-#define org_sqlite_jni_CApi_SQLITE_INDEX_CONSTRAINT_LIKE 65L
-#undef org_sqlite_jni_CApi_SQLITE_INDEX_CONSTRAINT_GLOB
-#define org_sqlite_jni_CApi_SQLITE_INDEX_CONSTRAINT_GLOB 66L
-#undef org_sqlite_jni_CApi_SQLITE_INDEX_CONSTRAINT_REGEXP
-#define org_sqlite_jni_CApi_SQLITE_INDEX_CONSTRAINT_REGEXP 67L
-#undef org_sqlite_jni_CApi_SQLITE_INDEX_CONSTRAINT_NE
-#define org_sqlite_jni_CApi_SQLITE_INDEX_CONSTRAINT_NE 68L
-#undef org_sqlite_jni_CApi_SQLITE_INDEX_CONSTRAINT_ISNOT
-#define org_sqlite_jni_CApi_SQLITE_INDEX_CONSTRAINT_ISNOT 69L
-#undef org_sqlite_jni_CApi_SQLITE_INDEX_CONSTRAINT_ISNOTNULL
-#define org_sqlite_jni_CApi_SQLITE_INDEX_CONSTRAINT_ISNOTNULL 70L
-#undef org_sqlite_jni_CApi_SQLITE_INDEX_CONSTRAINT_ISNULL
-#define org_sqlite_jni_CApi_SQLITE_INDEX_CONSTRAINT_ISNULL 71L
-#undef org_sqlite_jni_CApi_SQLITE_INDEX_CONSTRAINT_IS
-#define org_sqlite_jni_CApi_SQLITE_INDEX_CONSTRAINT_IS 72L
-#undef org_sqlite_jni_CApi_SQLITE_INDEX_CONSTRAINT_LIMIT
-#define org_sqlite_jni_CApi_SQLITE_INDEX_CONSTRAINT_LIMIT 73L
-#undef org_sqlite_jni_CApi_SQLITE_INDEX_CONSTRAINT_OFFSET
-#define org_sqlite_jni_CApi_SQLITE_INDEX_CONSTRAINT_OFFSET 74L
-#undef org_sqlite_jni_CApi_SQLITE_INDEX_CONSTRAINT_FUNCTION
-#define org_sqlite_jni_CApi_SQLITE_INDEX_CONSTRAINT_FUNCTION 150L
-#undef org_sqlite_jni_CApi_SQLITE_VTAB_CONSTRAINT_SUPPORT
-#define org_sqlite_jni_CApi_SQLITE_VTAB_CONSTRAINT_SUPPORT 1L
-#undef org_sqlite_jni_CApi_SQLITE_VTAB_INNOCUOUS
-#define org_sqlite_jni_CApi_SQLITE_VTAB_INNOCUOUS 2L
-#undef org_sqlite_jni_CApi_SQLITE_VTAB_DIRECTONLY
-#define org_sqlite_jni_CApi_SQLITE_VTAB_DIRECTONLY 3L
-#undef org_sqlite_jni_CApi_SQLITE_VTAB_USES_ALL_SCHEMAS
-#define org_sqlite_jni_CApi_SQLITE_VTAB_USES_ALL_SCHEMAS 4L
-#undef org_sqlite_jni_CApi_SQLITE_ROLLBACK
-#define org_sqlite_jni_CApi_SQLITE_ROLLBACK 1L
-#undef org_sqlite_jni_CApi_SQLITE_FAIL
-#define org_sqlite_jni_CApi_SQLITE_FAIL 3L
-#undef org_sqlite_jni_CApi_SQLITE_REPLACE
-#define org_sqlite_jni_CApi_SQLITE_REPLACE 5L
+#undef org_sqlite_jni_capi_CApi_SQLITE_ACCESS_EXISTS
+#define org_sqlite_jni_capi_CApi_SQLITE_ACCESS_EXISTS 0L
+#undef org_sqlite_jni_capi_CApi_SQLITE_ACCESS_READWRITE
+#define org_sqlite_jni_capi_CApi_SQLITE_ACCESS_READWRITE 1L
+#undef org_sqlite_jni_capi_CApi_SQLITE_ACCESS_READ
+#define org_sqlite_jni_capi_CApi_SQLITE_ACCESS_READ 2L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DENY
+#define org_sqlite_jni_capi_CApi_SQLITE_DENY 1L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IGNORE
+#define org_sqlite_jni_capi_CApi_SQLITE_IGNORE 2L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CREATE_INDEX
+#define org_sqlite_jni_capi_CApi_SQLITE_CREATE_INDEX 1L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CREATE_TABLE
+#define org_sqlite_jni_capi_CApi_SQLITE_CREATE_TABLE 2L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CREATE_TEMP_INDEX
+#define org_sqlite_jni_capi_CApi_SQLITE_CREATE_TEMP_INDEX 3L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CREATE_TEMP_TABLE
+#define org_sqlite_jni_capi_CApi_SQLITE_CREATE_TEMP_TABLE 4L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CREATE_TEMP_TRIGGER
+#define org_sqlite_jni_capi_CApi_SQLITE_CREATE_TEMP_TRIGGER 5L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CREATE_TEMP_VIEW
+#define org_sqlite_jni_capi_CApi_SQLITE_CREATE_TEMP_VIEW 6L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CREATE_TRIGGER
+#define org_sqlite_jni_capi_CApi_SQLITE_CREATE_TRIGGER 7L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CREATE_VIEW
+#define org_sqlite_jni_capi_CApi_SQLITE_CREATE_VIEW 8L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DELETE
+#define org_sqlite_jni_capi_CApi_SQLITE_DELETE 9L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DROP_INDEX
+#define org_sqlite_jni_capi_CApi_SQLITE_DROP_INDEX 10L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DROP_TABLE
+#define org_sqlite_jni_capi_CApi_SQLITE_DROP_TABLE 11L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DROP_TEMP_INDEX
+#define org_sqlite_jni_capi_CApi_SQLITE_DROP_TEMP_INDEX 12L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DROP_TEMP_TABLE
+#define org_sqlite_jni_capi_CApi_SQLITE_DROP_TEMP_TABLE 13L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DROP_TEMP_TRIGGER
+#define org_sqlite_jni_capi_CApi_SQLITE_DROP_TEMP_TRIGGER 14L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DROP_TEMP_VIEW
+#define org_sqlite_jni_capi_CApi_SQLITE_DROP_TEMP_VIEW 15L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DROP_TRIGGER
+#define org_sqlite_jni_capi_CApi_SQLITE_DROP_TRIGGER 16L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DROP_VIEW
+#define org_sqlite_jni_capi_CApi_SQLITE_DROP_VIEW 17L
+#undef org_sqlite_jni_capi_CApi_SQLITE_INSERT
+#define org_sqlite_jni_capi_CApi_SQLITE_INSERT 18L
+#undef org_sqlite_jni_capi_CApi_SQLITE_PRAGMA
+#define org_sqlite_jni_capi_CApi_SQLITE_PRAGMA 19L
+#undef org_sqlite_jni_capi_CApi_SQLITE_READ
+#define org_sqlite_jni_capi_CApi_SQLITE_READ 20L
+#undef org_sqlite_jni_capi_CApi_SQLITE_SELECT
+#define org_sqlite_jni_capi_CApi_SQLITE_SELECT 21L
+#undef org_sqlite_jni_capi_CApi_SQLITE_TRANSACTION
+#define org_sqlite_jni_capi_CApi_SQLITE_TRANSACTION 22L
+#undef org_sqlite_jni_capi_CApi_SQLITE_UPDATE
+#define org_sqlite_jni_capi_CApi_SQLITE_UPDATE 23L
+#undef org_sqlite_jni_capi_CApi_SQLITE_ATTACH
+#define org_sqlite_jni_capi_CApi_SQLITE_ATTACH 24L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DETACH
+#define org_sqlite_jni_capi_CApi_SQLITE_DETACH 25L
+#undef org_sqlite_jni_capi_CApi_SQLITE_ALTER_TABLE
+#define org_sqlite_jni_capi_CApi_SQLITE_ALTER_TABLE 26L
+#undef org_sqlite_jni_capi_CApi_SQLITE_REINDEX
+#define org_sqlite_jni_capi_CApi_SQLITE_REINDEX 27L
+#undef org_sqlite_jni_capi_CApi_SQLITE_ANALYZE
+#define org_sqlite_jni_capi_CApi_SQLITE_ANALYZE 28L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CREATE_VTABLE
+#define org_sqlite_jni_capi_CApi_SQLITE_CREATE_VTABLE 29L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DROP_VTABLE
+#define org_sqlite_jni_capi_CApi_SQLITE_DROP_VTABLE 30L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FUNCTION
+#define org_sqlite_jni_capi_CApi_SQLITE_FUNCTION 31L
+#undef org_sqlite_jni_capi_CApi_SQLITE_SAVEPOINT
+#define org_sqlite_jni_capi_CApi_SQLITE_SAVEPOINT 32L
+#undef org_sqlite_jni_capi_CApi_SQLITE_RECURSIVE
+#define org_sqlite_jni_capi_CApi_SQLITE_RECURSIVE 33L
+#undef org_sqlite_jni_capi_CApi_SQLITE_STATIC
+#define org_sqlite_jni_capi_CApi_SQLITE_STATIC 0LL
+#undef org_sqlite_jni_capi_CApi_SQLITE_TRANSIENT
+#define org_sqlite_jni_capi_CApi_SQLITE_TRANSIENT -1LL
+#undef org_sqlite_jni_capi_CApi_SQLITE_CHANGESETSTART_INVERT
+#define org_sqlite_jni_capi_CApi_SQLITE_CHANGESETSTART_INVERT 2L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CHANGESETAPPLY_NOSAVEPOINT
+#define org_sqlite_jni_capi_CApi_SQLITE_CHANGESETAPPLY_NOSAVEPOINT 1L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CHANGESETAPPLY_INVERT
+#define org_sqlite_jni_capi_CApi_SQLITE_CHANGESETAPPLY_INVERT 2L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CHANGESETAPPLY_IGNORENOOP
+#define org_sqlite_jni_capi_CApi_SQLITE_CHANGESETAPPLY_IGNORENOOP 4L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CHANGESET_DATA
+#define org_sqlite_jni_capi_CApi_SQLITE_CHANGESET_DATA 1L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CHANGESET_NOTFOUND
+#define org_sqlite_jni_capi_CApi_SQLITE_CHANGESET_NOTFOUND 2L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CHANGESET_CONFLICT
+#define org_sqlite_jni_capi_CApi_SQLITE_CHANGESET_CONFLICT 3L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CHANGESET_CONSTRAINT
+#define org_sqlite_jni_capi_CApi_SQLITE_CHANGESET_CONSTRAINT 4L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CHANGESET_FOREIGN_KEY
+#define org_sqlite_jni_capi_CApi_SQLITE_CHANGESET_FOREIGN_KEY 5L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CHANGESET_OMIT
+#define org_sqlite_jni_capi_CApi_SQLITE_CHANGESET_OMIT 0L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CHANGESET_REPLACE
+#define org_sqlite_jni_capi_CApi_SQLITE_CHANGESET_REPLACE 1L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CHANGESET_ABORT
+#define org_sqlite_jni_capi_CApi_SQLITE_CHANGESET_ABORT 2L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONFIG_SINGLETHREAD
+#define org_sqlite_jni_capi_CApi_SQLITE_CONFIG_SINGLETHREAD 1L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONFIG_MULTITHREAD
+#define org_sqlite_jni_capi_CApi_SQLITE_CONFIG_MULTITHREAD 2L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONFIG_SERIALIZED
+#define org_sqlite_jni_capi_CApi_SQLITE_CONFIG_SERIALIZED 3L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONFIG_MALLOC
+#define org_sqlite_jni_capi_CApi_SQLITE_CONFIG_MALLOC 4L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONFIG_GETMALLOC
+#define org_sqlite_jni_capi_CApi_SQLITE_CONFIG_GETMALLOC 5L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONFIG_SCRATCH
+#define org_sqlite_jni_capi_CApi_SQLITE_CONFIG_SCRATCH 6L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONFIG_PAGECACHE
+#define org_sqlite_jni_capi_CApi_SQLITE_CONFIG_PAGECACHE 7L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONFIG_HEAP
+#define org_sqlite_jni_capi_CApi_SQLITE_CONFIG_HEAP 8L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONFIG_MEMSTATUS
+#define org_sqlite_jni_capi_CApi_SQLITE_CONFIG_MEMSTATUS 9L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONFIG_MUTEX
+#define org_sqlite_jni_capi_CApi_SQLITE_CONFIG_MUTEX 10L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONFIG_GETMUTEX
+#define org_sqlite_jni_capi_CApi_SQLITE_CONFIG_GETMUTEX 11L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONFIG_LOOKASIDE
+#define org_sqlite_jni_capi_CApi_SQLITE_CONFIG_LOOKASIDE 13L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONFIG_PCACHE
+#define org_sqlite_jni_capi_CApi_SQLITE_CONFIG_PCACHE 14L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONFIG_GETPCACHE
+#define org_sqlite_jni_capi_CApi_SQLITE_CONFIG_GETPCACHE 15L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONFIG_LOG
+#define org_sqlite_jni_capi_CApi_SQLITE_CONFIG_LOG 16L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONFIG_URI
+#define org_sqlite_jni_capi_CApi_SQLITE_CONFIG_URI 17L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONFIG_PCACHE2
+#define org_sqlite_jni_capi_CApi_SQLITE_CONFIG_PCACHE2 18L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONFIG_GETPCACHE2
+#define org_sqlite_jni_capi_CApi_SQLITE_CONFIG_GETPCACHE2 19L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONFIG_COVERING_INDEX_SCAN
+#define org_sqlite_jni_capi_CApi_SQLITE_CONFIG_COVERING_INDEX_SCAN 20L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONFIG_SQLLOG
+#define org_sqlite_jni_capi_CApi_SQLITE_CONFIG_SQLLOG 21L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONFIG_MMAP_SIZE
+#define org_sqlite_jni_capi_CApi_SQLITE_CONFIG_MMAP_SIZE 22L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONFIG_WIN32_HEAPSIZE
+#define org_sqlite_jni_capi_CApi_SQLITE_CONFIG_WIN32_HEAPSIZE 23L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONFIG_PCACHE_HDRSZ
+#define org_sqlite_jni_capi_CApi_SQLITE_CONFIG_PCACHE_HDRSZ 24L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONFIG_PMASZ
+#define org_sqlite_jni_capi_CApi_SQLITE_CONFIG_PMASZ 25L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONFIG_STMTJRNL_SPILL
+#define org_sqlite_jni_capi_CApi_SQLITE_CONFIG_STMTJRNL_SPILL 26L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONFIG_SMALL_MALLOC
+#define org_sqlite_jni_capi_CApi_SQLITE_CONFIG_SMALL_MALLOC 27L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONFIG_SORTERREF_SIZE
+#define org_sqlite_jni_capi_CApi_SQLITE_CONFIG_SORTERREF_SIZE 28L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONFIG_MEMDB_MAXSIZE
+#define org_sqlite_jni_capi_CApi_SQLITE_CONFIG_MEMDB_MAXSIZE 29L
+#undef org_sqlite_jni_capi_CApi_SQLITE_INTEGER
+#define org_sqlite_jni_capi_CApi_SQLITE_INTEGER 1L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FLOAT
+#define org_sqlite_jni_capi_CApi_SQLITE_FLOAT 2L
+#undef org_sqlite_jni_capi_CApi_SQLITE_TEXT
+#define org_sqlite_jni_capi_CApi_SQLITE_TEXT 3L
+#undef org_sqlite_jni_capi_CApi_SQLITE_BLOB
+#define org_sqlite_jni_capi_CApi_SQLITE_BLOB 4L
+#undef org_sqlite_jni_capi_CApi_SQLITE_NULL
+#define org_sqlite_jni_capi_CApi_SQLITE_NULL 5L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_MAINDBNAME
+#define org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_MAINDBNAME 1000L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_LOOKASIDE
+#define org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_LOOKASIDE 1001L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_ENABLE_FKEY
+#define org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_ENABLE_FKEY 1002L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_ENABLE_TRIGGER
+#define org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_ENABLE_TRIGGER 1003L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER
+#define org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_ENABLE_FTS3_TOKENIZER 1004L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION
+#define org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_ENABLE_LOAD_EXTENSION 1005L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE
+#define org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_NO_CKPT_ON_CLOSE 1006L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_ENABLE_QPSG
+#define org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_ENABLE_QPSG 1007L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_TRIGGER_EQP
+#define org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_TRIGGER_EQP 1008L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_RESET_DATABASE
+#define org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_RESET_DATABASE 1009L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_DEFENSIVE
+#define org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_DEFENSIVE 1010L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_WRITABLE_SCHEMA
+#define org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_WRITABLE_SCHEMA 1011L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_LEGACY_ALTER_TABLE
+#define org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_LEGACY_ALTER_TABLE 1012L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_DQS_DML
+#define org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_DQS_DML 1013L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_DQS_DDL
+#define org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_DQS_DDL 1014L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_ENABLE_VIEW
+#define org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_ENABLE_VIEW 1015L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_LEGACY_FILE_FORMAT
+#define org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_LEGACY_FILE_FORMAT 1016L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_TRUSTED_SCHEMA
+#define org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_TRUSTED_SCHEMA 1017L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_STMT_SCANSTATUS
+#define org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_STMT_SCANSTATUS 1018L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_REVERSE_SCANORDER
+#define org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_REVERSE_SCANORDER 1019L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_MAX
+#define org_sqlite_jni_capi_CApi_SQLITE_DBCONFIG_MAX 1019L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DBSTATUS_LOOKASIDE_USED
+#define org_sqlite_jni_capi_CApi_SQLITE_DBSTATUS_LOOKASIDE_USED 0L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DBSTATUS_CACHE_USED
+#define org_sqlite_jni_capi_CApi_SQLITE_DBSTATUS_CACHE_USED 1L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DBSTATUS_SCHEMA_USED
+#define org_sqlite_jni_capi_CApi_SQLITE_DBSTATUS_SCHEMA_USED 2L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DBSTATUS_STMT_USED
+#define org_sqlite_jni_capi_CApi_SQLITE_DBSTATUS_STMT_USED 3L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DBSTATUS_LOOKASIDE_HIT
+#define org_sqlite_jni_capi_CApi_SQLITE_DBSTATUS_LOOKASIDE_HIT 4L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE
+#define org_sqlite_jni_capi_CApi_SQLITE_DBSTATUS_LOOKASIDE_MISS_SIZE 5L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL
+#define org_sqlite_jni_capi_CApi_SQLITE_DBSTATUS_LOOKASIDE_MISS_FULL 6L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DBSTATUS_CACHE_HIT
+#define org_sqlite_jni_capi_CApi_SQLITE_DBSTATUS_CACHE_HIT 7L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DBSTATUS_CACHE_MISS
+#define org_sqlite_jni_capi_CApi_SQLITE_DBSTATUS_CACHE_MISS 8L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DBSTATUS_CACHE_WRITE
+#define org_sqlite_jni_capi_CApi_SQLITE_DBSTATUS_CACHE_WRITE 9L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DBSTATUS_DEFERRED_FKS
+#define org_sqlite_jni_capi_CApi_SQLITE_DBSTATUS_DEFERRED_FKS 10L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DBSTATUS_CACHE_USED_SHARED
+#define org_sqlite_jni_capi_CApi_SQLITE_DBSTATUS_CACHE_USED_SHARED 11L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DBSTATUS_CACHE_SPILL
+#define org_sqlite_jni_capi_CApi_SQLITE_DBSTATUS_CACHE_SPILL 12L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DBSTATUS_MAX
+#define org_sqlite_jni_capi_CApi_SQLITE_DBSTATUS_MAX 12L
+#undef org_sqlite_jni_capi_CApi_SQLITE_UTF8
+#define org_sqlite_jni_capi_CApi_SQLITE_UTF8 1L
+#undef org_sqlite_jni_capi_CApi_SQLITE_UTF16LE
+#define org_sqlite_jni_capi_CApi_SQLITE_UTF16LE 2L
+#undef org_sqlite_jni_capi_CApi_SQLITE_UTF16BE
+#define org_sqlite_jni_capi_CApi_SQLITE_UTF16BE 3L
+#undef org_sqlite_jni_capi_CApi_SQLITE_UTF16
+#define org_sqlite_jni_capi_CApi_SQLITE_UTF16 4L
+#undef org_sqlite_jni_capi_CApi_SQLITE_UTF16_ALIGNED
+#define org_sqlite_jni_capi_CApi_SQLITE_UTF16_ALIGNED 8L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_LOCKSTATE
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_LOCKSTATE 1L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_GET_LOCKPROXYFILE
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_GET_LOCKPROXYFILE 2L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_SET_LOCKPROXYFILE
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_SET_LOCKPROXYFILE 3L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_LAST_ERRNO
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_LAST_ERRNO 4L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_SIZE_HINT
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_SIZE_HINT 5L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_CHUNK_SIZE
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_CHUNK_SIZE 6L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_FILE_POINTER
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_FILE_POINTER 7L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_SYNC_OMITTED
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_SYNC_OMITTED 8L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_WIN32_AV_RETRY
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_WIN32_AV_RETRY 9L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_PERSIST_WAL
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_PERSIST_WAL 10L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_OVERWRITE
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_OVERWRITE 11L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_VFSNAME
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_VFSNAME 12L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_POWERSAFE_OVERWRITE
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_POWERSAFE_OVERWRITE 13L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_PRAGMA
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_PRAGMA 14L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_BUSYHANDLER
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_BUSYHANDLER 15L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_TEMPFILENAME
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_TEMPFILENAME 16L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_MMAP_SIZE
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_MMAP_SIZE 18L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_TRACE
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_TRACE 19L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_HAS_MOVED
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_HAS_MOVED 20L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_SYNC
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_SYNC 21L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_COMMIT_PHASETWO
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_COMMIT_PHASETWO 22L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_WIN32_SET_HANDLE
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_WIN32_SET_HANDLE 23L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_WAL_BLOCK
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_WAL_BLOCK 24L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_ZIPVFS
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_ZIPVFS 25L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_RBU
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_RBU 26L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_VFS_POINTER
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_VFS_POINTER 27L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_JOURNAL_POINTER
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_JOURNAL_POINTER 28L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_WIN32_GET_HANDLE
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_WIN32_GET_HANDLE 29L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_PDB
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_PDB 30L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_BEGIN_ATOMIC_WRITE
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_BEGIN_ATOMIC_WRITE 31L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_COMMIT_ATOMIC_WRITE
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_COMMIT_ATOMIC_WRITE 32L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE 33L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_LOCK_TIMEOUT
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_LOCK_TIMEOUT 34L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_DATA_VERSION
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_DATA_VERSION 35L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_SIZE_LIMIT
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_SIZE_LIMIT 36L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_CKPT_DONE
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_CKPT_DONE 37L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_RESERVE_BYTES
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_RESERVE_BYTES 38L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_CKPT_START
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_CKPT_START 39L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_EXTERNAL_READER
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_EXTERNAL_READER 40L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_CKSM_FILE
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_CKSM_FILE 41L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FCNTL_RESET_CACHE
+#define org_sqlite_jni_capi_CApi_SQLITE_FCNTL_RESET_CACHE 42L
+#undef org_sqlite_jni_capi_CApi_SQLITE_LOCK_NONE
+#define org_sqlite_jni_capi_CApi_SQLITE_LOCK_NONE 0L
+#undef org_sqlite_jni_capi_CApi_SQLITE_LOCK_SHARED
+#define org_sqlite_jni_capi_CApi_SQLITE_LOCK_SHARED 1L
+#undef org_sqlite_jni_capi_CApi_SQLITE_LOCK_RESERVED
+#define org_sqlite_jni_capi_CApi_SQLITE_LOCK_RESERVED 2L
+#undef org_sqlite_jni_capi_CApi_SQLITE_LOCK_PENDING
+#define org_sqlite_jni_capi_CApi_SQLITE_LOCK_PENDING 3L
+#undef org_sqlite_jni_capi_CApi_SQLITE_LOCK_EXCLUSIVE
+#define org_sqlite_jni_capi_CApi_SQLITE_LOCK_EXCLUSIVE 4L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOCAP_ATOMIC
+#define org_sqlite_jni_capi_CApi_SQLITE_IOCAP_ATOMIC 1L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOCAP_ATOMIC512
+#define org_sqlite_jni_capi_CApi_SQLITE_IOCAP_ATOMIC512 2L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOCAP_ATOMIC1K
+#define org_sqlite_jni_capi_CApi_SQLITE_IOCAP_ATOMIC1K 4L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOCAP_ATOMIC2K
+#define org_sqlite_jni_capi_CApi_SQLITE_IOCAP_ATOMIC2K 8L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOCAP_ATOMIC4K
+#define org_sqlite_jni_capi_CApi_SQLITE_IOCAP_ATOMIC4K 16L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOCAP_ATOMIC8K
+#define org_sqlite_jni_capi_CApi_SQLITE_IOCAP_ATOMIC8K 32L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOCAP_ATOMIC16K
+#define org_sqlite_jni_capi_CApi_SQLITE_IOCAP_ATOMIC16K 64L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOCAP_ATOMIC32K
+#define org_sqlite_jni_capi_CApi_SQLITE_IOCAP_ATOMIC32K 128L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOCAP_ATOMIC64K
+#define org_sqlite_jni_capi_CApi_SQLITE_IOCAP_ATOMIC64K 256L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOCAP_SAFE_APPEND
+#define org_sqlite_jni_capi_CApi_SQLITE_IOCAP_SAFE_APPEND 512L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOCAP_SEQUENTIAL
+#define org_sqlite_jni_capi_CApi_SQLITE_IOCAP_SEQUENTIAL 1024L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN
+#define org_sqlite_jni_capi_CApi_SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN 2048L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOCAP_POWERSAFE_OVERWRITE
+#define org_sqlite_jni_capi_CApi_SQLITE_IOCAP_POWERSAFE_OVERWRITE 4096L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOCAP_IMMUTABLE
+#define org_sqlite_jni_capi_CApi_SQLITE_IOCAP_IMMUTABLE 8192L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOCAP_BATCH_ATOMIC
+#define org_sqlite_jni_capi_CApi_SQLITE_IOCAP_BATCH_ATOMIC 16384L
+#undef org_sqlite_jni_capi_CApi_SQLITE_LIMIT_LENGTH
+#define org_sqlite_jni_capi_CApi_SQLITE_LIMIT_LENGTH 0L
+#undef org_sqlite_jni_capi_CApi_SQLITE_LIMIT_SQL_LENGTH
+#define org_sqlite_jni_capi_CApi_SQLITE_LIMIT_SQL_LENGTH 1L
+#undef org_sqlite_jni_capi_CApi_SQLITE_LIMIT_COLUMN
+#define org_sqlite_jni_capi_CApi_SQLITE_LIMIT_COLUMN 2L
+#undef org_sqlite_jni_capi_CApi_SQLITE_LIMIT_EXPR_DEPTH
+#define org_sqlite_jni_capi_CApi_SQLITE_LIMIT_EXPR_DEPTH 3L
+#undef org_sqlite_jni_capi_CApi_SQLITE_LIMIT_COMPOUND_SELECT
+#define org_sqlite_jni_capi_CApi_SQLITE_LIMIT_COMPOUND_SELECT 4L
+#undef org_sqlite_jni_capi_CApi_SQLITE_LIMIT_VDBE_OP
+#define org_sqlite_jni_capi_CApi_SQLITE_LIMIT_VDBE_OP 5L
+#undef org_sqlite_jni_capi_CApi_SQLITE_LIMIT_FUNCTION_ARG
+#define org_sqlite_jni_capi_CApi_SQLITE_LIMIT_FUNCTION_ARG 6L
+#undef org_sqlite_jni_capi_CApi_SQLITE_LIMIT_ATTACHED
+#define org_sqlite_jni_capi_CApi_SQLITE_LIMIT_ATTACHED 7L
+#undef org_sqlite_jni_capi_CApi_SQLITE_LIMIT_LIKE_PATTERN_LENGTH
+#define org_sqlite_jni_capi_CApi_SQLITE_LIMIT_LIKE_PATTERN_LENGTH 8L
+#undef org_sqlite_jni_capi_CApi_SQLITE_LIMIT_VARIABLE_NUMBER
+#define org_sqlite_jni_capi_CApi_SQLITE_LIMIT_VARIABLE_NUMBER 9L
+#undef org_sqlite_jni_capi_CApi_SQLITE_LIMIT_TRIGGER_DEPTH
+#define org_sqlite_jni_capi_CApi_SQLITE_LIMIT_TRIGGER_DEPTH 10L
+#undef org_sqlite_jni_capi_CApi_SQLITE_LIMIT_WORKER_THREADS
+#define org_sqlite_jni_capi_CApi_SQLITE_LIMIT_WORKER_THREADS 11L
+#undef org_sqlite_jni_capi_CApi_SQLITE_OPEN_READONLY
+#define org_sqlite_jni_capi_CApi_SQLITE_OPEN_READONLY 1L
+#undef org_sqlite_jni_capi_CApi_SQLITE_OPEN_READWRITE
+#define org_sqlite_jni_capi_CApi_SQLITE_OPEN_READWRITE 2L
+#undef org_sqlite_jni_capi_CApi_SQLITE_OPEN_CREATE
+#define org_sqlite_jni_capi_CApi_SQLITE_OPEN_CREATE 4L
+#undef org_sqlite_jni_capi_CApi_SQLITE_OPEN_URI
+#define org_sqlite_jni_capi_CApi_SQLITE_OPEN_URI 64L
+#undef org_sqlite_jni_capi_CApi_SQLITE_OPEN_MEMORY
+#define org_sqlite_jni_capi_CApi_SQLITE_OPEN_MEMORY 128L
+#undef org_sqlite_jni_capi_CApi_SQLITE_OPEN_NOMUTEX
+#define org_sqlite_jni_capi_CApi_SQLITE_OPEN_NOMUTEX 32768L
+#undef org_sqlite_jni_capi_CApi_SQLITE_OPEN_FULLMUTEX
+#define org_sqlite_jni_capi_CApi_SQLITE_OPEN_FULLMUTEX 65536L
+#undef org_sqlite_jni_capi_CApi_SQLITE_OPEN_SHAREDCACHE
+#define org_sqlite_jni_capi_CApi_SQLITE_OPEN_SHAREDCACHE 131072L
+#undef org_sqlite_jni_capi_CApi_SQLITE_OPEN_PRIVATECACHE
+#define org_sqlite_jni_capi_CApi_SQLITE_OPEN_PRIVATECACHE 262144L
+#undef org_sqlite_jni_capi_CApi_SQLITE_OPEN_NOFOLLOW
+#define org_sqlite_jni_capi_CApi_SQLITE_OPEN_NOFOLLOW 16777216L
+#undef org_sqlite_jni_capi_CApi_SQLITE_OPEN_EXRESCODE
+#define org_sqlite_jni_capi_CApi_SQLITE_OPEN_EXRESCODE 33554432L
+#undef org_sqlite_jni_capi_CApi_SQLITE_PREPARE_PERSISTENT
+#define org_sqlite_jni_capi_CApi_SQLITE_PREPARE_PERSISTENT 1L
+#undef org_sqlite_jni_capi_CApi_SQLITE_PREPARE_NORMALIZE
+#define org_sqlite_jni_capi_CApi_SQLITE_PREPARE_NORMALIZE 2L
+#undef org_sqlite_jni_capi_CApi_SQLITE_PREPARE_NO_VTAB
+#define org_sqlite_jni_capi_CApi_SQLITE_PREPARE_NO_VTAB 4L
+#undef org_sqlite_jni_capi_CApi_SQLITE_OK
+#define org_sqlite_jni_capi_CApi_SQLITE_OK 0L
+#undef org_sqlite_jni_capi_CApi_SQLITE_ERROR
+#define org_sqlite_jni_capi_CApi_SQLITE_ERROR 1L
+#undef org_sqlite_jni_capi_CApi_SQLITE_INTERNAL
+#define org_sqlite_jni_capi_CApi_SQLITE_INTERNAL 2L
+#undef org_sqlite_jni_capi_CApi_SQLITE_PERM
+#define org_sqlite_jni_capi_CApi_SQLITE_PERM 3L
+#undef org_sqlite_jni_capi_CApi_SQLITE_ABORT
+#define org_sqlite_jni_capi_CApi_SQLITE_ABORT 4L
+#undef org_sqlite_jni_capi_CApi_SQLITE_BUSY
+#define org_sqlite_jni_capi_CApi_SQLITE_BUSY 5L
+#undef org_sqlite_jni_capi_CApi_SQLITE_LOCKED
+#define org_sqlite_jni_capi_CApi_SQLITE_LOCKED 6L
+#undef org_sqlite_jni_capi_CApi_SQLITE_NOMEM
+#define org_sqlite_jni_capi_CApi_SQLITE_NOMEM 7L
+#undef org_sqlite_jni_capi_CApi_SQLITE_READONLY
+#define org_sqlite_jni_capi_CApi_SQLITE_READONLY 8L
+#undef org_sqlite_jni_capi_CApi_SQLITE_INTERRUPT
+#define org_sqlite_jni_capi_CApi_SQLITE_INTERRUPT 9L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOERR
+#define org_sqlite_jni_capi_CApi_SQLITE_IOERR 10L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CORRUPT
+#define org_sqlite_jni_capi_CApi_SQLITE_CORRUPT 11L
+#undef org_sqlite_jni_capi_CApi_SQLITE_NOTFOUND
+#define org_sqlite_jni_capi_CApi_SQLITE_NOTFOUND 12L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FULL
+#define org_sqlite_jni_capi_CApi_SQLITE_FULL 13L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CANTOPEN
+#define org_sqlite_jni_capi_CApi_SQLITE_CANTOPEN 14L
+#undef org_sqlite_jni_capi_CApi_SQLITE_PROTOCOL
+#define org_sqlite_jni_capi_CApi_SQLITE_PROTOCOL 15L
+#undef org_sqlite_jni_capi_CApi_SQLITE_EMPTY
+#define org_sqlite_jni_capi_CApi_SQLITE_EMPTY 16L
+#undef org_sqlite_jni_capi_CApi_SQLITE_SCHEMA
+#define org_sqlite_jni_capi_CApi_SQLITE_SCHEMA 17L
+#undef org_sqlite_jni_capi_CApi_SQLITE_TOOBIG
+#define org_sqlite_jni_capi_CApi_SQLITE_TOOBIG 18L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONSTRAINT
+#define org_sqlite_jni_capi_CApi_SQLITE_CONSTRAINT 19L
+#undef org_sqlite_jni_capi_CApi_SQLITE_MISMATCH
+#define org_sqlite_jni_capi_CApi_SQLITE_MISMATCH 20L
+#undef org_sqlite_jni_capi_CApi_SQLITE_MISUSE
+#define org_sqlite_jni_capi_CApi_SQLITE_MISUSE 21L
+#undef org_sqlite_jni_capi_CApi_SQLITE_NOLFS
+#define org_sqlite_jni_capi_CApi_SQLITE_NOLFS 22L
+#undef org_sqlite_jni_capi_CApi_SQLITE_AUTH
+#define org_sqlite_jni_capi_CApi_SQLITE_AUTH 23L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FORMAT
+#define org_sqlite_jni_capi_CApi_SQLITE_FORMAT 24L
+#undef org_sqlite_jni_capi_CApi_SQLITE_RANGE
+#define org_sqlite_jni_capi_CApi_SQLITE_RANGE 25L
+#undef org_sqlite_jni_capi_CApi_SQLITE_NOTADB
+#define org_sqlite_jni_capi_CApi_SQLITE_NOTADB 26L
+#undef org_sqlite_jni_capi_CApi_SQLITE_NOTICE
+#define org_sqlite_jni_capi_CApi_SQLITE_NOTICE 27L
+#undef org_sqlite_jni_capi_CApi_SQLITE_WARNING
+#define org_sqlite_jni_capi_CApi_SQLITE_WARNING 28L
+#undef org_sqlite_jni_capi_CApi_SQLITE_ROW
+#define org_sqlite_jni_capi_CApi_SQLITE_ROW 100L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DONE
+#define org_sqlite_jni_capi_CApi_SQLITE_DONE 101L
+#undef org_sqlite_jni_capi_CApi_SQLITE_ERROR_MISSING_COLLSEQ
+#define org_sqlite_jni_capi_CApi_SQLITE_ERROR_MISSING_COLLSEQ 257L
+#undef org_sqlite_jni_capi_CApi_SQLITE_ERROR_RETRY
+#define org_sqlite_jni_capi_CApi_SQLITE_ERROR_RETRY 513L
+#undef org_sqlite_jni_capi_CApi_SQLITE_ERROR_SNAPSHOT
+#define org_sqlite_jni_capi_CApi_SQLITE_ERROR_SNAPSHOT 769L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOERR_READ
+#define org_sqlite_jni_capi_CApi_SQLITE_IOERR_READ 266L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOERR_SHORT_READ
+#define org_sqlite_jni_capi_CApi_SQLITE_IOERR_SHORT_READ 522L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOERR_WRITE
+#define org_sqlite_jni_capi_CApi_SQLITE_IOERR_WRITE 778L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOERR_FSYNC
+#define org_sqlite_jni_capi_CApi_SQLITE_IOERR_FSYNC 1034L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOERR_DIR_FSYNC
+#define org_sqlite_jni_capi_CApi_SQLITE_IOERR_DIR_FSYNC 1290L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOERR_TRUNCATE
+#define org_sqlite_jni_capi_CApi_SQLITE_IOERR_TRUNCATE 1546L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOERR_FSTAT
+#define org_sqlite_jni_capi_CApi_SQLITE_IOERR_FSTAT 1802L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOERR_UNLOCK
+#define org_sqlite_jni_capi_CApi_SQLITE_IOERR_UNLOCK 2058L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOERR_RDLOCK
+#define org_sqlite_jni_capi_CApi_SQLITE_IOERR_RDLOCK 2314L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOERR_DELETE
+#define org_sqlite_jni_capi_CApi_SQLITE_IOERR_DELETE 2570L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOERR_BLOCKED
+#define org_sqlite_jni_capi_CApi_SQLITE_IOERR_BLOCKED 2826L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOERR_NOMEM
+#define org_sqlite_jni_capi_CApi_SQLITE_IOERR_NOMEM 3082L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOERR_ACCESS
+#define org_sqlite_jni_capi_CApi_SQLITE_IOERR_ACCESS 3338L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOERR_CHECKRESERVEDLOCK
+#define org_sqlite_jni_capi_CApi_SQLITE_IOERR_CHECKRESERVEDLOCK 3594L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOERR_LOCK
+#define org_sqlite_jni_capi_CApi_SQLITE_IOERR_LOCK 3850L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOERR_CLOSE
+#define org_sqlite_jni_capi_CApi_SQLITE_IOERR_CLOSE 4106L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOERR_DIR_CLOSE
+#define org_sqlite_jni_capi_CApi_SQLITE_IOERR_DIR_CLOSE 4362L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOERR_SHMOPEN
+#define org_sqlite_jni_capi_CApi_SQLITE_IOERR_SHMOPEN 4618L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOERR_SHMSIZE
+#define org_sqlite_jni_capi_CApi_SQLITE_IOERR_SHMSIZE 4874L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOERR_SHMLOCK
+#define org_sqlite_jni_capi_CApi_SQLITE_IOERR_SHMLOCK 5130L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOERR_SHMMAP
+#define org_sqlite_jni_capi_CApi_SQLITE_IOERR_SHMMAP 5386L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOERR_SEEK
+#define org_sqlite_jni_capi_CApi_SQLITE_IOERR_SEEK 5642L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOERR_DELETE_NOENT
+#define org_sqlite_jni_capi_CApi_SQLITE_IOERR_DELETE_NOENT 5898L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOERR_MMAP
+#define org_sqlite_jni_capi_CApi_SQLITE_IOERR_MMAP 6154L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOERR_GETTEMPPATH
+#define org_sqlite_jni_capi_CApi_SQLITE_IOERR_GETTEMPPATH 6410L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOERR_CONVPATH
+#define org_sqlite_jni_capi_CApi_SQLITE_IOERR_CONVPATH 6666L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOERR_VNODE
+#define org_sqlite_jni_capi_CApi_SQLITE_IOERR_VNODE 6922L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOERR_AUTH
+#define org_sqlite_jni_capi_CApi_SQLITE_IOERR_AUTH 7178L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOERR_BEGIN_ATOMIC
+#define org_sqlite_jni_capi_CApi_SQLITE_IOERR_BEGIN_ATOMIC 7434L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOERR_COMMIT_ATOMIC
+#define org_sqlite_jni_capi_CApi_SQLITE_IOERR_COMMIT_ATOMIC 7690L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOERR_ROLLBACK_ATOMIC
+#define org_sqlite_jni_capi_CApi_SQLITE_IOERR_ROLLBACK_ATOMIC 7946L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOERR_DATA
+#define org_sqlite_jni_capi_CApi_SQLITE_IOERR_DATA 8202L
+#undef org_sqlite_jni_capi_CApi_SQLITE_IOERR_CORRUPTFS
+#define org_sqlite_jni_capi_CApi_SQLITE_IOERR_CORRUPTFS 8458L
+#undef org_sqlite_jni_capi_CApi_SQLITE_LOCKED_SHAREDCACHE
+#define org_sqlite_jni_capi_CApi_SQLITE_LOCKED_SHAREDCACHE 262L
+#undef org_sqlite_jni_capi_CApi_SQLITE_LOCKED_VTAB
+#define org_sqlite_jni_capi_CApi_SQLITE_LOCKED_VTAB 518L
+#undef org_sqlite_jni_capi_CApi_SQLITE_BUSY_RECOVERY
+#define org_sqlite_jni_capi_CApi_SQLITE_BUSY_RECOVERY 261L
+#undef org_sqlite_jni_capi_CApi_SQLITE_BUSY_SNAPSHOT
+#define org_sqlite_jni_capi_CApi_SQLITE_BUSY_SNAPSHOT 517L
+#undef org_sqlite_jni_capi_CApi_SQLITE_BUSY_TIMEOUT
+#define org_sqlite_jni_capi_CApi_SQLITE_BUSY_TIMEOUT 773L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CANTOPEN_NOTEMPDIR
+#define org_sqlite_jni_capi_CApi_SQLITE_CANTOPEN_NOTEMPDIR 270L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CANTOPEN_ISDIR
+#define org_sqlite_jni_capi_CApi_SQLITE_CANTOPEN_ISDIR 526L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CANTOPEN_FULLPATH
+#define org_sqlite_jni_capi_CApi_SQLITE_CANTOPEN_FULLPATH 782L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CANTOPEN_CONVPATH
+#define org_sqlite_jni_capi_CApi_SQLITE_CANTOPEN_CONVPATH 1038L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CANTOPEN_SYMLINK
+#define org_sqlite_jni_capi_CApi_SQLITE_CANTOPEN_SYMLINK 1550L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CORRUPT_VTAB
+#define org_sqlite_jni_capi_CApi_SQLITE_CORRUPT_VTAB 267L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CORRUPT_SEQUENCE
+#define org_sqlite_jni_capi_CApi_SQLITE_CORRUPT_SEQUENCE 523L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CORRUPT_INDEX
+#define org_sqlite_jni_capi_CApi_SQLITE_CORRUPT_INDEX 779L
+#undef org_sqlite_jni_capi_CApi_SQLITE_READONLY_RECOVERY
+#define org_sqlite_jni_capi_CApi_SQLITE_READONLY_RECOVERY 264L
+#undef org_sqlite_jni_capi_CApi_SQLITE_READONLY_CANTLOCK
+#define org_sqlite_jni_capi_CApi_SQLITE_READONLY_CANTLOCK 520L
+#undef org_sqlite_jni_capi_CApi_SQLITE_READONLY_ROLLBACK
+#define org_sqlite_jni_capi_CApi_SQLITE_READONLY_ROLLBACK 776L
+#undef org_sqlite_jni_capi_CApi_SQLITE_READONLY_DBMOVED
+#define org_sqlite_jni_capi_CApi_SQLITE_READONLY_DBMOVED 1032L
+#undef org_sqlite_jni_capi_CApi_SQLITE_READONLY_CANTINIT
+#define org_sqlite_jni_capi_CApi_SQLITE_READONLY_CANTINIT 1288L
+#undef org_sqlite_jni_capi_CApi_SQLITE_READONLY_DIRECTORY
+#define org_sqlite_jni_capi_CApi_SQLITE_READONLY_DIRECTORY 1544L
+#undef org_sqlite_jni_capi_CApi_SQLITE_ABORT_ROLLBACK
+#define org_sqlite_jni_capi_CApi_SQLITE_ABORT_ROLLBACK 516L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONSTRAINT_CHECK
+#define org_sqlite_jni_capi_CApi_SQLITE_CONSTRAINT_CHECK 275L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONSTRAINT_COMMITHOOK
+#define org_sqlite_jni_capi_CApi_SQLITE_CONSTRAINT_COMMITHOOK 531L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONSTRAINT_FOREIGNKEY
+#define org_sqlite_jni_capi_CApi_SQLITE_CONSTRAINT_FOREIGNKEY 787L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONSTRAINT_FUNCTION
+#define org_sqlite_jni_capi_CApi_SQLITE_CONSTRAINT_FUNCTION 1043L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONSTRAINT_NOTNULL
+#define org_sqlite_jni_capi_CApi_SQLITE_CONSTRAINT_NOTNULL 1299L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONSTRAINT_PRIMARYKEY
+#define org_sqlite_jni_capi_CApi_SQLITE_CONSTRAINT_PRIMARYKEY 1555L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONSTRAINT_TRIGGER
+#define org_sqlite_jni_capi_CApi_SQLITE_CONSTRAINT_TRIGGER 1811L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONSTRAINT_UNIQUE
+#define org_sqlite_jni_capi_CApi_SQLITE_CONSTRAINT_UNIQUE 2067L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONSTRAINT_VTAB
+#define org_sqlite_jni_capi_CApi_SQLITE_CONSTRAINT_VTAB 2323L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONSTRAINT_ROWID
+#define org_sqlite_jni_capi_CApi_SQLITE_CONSTRAINT_ROWID 2579L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONSTRAINT_PINNED
+#define org_sqlite_jni_capi_CApi_SQLITE_CONSTRAINT_PINNED 2835L
+#undef org_sqlite_jni_capi_CApi_SQLITE_CONSTRAINT_DATATYPE
+#define org_sqlite_jni_capi_CApi_SQLITE_CONSTRAINT_DATATYPE 3091L
+#undef org_sqlite_jni_capi_CApi_SQLITE_NOTICE_RECOVER_WAL
+#define org_sqlite_jni_capi_CApi_SQLITE_NOTICE_RECOVER_WAL 283L
+#undef org_sqlite_jni_capi_CApi_SQLITE_NOTICE_RECOVER_ROLLBACK
+#define org_sqlite_jni_capi_CApi_SQLITE_NOTICE_RECOVER_ROLLBACK 539L
+#undef org_sqlite_jni_capi_CApi_SQLITE_WARNING_AUTOINDEX
+#define org_sqlite_jni_capi_CApi_SQLITE_WARNING_AUTOINDEX 284L
+#undef org_sqlite_jni_capi_CApi_SQLITE_AUTH_USER
+#define org_sqlite_jni_capi_CApi_SQLITE_AUTH_USER 279L
+#undef org_sqlite_jni_capi_CApi_SQLITE_OK_LOAD_PERMANENTLY
+#define org_sqlite_jni_capi_CApi_SQLITE_OK_LOAD_PERMANENTLY 256L
+#undef org_sqlite_jni_capi_CApi_SQLITE_SERIALIZE_NOCOPY
+#define org_sqlite_jni_capi_CApi_SQLITE_SERIALIZE_NOCOPY 1L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DESERIALIZE_FREEONCLOSE
+#define org_sqlite_jni_capi_CApi_SQLITE_DESERIALIZE_FREEONCLOSE 1L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DESERIALIZE_READONLY
+#define org_sqlite_jni_capi_CApi_SQLITE_DESERIALIZE_READONLY 4L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DESERIALIZE_RESIZEABLE
+#define org_sqlite_jni_capi_CApi_SQLITE_DESERIALIZE_RESIZEABLE 2L
+#undef org_sqlite_jni_capi_CApi_SQLITE_SESSION_CONFIG_STRMSIZE
+#define org_sqlite_jni_capi_CApi_SQLITE_SESSION_CONFIG_STRMSIZE 1L
+#undef org_sqlite_jni_capi_CApi_SQLITE_SESSION_OBJCONFIG_SIZE
+#define org_sqlite_jni_capi_CApi_SQLITE_SESSION_OBJCONFIG_SIZE 1L
+#undef org_sqlite_jni_capi_CApi_SQLITE_STATUS_MEMORY_USED
+#define org_sqlite_jni_capi_CApi_SQLITE_STATUS_MEMORY_USED 0L
+#undef org_sqlite_jni_capi_CApi_SQLITE_STATUS_PAGECACHE_USED
+#define org_sqlite_jni_capi_CApi_SQLITE_STATUS_PAGECACHE_USED 1L
+#undef org_sqlite_jni_capi_CApi_SQLITE_STATUS_PAGECACHE_OVERFLOW
+#define org_sqlite_jni_capi_CApi_SQLITE_STATUS_PAGECACHE_OVERFLOW 2L
+#undef org_sqlite_jni_capi_CApi_SQLITE_STATUS_MALLOC_SIZE
+#define org_sqlite_jni_capi_CApi_SQLITE_STATUS_MALLOC_SIZE 5L
+#undef org_sqlite_jni_capi_CApi_SQLITE_STATUS_PARSER_STACK
+#define org_sqlite_jni_capi_CApi_SQLITE_STATUS_PARSER_STACK 6L
+#undef org_sqlite_jni_capi_CApi_SQLITE_STATUS_PAGECACHE_SIZE
+#define org_sqlite_jni_capi_CApi_SQLITE_STATUS_PAGECACHE_SIZE 7L
+#undef org_sqlite_jni_capi_CApi_SQLITE_STATUS_MALLOC_COUNT
+#define org_sqlite_jni_capi_CApi_SQLITE_STATUS_MALLOC_COUNT 9L
+#undef org_sqlite_jni_capi_CApi_SQLITE_STMTSTATUS_FULLSCAN_STEP
+#define org_sqlite_jni_capi_CApi_SQLITE_STMTSTATUS_FULLSCAN_STEP 1L
+#undef org_sqlite_jni_capi_CApi_SQLITE_STMTSTATUS_SORT
+#define org_sqlite_jni_capi_CApi_SQLITE_STMTSTATUS_SORT 2L
+#undef org_sqlite_jni_capi_CApi_SQLITE_STMTSTATUS_AUTOINDEX
+#define org_sqlite_jni_capi_CApi_SQLITE_STMTSTATUS_AUTOINDEX 3L
+#undef org_sqlite_jni_capi_CApi_SQLITE_STMTSTATUS_VM_STEP
+#define org_sqlite_jni_capi_CApi_SQLITE_STMTSTATUS_VM_STEP 4L
+#undef org_sqlite_jni_capi_CApi_SQLITE_STMTSTATUS_REPREPARE
+#define org_sqlite_jni_capi_CApi_SQLITE_STMTSTATUS_REPREPARE 5L
+#undef org_sqlite_jni_capi_CApi_SQLITE_STMTSTATUS_RUN
+#define org_sqlite_jni_capi_CApi_SQLITE_STMTSTATUS_RUN 6L
+#undef org_sqlite_jni_capi_CApi_SQLITE_STMTSTATUS_FILTER_MISS
+#define org_sqlite_jni_capi_CApi_SQLITE_STMTSTATUS_FILTER_MISS 7L
+#undef org_sqlite_jni_capi_CApi_SQLITE_STMTSTATUS_FILTER_HIT
+#define org_sqlite_jni_capi_CApi_SQLITE_STMTSTATUS_FILTER_HIT 8L
+#undef org_sqlite_jni_capi_CApi_SQLITE_STMTSTATUS_MEMUSED
+#define org_sqlite_jni_capi_CApi_SQLITE_STMTSTATUS_MEMUSED 99L
+#undef org_sqlite_jni_capi_CApi_SQLITE_SYNC_NORMAL
+#define org_sqlite_jni_capi_CApi_SQLITE_SYNC_NORMAL 2L
+#undef org_sqlite_jni_capi_CApi_SQLITE_SYNC_FULL
+#define org_sqlite_jni_capi_CApi_SQLITE_SYNC_FULL 3L
+#undef org_sqlite_jni_capi_CApi_SQLITE_SYNC_DATAONLY
+#define org_sqlite_jni_capi_CApi_SQLITE_SYNC_DATAONLY 16L
+#undef org_sqlite_jni_capi_CApi_SQLITE_TRACE_STMT
+#define org_sqlite_jni_capi_CApi_SQLITE_TRACE_STMT 1L
+#undef org_sqlite_jni_capi_CApi_SQLITE_TRACE_PROFILE
+#define org_sqlite_jni_capi_CApi_SQLITE_TRACE_PROFILE 2L
+#undef org_sqlite_jni_capi_CApi_SQLITE_TRACE_ROW
+#define org_sqlite_jni_capi_CApi_SQLITE_TRACE_ROW 4L
+#undef org_sqlite_jni_capi_CApi_SQLITE_TRACE_CLOSE
+#define org_sqlite_jni_capi_CApi_SQLITE_TRACE_CLOSE 8L
+#undef org_sqlite_jni_capi_CApi_SQLITE_TXN_NONE
+#define org_sqlite_jni_capi_CApi_SQLITE_TXN_NONE 0L
+#undef org_sqlite_jni_capi_CApi_SQLITE_TXN_READ
+#define org_sqlite_jni_capi_CApi_SQLITE_TXN_READ 1L
+#undef org_sqlite_jni_capi_CApi_SQLITE_TXN_WRITE
+#define org_sqlite_jni_capi_CApi_SQLITE_TXN_WRITE 2L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DETERMINISTIC
+#define org_sqlite_jni_capi_CApi_SQLITE_DETERMINISTIC 2048L
+#undef org_sqlite_jni_capi_CApi_SQLITE_DIRECTONLY
+#define org_sqlite_jni_capi_CApi_SQLITE_DIRECTONLY 524288L
+#undef org_sqlite_jni_capi_CApi_SQLITE_INNOCUOUS
+#define org_sqlite_jni_capi_CApi_SQLITE_INNOCUOUS 2097152L
+#undef org_sqlite_jni_capi_CApi_SQLITE_INDEX_SCAN_UNIQUE
+#define org_sqlite_jni_capi_CApi_SQLITE_INDEX_SCAN_UNIQUE 1L
+#undef org_sqlite_jni_capi_CApi_SQLITE_INDEX_CONSTRAINT_EQ
+#define org_sqlite_jni_capi_CApi_SQLITE_INDEX_CONSTRAINT_EQ 2L
+#undef org_sqlite_jni_capi_CApi_SQLITE_INDEX_CONSTRAINT_GT
+#define org_sqlite_jni_capi_CApi_SQLITE_INDEX_CONSTRAINT_GT 4L
+#undef org_sqlite_jni_capi_CApi_SQLITE_INDEX_CONSTRAINT_LE
+#define org_sqlite_jni_capi_CApi_SQLITE_INDEX_CONSTRAINT_LE 8L
+#undef org_sqlite_jni_capi_CApi_SQLITE_INDEX_CONSTRAINT_LT
+#define org_sqlite_jni_capi_CApi_SQLITE_INDEX_CONSTRAINT_LT 16L
+#undef org_sqlite_jni_capi_CApi_SQLITE_INDEX_CONSTRAINT_GE
+#define org_sqlite_jni_capi_CApi_SQLITE_INDEX_CONSTRAINT_GE 32L
+#undef org_sqlite_jni_capi_CApi_SQLITE_INDEX_CONSTRAINT_MATCH
+#define org_sqlite_jni_capi_CApi_SQLITE_INDEX_CONSTRAINT_MATCH 64L
+#undef org_sqlite_jni_capi_CApi_SQLITE_INDEX_CONSTRAINT_LIKE
+#define org_sqlite_jni_capi_CApi_SQLITE_INDEX_CONSTRAINT_LIKE 65L
+#undef org_sqlite_jni_capi_CApi_SQLITE_INDEX_CONSTRAINT_GLOB
+#define org_sqlite_jni_capi_CApi_SQLITE_INDEX_CONSTRAINT_GLOB 66L
+#undef org_sqlite_jni_capi_CApi_SQLITE_INDEX_CONSTRAINT_REGEXP
+#define org_sqlite_jni_capi_CApi_SQLITE_INDEX_CONSTRAINT_REGEXP 67L
+#undef org_sqlite_jni_capi_CApi_SQLITE_INDEX_CONSTRAINT_NE
+#define org_sqlite_jni_capi_CApi_SQLITE_INDEX_CONSTRAINT_NE 68L
+#undef org_sqlite_jni_capi_CApi_SQLITE_INDEX_CONSTRAINT_ISNOT
+#define org_sqlite_jni_capi_CApi_SQLITE_INDEX_CONSTRAINT_ISNOT 69L
+#undef org_sqlite_jni_capi_CApi_SQLITE_INDEX_CONSTRAINT_ISNOTNULL
+#define org_sqlite_jni_capi_CApi_SQLITE_INDEX_CONSTRAINT_ISNOTNULL 70L
+#undef org_sqlite_jni_capi_CApi_SQLITE_INDEX_CONSTRAINT_ISNULL
+#define org_sqlite_jni_capi_CApi_SQLITE_INDEX_CONSTRAINT_ISNULL 71L
+#undef org_sqlite_jni_capi_CApi_SQLITE_INDEX_CONSTRAINT_IS
+#define org_sqlite_jni_capi_CApi_SQLITE_INDEX_CONSTRAINT_IS 72L
+#undef org_sqlite_jni_capi_CApi_SQLITE_INDEX_CONSTRAINT_LIMIT
+#define org_sqlite_jni_capi_CApi_SQLITE_INDEX_CONSTRAINT_LIMIT 73L
+#undef org_sqlite_jni_capi_CApi_SQLITE_INDEX_CONSTRAINT_OFFSET
+#define org_sqlite_jni_capi_CApi_SQLITE_INDEX_CONSTRAINT_OFFSET 74L
+#undef org_sqlite_jni_capi_CApi_SQLITE_INDEX_CONSTRAINT_FUNCTION
+#define org_sqlite_jni_capi_CApi_SQLITE_INDEX_CONSTRAINT_FUNCTION 150L
+#undef org_sqlite_jni_capi_CApi_SQLITE_VTAB_CONSTRAINT_SUPPORT
+#define org_sqlite_jni_capi_CApi_SQLITE_VTAB_CONSTRAINT_SUPPORT 1L
+#undef org_sqlite_jni_capi_CApi_SQLITE_VTAB_INNOCUOUS
+#define org_sqlite_jni_capi_CApi_SQLITE_VTAB_INNOCUOUS 2L
+#undef org_sqlite_jni_capi_CApi_SQLITE_VTAB_DIRECTONLY
+#define org_sqlite_jni_capi_CApi_SQLITE_VTAB_DIRECTONLY 3L
+#undef org_sqlite_jni_capi_CApi_SQLITE_VTAB_USES_ALL_SCHEMAS
+#define org_sqlite_jni_capi_CApi_SQLITE_VTAB_USES_ALL_SCHEMAS 4L
+#undef org_sqlite_jni_capi_CApi_SQLITE_ROLLBACK
+#define org_sqlite_jni_capi_CApi_SQLITE_ROLLBACK 1L
+#undef org_sqlite_jni_capi_CApi_SQLITE_FAIL
+#define org_sqlite_jni_capi_CApi_SQLITE_FAIL 3L
+#undef org_sqlite_jni_capi_CApi_SQLITE_REPLACE
+#define org_sqlite_jni_capi_CApi_SQLITE_REPLACE 5L
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: init
* Signature: ()V
*/
-JNIEXPORT void JNICALL Java_org_sqlite_jni_CApi_init
+JNIEXPORT void JNICALL Java_org_sqlite_jni_capi_CApi_init
(JNIEnv *, jclass);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_java_uncache_thread
* Signature: ()Z
*/
-JNIEXPORT jboolean JNICALL Java_org_sqlite_jni_CApi_sqlite3_1java_1uncache_1thread
+JNIEXPORT jboolean JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1java_1uncache_1thread
(JNIEnv *, jclass);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_aggregate_context
- * Signature: (Lorg/sqlite/jni/sqlite3_context;Z)J
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_context;Z)J
*/
-JNIEXPORT jlong JNICALL Java_org_sqlite_jni_CApi_sqlite3_1aggregate_1context
+JNIEXPORT jlong JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1aggregate_1context
(JNIEnv *, jclass, jobject, jboolean);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_auto_extension
- * Signature: (Lorg/sqlite/jni/AutoExtensionCallback;)I
+ * Signature: (Lorg/sqlite/jni/capi/AutoExtensionCallback;)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1auto_1extension
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1auto_1extension
(JNIEnv *, jclass, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_backup_finish
* Signature: (J)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1backup_1finish
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1backup_1finish
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_backup_init
- * Signature: (JLjava/lang/String;JLjava/lang/String;)Lorg/sqlite/jni/sqlite3_backup;
+ * Signature: (JLjava/lang/String;JLjava/lang/String;)Lorg/sqlite/jni/capi/sqlite3_backup;
*/
-JNIEXPORT jobject JNICALL Java_org_sqlite_jni_CApi_sqlite3_1backup_1init
+JNIEXPORT jobject JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1backup_1init
(JNIEnv *, jclass, jlong, jstring, jlong, jstring);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_backup_pagecount
* Signature: (J)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1backup_1pagecount
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1backup_1pagecount
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_backup_remaining
* Signature: (J)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1backup_1remaining
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1backup_1remaining
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_backup_step
* Signature: (JI)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1backup_1step
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1backup_1step
(JNIEnv *, jclass, jlong, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_bind_blob
* Signature: (JI[BI)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1bind_1blob
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1bind_1blob
(JNIEnv *, jclass, jlong, jint, jbyteArray, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_bind_double
* Signature: (JID)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1bind_1double
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1bind_1double
(JNIEnv *, jclass, jlong, jint, jdouble);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_bind_int
* Signature: (JII)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1bind_1int
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1bind_1int
(JNIEnv *, jclass, jlong, jint, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_bind_int64
* Signature: (JIJ)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1bind_1int64
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1bind_1int64
(JNIEnv *, jclass, jlong, jint, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_bind_java_object
* Signature: (JILjava/lang/Object;)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1bind_1java_1object
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1bind_1java_1object
(JNIEnv *, jclass, jlong, jint, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_bind_null
* Signature: (JI)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1bind_1null
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1bind_1null
(JNIEnv *, jclass, jlong, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_bind_parameter_count
* Signature: (J)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1bind_1parameter_1count
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1bind_1parameter_1count
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_bind_parameter_index
* Signature: (J[B)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1bind_1parameter_1index
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1bind_1parameter_1index
(JNIEnv *, jclass, jlong, jbyteArray);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_bind_parameter_name
* Signature: (JI)Ljava/lang/String;
*/
-JNIEXPORT jstring JNICALL Java_org_sqlite_jni_CApi_sqlite3_1bind_1parameter_1name
+JNIEXPORT jstring JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1bind_1parameter_1name
(JNIEnv *, jclass, jlong, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_bind_text
* Signature: (JI[BI)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1bind_1text
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1bind_1text
(JNIEnv *, jclass, jlong, jint, jbyteArray, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_bind_text16
* Signature: (JI[BI)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1bind_1text16
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1bind_1text16
(JNIEnv *, jclass, jlong, jint, jbyteArray, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_bind_value
* Signature: (JIJ)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1bind_1value
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1bind_1value
(JNIEnv *, jclass, jlong, jint, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_bind_zeroblob
* Signature: (JII)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1bind_1zeroblob
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1bind_1zeroblob
(JNIEnv *, jclass, jlong, jint, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_bind_zeroblob64
* Signature: (JIJ)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1bind_1zeroblob64
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1bind_1zeroblob64
(JNIEnv *, jclass, jlong, jint, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_blob_bytes
* Signature: (J)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1blob_1bytes
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1blob_1bytes
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_blob_close
* Signature: (J)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1blob_1close
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1blob_1close
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_blob_open
- * Signature: (JLjava/lang/String;Ljava/lang/String;Ljava/lang/String;JILorg/sqlite/jni/OutputPointer/sqlite3_blob;)I
+ * Signature: (JLjava/lang/String;Ljava/lang/String;Ljava/lang/String;JILorg/sqlite/jni/capi/OutputPointer/sqlite3_blob;)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1blob_1open
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1blob_1open
(JNIEnv *, jclass, jlong, jstring, jstring, jstring, jlong, jint, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_blob_read
* Signature: (J[BI)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1blob_1read
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1blob_1read
(JNIEnv *, jclass, jlong, jbyteArray, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_blob_reopen
* Signature: (JJ)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1blob_1reopen
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1blob_1reopen
(JNIEnv *, jclass, jlong, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_blob_write
* Signature: (J[BI)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1blob_1write
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1blob_1write
(JNIEnv *, jclass, jlong, jbyteArray, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_busy_handler
- * Signature: (JLorg/sqlite/jni/BusyHandlerCallback;)I
+ * Signature: (JLorg/sqlite/jni/capi/BusyHandlerCallback;)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1busy_1handler
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1busy_1handler
(JNIEnv *, jclass, jlong, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_busy_timeout
* Signature: (JI)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1busy_1timeout
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1busy_1timeout
(JNIEnv *, jclass, jlong, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_cancel_auto_extension
- * Signature: (Lorg/sqlite/jni/AutoExtensionCallback;)Z
+ * Signature: (Lorg/sqlite/jni/capi/AutoExtensionCallback;)Z
*/
-JNIEXPORT jboolean JNICALL Java_org_sqlite_jni_CApi_sqlite3_1cancel_1auto_1extension
+JNIEXPORT jboolean JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1cancel_1auto_1extension
(JNIEnv *, jclass, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_changes
* Signature: (J)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1changes
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1changes
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_changes64
* Signature: (J)J
*/
-JNIEXPORT jlong JNICALL Java_org_sqlite_jni_CApi_sqlite3_1changes64
+JNIEXPORT jlong JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1changes64
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_clear_bindings
* Signature: (J)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1clear_1bindings
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1clear_1bindings
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_close
* Signature: (J)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1close
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1close
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_close_v2
* Signature: (J)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1close_1v2
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1close_1v2
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_column_blob
- * Signature: (Lorg/sqlite/jni/sqlite3_stmt;I)[B
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_stmt;I)[B
*/
-JNIEXPORT jbyteArray JNICALL Java_org_sqlite_jni_CApi_sqlite3_1column_1blob
+JNIEXPORT jbyteArray JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1column_1blob
(JNIEnv *, jclass, jobject, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_column_bytes
* Signature: (JI)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1column_1bytes
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1column_1bytes
(JNIEnv *, jclass, jlong, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_column_bytes16
* Signature: (JI)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1column_1bytes16
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1column_1bytes16
(JNIEnv *, jclass, jlong, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_column_count
* Signature: (J)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1column_1count
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1column_1count
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_column_decltype
* Signature: (JI)Ljava/lang/String;
*/
-JNIEXPORT jstring JNICALL Java_org_sqlite_jni_CApi_sqlite3_1column_1decltype
+JNIEXPORT jstring JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1column_1decltype
(JNIEnv *, jclass, jlong, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_column_double
- * Signature: (Lorg/sqlite/jni/sqlite3_stmt;I)D
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_stmt;I)D
*/
-JNIEXPORT jdouble JNICALL Java_org_sqlite_jni_CApi_sqlite3_1column_1double
+JNIEXPORT jdouble JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1column_1double
(JNIEnv *, jclass, jobject, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_column_int
- * Signature: (Lorg/sqlite/jni/sqlite3_stmt;I)I
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_stmt;I)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1column_1int
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1column_1int
(JNIEnv *, jclass, jobject, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_column_int64
- * Signature: (Lorg/sqlite/jni/sqlite3_stmt;I)J
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_stmt;I)J
*/
-JNIEXPORT jlong JNICALL Java_org_sqlite_jni_CApi_sqlite3_1column_1int64
+JNIEXPORT jlong JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1column_1int64
(JNIEnv *, jclass, jobject, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_column_name
* Signature: (JI)Ljava/lang/String;
*/
-JNIEXPORT jstring JNICALL Java_org_sqlite_jni_CApi_sqlite3_1column_1name
+JNIEXPORT jstring JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1column_1name
(JNIEnv *, jclass, jlong, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_column_database_name
* Signature: (JI)Ljava/lang/String;
*/
-JNIEXPORT jstring JNICALL Java_org_sqlite_jni_CApi_sqlite3_1column_1database_1name
+JNIEXPORT jstring JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1column_1database_1name
(JNIEnv *, jclass, jlong, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_column_origin_name
* Signature: (JI)Ljava/lang/String;
*/
-JNIEXPORT jstring JNICALL Java_org_sqlite_jni_CApi_sqlite3_1column_1origin_1name
+JNIEXPORT jstring JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1column_1origin_1name
(JNIEnv *, jclass, jlong, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_column_table_name
* Signature: (JI)Ljava/lang/String;
*/
-JNIEXPORT jstring JNICALL Java_org_sqlite_jni_CApi_sqlite3_1column_1table_1name
+JNIEXPORT jstring JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1column_1table_1name
(JNIEnv *, jclass, jlong, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_column_text
- * Signature: (Lorg/sqlite/jni/sqlite3_stmt;I)[B
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_stmt;I)[B
*/
-JNIEXPORT jbyteArray JNICALL Java_org_sqlite_jni_CApi_sqlite3_1column_1text
+JNIEXPORT jbyteArray JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1column_1text
(JNIEnv *, jclass, jobject, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_column_text16
- * Signature: (Lorg/sqlite/jni/sqlite3_stmt;I)Ljava/lang/String;
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_stmt;I)Ljava/lang/String;
*/
-JNIEXPORT jstring JNICALL Java_org_sqlite_jni_CApi_sqlite3_1column_1text16
+JNIEXPORT jstring JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1column_1text16
(JNIEnv *, jclass, jobject, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_column_type
* Signature: (JI)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1column_1type
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1column_1type
(JNIEnv *, jclass, jlong, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_column_value
- * Signature: (Lorg/sqlite/jni/sqlite3_stmt;I)Lorg/sqlite/jni/sqlite3_value;
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_stmt;I)Lorg/sqlite/jni/capi/sqlite3_value;
*/
-JNIEXPORT jobject JNICALL Java_org_sqlite_jni_CApi_sqlite3_1column_1value
+JNIEXPORT jobject JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1column_1value
(JNIEnv *, jclass, jobject, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_collation_needed
- * Signature: (JLorg/sqlite/jni/CollationNeededCallback;)I
+ * Signature: (JLorg/sqlite/jni/capi/CollationNeededCallback;)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1collation_1needed
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1collation_1needed
(JNIEnv *, jclass, jlong, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_commit_hook
- * Signature: (JLorg/sqlite/jni/CommitHookCallback;)Lorg/sqlite/jni/CommitHookCallback;
+ * Signature: (JLorg/sqlite/jni/capi/CommitHookCallback;)Lorg/sqlite/jni/capi/CommitHookCallback;
*/
-JNIEXPORT jobject JNICALL Java_org_sqlite_jni_CApi_sqlite3_1commit_1hook
+JNIEXPORT jobject JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1commit_1hook
(JNIEnv *, jclass, jlong, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_compileoption_get
* Signature: (I)Ljava/lang/String;
*/
-JNIEXPORT jstring JNICALL Java_org_sqlite_jni_CApi_sqlite3_1compileoption_1get
+JNIEXPORT jstring JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1compileoption_1get
(JNIEnv *, jclass, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_compileoption_used
* Signature: (Ljava/lang/String;)Z
*/
-JNIEXPORT jboolean JNICALL Java_org_sqlite_jni_CApi_sqlite3_1compileoption_1used
+JNIEXPORT jboolean JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1compileoption_1used
(JNIEnv *, jclass, jstring);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_complete
* Signature: ([B)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1complete
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1complete
(JNIEnv *, jclass, jbyteArray);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_config
* Signature: (I)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1config__I
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1config__I
(JNIEnv *, jclass, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_config
- * Signature: (Lorg/sqlite/jni/ConfigSqllogCallback;)I
+ * Signature: (Lorg/sqlite/jni/capi/ConfigSqllogCallback;)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1config__Lorg_sqlite_jni_ConfigSqllogCallback_2
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1config__Lorg_sqlite_jni_capi_ConfigSqllogCallback_2
(JNIEnv *, jclass, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_config
- * Signature: (Lorg/sqlite/jni/ConfigLogCallback;)I
+ * Signature: (Lorg/sqlite/jni/capi/ConfigLogCallback;)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1config__Lorg_sqlite_jni_ConfigLogCallback_2
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1config__Lorg_sqlite_jni_capi_ConfigLogCallback_2
(JNIEnv *, jclass, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_context_db_handle
- * Signature: (Lorg/sqlite/jni/sqlite3_context;)Lorg/sqlite/jni/sqlite3;
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_context;)Lorg/sqlite/jni/capi/sqlite3;
*/
-JNIEXPORT jobject JNICALL Java_org_sqlite_jni_CApi_sqlite3_1context_1db_1handle
+JNIEXPORT jobject JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1context_1db_1handle
(JNIEnv *, jclass, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_create_collation
- * Signature: (Lorg/sqlite/jni/sqlite3;Ljava/lang/String;ILorg/sqlite/jni/CollationCallback;)I
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3;Ljava/lang/String;ILorg/sqlite/jni/capi/CollationCallback;)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1create_1collation
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1create_1collation
(JNIEnv *, jclass, jobject, jstring, jint, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_create_function
- * Signature: (Lorg/sqlite/jni/sqlite3;Ljava/lang/String;IILorg/sqlite/jni/SQLFunction;)I
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3;Ljava/lang/String;IILorg/sqlite/jni/capi/SQLFunction;)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1create_1function
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1create_1function
(JNIEnv *, jclass, jobject, jstring, jint, jint, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_data_count
* Signature: (J)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1data_1count
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1data_1count
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_db_config
- * Signature: (Lorg/sqlite/jni/sqlite3;IILorg/sqlite/jni/OutputPointer/Int32;)I
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3;IILorg/sqlite/jni/capi/OutputPointer/Int32;)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1db_1config__Lorg_sqlite_jni_sqlite3_2IILorg_sqlite_jni_OutputPointer_Int32_2
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1db_1config__Lorg_sqlite_jni_capi_sqlite3_2IILorg_sqlite_jni_capi_OutputPointer_Int32_2
(JNIEnv *, jclass, jobject, jint, jint, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_db_config
- * Signature: (Lorg/sqlite/jni/sqlite3;ILjava/lang/String;)I
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3;ILjava/lang/String;)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1db_1config__Lorg_sqlite_jni_sqlite3_2ILjava_lang_String_2
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1db_1config__Lorg_sqlite_jni_capi_sqlite3_2ILjava_lang_String_2
(JNIEnv *, jclass, jobject, jint, jstring);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_db_name
* Signature: (JI)Ljava/lang/String;
*/
-JNIEXPORT jstring JNICALL Java_org_sqlite_jni_CApi_sqlite3_1db_1name
+JNIEXPORT jstring JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1db_1name
(JNIEnv *, jclass, jlong, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_db_filename
- * Signature: (Lorg/sqlite/jni/sqlite3;Ljava/lang/String;)Ljava/lang/String;
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3;Ljava/lang/String;)Ljava/lang/String;
*/
-JNIEXPORT jstring JNICALL Java_org_sqlite_jni_CApi_sqlite3_1db_1filename
+JNIEXPORT jstring JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1db_1filename
(JNIEnv *, jclass, jobject, jstring);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_db_handle
- * Signature: (Lorg/sqlite/jni/sqlite3_stmt;)Lorg/sqlite/jni/sqlite3;
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_stmt;)Lorg/sqlite/jni/capi/sqlite3;
*/
-JNIEXPORT jobject JNICALL Java_org_sqlite_jni_CApi_sqlite3_1db_1handle
+JNIEXPORT jobject JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1db_1handle
(JNIEnv *, jclass, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_db_readonly
- * Signature: (Lorg/sqlite/jni/sqlite3;Ljava/lang/String;)I
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3;Ljava/lang/String;)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1db_1readonly
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1db_1readonly
(JNIEnv *, jclass, jobject, jstring);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_db_release_memory
- * Signature: (Lorg/sqlite/jni/sqlite3;)I
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3;)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1db_1release_1memory
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1db_1release_1memory
(JNIEnv *, jclass, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_db_status
- * Signature: (Lorg/sqlite/jni/sqlite3;ILorg/sqlite/jni/OutputPointer/Int32;Lorg/sqlite/jni/OutputPointer/Int32;Z)I
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3;ILorg/sqlite/jni/capi/OutputPointer/Int32;Lorg/sqlite/jni/capi/OutputPointer/Int32;Z)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1db_1status
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1db_1status
(JNIEnv *, jclass, jobject, jint, jobject, jobject, jboolean);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_errcode
- * Signature: (Lorg/sqlite/jni/sqlite3;)I
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3;)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1errcode
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1errcode
(JNIEnv *, jclass, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_errmsg
- * Signature: (Lorg/sqlite/jni/sqlite3;)Ljava/lang/String;
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3;)Ljava/lang/String;
*/
-JNIEXPORT jstring JNICALL Java_org_sqlite_jni_CApi_sqlite3_1errmsg
+JNIEXPORT jstring JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1errmsg
(JNIEnv *, jclass, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_error_offset
* Signature: (J)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1error_1offset
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1error_1offset
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_errstr
* Signature: (I)Ljava/lang/String;
*/
-JNIEXPORT jstring JNICALL Java_org_sqlite_jni_CApi_sqlite3_1errstr
+JNIEXPORT jstring JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1errstr
(JNIEnv *, jclass, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_expanded_sql
- * Signature: (Lorg/sqlite/jni/sqlite3_stmt;)Ljava/lang/String;
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_stmt;)Ljava/lang/String;
*/
-JNIEXPORT jstring JNICALL Java_org_sqlite_jni_CApi_sqlite3_1expanded_1sql
+JNIEXPORT jstring JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1expanded_1sql
(JNIEnv *, jclass, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_extended_errcode
* Signature: (J)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1extended_1errcode
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1extended_1errcode
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_extended_result_codes
- * Signature: (Lorg/sqlite/jni/sqlite3;Z)Z
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3;Z)Z
*/
-JNIEXPORT jboolean JNICALL Java_org_sqlite_jni_CApi_sqlite3_1extended_1result_1codes
+JNIEXPORT jboolean JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1extended_1result_1codes
(JNIEnv *, jclass, jobject, jboolean);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_get_autocommit
* Signature: (J)Z
*/
-JNIEXPORT jboolean JNICALL Java_org_sqlite_jni_CApi_sqlite3_1get_1autocommit
+JNIEXPORT jboolean JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1get_1autocommit
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_get_auxdata
- * Signature: (Lorg/sqlite/jni/sqlite3_context;I)Ljava/lang/Object;
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_context;I)Ljava/lang/Object;
*/
-JNIEXPORT jobject JNICALL Java_org_sqlite_jni_CApi_sqlite3_1get_1auxdata
+JNIEXPORT jobject JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1get_1auxdata
(JNIEnv *, jclass, jobject, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_finalize
* Signature: (J)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1finalize
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1finalize
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_initialize
* Signature: ()I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1initialize
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1initialize
(JNIEnv *, jclass);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_interrupt
- * Signature: (Lorg/sqlite/jni/sqlite3;)V
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3;)V
*/
-JNIEXPORT void JNICALL Java_org_sqlite_jni_CApi_sqlite3_1interrupt
+JNIEXPORT void JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1interrupt
(JNIEnv *, jclass, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_is_interrupted
- * Signature: (Lorg/sqlite/jni/sqlite3;)Z
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3;)Z
*/
-JNIEXPORT jboolean JNICALL Java_org_sqlite_jni_CApi_sqlite3_1is_1interrupted
+JNIEXPORT jboolean JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1is_1interrupted
(JNIEnv *, jclass, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_keyword_check
* Signature: (Ljava/lang/String;)Z
*/
-JNIEXPORT jboolean JNICALL Java_org_sqlite_jni_CApi_sqlite3_1keyword_1check
+JNIEXPORT jboolean JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1keyword_1check
(JNIEnv *, jclass, jstring);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_keyword_count
* Signature: ()I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1keyword_1count
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1keyword_1count
(JNIEnv *, jclass);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_keyword_name
* Signature: (I)Ljava/lang/String;
*/
-JNIEXPORT jstring JNICALL Java_org_sqlite_jni_CApi_sqlite3_1keyword_1name
+JNIEXPORT jstring JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1keyword_1name
(JNIEnv *, jclass, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_last_insert_rowid
- * Signature: (Lorg/sqlite/jni/sqlite3;)J
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3;)J
*/
-JNIEXPORT jlong JNICALL Java_org_sqlite_jni_CApi_sqlite3_1last_1insert_1rowid
+JNIEXPORT jlong JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1last_1insert_1rowid
(JNIEnv *, jclass, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_libversion
* Signature: ()Ljava/lang/String;
*/
-JNIEXPORT jstring JNICALL Java_org_sqlite_jni_CApi_sqlite3_1libversion
+JNIEXPORT jstring JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1libversion
(JNIEnv *, jclass);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_libversion_number
* Signature: ()I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1libversion_1number
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1libversion_1number
(JNIEnv *, jclass);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_limit
- * Signature: (Lorg/sqlite/jni/sqlite3;II)I
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3;II)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1limit
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1limit
(JNIEnv *, jclass, jobject, jint, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_normalized_sql
- * Signature: (Lorg/sqlite/jni/sqlite3_stmt;)Ljava/lang/String;
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_stmt;)Ljava/lang/String;
*/
-JNIEXPORT jstring JNICALL Java_org_sqlite_jni_CApi_sqlite3_1normalized_1sql
+JNIEXPORT jstring JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1normalized_1sql
(JNIEnv *, jclass, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_open
- * Signature: (Ljava/lang/String;Lorg/sqlite/jni/OutputPointer/sqlite3;)I
+ * Signature: (Ljava/lang/String;Lorg/sqlite/jni/capi/OutputPointer/sqlite3;)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1open
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1open
(JNIEnv *, jclass, jstring, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_open_v2
- * Signature: (Ljava/lang/String;Lorg/sqlite/jni/OutputPointer/sqlite3;ILjava/lang/String;)I
+ * Signature: (Ljava/lang/String;Lorg/sqlite/jni/capi/OutputPointer/sqlite3;ILjava/lang/String;)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1open_1v2
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1open_1v2
(JNIEnv *, jclass, jstring, jobject, jint, jstring);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_prepare
- * Signature: (J[BILorg/sqlite/jni/OutputPointer/sqlite3_stmt;Lorg/sqlite/jni/OutputPointer/Int32;)I
+ * Signature: (J[BILorg/sqlite/jni/capi/OutputPointer/sqlite3_stmt;Lorg/sqlite/jni/capi/OutputPointer/Int32;)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1prepare
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1prepare
(JNIEnv *, jclass, jlong, jbyteArray, jint, jobject, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_prepare_v2
- * Signature: (J[BILorg/sqlite/jni/OutputPointer/sqlite3_stmt;Lorg/sqlite/jni/OutputPointer/Int32;)I
+ * Signature: (J[BILorg/sqlite/jni/capi/OutputPointer/sqlite3_stmt;Lorg/sqlite/jni/capi/OutputPointer/Int32;)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1prepare_1v2
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1prepare_1v2
(JNIEnv *, jclass, jlong, jbyteArray, jint, jobject, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_prepare_v3
- * Signature: (J[BIILorg/sqlite/jni/OutputPointer/sqlite3_stmt;Lorg/sqlite/jni/OutputPointer/Int32;)I
+ * Signature: (J[BIILorg/sqlite/jni/capi/OutputPointer/sqlite3_stmt;Lorg/sqlite/jni/capi/OutputPointer/Int32;)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1prepare_1v3
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1prepare_1v3
(JNIEnv *, jclass, jlong, jbyteArray, jint, jint, jobject, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_preupdate_blobwrite
* Signature: (J)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1preupdate_1blobwrite
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1preupdate_1blobwrite
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_preupdate_count
* Signature: (J)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1preupdate_1count
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1preupdate_1count
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_preupdate_depth
* Signature: (J)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1preupdate_1depth
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1preupdate_1depth
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_preupdate_hook
- * Signature: (JLorg/sqlite/jni/PreupdateHookCallback;)Lorg/sqlite/jni/PreupdateHookCallback;
+ * Signature: (JLorg/sqlite/jni/capi/PreupdateHookCallback;)Lorg/sqlite/jni/capi/PreupdateHookCallback;
*/
-JNIEXPORT jobject JNICALL Java_org_sqlite_jni_CApi_sqlite3_1preupdate_1hook
+JNIEXPORT jobject JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1preupdate_1hook
(JNIEnv *, jclass, jlong, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_preupdate_new
- * Signature: (JILorg/sqlite/jni/OutputPointer/sqlite3_value;)I
+ * Signature: (JILorg/sqlite/jni/capi/OutputPointer/sqlite3_value;)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1preupdate_1new
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1preupdate_1new
(JNIEnv *, jclass, jlong, jint, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_preupdate_old
- * Signature: (JILorg/sqlite/jni/OutputPointer/sqlite3_value;)I
+ * Signature: (JILorg/sqlite/jni/capi/OutputPointer/sqlite3_value;)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1preupdate_1old
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1preupdate_1old
(JNIEnv *, jclass, jlong, jint, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_progress_handler
- * Signature: (Lorg/sqlite/jni/sqlite3;ILorg/sqlite/jni/ProgressHandlerCallback;)V
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3;ILorg/sqlite/jni/capi/ProgressHandlerCallback;)V
*/
-JNIEXPORT void JNICALL Java_org_sqlite_jni_CApi_sqlite3_1progress_1handler
+JNIEXPORT void JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1progress_1handler
(JNIEnv *, jclass, jobject, jint, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_randomness
* Signature: ([B)V
*/
-JNIEXPORT void JNICALL Java_org_sqlite_jni_CApi_sqlite3_1randomness
+JNIEXPORT void JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1randomness
(JNIEnv *, jclass, jbyteArray);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_release_memory
* Signature: (I)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1release_1memory
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1release_1memory
(JNIEnv *, jclass, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_reset
- * Signature: (Lorg/sqlite/jni/sqlite3_stmt;)I
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_stmt;)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1reset
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1reset
(JNIEnv *, jclass, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_reset_auto_extension
* Signature: ()V
*/
-JNIEXPORT void JNICALL Java_org_sqlite_jni_CApi_sqlite3_1reset_1auto_1extension
+JNIEXPORT void JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1reset_1auto_1extension
(JNIEnv *, jclass);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_result_double
- * Signature: (Lorg/sqlite/jni/sqlite3_context;D)V
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_context;D)V
*/
-JNIEXPORT void JNICALL Java_org_sqlite_jni_CApi_sqlite3_1result_1double
+JNIEXPORT void JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1result_1double
(JNIEnv *, jclass, jobject, jdouble);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_result_error
- * Signature: (Lorg/sqlite/jni/sqlite3_context;[BI)V
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_context;[BI)V
*/
-JNIEXPORT void JNICALL Java_org_sqlite_jni_CApi_sqlite3_1result_1error
+JNIEXPORT void JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1result_1error
(JNIEnv *, jclass, jobject, jbyteArray, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_result_error_toobig
- * Signature: (Lorg/sqlite/jni/sqlite3_context;)V
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_context;)V
*/
-JNIEXPORT void JNICALL Java_org_sqlite_jni_CApi_sqlite3_1result_1error_1toobig
+JNIEXPORT void JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1result_1error_1toobig
(JNIEnv *, jclass, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_result_error_nomem
- * Signature: (Lorg/sqlite/jni/sqlite3_context;)V
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_context;)V
*/
-JNIEXPORT void JNICALL Java_org_sqlite_jni_CApi_sqlite3_1result_1error_1nomem
+JNIEXPORT void JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1result_1error_1nomem
(JNIEnv *, jclass, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_result_error_code
- * Signature: (Lorg/sqlite/jni/sqlite3_context;I)V
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_context;I)V
*/
-JNIEXPORT void JNICALL Java_org_sqlite_jni_CApi_sqlite3_1result_1error_1code
+JNIEXPORT void JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1result_1error_1code
(JNIEnv *, jclass, jobject, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_result_null
- * Signature: (Lorg/sqlite/jni/sqlite3_context;)V
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_context;)V
*/
-JNIEXPORT void JNICALL Java_org_sqlite_jni_CApi_sqlite3_1result_1null
+JNIEXPORT void JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1result_1null
(JNIEnv *, jclass, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_result_int
- * Signature: (Lorg/sqlite/jni/sqlite3_context;I)V
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_context;I)V
*/
-JNIEXPORT void JNICALL Java_org_sqlite_jni_CApi_sqlite3_1result_1int
+JNIEXPORT void JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1result_1int
(JNIEnv *, jclass, jobject, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_result_int64
- * Signature: (Lorg/sqlite/jni/sqlite3_context;J)V
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_context;J)V
*/
-JNIEXPORT void JNICALL Java_org_sqlite_jni_CApi_sqlite3_1result_1int64
+JNIEXPORT void JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1result_1int64
(JNIEnv *, jclass, jobject, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_result_java_object
- * Signature: (Lorg/sqlite/jni/sqlite3_context;Ljava/lang/Object;)V
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_context;Ljava/lang/Object;)V
*/
-JNIEXPORT void JNICALL Java_org_sqlite_jni_CApi_sqlite3_1result_1java_1object
+JNIEXPORT void JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1result_1java_1object
(JNIEnv *, jclass, jobject, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_result_value
- * Signature: (Lorg/sqlite/jni/sqlite3_context;Lorg/sqlite/jni/sqlite3_value;)V
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_context;Lorg/sqlite/jni/capi/sqlite3_value;)V
*/
-JNIEXPORT void JNICALL Java_org_sqlite_jni_CApi_sqlite3_1result_1value
+JNIEXPORT void JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1result_1value
(JNIEnv *, jclass, jobject, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_result_zeroblob
- * Signature: (Lorg/sqlite/jni/sqlite3_context;I)V
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_context;I)V
*/
-JNIEXPORT void JNICALL Java_org_sqlite_jni_CApi_sqlite3_1result_1zeroblob
+JNIEXPORT void JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1result_1zeroblob
(JNIEnv *, jclass, jobject, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_result_zeroblob64
- * Signature: (Lorg/sqlite/jni/sqlite3_context;J)I
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_context;J)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1result_1zeroblob64
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1result_1zeroblob64
(JNIEnv *, jclass, jobject, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_result_blob
- * Signature: (Lorg/sqlite/jni/sqlite3_context;[BI)V
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_context;[BI)V
*/
-JNIEXPORT void JNICALL Java_org_sqlite_jni_CApi_sqlite3_1result_1blob
+JNIEXPORT void JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1result_1blob
(JNIEnv *, jclass, jobject, jbyteArray, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_result_blob64
- * Signature: (Lorg/sqlite/jni/sqlite3_context;[BJ)V
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_context;[BJ)V
*/
-JNIEXPORT void JNICALL Java_org_sqlite_jni_CApi_sqlite3_1result_1blob64
+JNIEXPORT void JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1result_1blob64
(JNIEnv *, jclass, jobject, jbyteArray, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_result_text
- * Signature: (Lorg/sqlite/jni/sqlite3_context;[BI)V
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_context;[BI)V
*/
-JNIEXPORT void JNICALL Java_org_sqlite_jni_CApi_sqlite3_1result_1text
+JNIEXPORT void JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1result_1text
(JNIEnv *, jclass, jobject, jbyteArray, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_result_text64
- * Signature: (Lorg/sqlite/jni/sqlite3_context;[BJI)V
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_context;[BJI)V
*/
-JNIEXPORT void JNICALL Java_org_sqlite_jni_CApi_sqlite3_1result_1text64
+JNIEXPORT void JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1result_1text64
(JNIEnv *, jclass, jobject, jbyteArray, jlong, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_rollback_hook
- * Signature: (JLorg/sqlite/jni/RollbackHookCallback;)Lorg/sqlite/jni/RollbackHookCallback;
+ * Signature: (JLorg/sqlite/jni/capi/RollbackHookCallback;)Lorg/sqlite/jni/capi/RollbackHookCallback;
*/
-JNIEXPORT jobject JNICALL Java_org_sqlite_jni_CApi_sqlite3_1rollback_1hook
+JNIEXPORT jobject JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1rollback_1hook
(JNIEnv *, jclass, jlong, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_set_authorizer
- * Signature: (Lorg/sqlite/jni/sqlite3;Lorg/sqlite/jni/AuthorizerCallback;)I
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3;Lorg/sqlite/jni/capi/AuthorizerCallback;)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1set_1authorizer
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1set_1authorizer
(JNIEnv *, jclass, jobject, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_set_auxdata
- * Signature: (Lorg/sqlite/jni/sqlite3_context;ILjava/lang/Object;)V
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_context;ILjava/lang/Object;)V
*/
-JNIEXPORT void JNICALL Java_org_sqlite_jni_CApi_sqlite3_1set_1auxdata
+JNIEXPORT void JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1set_1auxdata
(JNIEnv *, jclass, jobject, jint, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_set_last_insert_rowid
- * Signature: (Lorg/sqlite/jni/sqlite3;J)V
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3;J)V
*/
-JNIEXPORT void JNICALL Java_org_sqlite_jni_CApi_sqlite3_1set_1last_1insert_1rowid
+JNIEXPORT void JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1set_1last_1insert_1rowid
(JNIEnv *, jclass, jobject, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_shutdown
* Signature: ()I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1shutdown
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1shutdown
(JNIEnv *, jclass);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_sleep
* Signature: (I)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1sleep
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1sleep
(JNIEnv *, jclass, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_sourceid
* Signature: ()Ljava/lang/String;
*/
-JNIEXPORT jstring JNICALL Java_org_sqlite_jni_CApi_sqlite3_1sourceid
+JNIEXPORT jstring JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1sourceid
(JNIEnv *, jclass);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_sql
- * Signature: (Lorg/sqlite/jni/sqlite3_stmt;)Ljava/lang/String;
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_stmt;)Ljava/lang/String;
*/
-JNIEXPORT jstring JNICALL Java_org_sqlite_jni_CApi_sqlite3_1sql
+JNIEXPORT jstring JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1sql
(JNIEnv *, jclass, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_status
- * Signature: (ILorg/sqlite/jni/OutputPointer/Int32;Lorg/sqlite/jni/OutputPointer/Int32;Z)I
+ * Signature: (ILorg/sqlite/jni/capi/OutputPointer/Int32;Lorg/sqlite/jni/capi/OutputPointer/Int32;Z)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1status
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1status
(JNIEnv *, jclass, jint, jobject, jobject, jboolean);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_status64
- * Signature: (ILorg/sqlite/jni/OutputPointer/Int64;Lorg/sqlite/jni/OutputPointer/Int64;Z)I
+ * Signature: (ILorg/sqlite/jni/capi/OutputPointer/Int64;Lorg/sqlite/jni/capi/OutputPointer/Int64;Z)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1status64
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1status64
(JNIEnv *, jclass, jint, jobject, jobject, jboolean);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_step
- * Signature: (Lorg/sqlite/jni/sqlite3_stmt;)I
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_stmt;)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1step
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1step
(JNIEnv *, jclass, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_stmt_busy
- * Signature: (Lorg/sqlite/jni/sqlite3_stmt;)Z
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_stmt;)Z
*/
-JNIEXPORT jboolean JNICALL Java_org_sqlite_jni_CApi_sqlite3_1stmt_1busy
+JNIEXPORT jboolean JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1stmt_1busy
(JNIEnv *, jclass, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_stmt_explain
* Signature: (JI)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1stmt_1explain
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1stmt_1explain
(JNIEnv *, jclass, jlong, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_stmt_isexplain
* Signature: (J)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1stmt_1isexplain
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1stmt_1isexplain
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_stmt_readonly
- * Signature: (Lorg/sqlite/jni/sqlite3_stmt;)Z
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_stmt;)Z
*/
-JNIEXPORT jboolean JNICALL Java_org_sqlite_jni_CApi_sqlite3_1stmt_1readonly
+JNIEXPORT jboolean JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1stmt_1readonly
(JNIEnv *, jclass, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_stmt_status
- * Signature: (Lorg/sqlite/jni/sqlite3_stmt;IZ)I
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3_stmt;IZ)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1stmt_1status
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1stmt_1status
(JNIEnv *, jclass, jobject, jint, jboolean);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_strglob
* Signature: ([B[B)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1strglob
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1strglob
(JNIEnv *, jclass, jbyteArray, jbyteArray);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_strlike
* Signature: ([B[BI)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1strlike
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1strlike
(JNIEnv *, jclass, jbyteArray, jbyteArray, jint);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_system_errno
* Signature: (J)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1system_1errno
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1system_1errno
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_table_column_metadata
- * Signature: (Lorg/sqlite/jni/sqlite3;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/sqlite/jni/OutputPointer/String;Lorg/sqlite/jni/OutputPointer/String;Lorg/sqlite/jni/OutputPointer/Bool;Lorg/sqlite/jni/OutputPointer/Bool;Lorg/sqlite/jni/OutputPointer/Bool;)I
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/sqlite/jni/capi/OutputPointer/String;Lorg/sqlite/jni/capi/OutputPointer/String;Lorg/sqlite/jni/capi/OutputPointer/Bool;Lorg/sqlite/jni/capi/OutputPointer/Bool;Lorg/sqlite/jni/capi/OutputPointer/Bool;)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1table_1column_1metadata
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1table_1column_1metadata
(JNIEnv *, jclass, jobject, jstring, jstring, jstring, jobject, jobject, jobject, jobject, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_threadsafe
* Signature: ()I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1threadsafe
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1threadsafe
(JNIEnv *, jclass);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_total_changes
* Signature: (J)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1total_1changes
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1total_1changes
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_total_changes64
* Signature: (J)J
*/
-JNIEXPORT jlong JNICALL Java_org_sqlite_jni_CApi_sqlite3_1total_1changes64
+JNIEXPORT jlong JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1total_1changes64
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_trace_v2
- * Signature: (Lorg/sqlite/jni/sqlite3;ILorg/sqlite/jni/TraceV2Callback;)I
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3;ILorg/sqlite/jni/capi/TraceV2Callback;)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1trace_1v2
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1trace_1v2
(JNIEnv *, jclass, jobject, jint, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_txn_state
- * Signature: (Lorg/sqlite/jni/sqlite3;Ljava/lang/String;)I
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3;Ljava/lang/String;)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1txn_1state
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1txn_1state
(JNIEnv *, jclass, jobject, jstring);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_update_hook
- * Signature: (JLorg/sqlite/jni/UpdateHookCallback;)Lorg/sqlite/jni/UpdateHookCallback;
+ * Signature: (JLorg/sqlite/jni/capi/UpdateHookCallback;)Lorg/sqlite/jni/capi/UpdateHookCallback;
*/
-JNIEXPORT jobject JNICALL Java_org_sqlite_jni_CApi_sqlite3_1update_1hook
+JNIEXPORT jobject JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1update_1hook
(JNIEnv *, jclass, jlong, jobject);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_value_blob
* Signature: (J)[B
*/
-JNIEXPORT jbyteArray JNICALL Java_org_sqlite_jni_CApi_sqlite3_1value_1blob
+JNIEXPORT jbyteArray JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1value_1blob
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_value_bytes
* Signature: (J)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1value_1bytes
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1value_1bytes
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_value_bytes16
* Signature: (J)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1value_1bytes16
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1value_1bytes16
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_value_double
* Signature: (J)D
*/
-JNIEXPORT jdouble JNICALL Java_org_sqlite_jni_CApi_sqlite3_1value_1double
+JNIEXPORT jdouble JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1value_1double
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_value_dup
- * Signature: (J)Lorg/sqlite/jni/sqlite3_value;
+ * Signature: (J)Lorg/sqlite/jni/capi/sqlite3_value;
*/
-JNIEXPORT jobject JNICALL Java_org_sqlite_jni_CApi_sqlite3_1value_1dup
+JNIEXPORT jobject JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1value_1dup
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_value_encoding
* Signature: (J)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1value_1encoding
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1value_1encoding
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_value_free
* Signature: (J)V
*/
-JNIEXPORT void JNICALL Java_org_sqlite_jni_CApi_sqlite3_1value_1free
+JNIEXPORT void JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1value_1free
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_value_frombind
* Signature: (J)Z
*/
-JNIEXPORT jboolean JNICALL Java_org_sqlite_jni_CApi_sqlite3_1value_1frombind
+JNIEXPORT jboolean JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1value_1frombind
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_value_int
* Signature: (J)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1value_1int
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1value_1int
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_value_int64
* Signature: (J)J
*/
-JNIEXPORT jlong JNICALL Java_org_sqlite_jni_CApi_sqlite3_1value_1int64
+JNIEXPORT jlong JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1value_1int64
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_value_java_object
* Signature: (J)Ljava/lang/Object;
*/
-JNIEXPORT jobject JNICALL Java_org_sqlite_jni_CApi_sqlite3_1value_1java_1object
+JNIEXPORT jobject JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1value_1java_1object
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_value_nochange
* Signature: (J)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1value_1nochange
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1value_1nochange
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_value_numeric_type
* Signature: (J)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1value_1numeric_1type
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1value_1numeric_1type
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_value_subtype
* Signature: (J)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1value_1subtype
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1value_1subtype
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_value_text
* Signature: (J)[B
*/
-JNIEXPORT jbyteArray JNICALL Java_org_sqlite_jni_CApi_sqlite3_1value_1text
+JNIEXPORT jbyteArray JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1value_1text
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_value_text16
* Signature: (J)Ljava/lang/String;
*/
-JNIEXPORT jstring JNICALL Java_org_sqlite_jni_CApi_sqlite3_1value_1text16
+JNIEXPORT jstring JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1value_1text16
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_value_type
* Signature: (J)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_CApi_sqlite3_1value_1type
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1value_1type
(JNIEnv *, jclass, jlong);
/*
- * Class: org_sqlite_jni_CApi
+ * Class: org_sqlite_jni_capi_CApi
* Method: sqlite3_jni_internal_details
* Signature: ()V
*/
-JNIEXPORT void JNICALL Java_org_sqlite_jni_CApi_sqlite3_1jni_1internal_1details
+JNIEXPORT void JNICALL Java_org_sqlite_jni_capi_CApi_sqlite3_1jni_1internal_1details
(JNIEnv *, jclass);
#ifdef __cplusplus
@@ -2125,27 +2125,27 @@ JNIEXPORT void JNICALL Java_org_sqlite_jni_CApi_sqlite3_1jni_1internal_1details
#endif
/* DO NOT EDIT THIS FILE - it is machine generated */
#include
-/* Header for class org_sqlite_jni_SQLTester */
+/* Header for class org_sqlite_jni_capi_SQLTester */
-#ifndef _Included_org_sqlite_jni_SQLTester
-#define _Included_org_sqlite_jni_SQLTester
+#ifndef _Included_org_sqlite_jni_capi_SQLTester
+#define _Included_org_sqlite_jni_capi_SQLTester
#ifdef __cplusplus
extern "C" {
#endif
/*
- * Class: org_sqlite_jni_SQLTester
+ * Class: org_sqlite_jni_capi_SQLTester
* Method: strglob
* Signature: ([B[B)I
*/
-JNIEXPORT jint JNICALL Java_org_sqlite_jni_SQLTester_strglob
+JNIEXPORT jint JNICALL Java_org_sqlite_jni_capi_SQLTester_strglob
(JNIEnv *, jclass, jbyteArray, jbyteArray);
/*
- * Class: org_sqlite_jni_SQLTester
+ * Class: org_sqlite_jni_capi_SQLTester
* Method: installCustomExtensions
* Signature: ()V
*/
-JNIEXPORT void JNICALL Java_org_sqlite_jni_SQLTester_installCustomExtensions
+JNIEXPORT void JNICALL Java_org_sqlite_jni_capi_SQLTester_installCustomExtensions
(JNIEnv *, jclass);
#ifdef __cplusplus
@@ -2180,7 +2180,7 @@ JNIEXPORT jint JNICALL Java_org_sqlite_jni_fts5_Fts5ExtensionApi_xColumnCount
/*
* Class: org_sqlite_jni_fts5_Fts5ExtensionApi
* Method: xColumnSize
- * Signature: (Lorg/sqlite/jni/fts5/Fts5Context;ILorg/sqlite/jni/OutputPointer/Int32;)I
+ * Signature: (Lorg/sqlite/jni/fts5/Fts5Context;ILorg/sqlite/jni/capi/OutputPointer/Int32;)I
*/
JNIEXPORT jint JNICALL Java_org_sqlite_jni_fts5_Fts5ExtensionApi_xColumnSize
(JNIEnv *, jobject, jobject, jint, jobject);
@@ -2188,7 +2188,7 @@ JNIEXPORT jint JNICALL Java_org_sqlite_jni_fts5_Fts5ExtensionApi_xColumnSize
/*
* Class: org_sqlite_jni_fts5_Fts5ExtensionApi
* Method: xColumnText
- * Signature: (Lorg/sqlite/jni/fts5/Fts5Context;ILorg/sqlite/jni/OutputPointer/String;)I
+ * Signature: (Lorg/sqlite/jni/fts5/Fts5Context;ILorg/sqlite/jni/capi/OutputPointer/String;)I
*/
JNIEXPORT jint JNICALL Java_org_sqlite_jni_fts5_Fts5ExtensionApi_xColumnText
(JNIEnv *, jobject, jobject, jint, jobject);
@@ -2196,7 +2196,7 @@ JNIEXPORT jint JNICALL Java_org_sqlite_jni_fts5_Fts5ExtensionApi_xColumnText
/*
* Class: org_sqlite_jni_fts5_Fts5ExtensionApi
* Method: xColumnTotalSize
- * Signature: (Lorg/sqlite/jni/fts5/Fts5Context;ILorg/sqlite/jni/OutputPointer/Int64;)I
+ * Signature: (Lorg/sqlite/jni/fts5/Fts5Context;ILorg/sqlite/jni/capi/OutputPointer/Int64;)I
*/
JNIEXPORT jint JNICALL Java_org_sqlite_jni_fts5_Fts5ExtensionApi_xColumnTotalSize
(JNIEnv *, jobject, jobject, jint, jobject);
@@ -2212,7 +2212,7 @@ JNIEXPORT jobject JNICALL Java_org_sqlite_jni_fts5_Fts5ExtensionApi_xGetAuxdata
/*
* Class: org_sqlite_jni_fts5_Fts5ExtensionApi
* Method: xInst
- * Signature: (Lorg/sqlite/jni/fts5/Fts5Context;ILorg/sqlite/jni/OutputPointer/Int32;Lorg/sqlite/jni/OutputPointer/Int32;Lorg/sqlite/jni/OutputPointer/Int32;)I
+ * Signature: (Lorg/sqlite/jni/fts5/Fts5Context;ILorg/sqlite/jni/capi/OutputPointer/Int32;Lorg/sqlite/jni/capi/OutputPointer/Int32;Lorg/sqlite/jni/capi/OutputPointer/Int32;)I
*/
JNIEXPORT jint JNICALL Java_org_sqlite_jni_fts5_Fts5ExtensionApi_xInst
(JNIEnv *, jobject, jobject, jint, jobject, jobject, jobject);
@@ -2220,7 +2220,7 @@ JNIEXPORT jint JNICALL Java_org_sqlite_jni_fts5_Fts5ExtensionApi_xInst
/*
* Class: org_sqlite_jni_fts5_Fts5ExtensionApi
* Method: xInstCount
- * Signature: (Lorg/sqlite/jni/fts5/Fts5Context;Lorg/sqlite/jni/OutputPointer/Int32;)I
+ * Signature: (Lorg/sqlite/jni/fts5/Fts5Context;Lorg/sqlite/jni/capi/OutputPointer/Int32;)I
*/
JNIEXPORT jint JNICALL Java_org_sqlite_jni_fts5_Fts5ExtensionApi_xInstCount
(JNIEnv *, jobject, jobject, jobject);
@@ -2236,7 +2236,7 @@ JNIEXPORT jint JNICALL Java_org_sqlite_jni_fts5_Fts5ExtensionApi_xPhraseCount
/*
* Class: org_sqlite_jni_fts5_Fts5ExtensionApi
* Method: xPhraseFirst
- * Signature: (Lorg/sqlite/jni/fts5/Fts5Context;ILorg/sqlite/jni/fts5/Fts5PhraseIter;Lorg/sqlite/jni/OutputPointer/Int32;Lorg/sqlite/jni/OutputPointer/Int32;)I
+ * Signature: (Lorg/sqlite/jni/fts5/Fts5Context;ILorg/sqlite/jni/fts5/Fts5PhraseIter;Lorg/sqlite/jni/capi/OutputPointer/Int32;Lorg/sqlite/jni/capi/OutputPointer/Int32;)I
*/
JNIEXPORT jint JNICALL Java_org_sqlite_jni_fts5_Fts5ExtensionApi_xPhraseFirst
(JNIEnv *, jobject, jobject, jint, jobject, jobject, jobject);
@@ -2244,7 +2244,7 @@ JNIEXPORT jint JNICALL Java_org_sqlite_jni_fts5_Fts5ExtensionApi_xPhraseFirst
/*
* Class: org_sqlite_jni_fts5_Fts5ExtensionApi
* Method: xPhraseFirstColumn
- * Signature: (Lorg/sqlite/jni/fts5/Fts5Context;ILorg/sqlite/jni/fts5/Fts5PhraseIter;Lorg/sqlite/jni/OutputPointer/Int32;)I
+ * Signature: (Lorg/sqlite/jni/fts5/Fts5Context;ILorg/sqlite/jni/fts5/Fts5PhraseIter;Lorg/sqlite/jni/capi/OutputPointer/Int32;)I
*/
JNIEXPORT jint JNICALL Java_org_sqlite_jni_fts5_Fts5ExtensionApi_xPhraseFirstColumn
(JNIEnv *, jobject, jobject, jint, jobject, jobject);
@@ -2252,7 +2252,7 @@ JNIEXPORT jint JNICALL Java_org_sqlite_jni_fts5_Fts5ExtensionApi_xPhraseFirstCol
/*
* Class: org_sqlite_jni_fts5_Fts5ExtensionApi
* Method: xPhraseNext
- * Signature: (Lorg/sqlite/jni/fts5/Fts5Context;Lorg/sqlite/jni/fts5/Fts5PhraseIter;Lorg/sqlite/jni/OutputPointer/Int32;Lorg/sqlite/jni/OutputPointer/Int32;)V
+ * Signature: (Lorg/sqlite/jni/fts5/Fts5Context;Lorg/sqlite/jni/fts5/Fts5PhraseIter;Lorg/sqlite/jni/capi/OutputPointer/Int32;Lorg/sqlite/jni/capi/OutputPointer/Int32;)V
*/
JNIEXPORT void JNICALL Java_org_sqlite_jni_fts5_Fts5ExtensionApi_xPhraseNext
(JNIEnv *, jobject, jobject, jobject, jobject, jobject);
@@ -2260,7 +2260,7 @@ JNIEXPORT void JNICALL Java_org_sqlite_jni_fts5_Fts5ExtensionApi_xPhraseNext
/*
* Class: org_sqlite_jni_fts5_Fts5ExtensionApi
* Method: xPhraseNextColumn
- * Signature: (Lorg/sqlite/jni/fts5/Fts5Context;Lorg/sqlite/jni/fts5/Fts5PhraseIter;Lorg/sqlite/jni/OutputPointer/Int32;)V
+ * Signature: (Lorg/sqlite/jni/fts5/Fts5Context;Lorg/sqlite/jni/fts5/Fts5PhraseIter;Lorg/sqlite/jni/capi/OutputPointer/Int32;)V
*/
JNIEXPORT void JNICALL Java_org_sqlite_jni_fts5_Fts5ExtensionApi_xPhraseNextColumn
(JNIEnv *, jobject, jobject, jobject, jobject);
@@ -2284,7 +2284,7 @@ JNIEXPORT jint JNICALL Java_org_sqlite_jni_fts5_Fts5ExtensionApi_xQueryPhrase
/*
* Class: org_sqlite_jni_fts5_Fts5ExtensionApi
* Method: xRowCount
- * Signature: (Lorg/sqlite/jni/fts5/Fts5Context;Lorg/sqlite/jni/OutputPointer/Int64;)I
+ * Signature: (Lorg/sqlite/jni/fts5/Fts5Context;Lorg/sqlite/jni/capi/OutputPointer/Int64;)I
*/
JNIEXPORT jint JNICALL Java_org_sqlite_jni_fts5_Fts5ExtensionApi_xRowCount
(JNIEnv *, jobject, jobject, jobject);
@@ -2339,7 +2339,7 @@ extern "C" {
/*
* Class: org_sqlite_jni_fts5_fts5_api
* Method: getInstanceForDb
- * Signature: (Lorg/sqlite/jni/sqlite3;)Lorg/sqlite/jni/fts5/fts5_api;
+ * Signature: (Lorg/sqlite/jni/capi/sqlite3;)Lorg/sqlite/jni/fts5/fts5_api;
*/
JNIEXPORT jobject JNICALL Java_org_sqlite_jni_fts5_fts5_1api_getInstanceForDb
(JNIEnv *, jclass, jobject);
diff --git a/ext/jni/src/org/sqlite/jni/AbstractCollationCallback.java b/ext/jni/src/org/sqlite/jni/capi/AbstractCollationCallback.java
similarity index 97%
rename from ext/jni/src/org/sqlite/jni/AbstractCollationCallback.java
rename to ext/jni/src/org/sqlite/jni/capi/AbstractCollationCallback.java
index 63cac66a52..925536636e 100644
--- a/ext/jni/src/org/sqlite/jni/AbstractCollationCallback.java
+++ b/ext/jni/src/org/sqlite/jni/capi/AbstractCollationCallback.java
@@ -11,7 +11,7 @@
*************************************************************************
** This file is part of the JNI bindings for the sqlite3 C API.
*/
-package org.sqlite.jni;
+package org.sqlite.jni.capi;
import org.sqlite.jni.annotation.NotNull;
/**
diff --git a/ext/jni/src/org/sqlite/jni/AggregateFunction.java b/ext/jni/src/org/sqlite/jni/capi/AggregateFunction.java
similarity index 98%
rename from ext/jni/src/org/sqlite/jni/AggregateFunction.java
rename to ext/jni/src/org/sqlite/jni/capi/AggregateFunction.java
index 502cde12f8..89c4f27421 100644
--- a/ext/jni/src/org/sqlite/jni/AggregateFunction.java
+++ b/ext/jni/src/org/sqlite/jni/capi/AggregateFunction.java
@@ -11,7 +11,7 @@
*************************************************************************
** This file is part of the JNI bindings for the sqlite3 C API.
*/
-package org.sqlite.jni;
+package org.sqlite.jni.capi;
/**
diff --git a/ext/jni/src/org/sqlite/jni/AuthorizerCallback.java b/ext/jni/src/org/sqlite/jni/capi/AuthorizerCallback.java
similarity index 96%
rename from ext/jni/src/org/sqlite/jni/AuthorizerCallback.java
rename to ext/jni/src/org/sqlite/jni/capi/AuthorizerCallback.java
index cd3eb06c2a..ce7c6fca6d 100644
--- a/ext/jni/src/org/sqlite/jni/AuthorizerCallback.java
+++ b/ext/jni/src/org/sqlite/jni/capi/AuthorizerCallback.java
@@ -11,7 +11,7 @@
*************************************************************************
** This file is part of the JNI bindings for the sqlite3 C API.
*/
-package org.sqlite.jni;
+package org.sqlite.jni.capi;
import org.sqlite.jni.annotation.*;
/**
diff --git a/ext/jni/src/org/sqlite/jni/AutoExtensionCallback.java b/ext/jni/src/org/sqlite/jni/capi/AutoExtensionCallback.java
similarity index 97%
rename from ext/jni/src/org/sqlite/jni/AutoExtensionCallback.java
rename to ext/jni/src/org/sqlite/jni/capi/AutoExtensionCallback.java
index 96a63cafb2..7a54132d29 100644
--- a/ext/jni/src/org/sqlite/jni/AutoExtensionCallback.java
+++ b/ext/jni/src/org/sqlite/jni/capi/AutoExtensionCallback.java
@@ -11,7 +11,7 @@
*************************************************************************
** This file is part of the JNI bindings for the sqlite3 C API.
*/
-package org.sqlite.jni;
+package org.sqlite.jni.capi;
/**
Callback for use with the {@link CApi#sqlite3_auto_extension}
diff --git a/ext/jni/src/org/sqlite/jni/BusyHandlerCallback.java b/ext/jni/src/org/sqlite/jni/capi/BusyHandlerCallback.java
similarity index 96%
rename from ext/jni/src/org/sqlite/jni/BusyHandlerCallback.java
rename to ext/jni/src/org/sqlite/jni/capi/BusyHandlerCallback.java
index 0f1670e17d..00223f0b66 100644
--- a/ext/jni/src/org/sqlite/jni/BusyHandlerCallback.java
+++ b/ext/jni/src/org/sqlite/jni/capi/BusyHandlerCallback.java
@@ -11,7 +11,7 @@
*************************************************************************
** This file is part of the JNI bindings for the sqlite3 C API.
*/
-package org.sqlite.jni;
+package org.sqlite.jni.capi;
/**
Callback for use with {@link CApi#sqlite3_busy_handler}.
diff --git a/ext/jni/src/org/sqlite/jni/CApi.java b/ext/jni/src/org/sqlite/jni/capi/CApi.java
similarity index 99%
rename from ext/jni/src/org/sqlite/jni/CApi.java
rename to ext/jni/src/org/sqlite/jni/capi/CApi.java
index aac9b4e071..051e28a899 100644
--- a/ext/jni/src/org/sqlite/jni/CApi.java
+++ b/ext/jni/src/org/sqlite/jni/capi/CApi.java
@@ -11,7 +11,7 @@
*************************************************************************
** This file declares JNI bindings for the sqlite3 C API.
*/
-package org.sqlite.jni;
+package org.sqlite.jni.capi;
import java.nio.charset.StandardCharsets;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@@ -27,7 +27,7 @@ import java.util.Arrays;
use, a static import is recommended:
{@code
- import static org.sqlite.jni.CApi.*;
+ import static org.sqlite.jni.capi.CApi.*;
}
The C-side part can be found in sqlite3-jni.c.
@@ -91,7 +91,7 @@ import java.util.Arrays;
https://docs.oracle.com/javase/8/docs/api/java/io/DataInput.html#modified-utf-8
*/
-final class CApi {
+public final class CApi {
static {
System.loadLibrary("sqlite3-jni");
}
diff --git a/ext/jni/src/org/sqlite/jni/CallbackProxy.java b/ext/jni/src/org/sqlite/jni/capi/CallbackProxy.java
similarity index 98%
rename from ext/jni/src/org/sqlite/jni/CallbackProxy.java
rename to ext/jni/src/org/sqlite/jni/capi/CallbackProxy.java
index 086c2f8e5d..0495702561 100644
--- a/ext/jni/src/org/sqlite/jni/CallbackProxy.java
+++ b/ext/jni/src/org/sqlite/jni/capi/CallbackProxy.java
@@ -11,7 +11,7 @@
*************************************************************************
** This file is part of the JNI bindings for the sqlite3 C API.
*/
-package org.sqlite.jni;
+package org.sqlite.jni.capi;
/**
This marker interface exists soley for use as a documentation and
class-grouping tool. It should be applied to interfaces or
diff --git a/ext/jni/src/org/sqlite/jni/CollationCallback.java b/ext/jni/src/org/sqlite/jni/capi/CollationCallback.java
similarity index 97%
rename from ext/jni/src/org/sqlite/jni/CollationCallback.java
rename to ext/jni/src/org/sqlite/jni/capi/CollationCallback.java
index 0e35296326..ed8bd09475 100644
--- a/ext/jni/src/org/sqlite/jni/CollationCallback.java
+++ b/ext/jni/src/org/sqlite/jni/capi/CollationCallback.java
@@ -11,7 +11,7 @@
*************************************************************************
** This file is part of the JNI bindings for the sqlite3 C API.
*/
-package org.sqlite.jni;
+package org.sqlite.jni.capi;
import org.sqlite.jni.annotation.NotNull;
/**
diff --git a/ext/jni/src/org/sqlite/jni/CollationNeededCallback.java b/ext/jni/src/org/sqlite/jni/capi/CollationNeededCallback.java
similarity index 96%
rename from ext/jni/src/org/sqlite/jni/CollationNeededCallback.java
rename to ext/jni/src/org/sqlite/jni/capi/CollationNeededCallback.java
index 21b014ba11..fe61fe5065 100644
--- a/ext/jni/src/org/sqlite/jni/CollationNeededCallback.java
+++ b/ext/jni/src/org/sqlite/jni/capi/CollationNeededCallback.java
@@ -11,7 +11,7 @@
*************************************************************************
** This file is part of the JNI bindings for the sqlite3 C API.
*/
-package org.sqlite.jni;
+package org.sqlite.jni.capi;
/**
Callback for use with {@link CApi#sqlite3_collation_needed}.
diff --git a/ext/jni/src/org/sqlite/jni/CommitHookCallback.java b/ext/jni/src/org/sqlite/jni/capi/CommitHookCallback.java
similarity index 95%
rename from ext/jni/src/org/sqlite/jni/CommitHookCallback.java
rename to ext/jni/src/org/sqlite/jni/capi/CommitHookCallback.java
index c6e4538bbd..24373bdf2b 100644
--- a/ext/jni/src/org/sqlite/jni/CommitHookCallback.java
+++ b/ext/jni/src/org/sqlite/jni/capi/CommitHookCallback.java
@@ -11,7 +11,7 @@
*************************************************************************
** This file is part of the JNI bindings for the sqlite3 C API.
*/
-package org.sqlite.jni;
+package org.sqlite.jni.capi;
/**
Callback for use with {@link CApi#sqlite3_commit_hook}.
diff --git a/ext/jni/src/org/sqlite/jni/ConfigLogCallback.java b/ext/jni/src/org/sqlite/jni/capi/ConfigLogCallback.java
similarity index 96%
rename from ext/jni/src/org/sqlite/jni/ConfigLogCallback.java
rename to ext/jni/src/org/sqlite/jni/capi/ConfigLogCallback.java
index d5af70fa52..6513b0730d 100644
--- a/ext/jni/src/org/sqlite/jni/ConfigLogCallback.java
+++ b/ext/jni/src/org/sqlite/jni/capi/ConfigLogCallback.java
@@ -11,7 +11,7 @@
*************************************************************************
** This file is part of the JNI bindings for the sqlite3 C API.
*/
-package org.sqlite.jni;
+package org.sqlite.jni.capi;
/**
A callback for use with sqlite3_config().
diff --git a/ext/jni/src/org/sqlite/jni/ConfigSqllogCallback.java b/ext/jni/src/org/sqlite/jni/capi/ConfigSqllogCallback.java
similarity index 96%
rename from ext/jni/src/org/sqlite/jni/ConfigSqllogCallback.java
rename to ext/jni/src/org/sqlite/jni/capi/ConfigSqllogCallback.java
index 9a5a201aac..df753e6513 100644
--- a/ext/jni/src/org/sqlite/jni/ConfigSqllogCallback.java
+++ b/ext/jni/src/org/sqlite/jni/capi/ConfigSqllogCallback.java
@@ -11,7 +11,7 @@
*************************************************************************
** This file is part of the JNI bindings for the sqlite3 C API.
*/
-package org.sqlite.jni;
+package org.sqlite.jni.capi;
/**
A callback for use with sqlite3_config().
diff --git a/ext/jni/src/org/sqlite/jni/NativePointerHolder.java b/ext/jni/src/org/sqlite/jni/capi/NativePointerHolder.java
similarity index 98%
rename from ext/jni/src/org/sqlite/jni/NativePointerHolder.java
rename to ext/jni/src/org/sqlite/jni/capi/NativePointerHolder.java
index 2b0e8cfbdd..e82909e424 100644
--- a/ext/jni/src/org/sqlite/jni/NativePointerHolder.java
+++ b/ext/jni/src/org/sqlite/jni/capi/NativePointerHolder.java
@@ -11,7 +11,7 @@
*************************************************************************
** This file is part of the JNI bindings for the sqlite3 C API.
*/
-package org.sqlite.jni;
+package org.sqlite.jni.capi;
/**
A helper for passing pointers between JNI C code and Java, in
diff --git a/ext/jni/src/org/sqlite/jni/OutputPointer.java b/ext/jni/src/org/sqlite/jni/capi/OutputPointer.java
similarity index 87%
rename from ext/jni/src/org/sqlite/jni/OutputPointer.java
rename to ext/jni/src/org/sqlite/jni/capi/OutputPointer.java
index c6e48ed72f..60b9025386 100644
--- a/ext/jni/src/org/sqlite/jni/OutputPointer.java
+++ b/ext/jni/src/org/sqlite/jni/capi/OutputPointer.java
@@ -11,7 +11,7 @@
*************************************************************************
** This file is part of the JNI bindings for the sqlite3 C API.
*/
-package org.sqlite.jni;
+package org.sqlite.jni.capi;
/**
Helper classes for handling JNI output pointers.
@@ -49,16 +49,16 @@ public final class OutputPointer {
code.
*/
public static final class sqlite3 {
- private org.sqlite.jni.sqlite3 value;
+ private org.sqlite.jni.capi.sqlite3 value;
/** Initializes with a null value. */
public sqlite3(){value = null;}
/** Sets the current value to null. */
public void clear(){value = null;}
/** Returns the current value. */
- public final org.sqlite.jni.sqlite3 get(){return value;}
+ public final org.sqlite.jni.capi.sqlite3 get(){return value;}
/** Equivalent to calling get() then clear(). */
- public final org.sqlite.jni.sqlite3 take(){
- final org.sqlite.jni.sqlite3 v = value;
+ public final org.sqlite.jni.capi.sqlite3 take(){
+ final org.sqlite.jni.capi.sqlite3 v = value;
value = null;
return v;
}
@@ -70,16 +70,16 @@ public final class OutputPointer {
code.
*/
public static final class sqlite3_blob {
- private org.sqlite.jni.sqlite3_blob value;
+ private org.sqlite.jni.capi.sqlite3_blob value;
/** Initializes with a null value. */
public sqlite3_blob(){value = null;}
/** Sets the current value to null. */
public void clear(){value = null;}
/** Returns the current value. */
- public final org.sqlite.jni.sqlite3_blob get(){return value;}
+ public final org.sqlite.jni.capi.sqlite3_blob get(){return value;}
/** Equivalent to calling get() then clear(). */
- public final org.sqlite.jni.sqlite3_blob take(){
- final org.sqlite.jni.sqlite3_blob v = value;
+ public final org.sqlite.jni.capi.sqlite3_blob take(){
+ final org.sqlite.jni.capi.sqlite3_blob v = value;
value = null;
return v;
}
@@ -92,16 +92,16 @@ public final class OutputPointer {
code.
*/
public static final class sqlite3_stmt {
- private org.sqlite.jni.sqlite3_stmt value;
+ private org.sqlite.jni.capi.sqlite3_stmt value;
/** Initializes with a null value. */
public sqlite3_stmt(){value = null;}
/** Sets the current value to null. */
public void clear(){value = null;}
/** Returns the current value. */
- public final org.sqlite.jni.sqlite3_stmt get(){return value;}
+ public final org.sqlite.jni.capi.sqlite3_stmt get(){return value;}
/** Equivalent to calling get() then clear(). */
- public final org.sqlite.jni.sqlite3_stmt take(){
- final org.sqlite.jni.sqlite3_stmt v = value;
+ public final org.sqlite.jni.capi.sqlite3_stmt take(){
+ final org.sqlite.jni.capi.sqlite3_stmt v = value;
value = null;
return v;
}
@@ -114,16 +114,16 @@ public final class OutputPointer {
code.
*/
public static final class sqlite3_value {
- private org.sqlite.jni.sqlite3_value value;
+ private org.sqlite.jni.capi.sqlite3_value value;
/** Initializes with a null value. */
public sqlite3_value(){value = null;}
/** Sets the current value to null. */
public void clear(){value = null;}
/** Returns the current value. */
- public final org.sqlite.jni.sqlite3_value get(){return value;}
+ public final org.sqlite.jni.capi.sqlite3_value get(){return value;}
/** Equivalent to calling get() then clear(). */
- public final org.sqlite.jni.sqlite3_value take(){
- final org.sqlite.jni.sqlite3_value v = value;
+ public final org.sqlite.jni.capi.sqlite3_value take(){
+ final org.sqlite.jni.capi.sqlite3_value v = value;
value = null;
return v;
}
diff --git a/ext/jni/src/org/sqlite/jni/PrepareMultiCallback.java b/ext/jni/src/org/sqlite/jni/capi/PrepareMultiCallback.java
similarity index 98%
rename from ext/jni/src/org/sqlite/jni/PrepareMultiCallback.java
rename to ext/jni/src/org/sqlite/jni/capi/PrepareMultiCallback.java
index 2599c1cd7f..1c805a9b16 100644
--- a/ext/jni/src/org/sqlite/jni/PrepareMultiCallback.java
+++ b/ext/jni/src/org/sqlite/jni/capi/PrepareMultiCallback.java
@@ -11,7 +11,7 @@
*************************************************************************
** This file is part of the JNI bindings for the sqlite3 C API.
*/
-package org.sqlite.jni;
+package org.sqlite.jni.capi;
/**
Callback for use with {@link CApi#sqlite3_prepare_multi}.
diff --git a/ext/jni/src/org/sqlite/jni/PreupdateHookCallback.java b/ext/jni/src/org/sqlite/jni/capi/PreupdateHookCallback.java
similarity index 96%
rename from ext/jni/src/org/sqlite/jni/PreupdateHookCallback.java
rename to ext/jni/src/org/sqlite/jni/capi/PreupdateHookCallback.java
index 29088726f0..99d3fb0351 100644
--- a/ext/jni/src/org/sqlite/jni/PreupdateHookCallback.java
+++ b/ext/jni/src/org/sqlite/jni/capi/PreupdateHookCallback.java
@@ -11,7 +11,7 @@
*************************************************************************
** This file is part of the JNI bindings for the sqlite3 C API.
*/
-package org.sqlite.jni;
+package org.sqlite.jni.capi;
/**
Callback for use with {@link CApi#sqlite3_preupdate_hook}.
diff --git a/ext/jni/src/org/sqlite/jni/ProgressHandlerCallback.java b/ext/jni/src/org/sqlite/jni/capi/ProgressHandlerCallback.java
similarity index 96%
rename from ext/jni/src/org/sqlite/jni/ProgressHandlerCallback.java
rename to ext/jni/src/org/sqlite/jni/capi/ProgressHandlerCallback.java
index 2bc56665cb..464baa2e3d 100644
--- a/ext/jni/src/org/sqlite/jni/ProgressHandlerCallback.java
+++ b/ext/jni/src/org/sqlite/jni/capi/ProgressHandlerCallback.java
@@ -11,7 +11,7 @@
*************************************************************************
** This file is part of the JNI bindings for the sqlite3 C API.
*/
-package org.sqlite.jni;
+package org.sqlite.jni.capi;
/**
Callback for use with {@link CApi#sqlite3_progress_handler}.
diff --git a/ext/jni/src/org/sqlite/jni/ResultCode.java b/ext/jni/src/org/sqlite/jni/capi/ResultCode.java
similarity index 99%
rename from ext/jni/src/org/sqlite/jni/ResultCode.java
rename to ext/jni/src/org/sqlite/jni/capi/ResultCode.java
index e6f0ad89dc..5a8b2e6a18 100644
--- a/ext/jni/src/org/sqlite/jni/ResultCode.java
+++ b/ext/jni/src/org/sqlite/jni/capi/ResultCode.java
@@ -11,7 +11,7 @@
*************************************************************************
** This file is part of the JNI bindings for the sqlite3 C API.
*/
-package org.sqlite.jni;
+package org.sqlite.jni.capi;
/**
This enum contains all of the core and "extended" result codes used
diff --git a/ext/jni/src/org/sqlite/jni/RollbackHookCallback.java b/ext/jni/src/org/sqlite/jni/capi/RollbackHookCallback.java
similarity index 95%
rename from ext/jni/src/org/sqlite/jni/RollbackHookCallback.java
rename to ext/jni/src/org/sqlite/jni/capi/RollbackHookCallback.java
index bd736e1b76..5ce17e718a 100644
--- a/ext/jni/src/org/sqlite/jni/RollbackHookCallback.java
+++ b/ext/jni/src/org/sqlite/jni/capi/RollbackHookCallback.java
@@ -11,7 +11,7 @@
*************************************************************************
** This file is part of the JNI bindings for the sqlite3 C API.
*/
-package org.sqlite.jni;
+package org.sqlite.jni.capi;
/**
Callback for use with {@link CApi#sqlite3_rollback_hook}.
diff --git a/ext/jni/src/org/sqlite/jni/SQLFunction.java b/ext/jni/src/org/sqlite/jni/capi/SQLFunction.java
similarity index 99%
rename from ext/jni/src/org/sqlite/jni/SQLFunction.java
rename to ext/jni/src/org/sqlite/jni/capi/SQLFunction.java
index 66119ebe55..4806e2fc0c 100644
--- a/ext/jni/src/org/sqlite/jni/SQLFunction.java
+++ b/ext/jni/src/org/sqlite/jni/capi/SQLFunction.java
@@ -11,7 +11,7 @@
*************************************************************************
** This file is part of the JNI bindings for the sqlite3 C API.
*/
-package org.sqlite.jni;
+package org.sqlite.jni.capi;
/**
SQLFunction is used in conjunction with the
diff --git a/ext/jni/src/org/sqlite/jni/SQLTester.java b/ext/jni/src/org/sqlite/jni/capi/SQLTester.java
similarity index 99%
rename from ext/jni/src/org/sqlite/jni/SQLTester.java
rename to ext/jni/src/org/sqlite/jni/capi/SQLTester.java
index 1170c86d92..81d6106be7 100644
--- a/ext/jni/src/org/sqlite/jni/SQLTester.java
+++ b/ext/jni/src/org/sqlite/jni/capi/SQLTester.java
@@ -12,13 +12,13 @@
** This file contains the main application entry pointer for the
** SQLTester framework.
*/
-package org.sqlite.jni;
+package org.sqlite.jni.capi;
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
import java.nio.charset.StandardCharsets;
import java.util.regex.*;
-import static org.sqlite.jni.CApi.*;
+import static org.sqlite.jni.capi.CApi.*;
/**
Modes for how to escape (or not) column values and names from
@@ -457,7 +457,7 @@ public class SQLTester {
}
private void appendDbErr(sqlite3 db, StringBuilder sb, int rc){
- sb.append(org.sqlite.jni.ResultCode.getEntryForInt(rc)).append(' ');
+ sb.append(org.sqlite.jni.capi.ResultCode.getEntryForInt(rc)).append(' ');
final String msg = escapeSqlValue(sqlite3_errmsg(db));
if( '{' == msg.charAt(0) ){
sb.append(msg);
diff --git a/ext/jni/src/org/sqlite/jni/ScalarFunction.java b/ext/jni/src/org/sqlite/jni/capi/ScalarFunction.java
similarity index 97%
rename from ext/jni/src/org/sqlite/jni/ScalarFunction.java
rename to ext/jni/src/org/sqlite/jni/capi/ScalarFunction.java
index 73fb58cda2..f517b3610c 100644
--- a/ext/jni/src/org/sqlite/jni/ScalarFunction.java
+++ b/ext/jni/src/org/sqlite/jni/capi/ScalarFunction.java
@@ -11,7 +11,7 @@
*************************************************************************
** This file is part of the JNI bindings for the sqlite3 C API.
*/
-package org.sqlite.jni;
+package org.sqlite.jni.capi;
/**
diff --git a/ext/jni/src/org/sqlite/jni/TableColumnMetadata.java b/ext/jni/src/org/sqlite/jni/capi/TableColumnMetadata.java
similarity index 97%
rename from ext/jni/src/org/sqlite/jni/TableColumnMetadata.java
rename to ext/jni/src/org/sqlite/jni/capi/TableColumnMetadata.java
index 70b7c90ec8..d8b6226ac9 100644
--- a/ext/jni/src/org/sqlite/jni/TableColumnMetadata.java
+++ b/ext/jni/src/org/sqlite/jni/capi/TableColumnMetadata.java
@@ -11,7 +11,7 @@
*************************************************************************
** This file is part of the JNI bindings for the sqlite3 C API.
*/
-package org.sqlite.jni;
+package org.sqlite.jni.capi;
/**
A wrapper object for use with sqlite3_table_column_metadata().
diff --git a/ext/jni/src/org/sqlite/jni/Tester1.java b/ext/jni/src/org/sqlite/jni/capi/Tester1.java
similarity index 99%
rename from ext/jni/src/org/sqlite/jni/Tester1.java
rename to ext/jni/src/org/sqlite/jni/capi/Tester1.java
index 43ba085fab..5c982ea5ed 100644
--- a/ext/jni/src/org/sqlite/jni/Tester1.java
+++ b/ext/jni/src/org/sqlite/jni/capi/Tester1.java
@@ -11,8 +11,8 @@
*************************************************************************
** This file contains a set of tests for the sqlite3 JNI bindings.
*/
-package org.sqlite.jni;
-import static org.sqlite.jni.CApi.*;
+package org.sqlite.jni.capi;
+import static org.sqlite.jni.capi.CApi.*;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.ArrayList;
@@ -707,13 +707,13 @@ public class Tester1 implements Runnable {
public void xFunc(sqlite3_context cx, sqlite3_value[] args){
affirm(db == sqlite3_context_db_handle(cx));
if( null==neverEverDoThisInClientCode.value ){
+ /* !!!NEVER!!! hold a reference to an sqlite3_value or
+ sqlite3_context object like this in client code! They
+ are ONLY legal for the duration of their single
+ call. We do it here ONLY to test that the defenses
+ against clients doing this are working. */
neverEverDoThisInClientCode2.value = cx;
- neverEverDoThisInClientCode.value = args
- /* !!!NEVER!!! hold a reference to an sqlite3_value
- object like this in client code! They are ONLY legal
- for the duration of their single call. We do it here
- ONLY to test that the defenses against clients doing
- this are working. */;
+ neverEverDoThisInClientCode.value = args;
}
int result = 0;
for( sqlite3_value v : args ) result += sqlite3_value_int(v);
@@ -1323,7 +1323,7 @@ public class Tester1 implements Runnable {
}
Exception err = null;
try {
- Class t = Class.forName("org.sqlite.jni.TesterFts5");
+ Class t = Class.forName("org.sqlite.jni.fts5.TesterFts5");
java.lang.reflect.Constructor ctor = t.getConstructor();
ctor.setAccessible(true);
final long timeStart = System.currentTimeMillis();
diff --git a/ext/jni/src/org/sqlite/jni/TraceV2Callback.java b/ext/jni/src/org/sqlite/jni/capi/TraceV2Callback.java
similarity index 98%
rename from ext/jni/src/org/sqlite/jni/TraceV2Callback.java
rename to ext/jni/src/org/sqlite/jni/capi/TraceV2Callback.java
index b16012b60e..56465a2c0a 100644
--- a/ext/jni/src/org/sqlite/jni/TraceV2Callback.java
+++ b/ext/jni/src/org/sqlite/jni/capi/TraceV2Callback.java
@@ -11,7 +11,7 @@
*************************************************************************
** This file is part of the JNI bindings for the sqlite3 C API.
*/
-package org.sqlite.jni;
+package org.sqlite.jni.capi;
import org.sqlite.jni.annotation.Nullable;
/**
diff --git a/ext/jni/src/org/sqlite/jni/UpdateHookCallback.java b/ext/jni/src/org/sqlite/jni/capi/UpdateHookCallback.java
similarity index 96%
rename from ext/jni/src/org/sqlite/jni/UpdateHookCallback.java
rename to ext/jni/src/org/sqlite/jni/capi/UpdateHookCallback.java
index 32724be6d4..33d72a5dd2 100644
--- a/ext/jni/src/org/sqlite/jni/UpdateHookCallback.java
+++ b/ext/jni/src/org/sqlite/jni/capi/UpdateHookCallback.java
@@ -11,7 +11,7 @@
*************************************************************************
** This file is part of the JNI bindings for the sqlite3 C API.
*/
-package org.sqlite.jni;
+package org.sqlite.jni.capi;
/**
Callback for use with {@link CApi#sqlite3_update_hook}.
diff --git a/ext/jni/src/org/sqlite/jni/WindowFunction.java b/ext/jni/src/org/sqlite/jni/capi/WindowFunction.java
similarity index 97%
rename from ext/jni/src/org/sqlite/jni/WindowFunction.java
rename to ext/jni/src/org/sqlite/jni/capi/WindowFunction.java
index 7f70177ac0..eaf1bb9a35 100644
--- a/ext/jni/src/org/sqlite/jni/WindowFunction.java
+++ b/ext/jni/src/org/sqlite/jni/capi/WindowFunction.java
@@ -11,7 +11,7 @@
*************************************************************************
** This file is part of the JNI bindings for the sqlite3 C API.
*/
-package org.sqlite.jni;
+package org.sqlite.jni.capi;
/**
diff --git a/ext/jni/src/org/sqlite/jni/XDestroyCallback.java b/ext/jni/src/org/sqlite/jni/capi/XDestroyCallback.java
similarity index 97%
rename from ext/jni/src/org/sqlite/jni/XDestroyCallback.java
rename to ext/jni/src/org/sqlite/jni/capi/XDestroyCallback.java
index 4b547e6bc9..372e4ec8d0 100644
--- a/ext/jni/src/org/sqlite/jni/XDestroyCallback.java
+++ b/ext/jni/src/org/sqlite/jni/capi/XDestroyCallback.java
@@ -11,7 +11,7 @@
*************************************************************************
** This file declares JNI bindings for the sqlite3 C API.
*/
-package org.sqlite.jni;
+package org.sqlite.jni.capi;
/**
Callback for a hook called by SQLite when certain client-provided
diff --git a/ext/jni/src/org/sqlite/jni/package-info.java b/ext/jni/src/org/sqlite/jni/capi/package-info.java
similarity index 98%
rename from ext/jni/src/org/sqlite/jni/package-info.java
rename to ext/jni/src/org/sqlite/jni/capi/package-info.java
index d669e680f7..127f380675 100644
--- a/ext/jni/src/org/sqlite/jni/package-info.java
+++ b/ext/jni/src/org/sqlite/jni/capi/package-info.java
@@ -2,7 +2,7 @@
This package houses a JNI binding to the SQLite3 C API.
The primary interfaces are in {@link
- org.sqlite.jni.CApi}.
+ org.sqlite.jni.capi.CApi}.
API Goals and Requirements
@@ -86,4 +86,4 @@
undefined behavior.
*/
-package org.sqlite.jni;
+package org.sqlite.jni.capi;
diff --git a/ext/jni/src/org/sqlite/jni/sqlite3.java b/ext/jni/src/org/sqlite/jni/capi/sqlite3.java
similarity index 97%
rename from ext/jni/src/org/sqlite/jni/sqlite3.java
rename to ext/jni/src/org/sqlite/jni/capi/sqlite3.java
index c358e91c8f..901317f0ef 100644
--- a/ext/jni/src/org/sqlite/jni/sqlite3.java
+++ b/ext/jni/src/org/sqlite/jni/capi/sqlite3.java
@@ -11,7 +11,7 @@
*************************************************************************
** This file is part of the JNI bindings for the sqlite3 C API.
*/
-package org.sqlite.jni;
+package org.sqlite.jni.capi;
/**
A wrapper for communicating C-level (sqlite3*) instances with
diff --git a/ext/jni/src/org/sqlite/jni/sqlite3_backup.java b/ext/jni/src/org/sqlite/jni/capi/sqlite3_backup.java
similarity index 96%
rename from ext/jni/src/org/sqlite/jni/sqlite3_backup.java
rename to ext/jni/src/org/sqlite/jni/capi/sqlite3_backup.java
index 232b001818..0ef75c17eb 100644
--- a/ext/jni/src/org/sqlite/jni/sqlite3_backup.java
+++ b/ext/jni/src/org/sqlite/jni/capi/sqlite3_backup.java
@@ -11,7 +11,7 @@
*************************************************************************
** This file is part of the JNI bindings for the sqlite3 C API.
*/
-package org.sqlite.jni;
+package org.sqlite.jni.capi;
/**
A wrapper for passing C-level (sqlite3_backup*) instances around in
diff --git a/ext/jni/src/org/sqlite/jni/sqlite3_blob.java b/ext/jni/src/org/sqlite/jni/capi/sqlite3_blob.java
similarity index 96%
rename from ext/jni/src/org/sqlite/jni/sqlite3_blob.java
rename to ext/jni/src/org/sqlite/jni/capi/sqlite3_blob.java
index f84b848a40..1b96c18b06 100644
--- a/ext/jni/src/org/sqlite/jni/sqlite3_blob.java
+++ b/ext/jni/src/org/sqlite/jni/capi/sqlite3_blob.java
@@ -11,7 +11,7 @@
*************************************************************************
** This file is part of the JNI bindings for the sqlite3 C API.
*/
-package org.sqlite.jni;
+package org.sqlite.jni.capi;
/**
A wrapper for passing C-level (sqlite3_blob*) instances around in
diff --git a/ext/jni/src/org/sqlite/jni/sqlite3_context.java b/ext/jni/src/org/sqlite/jni/capi/sqlite3_context.java
similarity index 99%
rename from ext/jni/src/org/sqlite/jni/sqlite3_context.java
rename to ext/jni/src/org/sqlite/jni/capi/sqlite3_context.java
index 22bc62ab46..82ec49af16 100644
--- a/ext/jni/src/org/sqlite/jni/sqlite3_context.java
+++ b/ext/jni/src/org/sqlite/jni/capi/sqlite3_context.java
@@ -11,7 +11,7 @@
*************************************************************************
** This file is part of the JNI bindings for the sqlite3 C API.
*/
-package org.sqlite.jni;
+package org.sqlite.jni.capi;
/**
sqlite3_context instances are used in conjunction with user-defined
diff --git a/ext/jni/src/org/sqlite/jni/sqlite3_stmt.java b/ext/jni/src/org/sqlite/jni/capi/sqlite3_stmt.java
similarity index 96%
rename from ext/jni/src/org/sqlite/jni/sqlite3_stmt.java
rename to ext/jni/src/org/sqlite/jni/capi/sqlite3_stmt.java
index e773b73631..3b8b71f8a5 100644
--- a/ext/jni/src/org/sqlite/jni/sqlite3_stmt.java
+++ b/ext/jni/src/org/sqlite/jni/capi/sqlite3_stmt.java
@@ -11,7 +11,7 @@
*************************************************************************
** This file is part of the JNI bindings for the sqlite3 C API.
*/
-package org.sqlite.jni;
+package org.sqlite.jni.capi;
/**
A wrapper for communicating C-level (sqlite3_stmt*) instances with
diff --git a/ext/jni/src/org/sqlite/jni/sqlite3_value.java b/ext/jni/src/org/sqlite/jni/capi/sqlite3_value.java
similarity index 95%
rename from ext/jni/src/org/sqlite/jni/sqlite3_value.java
rename to ext/jni/src/org/sqlite/jni/capi/sqlite3_value.java
index 2cfb32ff1a..a4772f0f63 100644
--- a/ext/jni/src/org/sqlite/jni/sqlite3_value.java
+++ b/ext/jni/src/org/sqlite/jni/capi/sqlite3_value.java
@@ -11,7 +11,7 @@
*************************************************************************
** This file is part of the JNI bindings for the sqlite3 C API.
*/
-package org.sqlite.jni;
+package org.sqlite.jni.capi;
public final class sqlite3_value extends NativePointerHolder {
//! Invoked only from JNI.
diff --git a/ext/jni/src/org/sqlite/jni/fts5/Fts5Context.java b/ext/jni/src/org/sqlite/jni/fts5/Fts5Context.java
index a5b937ceb8..439b477910 100644
--- a/ext/jni/src/org/sqlite/jni/fts5/Fts5Context.java
+++ b/ext/jni/src/org/sqlite/jni/fts5/Fts5Context.java
@@ -12,7 +12,7 @@
** This file is part of the JNI bindings for the sqlite3 C API.
*/
package org.sqlite.jni.fts5;
-import org.sqlite.jni.*;
+import org.sqlite.jni.capi.*;
/**
A wrapper for communicating C-level (Fts5Context*) instances with
diff --git a/ext/jni/src/org/sqlite/jni/fts5/Fts5ExtensionApi.java b/ext/jni/src/org/sqlite/jni/fts5/Fts5ExtensionApi.java
index 7829104cd9..594f3eaad6 100644
--- a/ext/jni/src/org/sqlite/jni/fts5/Fts5ExtensionApi.java
+++ b/ext/jni/src/org/sqlite/jni/fts5/Fts5ExtensionApi.java
@@ -13,7 +13,7 @@
*/
package org.sqlite.jni.fts5;
import java.nio.charset.StandardCharsets;
-import org.sqlite.jni.*;
+import org.sqlite.jni.capi.*;
import org.sqlite.jni.annotation.*;
/**
diff --git a/ext/jni/src/org/sqlite/jni/fts5/Fts5PhraseIter.java b/ext/jni/src/org/sqlite/jni/fts5/Fts5PhraseIter.java
index 0f8f3e551b..5774eb5936 100644
--- a/ext/jni/src/org/sqlite/jni/fts5/Fts5PhraseIter.java
+++ b/ext/jni/src/org/sqlite/jni/fts5/Fts5PhraseIter.java
@@ -12,7 +12,7 @@
** This file is part of the JNI bindings for the sqlite3 C API.
*/
package org.sqlite.jni.fts5;
-import org.sqlite.jni.NativePointerHolder;
+import org.sqlite.jni.capi.NativePointerHolder;
/**
A wrapper for C-level Fts5PhraseIter. They are only modified and
diff --git a/ext/jni/src/org/sqlite/jni/fts5/Fts5Tokenizer.java b/ext/jni/src/org/sqlite/jni/fts5/Fts5Tokenizer.java
index 1992438448..b72e5d0fc0 100644
--- a/ext/jni/src/org/sqlite/jni/fts5/Fts5Tokenizer.java
+++ b/ext/jni/src/org/sqlite/jni/fts5/Fts5Tokenizer.java
@@ -12,7 +12,7 @@
** This file is part of the JNI bindings for the sqlite3 C API.
*/
package org.sqlite.jni.fts5;
-import org.sqlite.jni.NativePointerHolder;
+import org.sqlite.jni.capi.NativePointerHolder;
/**
INCOMPLETE AND COMPLETELY UNTESTED.
diff --git a/ext/jni/src/org/sqlite/jni/TesterFts5.java b/ext/jni/src/org/sqlite/jni/fts5/TesterFts5.java
similarity index 99%
rename from ext/jni/src/org/sqlite/jni/TesterFts5.java
rename to ext/jni/src/org/sqlite/jni/fts5/TesterFts5.java
index 04cc7dbcfb..c4264c5417 100644
--- a/ext/jni/src/org/sqlite/jni/TesterFts5.java
+++ b/ext/jni/src/org/sqlite/jni/fts5/TesterFts5.java
@@ -11,10 +11,10 @@
*************************************************************************
** This file contains a set of tests for the sqlite3 JNI bindings.
*/
-package org.sqlite.jni;
-import static org.sqlite.jni.CApi.*;
-import static org.sqlite.jni.Tester1.*;
-import org.sqlite.jni.*;
+package org.sqlite.jni.fts5;
+import static org.sqlite.jni.capi.CApi.*;
+import static org.sqlite.jni.capi.Tester1.*;
+import org.sqlite.jni.capi.*;
import org.sqlite.jni.fts5.*;
import java.util.*;
diff --git a/ext/jni/src/org/sqlite/jni/fts5/fts5_api.java b/ext/jni/src/org/sqlite/jni/fts5/fts5_api.java
index 3172dc8306..d7d2da430d 100644
--- a/ext/jni/src/org/sqlite/jni/fts5/fts5_api.java
+++ b/ext/jni/src/org/sqlite/jni/fts5/fts5_api.java
@@ -13,7 +13,7 @@
*/
package org.sqlite.jni.fts5;
import org.sqlite.jni.annotation.*;
-import org.sqlite.jni.*;
+import org.sqlite.jni.capi.*;
/**
A wrapper for communicating C-level (fts5_api*) instances with
diff --git a/ext/jni/src/org/sqlite/jni/fts5/fts5_extension_function.java b/ext/jni/src/org/sqlite/jni/fts5/fts5_extension_function.java
index 7ed353ac0b..5e47633baa 100644
--- a/ext/jni/src/org/sqlite/jni/fts5/fts5_extension_function.java
+++ b/ext/jni/src/org/sqlite/jni/fts5/fts5_extension_function.java
@@ -12,8 +12,8 @@
** This file is part of the JNI bindings for the sqlite3 C API.
*/
package org.sqlite.jni.fts5;
-import org.sqlite.jni.sqlite3_context;
-import org.sqlite.jni.sqlite3_value;
+import org.sqlite.jni.capi.sqlite3_context;
+import org.sqlite.jni.capi.sqlite3_value;
/**
JNI-level wrapper for C's fts5_extension_function type.
diff --git a/ext/jni/src/org/sqlite/jni/fts5/fts5_tokenizer.java b/ext/jni/src/org/sqlite/jni/fts5/fts5_tokenizer.java
index d442fe9aaa..f4ada4dc30 100644
--- a/ext/jni/src/org/sqlite/jni/fts5/fts5_tokenizer.java
+++ b/ext/jni/src/org/sqlite/jni/fts5/fts5_tokenizer.java
@@ -12,7 +12,7 @@
** This file is part of the JNI bindings for the sqlite3 C API.
*/
package org.sqlite.jni.fts5;
-import org.sqlite.jni.NativePointerHolder;
+import org.sqlite.jni.capi.NativePointerHolder;
import org.sqlite.jni.annotation.NotNull;
/**
diff --git a/ext/jni/src/org/sqlite/jni/Sqlite.java b/ext/jni/src/org/sqlite/jni/wrapper1/Sqlite.java
similarity index 96%
rename from ext/jni/src/org/sqlite/jni/Sqlite.java
rename to ext/jni/src/org/sqlite/jni/wrapper1/Sqlite.java
index 5c2c456296..aaa1fe67fc 100644
--- a/ext/jni/src/org/sqlite/jni/Sqlite.java
+++ b/ext/jni/src/org/sqlite/jni/wrapper1/Sqlite.java
@@ -11,9 +11,12 @@
*************************************************************************
** This file is part of the JNI bindings for the sqlite3 C API.
*/
-package org.sqlite.jni;
+package org.sqlite.jni.wrapper1;
import java.nio.charset.StandardCharsets;
-import static org.sqlite.jni.CApi.*;
+import static org.sqlite.jni.capi.CApi.*;
+import org.sqlite.jni.capi.sqlite3;
+import org.sqlite.jni.capi.sqlite3_stmt;
+import org.sqlite.jni.capi.OutputPointer;
/**
This class represents a database connection, analog to the C-side
diff --git a/ext/jni/src/org/sqlite/jni/SqliteException.java b/ext/jni/src/org/sqlite/jni/wrapper1/SqliteException.java
similarity index 95%
rename from ext/jni/src/org/sqlite/jni/SqliteException.java
rename to ext/jni/src/org/sqlite/jni/wrapper1/SqliteException.java
index c15cb34919..87b0d3737f 100644
--- a/ext/jni/src/org/sqlite/jni/SqliteException.java
+++ b/ext/jni/src/org/sqlite/jni/wrapper1/SqliteException.java
@@ -11,8 +11,9 @@
*************************************************************************
** This file is part of the JNI bindings for the sqlite3 C API.
*/
-package org.sqlite.jni;
-import static org.sqlite.jni.CApi.*;
+package org.sqlite.jni.wrapper1;
+import static org.sqlite.jni.capi.CApi.*;
+import org.sqlite.jni.capi.sqlite3;
/**
A wrapper for communicating C-level (sqlite3*) instances with
diff --git a/ext/jni/src/org/sqlite/jni/Tester2.java b/ext/jni/src/org/sqlite/jni/wrapper1/Tester2.java
similarity index 94%
rename from ext/jni/src/org/sqlite/jni/Tester2.java
rename to ext/jni/src/org/sqlite/jni/wrapper1/Tester2.java
index e75f56e064..435c37425d 100644
--- a/ext/jni/src/org/sqlite/jni/Tester2.java
+++ b/ext/jni/src/org/sqlite/jni/wrapper1/Tester2.java
@@ -11,15 +11,32 @@
*************************************************************************
** This file contains a set of tests for the sqlite3 JNI bindings.
*/
-package org.sqlite.jni;
-import static org.sqlite.jni.CApi.*;
+package org.sqlite.jni.wrapper1;
+import static org.sqlite.jni.capi.CApi.*;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
+import org.sqlite.jni.capi.*;
+
+/**
+ An annotation for Tester1 tests which we do not want to run in
+ reflection-driven test mode because either they are not suitable
+ for multi-threaded threaded mode or we have to control their execution
+ order.
+*/
+@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
+@java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD})
+@interface ManualTest{}
+/**
+ Annotation for Tester1 tests which mark those which must be skipped
+ in multi-threaded mode.
+*/
+@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
+@java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD})
+@interface SingleThreadOnly{}
public class Tester2 implements Runnable {
//! True when running in multi-threaded mode.
diff --git a/manifest b/manifest
index 482917dfef..2e440bcd40 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C JNI:\safter\scalling\sa\sJava-side\sUDF,\szero-out\sthe\spointer\sof\sthe\sJava-side\ssqlite3_context\sand\ssqlite3_value\sarray\sentries\sto\savoid\smisbehavior\sif\sa\sclient\smakes\sthe\smistake\sof\sholding\sa\sreference\sto\sone\sof\sthose\sobjects.
-D 2023-10-16T08:10:11.732
+C JNI:\smove\sthe\sC-style\sAPI\sparts\sinto\sthe\scapi\ssubpackage\sand\sthe\shigher-level\swrapper\sinto\s(tentatively)\swrapper1,\sso\sthat\sCApi.java\scan\ssupport\smultiple\sindependent\shigher-level\swrappers\swithout\sname\scollisions,\sand\sCApi\scan\sbe\smade\spublic\sbut\shave\sthe\soption\sto\sbe\selided\sfrom\swrapper-level\sjavadocs\sfor\swrappers\swhich\sdo\snot\swish\sto\sexpose\sit.
+D 2023-10-16T10:27:19.982
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -235,63 +235,63 @@ F ext/fts5/tool/showfts5.tcl d54da0e067306663e2d5d523965ca487698e722c
F ext/icu/README.txt 7ab7ced8ae78e3a645b57e78570ff589d4c672b71370f5aa9e1cd7024f400fc9
F ext/icu/icu.c c074519b46baa484bb5396c7e01e051034da8884bad1a1cb7f09bbe6be3f0282
F ext/icu/sqliteicu.h fa373836ed5a1ee7478bdf8a1650689294e41d0c89c1daab26e9ae78a32075a8
-F ext/jni/GNUmakefile efaf1db6e3c2bbae4067924b932ee1a0f0640e842002c0dd9f3be824c24084f5
+F ext/jni/GNUmakefile 951ced121cce68b27086ab4dd5d9c6ba493507b2aa3ad396abe3ee352fc76170
F ext/jni/README.md ef9ac115e97704ea995d743b4a8334e23c659e5534c3b64065a5405256d5f2f4
F ext/jni/jar-dist.make 030aaa4ae71dd86e4ec5e7c1e6cd86f9dfa47c4592c070d2e35157e42498e1fa
-F ext/jni/src/c/sqlite3-jni.c fa78ee087d493dba500c55797a77d57591d36be45e983b66222b9de6dd498ab9
-F ext/jni/src/c/sqlite3-jni.h e7c19450b691aeb12a1506521432144b5d07031683e0fbaad7dfcb9a0c8d69d7
-F ext/jni/src/org/sqlite/jni/AbstractCollationCallback.java 95e88ba04f4aac51ffec65693e878e234088b2f21b387f4e4285c8b72b33e436
-F ext/jni/src/org/sqlite/jni/AggregateFunction.java 7312486bc65fecdb91753c0a4515799194e031f45edbe16a6373cea18f404dc4
-F ext/jni/src/org/sqlite/jni/AuthorizerCallback.java fde5f758ad170ca45ae00b12194c8ba8d8f3090bd64cc3e002dd9c5e7dff8568
-F ext/jni/src/org/sqlite/jni/AutoExtensionCallback.java c0fbfd3779fc92982c7935325a7484dee43eeb80d716989ed31218f453addb94
-F ext/jni/src/org/sqlite/jni/BusyHandlerCallback.java 4cb7fc70efd55583fed6033c34a8719da42975ca97ef4781dda0b9f6cc8ec2e8
-F ext/jni/src/org/sqlite/jni/CApi.java ab05a2ad4237b95e96ac5acf9ce28f1432f0862546444fc2f6265b6998e14860
-F ext/jni/src/org/sqlite/jni/CallbackProxy.java 064a8a00e4c63cc501c30504f93ca996d422c5f010067f969b2d0a10f0868153
-F ext/jni/src/org/sqlite/jni/CollationCallback.java 8cf57cb014a645ecc12609eed17308852a597bc5e83d82a4fdb90f7fadc25f9d
-F ext/jni/src/org/sqlite/jni/CollationNeededCallback.java 0c62245e000d5db52576c728cac20f6a31f31f5cf40ca4cbcd64b22964e82ae5
-F ext/jni/src/org/sqlite/jni/CommitHookCallback.java d15bd87ca6159a48b281966cf7a6e67dd17e2fabf974a797c9e3a66a74f361e8
-F ext/jni/src/org/sqlite/jni/ConfigLogCallback.java 16bb391d8d4ae89cc43baa3cfa0c80c988003627b7ea872deb41156a76f7e867
-F ext/jni/src/org/sqlite/jni/ConfigSqllogCallback.java 6d6b64638123acb70ffefcd5d2345b1bea3d3b528727d1684cc20cc2357f03a0
-F ext/jni/src/org/sqlite/jni/NativePointerHolder.java 3eb36b5e81993a847f5ec03d23ab219a92671f817547b6a85d312667faeedd8b
-F ext/jni/src/org/sqlite/jni/OutputPointer.java 2f57c05672ddc9b38e3f8eed11759896cf0bf01107ffd24d5182b99f6e7254b6
-F ext/jni/src/org/sqlite/jni/PrepareMultiCallback.java 6f051951fecab41f2e842b1ac1d3c498706de9387c86f62564e2afbe03d026cb
-F ext/jni/src/org/sqlite/jni/PreupdateHookCallback.java 242dc2afea13c45b4809d41b6a919e0a4003508713ceffe5f6545270138c6a7b
-F ext/jni/src/org/sqlite/jni/ProgressHandlerCallback.java 247a47f49a1dd54fda28201c27796d2600a5c904f47fa21697a5377d49febe56
-F ext/jni/src/org/sqlite/jni/ResultCode.java dc7400b8b18df10027525d8d0f04300b2c6afc617d4d980923f8b5bb14412f3a
-F ext/jni/src/org/sqlite/jni/RollbackHookCallback.java ec6cd96bff5d3bc5af079cbf1469ae7fb34c50583a23581a58d6b2f8b55bafd3
-F ext/jni/src/org/sqlite/jni/SQLFunction.java 544a875d33fd160467d82e2397ac33157b29971d715a821a4fad3c899113ee8c
-F ext/jni/src/org/sqlite/jni/SQLTester.java d246c67f93e2fa2603bd106dbb3246ea725c987dffd6e5d42214ae262f750c68
-F ext/jni/src/org/sqlite/jni/ScalarFunction.java 6d387bb499fbe3bc13c53315335233dbf6a0c711e8fa7c521683219b041c614c
-F ext/jni/src/org/sqlite/jni/Sqlite.java 1617ea2bf3dfa493b7f031a3187cbfd6837c39bc1d406c4b3edcf9aab941639d
-F ext/jni/src/org/sqlite/jni/SqliteException.java e17500e8bca2c68c260d8d0163fe4b7dc8bd0b1b90211201325c4a5566ce75ca
-F ext/jni/src/org/sqlite/jni/TableColumnMetadata.java 54511b4297fa28dcb3f49b24035e34ced10e3fd44fd0e458e784f4d6b0096dab
-F ext/jni/src/org/sqlite/jni/Tester1.java 865cc3a23f9aeec5c70b362633037d166697f97f88eccd4024085814c4c95dbd
-F ext/jni/src/org/sqlite/jni/Tester2.java 70e005d41060e398ec0f69bd39a8e1c376fd51f81629cf25e877889ec9cb6ec6
-F ext/jni/src/org/sqlite/jni/TesterFts5.java d60fe9944a81156b3b5325dd1b0e8e92a1547468f39fd1266d06f7bb6a95fa70
-F ext/jni/src/org/sqlite/jni/TraceV2Callback.java f157edd9c72e7d2243c169061487cd7bb51a0d50f3ac976dbcbbacf748ab1fc2
-F ext/jni/src/org/sqlite/jni/UpdateHookCallback.java 959d4677a857c9079c6e96ddd10918b946d68359af6252b6f284379069ea3d27
-F ext/jni/src/org/sqlite/jni/WindowFunction.java 488980f4dbb6bdd7067d6cb9c43e4075475e51c54d9b74a5834422654b126246
-F ext/jni/src/org/sqlite/jni/XDestroyCallback.java 50c5ca124ef6c6b735a7e136e7a23a557be367e61b56d4aab5777a614ab46cc2
+F ext/jni/src/c/sqlite3-jni.c 8d32ca0598a11370a9e92a6d111f38934c225056b42b13512175acf6e37eed4c
+F ext/jni/src/c/sqlite3-jni.h b4c413a0d0c734683da1049cfcf89e35ae2719759d0656ec0f8c57188f18cab8
F ext/jni/src/org/sqlite/jni/annotation/NotNull.java a99341e88154e70447596b1af6a27c586317df41a7e0f246fd41370cd7b723b2
F ext/jni/src/org/sqlite/jni/annotation/Nullable.java 0b1879852707f752512d4db9d7edd0d8db2f0c2612316ce1c832715e012ff6ba
F ext/jni/src/org/sqlite/jni/annotation/package-info.java 977b374aed9d5853cbf3438ba3b0940abfa2ea4574f702a2448ee143b98ac3ca
+F ext/jni/src/org/sqlite/jni/capi/AbstractCollationCallback.java 1afa90d3f236f79cc7fcd2497e111992644f7596fbc8e8bcf7f1908ae00acd6c w ext/jni/src/org/sqlite/jni/AbstractCollationCallback.java
+F ext/jni/src/org/sqlite/jni/capi/AggregateFunction.java bc29e986c866c2ddbbb9f935f5b7264c1c1026864e50a4a735192864f75e37c0 w ext/jni/src/org/sqlite/jni/AggregateFunction.java
+F ext/jni/src/org/sqlite/jni/capi/AuthorizerCallback.java 7ed409d5449684616cc924534e22ff6b07d361f12ad904b69ecb10e0568a8013 w ext/jni/src/org/sqlite/jni/AuthorizerCallback.java
+F ext/jni/src/org/sqlite/jni/capi/AutoExtensionCallback.java 74cc4998a73d6563542ecb90804a3c4f4e828cb4bd69e61226d1a51f4646e759 w ext/jni/src/org/sqlite/jni/AutoExtensionCallback.java
+F ext/jni/src/org/sqlite/jni/capi/BusyHandlerCallback.java 7b8e19810c42b0ad21a04b5d8c804b32ee5905d137148703f16a75b612c380ca w ext/jni/src/org/sqlite/jni/BusyHandlerCallback.java
+F ext/jni/src/org/sqlite/jni/capi/CApi.java 82993492793fd946e2b9b9a244fe5ac39647292b449cac7453ea49031c00f517 w ext/jni/src/org/sqlite/jni/CApi.java
+F ext/jni/src/org/sqlite/jni/capi/CallbackProxy.java 0bfd6e56e8265c2f05c9207665707285534d78f8466ef0e0430c65677f00943d w ext/jni/src/org/sqlite/jni/CallbackProxy.java
+F ext/jni/src/org/sqlite/jni/capi/CollationCallback.java e29bcfc540fdd343e2f5cca4d27235113f2886acb13380686756d5cabdfd065a w ext/jni/src/org/sqlite/jni/CollationCallback.java
+F ext/jni/src/org/sqlite/jni/capi/CollationNeededCallback.java f81cf10b79c52f9b2e9247d523d29ae48863935f60420eae35f257c38c80ce95 w ext/jni/src/org/sqlite/jni/CollationNeededCallback.java
+F ext/jni/src/org/sqlite/jni/capi/CommitHookCallback.java 29c002f3c638cc80f7db1594564a262d1beb32637824c3dca2d60a224d1f71d7 w ext/jni/src/org/sqlite/jni/CommitHookCallback.java
+F ext/jni/src/org/sqlite/jni/capi/ConfigLogCallback.java b995ca412f59b631803b93aa5b3684fce62e335d1e123207084c054abfd488d4 w ext/jni/src/org/sqlite/jni/ConfigLogCallback.java
+F ext/jni/src/org/sqlite/jni/capi/ConfigSqllogCallback.java 701f2e4d8bdeb27cfbeeb56315d15b13d8752b0fdbca705f31bd4366c58d8a33 w ext/jni/src/org/sqlite/jni/ConfigSqllogCallback.java
+F ext/jni/src/org/sqlite/jni/capi/NativePointerHolder.java b7036dcb1ef1b39f1f36ac605dde0ff1a24a9a01ade6aa1a605039443e089a61 w ext/jni/src/org/sqlite/jni/NativePointerHolder.java
+F ext/jni/src/org/sqlite/jni/capi/OutputPointer.java 68f60aec7aeb5cd4e5fb83449037f668c63cb99f682ee1036cc226d0cbd909b9 w ext/jni/src/org/sqlite/jni/OutputPointer.java
+F ext/jni/src/org/sqlite/jni/capi/PrepareMultiCallback.java aca8f9fa72e3b6602bc9a7dd3ae9f5b2808103fbbee9b2749dc96c19cdc261a1 w ext/jni/src/org/sqlite/jni/PrepareMultiCallback.java
+F ext/jni/src/org/sqlite/jni/capi/PreupdateHookCallback.java 819d938e26208adde17ca4b7ddde1d8cd6915b6ab7b708249a9787beca6bd6b6 w ext/jni/src/org/sqlite/jni/PreupdateHookCallback.java
+F ext/jni/src/org/sqlite/jni/capi/ProgressHandlerCallback.java 01bc0c238eed2d5f93c73522cb7849a445cc9098c2ed1e78248fa20ed1cfde5b w ext/jni/src/org/sqlite/jni/ProgressHandlerCallback.java
+F ext/jni/src/org/sqlite/jni/capi/ResultCode.java 8141171f1bcf9f46eef303b9d3c5dc2537a25ad1628f3638398d8a60cacefa7f w ext/jni/src/org/sqlite/jni/ResultCode.java
+F ext/jni/src/org/sqlite/jni/capi/RollbackHookCallback.java 105e324d09c207100485e7667ad172e64322c62426bb49b547e9b0dc9c33f5f0 w ext/jni/src/org/sqlite/jni/RollbackHookCallback.java
+F ext/jni/src/org/sqlite/jni/capi/SQLFunction.java fef556adbc3624292423083a648bdf97fa8a4f6b3b6577c9660dd7bd6a6d3c4a w ext/jni/src/org/sqlite/jni/SQLFunction.java
+F ext/jni/src/org/sqlite/jni/capi/SQLTester.java 09bee15aa0eedac68d767ae21d9a6a62a31ade59182a3ccbf036d6463d9e30b1 w ext/jni/src/org/sqlite/jni/SQLTester.java
+F ext/jni/src/org/sqlite/jni/capi/ScalarFunction.java dee85ef2650a9c95067f5d55bd6e290e0404e6643a5d115d1a1533df21f9b5c8 w ext/jni/src/org/sqlite/jni/ScalarFunction.java
+F ext/jni/src/org/sqlite/jni/capi/TableColumnMetadata.java addf120e0e76e5be1ff2260daa7ce305ff9b5fafd64153a7a28e9d8f000a815f w ext/jni/src/org/sqlite/jni/TableColumnMetadata.java
+F ext/jni/src/org/sqlite/jni/capi/Tester1.java 8aacea90b0eed6e4e801cfba2515a66b5d602e124f1ba68fe3d2f0aa98f0f443 w ext/jni/src/org/sqlite/jni/Tester1.java
+F ext/jni/src/org/sqlite/jni/capi/TraceV2Callback.java 0a25e117a0daae3394a77f24713e36d7b44c67d6e6d30e9e1d56a63442eef723 w ext/jni/src/org/sqlite/jni/TraceV2Callback.java
+F ext/jni/src/org/sqlite/jni/capi/UpdateHookCallback.java 2766b8526bbffc4f1045f70e79f1bc1b1efe1c3e95ca06cdb8a7391032dda3b4 w ext/jni/src/org/sqlite/jni/UpdateHookCallback.java
+F ext/jni/src/org/sqlite/jni/capi/WindowFunction.java caf4396f91b2567904cf94bc538a069fd62260d975bd037d15a02a890ed1ef9e w ext/jni/src/org/sqlite/jni/WindowFunction.java
+F ext/jni/src/org/sqlite/jni/capi/XDestroyCallback.java f3abb8dd7381f53ebba909437090caf68200f06717b8a7d6aa96fa3e8133117d w ext/jni/src/org/sqlite/jni/XDestroyCallback.java
+F ext/jni/src/org/sqlite/jni/capi/package-info.java 08ff986a65d2be9162442c82d28a65ce431d826f188520717c2ecb1484d0a50e w ext/jni/src/org/sqlite/jni/package-info.java
+F ext/jni/src/org/sqlite/jni/capi/sqlite3.java 4010bbebc5bf44e2044e610786088cdee7dc155da2b333c0551492ff1cedf33b w ext/jni/src/org/sqlite/jni/sqlite3.java
+F ext/jni/src/org/sqlite/jni/capi/sqlite3_backup.java 6742b431cd4d77e8000c1f92ec66265a58414c86bf3b0b5fbcb1164e08477227 w ext/jni/src/org/sqlite/jni/sqlite3_backup.java
+F ext/jni/src/org/sqlite/jni/capi/sqlite3_blob.java f204ab6ab1263e119fe43730141a00662d80972129a5351dfb11aae5d282df36 w ext/jni/src/org/sqlite/jni/sqlite3_blob.java
+F ext/jni/src/org/sqlite/jni/capi/sqlite3_context.java f0ef982009c335c4393ffcb68051809ca1711e4f47bcb8d1d46952f22c01bc22 w ext/jni/src/org/sqlite/jni/sqlite3_context.java
+F ext/jni/src/org/sqlite/jni/capi/sqlite3_stmt.java ff579621e9bd5ffbc6b2ef9f996c12db4df6e0c8cc5697c91273e5fca279fcf8 w ext/jni/src/org/sqlite/jni/sqlite3_stmt.java
+F ext/jni/src/org/sqlite/jni/capi/sqlite3_value.java e1d62a257c13504b46d39d5c21c49cf157ad73fda00cc5f34c931aa008c37049 w ext/jni/src/org/sqlite/jni/sqlite3_value.java
F ext/jni/src/org/sqlite/jni/fts5/Fts5.java e94681023785f1eff5399f0ddc82f46b035977d350f14838db659236ebdf6b41
-F ext/jni/src/org/sqlite/jni/fts5/Fts5Context.java 7058da97059b8e156c17561a47ecd7faa0fc3e2d8c2588b9a28dbff8d06202dd
-F ext/jni/src/org/sqlite/jni/fts5/Fts5ExtensionApi.java c8e06475a6172a7cd61b2bad9cfb18b6f059ffdd2935e62856f95785a14fe0e5
-F ext/jni/src/org/sqlite/jni/fts5/Fts5PhraseIter.java 2a7f3d76a1206e6a43d4c4ed9609b294d5431cc7d8fb875d8419f76efa6e56dc
-F ext/jni/src/org/sqlite/jni/fts5/Fts5Tokenizer.java cc9a53846a168a215238af224c31cef0e8379780e36e8a5e743b00c08145cf19
+F ext/jni/src/org/sqlite/jni/fts5/Fts5Context.java 338637e6e5a2cc385d962b220f3c1f475cc371d12ae43d18ef27327b6e6225f7
+F ext/jni/src/org/sqlite/jni/fts5/Fts5ExtensionApi.java 7da0fbb5728f7c056a43e6407f13dd0c7c9c445221267786a109b987f5fc8a9d
+F ext/jni/src/org/sqlite/jni/fts5/Fts5PhraseIter.java 28045042d593a1f1b9b80d54ec77cbf1d8a1bc95e442eceefa9a3a6f56600b0e
+F ext/jni/src/org/sqlite/jni/fts5/Fts5Tokenizer.java 3c8f677ffb85b8782f865d6fcbc16200b3375d0e3c29ed541a494fde3011bf49
+F ext/jni/src/org/sqlite/jni/fts5/TesterFts5.java eaee4d641229a098eb704b96a45c9a23c6514dc39009d3611e265bab33834deb w ext/jni/src/org/sqlite/jni/TesterFts5.java
F ext/jni/src/org/sqlite/jni/fts5/XTokenizeCallback.java 1efd1220ea328a32f2d2a1b16c735864159e929480f71daad4de9d5944839167
-F ext/jni/src/org/sqlite/jni/fts5/fts5_api.java 90f09477331c371a8abe0a6504cfe094bc075b29a800be9d72a2c92a7bb49db1
-F ext/jni/src/org/sqlite/jni/fts5/fts5_extension_function.java 1fe0f5692c1d67475d12b067f0469949073446f18c56eba5ee5da6ddd06db9b9
-F ext/jni/src/org/sqlite/jni/fts5/fts5_tokenizer.java ea993738b851038c16d98576abd0db3d6028a231f075a394fb8a78c7834d0f6c
-F ext/jni/src/org/sqlite/jni/package-info.java 7d465cbdf9050761db0db6d0c542afaaad7dc67f61510860592159c48bfc40e8
-F ext/jni/src/org/sqlite/jni/sqlite3.java 4fa76f9c618264ed17ab613570076002c0b78717261b263350cd92d6d6b01242
-F ext/jni/src/org/sqlite/jni/sqlite3_backup.java 42db8b2f9cd8e9e16217273890e5d4afbb102603d7130a2cb1651f1c69c1cfa4
-F ext/jni/src/org/sqlite/jni/sqlite3_blob.java 7c341bca1856475fc3bf3697251e0cf1d737ddcb099c65d90afdc164aaddcc51
-F ext/jni/src/org/sqlite/jni/sqlite3_context.java ba8da75eaaeb557c986af3fb4dbc69501cf2b083ca33497f2c0c70dbc0a53f2c
-F ext/jni/src/org/sqlite/jni/sqlite3_stmt.java fa0703004721c49d6d08a0c1e99439fadb8cebaebf42b81ee3f427d7f950d1eb
-F ext/jni/src/org/sqlite/jni/sqlite3_value.java 3d1d4903e267bc0bc81d57d21f5e85978eff389a1a6ed46726dbe75f85e6914a
+F ext/jni/src/org/sqlite/jni/fts5/fts5_api.java a8e88c3783d21cec51b0748568a96653fead88f8f4953376178d9c7385b197ea
+F ext/jni/src/org/sqlite/jni/fts5/fts5_extension_function.java 9e2b954d210d572552b28aca523b272fae14bd41e318921b22f65b728d5bf978
+F ext/jni/src/org/sqlite/jni/fts5/fts5_tokenizer.java 92bdaa3893bd684533004d64ade23d329843f809cd0d0f4f1a2856da6e6b4d90
F ext/jni/src/org/sqlite/jni/test-script-interpreter.md f9f25126127045d051e918fe59004a1485311c50a13edbf18c79a6ff9160030e
+F ext/jni/src/org/sqlite/jni/wrapper1/Sqlite.java f05ee6c52b039bb5b65e49ac90710f58cbfc95e13e5a8d46a7fe5106d5819dad w ext/jni/src/org/sqlite/jni/Sqlite.java
+F ext/jni/src/org/sqlite/jni/wrapper1/SqliteException.java 039f6f858cd6a0f59a41f0823d638959d8f47e7098dd469c486988494d651896 w ext/jni/src/org/sqlite/jni/SqliteException.java
+F ext/jni/src/org/sqlite/jni/wrapper1/Tester2.java 7f5aa5a74ad1b01339c7fefe2a3a89b2b3a7b45449d02aa77ca353fadb5045bf w ext/jni/src/org/sqlite/jni/Tester2.java
F ext/jni/src/tests/000-000-sanity.test c3427a0e0ac84d7cbe4c95fdc1cd4b61f9ddcf43443408f3000139478c4dc745
F ext/jni/src/tests/000-001-ignored.test e17e874c6ab3c437f1293d88093cf06286083b65bf162317f91bbfd92f961b70
F ext/jni/src/tests/900-001-fts.test bf0ce17a8d082773450e91f2388f5bbb2dfa316d0b676c313c637a91198090f0
@@ -2128,8 +2128,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 2b4e53d8be42a3bc098317abd8bb58b8ddc25094d80787f784bbc896f4f7b976
-R e7086cafa37f4c64d76125756c139d05
+P 9fc3104f76a83d600beb11d91feb97bcea8bc7f7cda8cd73e7a6b81fbba879df
+R 07d421243ac464d8cea8c99cca226bef
U stephan
-Z 15d3510e65023cee802402770fb1df4a
+Z 86e6158301bdc6bca12dead7ccadc137
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 71558f81fb..82f34fe35b 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-9fc3104f76a83d600beb11d91feb97bcea8bc7f7cda8cd73e7a6b81fbba879df
\ No newline at end of file
+9fcdf96adca25cc2d2f4b75ec4eea94254fb9671c5ba63b88213d7f62dedff1b
\ No newline at end of file
From 7e540e5a2cbbc70dffeaed1877c1a5aa6fdf4d39 Mon Sep 17 00:00:00 2001
From: stephan
Date: Mon, 16 Oct 2023 10:38:34 +0000
Subject: [PATCH 34/66] JNI: cleanups in Tester2 and update the jar makefile
target to account for [9fcdf96adca2].
FossilOrigin-Name: abc82bf4b800dde1b6e6172c7be816edb391fdbed5dbd2749f54623fdf3bf8e6
---
ext/jni/GNUmakefile | 3 +-
.../src/org/sqlite/jni/wrapper1/Tester2.java | 68 +++++++-------
manifest | 90 +++++++++----------
manifest.uuid | 2 +-
4 files changed, 81 insertions(+), 82 deletions(-)
diff --git a/ext/jni/GNUmakefile b/ext/jni/GNUmakefile
index 6b09514e1c..cc53cf8d15 100644
--- a/ext/jni/GNUmakefile
+++ b/ext/jni/GNUmakefile
@@ -383,8 +383,7 @@ JAVA_FILES.jar := $(JAVA_FILES.main) $(JAVA_FILES.unittest) $(JAVA_FILES.package
CLASS_FILES.jar := $(filter-out %/package-info.class,$(JAVA_FILES.jar:.java=.class))
$(package.jar.in): $(package.dll) $(MAKEFILE)
ls -1 \
- $(dir.src.jni)/*.java $(dir.src.jni)/*.class \
- $(dir.src.jni)/annotation/*.java $(dir.src.jni)/annotation/*.class \
+ $(dir.src.jni)/*/*.java $(dir.src.jni)/*/*.class \
| sed -e 's,^$(dir.src)/,,' | sort > $@
$(package.jar): $(CLASS_FILES.jar) $(MAKEFILE) $(package.jar.in)
diff --git a/ext/jni/src/org/sqlite/jni/wrapper1/Tester2.java b/ext/jni/src/org/sqlite/jni/wrapper1/Tester2.java
index 435c37425d..73f07b1561 100644
--- a/ext/jni/src/org/sqlite/jni/wrapper1/Tester2.java
+++ b/ext/jni/src/org/sqlite/jni/wrapper1/Tester2.java
@@ -12,7 +12,7 @@
** This file contains a set of tests for the sqlite3 JNI bindings.
*/
package org.sqlite.jni.wrapper1;
-import static org.sqlite.jni.capi.CApi.*;
+//import static org.sqlite.jni.capi.CApi.*;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.ArrayList;
@@ -22,7 +22,7 @@ import java.util.concurrent.Executors;
import org.sqlite.jni.capi.*;
/**
- An annotation for Tester1 tests which we do not want to run in
+ An annotation for Tester2 tests which we do not want to run in
reflection-driven test mode because either they are not suitable
for multi-threaded threaded mode or we have to control their execution
order.
@@ -31,7 +31,7 @@ import org.sqlite.jni.capi.*;
@java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD})
@interface ManualTest{}
/**
- Annotation for Tester1 tests which mark those which must be skipped
+ Annotation for Tester2 tests which mark those which must be skipped
in multi-threaded mode.
*/
@java.lang.annotation.Retention(java.lang.annotation.RetentionPolicy.RUNTIME)
@@ -126,7 +126,7 @@ public class Tester2 implements Runnable {
@SingleThreadOnly /* because it's thread-agnostic */
private void test1(){
- affirm(sqlite3_libversion_number() == SQLITE_VERSION_NUMBER);
+ affirm(CApi.sqlite3_libversion_number() == CApi.SQLITE_VERSION_NUMBER);
}
/* Copy/paste/rename this to add new tests. */
@@ -144,9 +144,9 @@ public class Tester2 implements Runnable {
}
Sqlite openDb(String name){
- return Sqlite.open(name, SQLITE_OPEN_READWRITE|
- SQLITE_OPEN_CREATE|
- SQLITE_OPEN_EXRESCODE);
+ return Sqlite.open(name, CApi.SQLITE_OPEN_READWRITE|
+ CApi.SQLITE_OPEN_CREATE|
+ CApi.SQLITE_OPEN_EXRESCODE);
}
Sqlite openDb(){ return openDb(":memory:"); }
@@ -174,16 +174,16 @@ public class Tester2 implements Runnable {
try (Sqlite db = openDb()) {
Sqlite.Stmt stmt = db.prepare("SELECT 1");
affirm( null!=stmt.nativeHandle() );
- affirm( SQLITE_ROW == stmt.step() );
- affirm( SQLITE_DONE == stmt.step() );
+ affirm( CApi.SQLITE_ROW == stmt.step() );
+ affirm( CApi.SQLITE_DONE == stmt.step() );
stmt.reset();
- affirm( SQLITE_ROW == stmt.step() );
- affirm( SQLITE_DONE == stmt.step() );
+ affirm( CApi.SQLITE_ROW == stmt.step() );
+ affirm( CApi.SQLITE_DONE == stmt.step() );
affirm( 0 == stmt.finalizeStmt() );
affirm( null==stmt.nativeHandle() );
stmt = db.prepare("SELECT 1");
- affirm( SQLITE_ROW == stmt.step() );
+ affirm( CApi.SQLITE_ROW == stmt.step() );
affirm( 0 == stmt.finalizeStmt() )
/* getting a non-0 out of sqlite3_finalize() is tricky */;
affirm( null==stmt.nativeHandle() );
@@ -236,8 +236,8 @@ public class Tester2 implements Runnable {
listErrors.add(e);
}
}finally{
- affirm( sqlite3_java_uncache_thread() );
- affirm( !sqlite3_java_uncache_thread() );
+ affirm( CApi.sqlite3_java_uncache_thread() );
+ affirm( !CApi.sqlite3_java_uncache_thread() );
}
}
@@ -307,7 +307,7 @@ public class Tester2 implements Runnable {
}
if( sqlLog ){
- if( sqlite3_compileoption_used("ENABLE_SQLLOG") ){
+ if( CApi.sqlite3_compileoption_used("ENABLE_SQLLOG") ){
final ConfigSqllogCallback log = new ConfigSqllogCallback() {
@Override public void call(sqlite3 db, String msg, int op){
switch(op){
@@ -317,11 +317,11 @@ public class Tester2 implements Runnable {
}
}
};
- int rc = sqlite3_config( log );
+ int rc = CApi.sqlite3_config( log );
affirm( 0==rc );
- rc = sqlite3_config( (ConfigSqllogCallback)null );
+ rc = CApi.sqlite3_config( (ConfigSqllogCallback)null );
affirm( 0==rc );
- rc = sqlite3_config( log );
+ rc = CApi.sqlite3_config( log );
affirm( 0==rc );
}else{
outln("WARNING: -sqllog is not active because library was built ",
@@ -334,11 +334,11 @@ public class Tester2 implements Runnable {
outln("ConfigLogCallback: ",ResultCode.getEntryForInt(code),": ", msg);
};
};
- int rc = sqlite3_config( log );
+ int rc = CApi.sqlite3_config( log );
affirm( 0==rc );
- rc = sqlite3_config( (ConfigLogCallback)null );
+ rc = CApi.sqlite3_config( (ConfigLogCallback)null );
affirm( 0==rc );
- rc = sqlite3_config( log );
+ rc = CApi.sqlite3_config( log );
affirm( 0==rc );
}
@@ -373,33 +373,33 @@ public class Tester2 implements Runnable {
final long timeStart = System.currentTimeMillis();
int nLoop = 0;
- switch( sqlite3_threadsafe() ){ /* Sanity checking */
+ switch( CApi.sqlite3_threadsafe() ){ /* Sanity checking */
case 0:
- affirm( SQLITE_ERROR==sqlite3_config( SQLITE_CONFIG_SINGLETHREAD ),
+ affirm( CApi.SQLITE_ERROR==CApi.sqlite3_config( CApi.SQLITE_CONFIG_SINGLETHREAD ),
"Could not switch to single-thread mode." );
- affirm( SQLITE_ERROR==sqlite3_config( SQLITE_CONFIG_MULTITHREAD ),
+ affirm( CApi.SQLITE_ERROR==CApi.sqlite3_config( CApi.SQLITE_CONFIG_MULTITHREAD ),
"Could switch to multithread mode." );
- affirm( SQLITE_ERROR==sqlite3_config( SQLITE_CONFIG_SERIALIZED ),
+ affirm( CApi.SQLITE_ERROR==CApi.sqlite3_config( CApi.SQLITE_CONFIG_SERIALIZED ),
"Could not switch to serialized threading mode." );
outln("This is a single-threaded build. Not using threads.");
nThread = 1;
break;
case 1:
case 2:
- affirm( 0==sqlite3_config( SQLITE_CONFIG_SINGLETHREAD ),
+ affirm( 0==CApi.sqlite3_config( CApi.SQLITE_CONFIG_SINGLETHREAD ),
"Could not switch to single-thread mode." );
- affirm( 0==sqlite3_config( SQLITE_CONFIG_MULTITHREAD ),
+ affirm( 0==CApi.sqlite3_config( CApi.SQLITE_CONFIG_MULTITHREAD ),
"Could not switch to multithread mode." );
- affirm( 0==sqlite3_config( SQLITE_CONFIG_SERIALIZED ),
+ affirm( 0==CApi.sqlite3_config( CApi.SQLITE_CONFIG_SERIALIZED ),
"Could not switch to serialized threading mode." );
break;
default:
affirm( false, "Unhandled SQLITE_THREADSAFE value." );
}
outln("libversion_number: ",
- sqlite3_libversion_number(),"\n",
- sqlite3_libversion(),"\n",SQLITE_SOURCE_ID,"\n",
- "SQLITE_THREADSAFE=",sqlite3_threadsafe());
+ CApi.sqlite3_libversion_number(),"\n",
+ CApi.sqlite3_libversion(),"\n",CApi.SQLITE_SOURCE_ID,"\n",
+ "SQLITE_THREADSAFE=",CApi.sqlite3_threadsafe());
final boolean showLoopCount = (nRepeat>1 && nThread>1);
if( showLoopCount ){
outln("Running ",nRepeat," loop(s) with ",nThread," thread(s) each.");
@@ -444,10 +444,10 @@ public class Tester2 implements Runnable {
outln("\tAssertions checked: ",affirmCount);
outln("\tDatabases opened: ",metrics.dbOpen);
if( doSomethingForDev ){
- sqlite3_jni_internal_details();
+ CApi.sqlite3_jni_internal_details();
}
- affirm( 0==sqlite3_release_memory(1) );
- sqlite3_shutdown();
+ affirm( 0==CApi.sqlite3_release_memory(1) );
+ CApi.sqlite3_shutdown();
int nMethods = 0;
int nNatives = 0;
int nCanonical = 0;
diff --git a/manifest b/manifest
index 2e440bcd40..891a5e2aef 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C JNI:\smove\sthe\sC-style\sAPI\sparts\sinto\sthe\scapi\ssubpackage\sand\sthe\shigher-level\swrapper\sinto\s(tentatively)\swrapper1,\sso\sthat\sCApi.java\scan\ssupport\smultiple\sindependent\shigher-level\swrappers\swithout\sname\scollisions,\sand\sCApi\scan\sbe\smade\spublic\sbut\shave\sthe\soption\sto\sbe\selided\sfrom\swrapper-level\sjavadocs\sfor\swrappers\swhich\sdo\snot\swish\sto\sexpose\sit.
-D 2023-10-16T10:27:19.982
+C JNI:\scleanups\sin\sTester2\sand\supdate\sthe\sjar\smakefile\starget\sto\saccount\sfor\s[9fcdf96adca2].
+D 2023-10-16T10:38:34.125
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -235,7 +235,7 @@ F ext/fts5/tool/showfts5.tcl d54da0e067306663e2d5d523965ca487698e722c
F ext/icu/README.txt 7ab7ced8ae78e3a645b57e78570ff589d4c672b71370f5aa9e1cd7024f400fc9
F ext/icu/icu.c c074519b46baa484bb5396c7e01e051034da8884bad1a1cb7f09bbe6be3f0282
F ext/icu/sqliteicu.h fa373836ed5a1ee7478bdf8a1650689294e41d0c89c1daab26e9ae78a32075a8
-F ext/jni/GNUmakefile 951ced121cce68b27086ab4dd5d9c6ba493507b2aa3ad396abe3ee352fc76170
+F ext/jni/GNUmakefile bf7dbc177903a180aaa45540483d49185abb5e032c08773a36eb7983281b7ab0
F ext/jni/README.md ef9ac115e97704ea995d743b4a8334e23c659e5534c3b64065a5405256d5f2f4
F ext/jni/jar-dist.make 030aaa4ae71dd86e4ec5e7c1e6cd86f9dfa47c4592c070d2e35157e42498e1fa
F ext/jni/src/c/sqlite3-jni.c 8d32ca0598a11370a9e92a6d111f38934c225056b42b13512175acf6e37eed4c
@@ -243,55 +243,55 @@ F ext/jni/src/c/sqlite3-jni.h b4c413a0d0c734683da1049cfcf89e35ae2719759d0656ec0f
F ext/jni/src/org/sqlite/jni/annotation/NotNull.java a99341e88154e70447596b1af6a27c586317df41a7e0f246fd41370cd7b723b2
F ext/jni/src/org/sqlite/jni/annotation/Nullable.java 0b1879852707f752512d4db9d7edd0d8db2f0c2612316ce1c832715e012ff6ba
F ext/jni/src/org/sqlite/jni/annotation/package-info.java 977b374aed9d5853cbf3438ba3b0940abfa2ea4574f702a2448ee143b98ac3ca
-F ext/jni/src/org/sqlite/jni/capi/AbstractCollationCallback.java 1afa90d3f236f79cc7fcd2497e111992644f7596fbc8e8bcf7f1908ae00acd6c w ext/jni/src/org/sqlite/jni/AbstractCollationCallback.java
-F ext/jni/src/org/sqlite/jni/capi/AggregateFunction.java bc29e986c866c2ddbbb9f935f5b7264c1c1026864e50a4a735192864f75e37c0 w ext/jni/src/org/sqlite/jni/AggregateFunction.java
-F ext/jni/src/org/sqlite/jni/capi/AuthorizerCallback.java 7ed409d5449684616cc924534e22ff6b07d361f12ad904b69ecb10e0568a8013 w ext/jni/src/org/sqlite/jni/AuthorizerCallback.java
-F ext/jni/src/org/sqlite/jni/capi/AutoExtensionCallback.java 74cc4998a73d6563542ecb90804a3c4f4e828cb4bd69e61226d1a51f4646e759 w ext/jni/src/org/sqlite/jni/AutoExtensionCallback.java
-F ext/jni/src/org/sqlite/jni/capi/BusyHandlerCallback.java 7b8e19810c42b0ad21a04b5d8c804b32ee5905d137148703f16a75b612c380ca w ext/jni/src/org/sqlite/jni/BusyHandlerCallback.java
-F ext/jni/src/org/sqlite/jni/capi/CApi.java 82993492793fd946e2b9b9a244fe5ac39647292b449cac7453ea49031c00f517 w ext/jni/src/org/sqlite/jni/CApi.java
-F ext/jni/src/org/sqlite/jni/capi/CallbackProxy.java 0bfd6e56e8265c2f05c9207665707285534d78f8466ef0e0430c65677f00943d w ext/jni/src/org/sqlite/jni/CallbackProxy.java
-F ext/jni/src/org/sqlite/jni/capi/CollationCallback.java e29bcfc540fdd343e2f5cca4d27235113f2886acb13380686756d5cabdfd065a w ext/jni/src/org/sqlite/jni/CollationCallback.java
-F ext/jni/src/org/sqlite/jni/capi/CollationNeededCallback.java f81cf10b79c52f9b2e9247d523d29ae48863935f60420eae35f257c38c80ce95 w ext/jni/src/org/sqlite/jni/CollationNeededCallback.java
-F ext/jni/src/org/sqlite/jni/capi/CommitHookCallback.java 29c002f3c638cc80f7db1594564a262d1beb32637824c3dca2d60a224d1f71d7 w ext/jni/src/org/sqlite/jni/CommitHookCallback.java
-F ext/jni/src/org/sqlite/jni/capi/ConfigLogCallback.java b995ca412f59b631803b93aa5b3684fce62e335d1e123207084c054abfd488d4 w ext/jni/src/org/sqlite/jni/ConfigLogCallback.java
-F ext/jni/src/org/sqlite/jni/capi/ConfigSqllogCallback.java 701f2e4d8bdeb27cfbeeb56315d15b13d8752b0fdbca705f31bd4366c58d8a33 w ext/jni/src/org/sqlite/jni/ConfigSqllogCallback.java
-F ext/jni/src/org/sqlite/jni/capi/NativePointerHolder.java b7036dcb1ef1b39f1f36ac605dde0ff1a24a9a01ade6aa1a605039443e089a61 w ext/jni/src/org/sqlite/jni/NativePointerHolder.java
-F ext/jni/src/org/sqlite/jni/capi/OutputPointer.java 68f60aec7aeb5cd4e5fb83449037f668c63cb99f682ee1036cc226d0cbd909b9 w ext/jni/src/org/sqlite/jni/OutputPointer.java
-F ext/jni/src/org/sqlite/jni/capi/PrepareMultiCallback.java aca8f9fa72e3b6602bc9a7dd3ae9f5b2808103fbbee9b2749dc96c19cdc261a1 w ext/jni/src/org/sqlite/jni/PrepareMultiCallback.java
-F ext/jni/src/org/sqlite/jni/capi/PreupdateHookCallback.java 819d938e26208adde17ca4b7ddde1d8cd6915b6ab7b708249a9787beca6bd6b6 w ext/jni/src/org/sqlite/jni/PreupdateHookCallback.java
-F ext/jni/src/org/sqlite/jni/capi/ProgressHandlerCallback.java 01bc0c238eed2d5f93c73522cb7849a445cc9098c2ed1e78248fa20ed1cfde5b w ext/jni/src/org/sqlite/jni/ProgressHandlerCallback.java
-F ext/jni/src/org/sqlite/jni/capi/ResultCode.java 8141171f1bcf9f46eef303b9d3c5dc2537a25ad1628f3638398d8a60cacefa7f w ext/jni/src/org/sqlite/jni/ResultCode.java
-F ext/jni/src/org/sqlite/jni/capi/RollbackHookCallback.java 105e324d09c207100485e7667ad172e64322c62426bb49b547e9b0dc9c33f5f0 w ext/jni/src/org/sqlite/jni/RollbackHookCallback.java
-F ext/jni/src/org/sqlite/jni/capi/SQLFunction.java fef556adbc3624292423083a648bdf97fa8a4f6b3b6577c9660dd7bd6a6d3c4a w ext/jni/src/org/sqlite/jni/SQLFunction.java
-F ext/jni/src/org/sqlite/jni/capi/SQLTester.java 09bee15aa0eedac68d767ae21d9a6a62a31ade59182a3ccbf036d6463d9e30b1 w ext/jni/src/org/sqlite/jni/SQLTester.java
-F ext/jni/src/org/sqlite/jni/capi/ScalarFunction.java dee85ef2650a9c95067f5d55bd6e290e0404e6643a5d115d1a1533df21f9b5c8 w ext/jni/src/org/sqlite/jni/ScalarFunction.java
-F ext/jni/src/org/sqlite/jni/capi/TableColumnMetadata.java addf120e0e76e5be1ff2260daa7ce305ff9b5fafd64153a7a28e9d8f000a815f w ext/jni/src/org/sqlite/jni/TableColumnMetadata.java
-F ext/jni/src/org/sqlite/jni/capi/Tester1.java 8aacea90b0eed6e4e801cfba2515a66b5d602e124f1ba68fe3d2f0aa98f0f443 w ext/jni/src/org/sqlite/jni/Tester1.java
-F ext/jni/src/org/sqlite/jni/capi/TraceV2Callback.java 0a25e117a0daae3394a77f24713e36d7b44c67d6e6d30e9e1d56a63442eef723 w ext/jni/src/org/sqlite/jni/TraceV2Callback.java
-F ext/jni/src/org/sqlite/jni/capi/UpdateHookCallback.java 2766b8526bbffc4f1045f70e79f1bc1b1efe1c3e95ca06cdb8a7391032dda3b4 w ext/jni/src/org/sqlite/jni/UpdateHookCallback.java
-F ext/jni/src/org/sqlite/jni/capi/WindowFunction.java caf4396f91b2567904cf94bc538a069fd62260d975bd037d15a02a890ed1ef9e w ext/jni/src/org/sqlite/jni/WindowFunction.java
-F ext/jni/src/org/sqlite/jni/capi/XDestroyCallback.java f3abb8dd7381f53ebba909437090caf68200f06717b8a7d6aa96fa3e8133117d w ext/jni/src/org/sqlite/jni/XDestroyCallback.java
-F ext/jni/src/org/sqlite/jni/capi/package-info.java 08ff986a65d2be9162442c82d28a65ce431d826f188520717c2ecb1484d0a50e w ext/jni/src/org/sqlite/jni/package-info.java
-F ext/jni/src/org/sqlite/jni/capi/sqlite3.java 4010bbebc5bf44e2044e610786088cdee7dc155da2b333c0551492ff1cedf33b w ext/jni/src/org/sqlite/jni/sqlite3.java
-F ext/jni/src/org/sqlite/jni/capi/sqlite3_backup.java 6742b431cd4d77e8000c1f92ec66265a58414c86bf3b0b5fbcb1164e08477227 w ext/jni/src/org/sqlite/jni/sqlite3_backup.java
-F ext/jni/src/org/sqlite/jni/capi/sqlite3_blob.java f204ab6ab1263e119fe43730141a00662d80972129a5351dfb11aae5d282df36 w ext/jni/src/org/sqlite/jni/sqlite3_blob.java
-F ext/jni/src/org/sqlite/jni/capi/sqlite3_context.java f0ef982009c335c4393ffcb68051809ca1711e4f47bcb8d1d46952f22c01bc22 w ext/jni/src/org/sqlite/jni/sqlite3_context.java
-F ext/jni/src/org/sqlite/jni/capi/sqlite3_stmt.java ff579621e9bd5ffbc6b2ef9f996c12db4df6e0c8cc5697c91273e5fca279fcf8 w ext/jni/src/org/sqlite/jni/sqlite3_stmt.java
-F ext/jni/src/org/sqlite/jni/capi/sqlite3_value.java e1d62a257c13504b46d39d5c21c49cf157ad73fda00cc5f34c931aa008c37049 w ext/jni/src/org/sqlite/jni/sqlite3_value.java
+F ext/jni/src/org/sqlite/jni/capi/AbstractCollationCallback.java 1afa90d3f236f79cc7fcd2497e111992644f7596fbc8e8bcf7f1908ae00acd6c
+F ext/jni/src/org/sqlite/jni/capi/AggregateFunction.java bc29e986c866c2ddbbb9f935f5b7264c1c1026864e50a4a735192864f75e37c0
+F ext/jni/src/org/sqlite/jni/capi/AuthorizerCallback.java 7ed409d5449684616cc924534e22ff6b07d361f12ad904b69ecb10e0568a8013
+F ext/jni/src/org/sqlite/jni/capi/AutoExtensionCallback.java 74cc4998a73d6563542ecb90804a3c4f4e828cb4bd69e61226d1a51f4646e759
+F ext/jni/src/org/sqlite/jni/capi/BusyHandlerCallback.java 7b8e19810c42b0ad21a04b5d8c804b32ee5905d137148703f16a75b612c380ca
+F ext/jni/src/org/sqlite/jni/capi/CApi.java 82993492793fd946e2b9b9a244fe5ac39647292b449cac7453ea49031c00f517
+F ext/jni/src/org/sqlite/jni/capi/CallbackProxy.java 0bfd6e56e8265c2f05c9207665707285534d78f8466ef0e0430c65677f00943d
+F ext/jni/src/org/sqlite/jni/capi/CollationCallback.java e29bcfc540fdd343e2f5cca4d27235113f2886acb13380686756d5cabdfd065a
+F ext/jni/src/org/sqlite/jni/capi/CollationNeededCallback.java f81cf10b79c52f9b2e9247d523d29ae48863935f60420eae35f257c38c80ce95
+F ext/jni/src/org/sqlite/jni/capi/CommitHookCallback.java 29c002f3c638cc80f7db1594564a262d1beb32637824c3dca2d60a224d1f71d7
+F ext/jni/src/org/sqlite/jni/capi/ConfigLogCallback.java b995ca412f59b631803b93aa5b3684fce62e335d1e123207084c054abfd488d4
+F ext/jni/src/org/sqlite/jni/capi/ConfigSqllogCallback.java 701f2e4d8bdeb27cfbeeb56315d15b13d8752b0fdbca705f31bd4366c58d8a33
+F ext/jni/src/org/sqlite/jni/capi/NativePointerHolder.java b7036dcb1ef1b39f1f36ac605dde0ff1a24a9a01ade6aa1a605039443e089a61
+F ext/jni/src/org/sqlite/jni/capi/OutputPointer.java 68f60aec7aeb5cd4e5fb83449037f668c63cb99f682ee1036cc226d0cbd909b9
+F ext/jni/src/org/sqlite/jni/capi/PrepareMultiCallback.java aca8f9fa72e3b6602bc9a7dd3ae9f5b2808103fbbee9b2749dc96c19cdc261a1
+F ext/jni/src/org/sqlite/jni/capi/PreupdateHookCallback.java 819d938e26208adde17ca4b7ddde1d8cd6915b6ab7b708249a9787beca6bd6b6
+F ext/jni/src/org/sqlite/jni/capi/ProgressHandlerCallback.java 01bc0c238eed2d5f93c73522cb7849a445cc9098c2ed1e78248fa20ed1cfde5b
+F ext/jni/src/org/sqlite/jni/capi/ResultCode.java 8141171f1bcf9f46eef303b9d3c5dc2537a25ad1628f3638398d8a60cacefa7f
+F ext/jni/src/org/sqlite/jni/capi/RollbackHookCallback.java 105e324d09c207100485e7667ad172e64322c62426bb49b547e9b0dc9c33f5f0
+F ext/jni/src/org/sqlite/jni/capi/SQLFunction.java fef556adbc3624292423083a648bdf97fa8a4f6b3b6577c9660dd7bd6a6d3c4a
+F ext/jni/src/org/sqlite/jni/capi/SQLTester.java 09bee15aa0eedac68d767ae21d9a6a62a31ade59182a3ccbf036d6463d9e30b1
+F ext/jni/src/org/sqlite/jni/capi/ScalarFunction.java dee85ef2650a9c95067f5d55bd6e290e0404e6643a5d115d1a1533df21f9b5c8
+F ext/jni/src/org/sqlite/jni/capi/TableColumnMetadata.java addf120e0e76e5be1ff2260daa7ce305ff9b5fafd64153a7a28e9d8f000a815f
+F ext/jni/src/org/sqlite/jni/capi/Tester1.java 8aacea90b0eed6e4e801cfba2515a66b5d602e124f1ba68fe3d2f0aa98f0f443
+F ext/jni/src/org/sqlite/jni/capi/TraceV2Callback.java 0a25e117a0daae3394a77f24713e36d7b44c67d6e6d30e9e1d56a63442eef723
+F ext/jni/src/org/sqlite/jni/capi/UpdateHookCallback.java 2766b8526bbffc4f1045f70e79f1bc1b1efe1c3e95ca06cdb8a7391032dda3b4
+F ext/jni/src/org/sqlite/jni/capi/WindowFunction.java caf4396f91b2567904cf94bc538a069fd62260d975bd037d15a02a890ed1ef9e
+F ext/jni/src/org/sqlite/jni/capi/XDestroyCallback.java f3abb8dd7381f53ebba909437090caf68200f06717b8a7d6aa96fa3e8133117d
+F ext/jni/src/org/sqlite/jni/capi/package-info.java 08ff986a65d2be9162442c82d28a65ce431d826f188520717c2ecb1484d0a50e
+F ext/jni/src/org/sqlite/jni/capi/sqlite3.java 4010bbebc5bf44e2044e610786088cdee7dc155da2b333c0551492ff1cedf33b
+F ext/jni/src/org/sqlite/jni/capi/sqlite3_backup.java 6742b431cd4d77e8000c1f92ec66265a58414c86bf3b0b5fbcb1164e08477227
+F ext/jni/src/org/sqlite/jni/capi/sqlite3_blob.java f204ab6ab1263e119fe43730141a00662d80972129a5351dfb11aae5d282df36
+F ext/jni/src/org/sqlite/jni/capi/sqlite3_context.java f0ef982009c335c4393ffcb68051809ca1711e4f47bcb8d1d46952f22c01bc22
+F ext/jni/src/org/sqlite/jni/capi/sqlite3_stmt.java ff579621e9bd5ffbc6b2ef9f996c12db4df6e0c8cc5697c91273e5fca279fcf8
+F ext/jni/src/org/sqlite/jni/capi/sqlite3_value.java e1d62a257c13504b46d39d5c21c49cf157ad73fda00cc5f34c931aa008c37049
F ext/jni/src/org/sqlite/jni/fts5/Fts5.java e94681023785f1eff5399f0ddc82f46b035977d350f14838db659236ebdf6b41
F ext/jni/src/org/sqlite/jni/fts5/Fts5Context.java 338637e6e5a2cc385d962b220f3c1f475cc371d12ae43d18ef27327b6e6225f7
F ext/jni/src/org/sqlite/jni/fts5/Fts5ExtensionApi.java 7da0fbb5728f7c056a43e6407f13dd0c7c9c445221267786a109b987f5fc8a9d
F ext/jni/src/org/sqlite/jni/fts5/Fts5PhraseIter.java 28045042d593a1f1b9b80d54ec77cbf1d8a1bc95e442eceefa9a3a6f56600b0e
F ext/jni/src/org/sqlite/jni/fts5/Fts5Tokenizer.java 3c8f677ffb85b8782f865d6fcbc16200b3375d0e3c29ed541a494fde3011bf49
-F ext/jni/src/org/sqlite/jni/fts5/TesterFts5.java eaee4d641229a098eb704b96a45c9a23c6514dc39009d3611e265bab33834deb w ext/jni/src/org/sqlite/jni/TesterFts5.java
+F ext/jni/src/org/sqlite/jni/fts5/TesterFts5.java eaee4d641229a098eb704b96a45c9a23c6514dc39009d3611e265bab33834deb
F ext/jni/src/org/sqlite/jni/fts5/XTokenizeCallback.java 1efd1220ea328a32f2d2a1b16c735864159e929480f71daad4de9d5944839167
F ext/jni/src/org/sqlite/jni/fts5/fts5_api.java a8e88c3783d21cec51b0748568a96653fead88f8f4953376178d9c7385b197ea
F ext/jni/src/org/sqlite/jni/fts5/fts5_extension_function.java 9e2b954d210d572552b28aca523b272fae14bd41e318921b22f65b728d5bf978
F ext/jni/src/org/sqlite/jni/fts5/fts5_tokenizer.java 92bdaa3893bd684533004d64ade23d329843f809cd0d0f4f1a2856da6e6b4d90
F ext/jni/src/org/sqlite/jni/test-script-interpreter.md f9f25126127045d051e918fe59004a1485311c50a13edbf18c79a6ff9160030e
-F ext/jni/src/org/sqlite/jni/wrapper1/Sqlite.java f05ee6c52b039bb5b65e49ac90710f58cbfc95e13e5a8d46a7fe5106d5819dad w ext/jni/src/org/sqlite/jni/Sqlite.java
-F ext/jni/src/org/sqlite/jni/wrapper1/SqliteException.java 039f6f858cd6a0f59a41f0823d638959d8f47e7098dd469c486988494d651896 w ext/jni/src/org/sqlite/jni/SqliteException.java
-F ext/jni/src/org/sqlite/jni/wrapper1/Tester2.java 7f5aa5a74ad1b01339c7fefe2a3a89b2b3a7b45449d02aa77ca353fadb5045bf w ext/jni/src/org/sqlite/jni/Tester2.java
+F ext/jni/src/org/sqlite/jni/wrapper1/Sqlite.java f05ee6c52b039bb5b65e49ac90710f58cbfc95e13e5a8d46a7fe5106d5819dad
+F ext/jni/src/org/sqlite/jni/wrapper1/SqliteException.java 039f6f858cd6a0f59a41f0823d638959d8f47e7098dd469c486988494d651896
+F ext/jni/src/org/sqlite/jni/wrapper1/Tester2.java aee8301f92256ab8572043cf5de2a35afda057d2a6ff09970a2f84a90305471e
F ext/jni/src/tests/000-000-sanity.test c3427a0e0ac84d7cbe4c95fdc1cd4b61f9ddcf43443408f3000139478c4dc745
F ext/jni/src/tests/000-001-ignored.test e17e874c6ab3c437f1293d88093cf06286083b65bf162317f91bbfd92f961b70
F ext/jni/src/tests/900-001-fts.test bf0ce17a8d082773450e91f2388f5bbb2dfa316d0b676c313c637a91198090f0
@@ -2128,8 +2128,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 9fc3104f76a83d600beb11d91feb97bcea8bc7f7cda8cd73e7a6b81fbba879df
-R 07d421243ac464d8cea8c99cca226bef
+P 9fcdf96adca25cc2d2f4b75ec4eea94254fb9671c5ba63b88213d7f62dedff1b
+R 376c33c5d6d18c40ea3627a195e8192d
U stephan
-Z 86e6158301bdc6bca12dead7ccadc137
+Z 0f3f56205e0babb2af321d2f9efdae5a
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 82f34fe35b..11d064f42b 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-9fcdf96adca25cc2d2f4b75ec4eea94254fb9671c5ba63b88213d7f62dedff1b
\ No newline at end of file
+abc82bf4b800dde1b6e6172c7be816edb391fdbed5dbd2749f54623fdf3bf8e6
\ No newline at end of file
From f2d7e961d9f8f67e183328ca40262e1a7c115f8d Mon Sep 17 00:00:00 2001
From: stephan
Date: Mon, 16 Oct 2023 13:04:42 +0000
Subject: [PATCH 35/66] JNI: initial draft (untested - requires more
infrastructure first) of a UDF argument/result-handling interface which
completely hides the C-style API from the client.
FossilOrigin-Name: 43b10a5cf9cb8be53d62914f340d533e60a70bf4caa8b9b91c0f867fa0f70493
---
ext/jni/GNUmakefile | 1 +
ext/jni/src/org/sqlite/jni/capi/CApi.java | 3 +-
.../org/sqlite/jni/wrapper1/SqlFunction.java | 153 ++++++++++++++++++
.../src/org/sqlite/jni/wrapper1/Sqlite.java | 2 +-
.../sqlite/jni/wrapper1/SqliteException.java | 8 +-
manifest | 19 +--
manifest.uuid | 2 +-
7 files changed, 172 insertions(+), 16 deletions(-)
create mode 100644 ext/jni/src/org/sqlite/jni/wrapper1/SqlFunction.java
diff --git a/ext/jni/GNUmakefile b/ext/jni/GNUmakefile
index cc53cf8d15..e7f083a756 100644
--- a/ext/jni/GNUmakefile
+++ b/ext/jni/GNUmakefile
@@ -113,6 +113,7 @@ JAVA_FILES.main := $(patsubst %,$(dir.src.jni)/annotation/%,\
sqlite3_stmt.java \
sqlite3_value.java \
) $(patsubst %,$(dir.src.jni)/wrapper1/%,\
+ SqlFunction.java \
Sqlite.java \
SqliteException.java \
)
diff --git a/ext/jni/src/org/sqlite/jni/capi/CApi.java b/ext/jni/src/org/sqlite/jni/capi/CApi.java
index 051e28a899..a721844744 100644
--- a/ext/jni/src/org/sqlite/jni/capi/CApi.java
+++ b/ext/jni/src/org/sqlite/jni/capi/CApi.java
@@ -1635,7 +1635,8 @@ public final class CApi {
public static void sqlite3_result_text16(
@NotNull sqlite3_context cx, @Nullable byte[] utf16
){
- sqlite3_result_text64(cx, utf16, utf16.length, SQLITE_UTF16);
+ if(null == utf16) sqlite3_result_null(cx);
+ else sqlite3_result_text64(cx, utf16, utf16.length, SQLITE_UTF16);
}
public static void sqlite3_result_text16(
diff --git a/ext/jni/src/org/sqlite/jni/wrapper1/SqlFunction.java b/ext/jni/src/org/sqlite/jni/wrapper1/SqlFunction.java
new file mode 100644
index 0000000000..4be6dcbe23
--- /dev/null
+++ b/ext/jni/src/org/sqlite/jni/wrapper1/SqlFunction.java
@@ -0,0 +1,153 @@
+/*
+** 2023-10-16
+**
+** 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 is part of the wrapper1 interface for sqlite3.
+*/
+package org.sqlite.jni.wrapper1;
+import org.sqlite.jni.capi.CApi;
+import org.sqlite.jni.annotation.*;
+import org.sqlite.jni.capi.sqlite3_context;
+import org.sqlite.jni.capi.sqlite3_value;
+
+/**
+ EXPERIMENTAL/INCOMPLETE/UNTESTED
+*/
+public interface SqlFunction {
+
+ /**
+ EXPERIMENTAL/INCOMPLETE/UNTESTED. An attempt at hiding UDF-side
+ uses of the sqlite3_context and sqlite3_value classes from a
+ high-level wrapper. This level of indirection requires more than
+ twice as much Java code (in this API, not client-side) as using
+ the lower-level API. Client-side it's roughly the same amount of
+ code.
+ */
+ public final static class Arguments implements Iterable{
+ private final sqlite3_context cx;
+ private final sqlite3_value args[];
+
+ /**
+ Must be passed the context and arguments for the UDF call this
+ object is wrapping.
+ */
+ Arguments(@NotNull sqlite3_context cx, @NotNull sqlite3_value args[]){
+ this.cx = cx;
+ this.args = args;
+ }
+
+ /**
+ Wrapper for a single SqlFunction argument. Primarily intended
+ for eventual use with the Arguments class's Iterable interface.
+ */
+ public final static class Arg {
+ private final Arguments a;
+ private final int ndx;
+ /* Only for use by the Arguments class. */
+ private Arg(@NotNull Arguments a, int ndx){
+ this.a = a;
+ this.ndx = ndx;
+ }
+ /** Returns this argument's index in its parent argument list. */
+ public int getIndex(){return ndx;}
+
+ public int getInt(){return a.getInt(ndx);}
+ public long getInt64(){return a.getInt64(ndx);}
+ public double getDouble(){return a.getDouble(ndx);}
+ public byte[] getBlob(){return a.getBlob(ndx);}
+ public byte[] getText(){return a.getText(ndx);}
+ public String getText16(){return a.getText16(ndx);}
+ public int getBytes(){return a.getBytes(ndx);}
+ public int getBytes16(){return a.getBytes16(ndx);}
+ public Object getObject(){return a.getObject(ndx);}
+ public T getObjectCasted(Class type){ return a.getObjectCasted(ndx, type); }
+ public int getType(){return a.getType(ndx);}
+ public Object getAuxData(){return a.getAuxData(ndx);}
+ public void setAuxData(Object o){a.setAuxData(ndx, o);}
+ }
+
+ //! Untested!
+ @Override
+ public java.util.Iterator iterator(){
+ Arg[] proxies = new Arg[args.length];
+ for( int i = 0; i < args.length; ++i ){
+ proxies[i] = new Arg(this, i);
+ }
+ return java.util.Arrays.stream(proxies).iterator();
+ }
+
+ /**
+ Returns the sqlite3_value at the given argument index or throws
+ an IllegalArgumentException exception if ndx is out of range.
+ */
+ private sqlite3_value valueAt(int ndx){
+ if(ndx<0 || ndx>=args.length){
+ throw new IllegalArgumentException(
+ "SQL function argument index "+ndx+" is out of range."
+ );
+ }
+ return args[ndx];
+ }
+
+ public int getArgCount(){ return args.length; }
+
+ public int getInt(int arg){return CApi.sqlite3_value_int(valueAt(arg));}
+ public long getInt64(int arg){return CApi.sqlite3_value_int64(valueAt(arg));}
+ public double getDouble(int arg){return CApi.sqlite3_value_double(valueAt(arg));}
+ public byte[] getBlob(int arg){return CApi.sqlite3_value_blob(valueAt(arg));}
+ public byte[] getText(int arg){return CApi.sqlite3_value_text(valueAt(arg));}
+ public String getText16(int arg){return CApi.sqlite3_value_text16(valueAt(arg));}
+ public int getBytes(int arg){return CApi.sqlite3_value_bytes(valueAt(arg));}
+ public int getBytes16(int arg){return CApi.sqlite3_value_bytes16(valueAt(arg));}
+ public Object getObject(int arg){return CApi.sqlite3_value_java_object(valueAt(arg));}
+ public T getObjectCasted(int arg, Class type){
+ return CApi.sqlite3_value_java_casted(valueAt(arg), type);
+ }
+
+ public int getType(int arg){return CApi.sqlite3_value_type(valueAt(arg));}
+
+ public void resultInt(int v){ CApi.sqlite3_result_int(cx, v); }
+ public void resultInt64(long v){ CApi.sqlite3_result_int64(cx, v); }
+ public void resultDouble(double v){ CApi.sqlite3_result_double(cx, v); }
+ public void resultError(String msg){CApi.sqlite3_result_error(cx, msg);}
+ public void resultError(Exception e){CApi.sqlite3_result_error(cx, e);}
+ public void resultErrorTooBig(){CApi.sqlite3_result_error_toobig(cx);}
+ public void resultErrorCode(int rc){CApi.sqlite3_result_error_code(cx, rc);}
+ public void resultObject(Object o){CApi.sqlite3_result_java_object(cx, o);}
+ public void resultArg(int argNdx){CApi.sqlite3_result_value(cx, valueAt(argNdx));}
+ public void resultZeroBlob(long n){
+ // Throw on error? If n is too big,
+ // sqlite3_result_error_toobig() is automatically called.
+ CApi.sqlite3_result_zeroblob64(cx, n);
+ }
+
+ public void resultBlob(byte[] blob){CApi.sqlite3_result_blob(cx, blob);}
+ public void resultText(byte[] utf8){CApi.sqlite3_result_text(cx, utf8);}
+ public void resultText(String txt){CApi.sqlite3_result_text(cx, txt);}
+ public void resultText16(byte[] utf16){CApi.sqlite3_result_text16(cx, utf16);}
+ public void resultText16(String txt){CApi.sqlite3_result_text16(cx, txt);}
+
+ public void setAuxData(int arg, Object o){
+ /* From the API docs: https://www.sqlite.org/c3ref/get_auxdata.html
+
+ The value of the N parameter to these interfaces should be
+ non-negative. Future enhancements may make use of negative N
+ values to define new kinds of function caching behavior.
+ */
+ valueAt(arg);
+ CApi.sqlite3_set_auxdata(cx, arg, o);
+ }
+
+ public Object getAuxData(int arg){
+ valueAt(arg);
+ return CApi.sqlite3_get_auxdata(cx, arg);
+ }
+ }
+}
diff --git a/ext/jni/src/org/sqlite/jni/wrapper1/Sqlite.java b/ext/jni/src/org/sqlite/jni/wrapper1/Sqlite.java
index aaa1fe67fc..b6a4bda108 100644
--- a/ext/jni/src/org/sqlite/jni/wrapper1/Sqlite.java
+++ b/ext/jni/src/org/sqlite/jni/wrapper1/Sqlite.java
@@ -9,7 +9,7 @@
** May you share freely, never taking more than you give.
**
*************************************************************************
-** This file is part of the JNI bindings for the sqlite3 C API.
+** This file is part of the wrapper1 interface for sqlite3.
*/
package org.sqlite.jni.wrapper1;
import java.nio.charset.StandardCharsets;
diff --git a/ext/jni/src/org/sqlite/jni/wrapper1/SqliteException.java b/ext/jni/src/org/sqlite/jni/wrapper1/SqliteException.java
index 87b0d3737f..111f004db4 100644
--- a/ext/jni/src/org/sqlite/jni/wrapper1/SqliteException.java
+++ b/ext/jni/src/org/sqlite/jni/wrapper1/SqliteException.java
@@ -9,7 +9,7 @@
** May you share freely, never taking more than you give.
**
*************************************************************************
-** This file is part of the JNI bindings for the sqlite3 C API.
+** This file is part of the wrapper1 interface for sqlite3.
*/
package org.sqlite.jni.wrapper1;
import static org.sqlite.jni.capi.CApi.*;
@@ -54,7 +54,7 @@ public final class SqliteException extends java.lang.RuntimeException {
a failed db-open operation, and the place(s) where that can
happen are inside this library, not client-level code.
*/
- public SqliteException(sqlite3 db){
+ SqliteException(sqlite3 db){
super(sqlite3_errmsg(db));
errCode = sqlite3_errcode(db);
xerrCode = sqlite3_extended_errcode(db);
@@ -63,8 +63,8 @@ public final class SqliteException extends java.lang.RuntimeException {
}
/**
- Records the current error state of db (which must not be null and must
- refer to an open database) then closes it.
+ Records the current error state of db (which must not be null and
+ must refer to an open database).
*/
public SqliteException(Sqlite db){
this(db.nativeHandle());
diff --git a/manifest b/manifest
index 891a5e2aef..978dd1cded 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C JNI:\scleanups\sin\sTester2\sand\supdate\sthe\sjar\smakefile\starget\sto\saccount\sfor\s[9fcdf96adca2].
-D 2023-10-16T10:38:34.125
+C JNI:\sinitial\sdraft\s(untested\s-\srequires\smore\sinfrastructure\sfirst)\sof\sa\sUDF\sargument/result-handling\sinterface\swhich\scompletely\shides\sthe\sC-style\sAPI\sfrom\sthe\sclient.
+D 2023-10-16T13:04:42.394
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -235,7 +235,7 @@ F ext/fts5/tool/showfts5.tcl d54da0e067306663e2d5d523965ca487698e722c
F ext/icu/README.txt 7ab7ced8ae78e3a645b57e78570ff589d4c672b71370f5aa9e1cd7024f400fc9
F ext/icu/icu.c c074519b46baa484bb5396c7e01e051034da8884bad1a1cb7f09bbe6be3f0282
F ext/icu/sqliteicu.h fa373836ed5a1ee7478bdf8a1650689294e41d0c89c1daab26e9ae78a32075a8
-F ext/jni/GNUmakefile bf7dbc177903a180aaa45540483d49185abb5e032c08773a36eb7983281b7ab0
+F ext/jni/GNUmakefile 069399d471af948a4293e79135907a8d58daa09e59b4cc1b9cc1a5124c87f589
F ext/jni/README.md ef9ac115e97704ea995d743b4a8334e23c659e5534c3b64065a5405256d5f2f4
F ext/jni/jar-dist.make 030aaa4ae71dd86e4ec5e7c1e6cd86f9dfa47c4592c070d2e35157e42498e1fa
F ext/jni/src/c/sqlite3-jni.c 8d32ca0598a11370a9e92a6d111f38934c225056b42b13512175acf6e37eed4c
@@ -248,7 +248,7 @@ F ext/jni/src/org/sqlite/jni/capi/AggregateFunction.java bc29e986c866c2ddbbb9f93
F ext/jni/src/org/sqlite/jni/capi/AuthorizerCallback.java 7ed409d5449684616cc924534e22ff6b07d361f12ad904b69ecb10e0568a8013
F ext/jni/src/org/sqlite/jni/capi/AutoExtensionCallback.java 74cc4998a73d6563542ecb90804a3c4f4e828cb4bd69e61226d1a51f4646e759
F ext/jni/src/org/sqlite/jni/capi/BusyHandlerCallback.java 7b8e19810c42b0ad21a04b5d8c804b32ee5905d137148703f16a75b612c380ca
-F ext/jni/src/org/sqlite/jni/capi/CApi.java 82993492793fd946e2b9b9a244fe5ac39647292b449cac7453ea49031c00f517
+F ext/jni/src/org/sqlite/jni/capi/CApi.java 5d754b4bb57852d006ad046b2860eb23ba406f800846460b26beee5172df4fc3
F ext/jni/src/org/sqlite/jni/capi/CallbackProxy.java 0bfd6e56e8265c2f05c9207665707285534d78f8466ef0e0430c65677f00943d
F ext/jni/src/org/sqlite/jni/capi/CollationCallback.java e29bcfc540fdd343e2f5cca4d27235113f2886acb13380686756d5cabdfd065a
F ext/jni/src/org/sqlite/jni/capi/CollationNeededCallback.java f81cf10b79c52f9b2e9247d523d29ae48863935f60420eae35f257c38c80ce95
@@ -289,8 +289,9 @@ F ext/jni/src/org/sqlite/jni/fts5/fts5_api.java a8e88c3783d21cec51b0748568a96653
F ext/jni/src/org/sqlite/jni/fts5/fts5_extension_function.java 9e2b954d210d572552b28aca523b272fae14bd41e318921b22f65b728d5bf978
F ext/jni/src/org/sqlite/jni/fts5/fts5_tokenizer.java 92bdaa3893bd684533004d64ade23d329843f809cd0d0f4f1a2856da6e6b4d90
F ext/jni/src/org/sqlite/jni/test-script-interpreter.md f9f25126127045d051e918fe59004a1485311c50a13edbf18c79a6ff9160030e
-F ext/jni/src/org/sqlite/jni/wrapper1/Sqlite.java f05ee6c52b039bb5b65e49ac90710f58cbfc95e13e5a8d46a7fe5106d5819dad
-F ext/jni/src/org/sqlite/jni/wrapper1/SqliteException.java 039f6f858cd6a0f59a41f0823d638959d8f47e7098dd469c486988494d651896
+F ext/jni/src/org/sqlite/jni/wrapper1/SqlFunction.java 40a9f4f8a7a72b90b12baa82d26ba16376a5758009739b069c1863201770e816
+F ext/jni/src/org/sqlite/jni/wrapper1/Sqlite.java 2bc90edc4c25225e018ed600b5eff43ba0485be85db08f8b6b35246372fdac20
+F ext/jni/src/org/sqlite/jni/wrapper1/SqliteException.java 1386f7b753134fc12253ce2fbbc448ba8c970567fac01a3356cb672e14408d73
F ext/jni/src/org/sqlite/jni/wrapper1/Tester2.java aee8301f92256ab8572043cf5de2a35afda057d2a6ff09970a2f84a90305471e
F ext/jni/src/tests/000-000-sanity.test c3427a0e0ac84d7cbe4c95fdc1cd4b61f9ddcf43443408f3000139478c4dc745
F ext/jni/src/tests/000-001-ignored.test e17e874c6ab3c437f1293d88093cf06286083b65bf162317f91bbfd92f961b70
@@ -2128,8 +2129,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 9fcdf96adca25cc2d2f4b75ec4eea94254fb9671c5ba63b88213d7f62dedff1b
-R 376c33c5d6d18c40ea3627a195e8192d
+P abc82bf4b800dde1b6e6172c7be816edb391fdbed5dbd2749f54623fdf3bf8e6
+R 287c21329f3772a974832101be3bffee
U stephan
-Z 0f3f56205e0babb2af321d2f9efdae5a
+Z a4e77b564ffa0b3970c5e65a1253c53d
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 11d064f42b..2eac8e0f45 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-abc82bf4b800dde1b6e6172c7be816edb391fdbed5dbd2749f54623fdf3bf8e6
\ No newline at end of file
+43b10a5cf9cb8be53d62914f340d533e60a70bf4caa8b9b91c0f867fa0f70493
\ No newline at end of file
From 626d0a9fda410efcf405ed8bb6f7b00acee80207 Mon Sep 17 00:00:00 2001
From: stephan
Date: Mon, 16 Oct 2023 14:31:13 +0000
Subject: [PATCH 36/66] JNI: add scalar UDF support to the wrapper1 API.
FossilOrigin-Name: a850535766d2243d9475e1523c753615875a2da9c9d82a41a9fb61b141c6334a
---
.../org/sqlite/jni/capi/ScalarFunction.java | 2 +-
.../org/sqlite/jni/wrapper1/SqlFunction.java | 31 ++++++
.../src/org/sqlite/jni/wrapper1/Sqlite.java | 27 +++++-
.../src/org/sqlite/jni/wrapper1/Tester2.java | 95 ++++++++++++++++++-
manifest | 18 ++--
manifest.uuid | 2 +-
6 files changed, 156 insertions(+), 19 deletions(-)
diff --git a/ext/jni/src/org/sqlite/jni/capi/ScalarFunction.java b/ext/jni/src/org/sqlite/jni/capi/ScalarFunction.java
index f517b3610c..95541bdcba 100644
--- a/ext/jni/src/org/sqlite/jni/capi/ScalarFunction.java
+++ b/ext/jni/src/org/sqlite/jni/capi/ScalarFunction.java
@@ -27,7 +27,7 @@ public abstract class ScalarFunction implements SQLFunction {
/**
Optionally override to be notified when the UDF is finalized by
- SQLite. This implementation does nothing.
+ SQLite. This default implementation does nothing.
*/
public void xDestroy() {}
}
diff --git a/ext/jni/src/org/sqlite/jni/wrapper1/SqlFunction.java b/ext/jni/src/org/sqlite/jni/wrapper1/SqlFunction.java
index 4be6dcbe23..6851bf8379 100644
--- a/ext/jni/src/org/sqlite/jni/wrapper1/SqlFunction.java
+++ b/ext/jni/src/org/sqlite/jni/wrapper1/SqlFunction.java
@@ -33,6 +33,7 @@ public interface SqlFunction {
public final static class Arguments implements Iterable{
private final sqlite3_context cx;
private final sqlite3_value args[];
+ public final int length;
/**
Must be passed the context and arguments for the UDF call this
@@ -41,6 +42,7 @@ public interface SqlFunction {
Arguments(@NotNull sqlite3_context cx, @NotNull sqlite3_value args[]){
this.cx = cx;
this.args = args;
+ this.length = args.length;
}
/**
@@ -112,6 +114,11 @@ public interface SqlFunction {
}
public int getType(int arg){return CApi.sqlite3_value_type(valueAt(arg));}
+ public int getSubtype(int arg){return CApi.sqlite3_value_subtype(valueAt(arg));}
+ public int getNumericType(int arg){return CApi.sqlite3_value_numeric_type(valueAt(arg));}
+ public int getNoChange(int arg){return CApi.sqlite3_value_nochange(valueAt(arg));}
+ public boolean getFromBind(int arg){return CApi.sqlite3_value_frombind(valueAt(arg));}
+ public int getEncoding(int arg){return CApi.sqlite3_value_encoding(valueAt(arg));}
public void resultInt(int v){ CApi.sqlite3_result_int(cx, v); }
public void resultInt64(long v){ CApi.sqlite3_result_int64(cx, v); }
@@ -121,6 +128,7 @@ public interface SqlFunction {
public void resultErrorTooBig(){CApi.sqlite3_result_error_toobig(cx);}
public void resultErrorCode(int rc){CApi.sqlite3_result_error_code(cx, rc);}
public void resultObject(Object o){CApi.sqlite3_result_java_object(cx, o);}
+ public void resultNull(){CApi.sqlite3_result_null(cx);}
public void resultArg(int argNdx){CApi.sqlite3_result_value(cx, valueAt(argNdx));}
public void resultZeroBlob(long n){
// Throw on error? If n is too big,
@@ -150,4 +158,27 @@ public interface SqlFunction {
return CApi.sqlite3_get_auxdata(cx, arg);
}
}
+
+ /**
+ Internal-use adapter for wrapping this package's ScalarFunction
+ for use with the org.sqlite.jni.capi.ScalarFunction interface.
+ */
+ static final class ScalarAdapter extends org.sqlite.jni.capi.ScalarFunction {
+ final ScalarFunction impl;
+ ScalarAdapter(ScalarFunction impl){
+ this.impl = impl;
+ }
+ /**
+ Proxies this.f.xFunc(), adapting the call arguments to that
+ function's signature.
+ */
+ public void xFunc(sqlite3_context cx, sqlite3_value[] args){
+ impl.xFunc( new SqlFunction.Arguments(cx, args) );
+ }
+
+ public void xDestroy(){
+ impl.xDestroy();
+ }
+ }
+
}
diff --git a/ext/jni/src/org/sqlite/jni/wrapper1/Sqlite.java b/ext/jni/src/org/sqlite/jni/wrapper1/Sqlite.java
index b6a4bda108..7321d7bb36 100644
--- a/ext/jni/src/org/sqlite/jni/wrapper1/Sqlite.java
+++ b/ext/jni/src/org/sqlite/jni/wrapper1/Sqlite.java
@@ -14,6 +14,7 @@
package org.sqlite.jni.wrapper1;
import java.nio.charset.StandardCharsets;
import static org.sqlite.jni.capi.CApi.*;
+import org.sqlite.jni.capi.CApi;
import org.sqlite.jni.capi.sqlite3;
import org.sqlite.jni.capi.sqlite3_stmt;
import org.sqlite.jni.capi.OutputPointer;
@@ -71,14 +72,16 @@ public final class Sqlite implements AutoCloseable {
/**
Returns this object's underlying native db handle, or null if
- this instance has been closed.
+ this instance has been closed. This is very specifically not
+ public.
*/
sqlite3 nativeHandle(){ return this.db; }
- private void affirmOpen(){
+ private sqlite3 affirmOpen(){
if( null==db || 0==db.getNativePointer() ){
throw new IllegalArgumentException("This database instance is closed.");
}
+ return this.db;
}
// private byte[] stringToUtf8(String s){
@@ -91,6 +94,10 @@ public final class Sqlite implements AutoCloseable {
}
}
+ /**
+ Corresponds to the sqlite3_stmt class. Use Sqlite.prepare() to
+ create new instances.
+ */
public final class Stmt implements AutoCloseable {
private Sqlite _db = null;
private sqlite3_stmt stmt = null;
@@ -114,7 +121,7 @@ public final class Sqlite implements AutoCloseable {
/**
Corresponds to sqlite3_finalize(), but we cannot override the
name finalize() here because this one requires a different
- signature. We do not throw on error here because "destructors
+ signature. It does not throw on error here because "destructors
do not throw." If it returns non-0, the object is still
finalized.
*/
@@ -178,9 +185,8 @@ public final class Sqlite implements AutoCloseable {
rather than the sqlite3_stmt class.
*/
public Stmt prepare(String sql, int prepFlags){
- affirmOpen();
final OutputPointer.sqlite3_stmt out = new OutputPointer.sqlite3_stmt();
- final int rc = sqlite3_prepare_v3(this.db, sql, prepFlags, out);
+ final int rc = sqlite3_prepare_v3(affirmOpen(), sql, prepFlags, out);
affirmRcOk(rc);
return new Stmt(this, out.take());
}
@@ -189,4 +195,15 @@ public final class Sqlite implements AutoCloseable {
return prepare(sql, 0);
}
+
+ public void createFunction(String name, int nArg, int eTextRep, ScalarFunction f ){
+ int rc = CApi.sqlite3_create_function(affirmOpen(), name, nArg, eTextRep,
+ new SqlFunction.ScalarAdapter(f));
+ if( 0!=rc ) throw new SqliteException(db);
+ }
+
+ public void createFunction(String name, int nArg, ScalarFunction f){
+ this.createFunction(name, nArg, CApi.SQLITE_UTF8, f);
+ }
+
}
diff --git a/ext/jni/src/org/sqlite/jni/wrapper1/Tester2.java b/ext/jni/src/org/sqlite/jni/wrapper1/Tester2.java
index 73f07b1561..07a43b63dd 100644
--- a/ext/jni/src/org/sqlite/jni/wrapper1/Tester2.java
+++ b/ext/jni/src/org/sqlite/jni/wrapper1/Tester2.java
@@ -38,6 +38,17 @@ import org.sqlite.jni.capi.*;
@java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD})
@interface SingleThreadOnly{}
+/**
+ A helper class which simply holds a single value. Its current use
+ is for communicating values out of anonymous classes, as doing so
+ requires a "final" reference.
+*/
+class ValueHolder {
+ public T value;
+ public ValueHolder(){}
+ public ValueHolder(T v){value = v;}
+}
+
public class Tester2 implements Runnable {
//! True when running in multi-threaded mode.
private static boolean mtMode = false;
@@ -124,6 +135,56 @@ public class Tester2 implements Runnable {
affirm(v, "Affirmation failed.");
}
+
+ public static void execSql(Sqlite db, String[] sql){
+ execSql(db, String.join("", sql));
+ }
+
+ public static int execSql(Sqlite dbw, boolean throwOnError, String sql){
+ final sqlite3 db = dbw.nativeHandle();
+ OutputPointer.Int32 oTail = new OutputPointer.Int32();
+ final byte[] sqlUtf8 = sql.getBytes(StandardCharsets.UTF_8);
+ int pos = 0, n = 1;
+ byte[] sqlChunk = sqlUtf8;
+ int rc = 0;
+ sqlite3_stmt stmt = null;
+ final OutputPointer.sqlite3_stmt outStmt = new OutputPointer.sqlite3_stmt();
+ while(pos < sqlChunk.length){
+ if(pos > 0){
+ sqlChunk = Arrays.copyOfRange(sqlChunk, pos,
+ sqlChunk.length);
+ }
+ if( 0==sqlChunk.length ) break;
+ rc = CApi.sqlite3_prepare_v2(db, sqlChunk, outStmt, oTail);
+ if(throwOnError) affirm(0 == rc);
+ else if( 0!=rc ) break;
+ pos = oTail.value;
+ stmt = outStmt.take();
+ if( null == stmt ){
+ // empty statement was parsed.
+ continue;
+ }
+ affirm(0 != stmt.getNativePointer());
+ while( CApi.SQLITE_ROW == (rc = CApi.sqlite3_step(stmt)) ){
+ }
+ CApi.sqlite3_finalize(stmt);
+ affirm(0 == stmt.getNativePointer());
+ if(0!=rc && CApi.SQLITE_ROW!=rc && CApi.SQLITE_DONE!=rc){
+ break;
+ }
+ }
+ CApi.sqlite3_finalize(stmt);
+ if(CApi.SQLITE_ROW==rc || CApi.SQLITE_DONE==rc) rc = 0;
+ if( 0!=rc && throwOnError){
+ throw new SqliteException(db);
+ }
+ return rc;
+ }
+
+ static void execSql(Sqlite db, String sql){
+ execSql(db, true, sql);
+ }
+
@SingleThreadOnly /* because it's thread-agnostic */
private void test1(){
affirm(CApi.sqlite3_libversion_number() == CApi.SQLITE_VERSION_NUMBER);
@@ -144,9 +205,11 @@ public class Tester2 implements Runnable {
}
Sqlite openDb(String name){
- return Sqlite.open(name, CApi.SQLITE_OPEN_READWRITE|
- CApi.SQLITE_OPEN_CREATE|
- CApi.SQLITE_OPEN_EXRESCODE);
+ final Sqlite db = Sqlite.open(name, CApi.SQLITE_OPEN_READWRITE|
+ CApi.SQLITE_OPEN_CREATE|
+ CApi.SQLITE_OPEN_EXRESCODE);
+ ++metrics.dbOpen;
+ return db;
}
Sqlite openDb(){ return openDb(":memory:"); }
@@ -190,6 +253,32 @@ public class Tester2 implements Runnable {
}
}
+ void testUdfScalar(){
+ final ValueHolder xDestroyCalled = new ValueHolder<>(0);
+ try (Sqlite db = openDb()) {
+ execSql(db, "create table t(a); insert into t(a) values(1),(2),(3)");
+ final ValueHolder vh = new ValueHolder<>(0);
+ final ScalarFunction f = new ScalarFunction(){
+ public void xFunc(SqlFunction.Arguments args){
+ for( SqlFunction.Arguments.Arg arg : args ){
+ vh.value += arg.getInt();
+ }
+ }
+ public void xDestroy(){
+ ++xDestroyCalled.value;
+ }
+ };
+ db.createFunction("myfunc", -1, f);
+ execSql(db, "select myfunc(1,2,3)");
+ affirm( 6 == vh.value );
+ vh.value = 0;
+ execSql(db, "select myfunc(-1,-2,-3)");
+ affirm( -6 == vh.value );
+ affirm( 0 == xDestroyCalled.value );
+ }
+ affirm( 1 == xDestroyCalled.value );
+ }
+
private void runTests(boolean fromThread) throws Exception {
List mlist = testMethods;
affirm( null!=mlist );
diff --git a/manifest b/manifest
index 978dd1cded..1fb9230659 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C JNI:\sinitial\sdraft\s(untested\s-\srequires\smore\sinfrastructure\sfirst)\sof\sa\sUDF\sargument/result-handling\sinterface\swhich\scompletely\shides\sthe\sC-style\sAPI\sfrom\sthe\sclient.
-D 2023-10-16T13:04:42.394
+C JNI:\sadd\sscalar\sUDF\ssupport\sto\sthe\swrapper1\sAPI.
+D 2023-10-16T14:31:13.824
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -264,7 +264,7 @@ F ext/jni/src/org/sqlite/jni/capi/ResultCode.java 8141171f1bcf9f46eef303b9d3c5dc
F ext/jni/src/org/sqlite/jni/capi/RollbackHookCallback.java 105e324d09c207100485e7667ad172e64322c62426bb49b547e9b0dc9c33f5f0
F ext/jni/src/org/sqlite/jni/capi/SQLFunction.java fef556adbc3624292423083a648bdf97fa8a4f6b3b6577c9660dd7bd6a6d3c4a
F ext/jni/src/org/sqlite/jni/capi/SQLTester.java 09bee15aa0eedac68d767ae21d9a6a62a31ade59182a3ccbf036d6463d9e30b1
-F ext/jni/src/org/sqlite/jni/capi/ScalarFunction.java dee85ef2650a9c95067f5d55bd6e290e0404e6643a5d115d1a1533df21f9b5c8
+F ext/jni/src/org/sqlite/jni/capi/ScalarFunction.java 93b9700fca4c68075ccab12fe0fbbc76c91cafc9f368e835b9bd7cd7732c8615
F ext/jni/src/org/sqlite/jni/capi/TableColumnMetadata.java addf120e0e76e5be1ff2260daa7ce305ff9b5fafd64153a7a28e9d8f000a815f
F ext/jni/src/org/sqlite/jni/capi/Tester1.java 8aacea90b0eed6e4e801cfba2515a66b5d602e124f1ba68fe3d2f0aa98f0f443
F ext/jni/src/org/sqlite/jni/capi/TraceV2Callback.java 0a25e117a0daae3394a77f24713e36d7b44c67d6e6d30e9e1d56a63442eef723
@@ -289,10 +289,10 @@ F ext/jni/src/org/sqlite/jni/fts5/fts5_api.java a8e88c3783d21cec51b0748568a96653
F ext/jni/src/org/sqlite/jni/fts5/fts5_extension_function.java 9e2b954d210d572552b28aca523b272fae14bd41e318921b22f65b728d5bf978
F ext/jni/src/org/sqlite/jni/fts5/fts5_tokenizer.java 92bdaa3893bd684533004d64ade23d329843f809cd0d0f4f1a2856da6e6b4d90
F ext/jni/src/org/sqlite/jni/test-script-interpreter.md f9f25126127045d051e918fe59004a1485311c50a13edbf18c79a6ff9160030e
-F ext/jni/src/org/sqlite/jni/wrapper1/SqlFunction.java 40a9f4f8a7a72b90b12baa82d26ba16376a5758009739b069c1863201770e816
-F ext/jni/src/org/sqlite/jni/wrapper1/Sqlite.java 2bc90edc4c25225e018ed600b5eff43ba0485be85db08f8b6b35246372fdac20
+F ext/jni/src/org/sqlite/jni/wrapper1/SqlFunction.java 8b422ec8a2e922c1c21db549e68e0eb93078d2c4d341354043975e111a43b10d
+F ext/jni/src/org/sqlite/jni/wrapper1/Sqlite.java 7826de9bea3102d8a2ecaef3cc84480d8d6f6bc617c531d2078b419913c866fd
F ext/jni/src/org/sqlite/jni/wrapper1/SqliteException.java 1386f7b753134fc12253ce2fbbc448ba8c970567fac01a3356cb672e14408d73
-F ext/jni/src/org/sqlite/jni/wrapper1/Tester2.java aee8301f92256ab8572043cf5de2a35afda057d2a6ff09970a2f84a90305471e
+F ext/jni/src/org/sqlite/jni/wrapper1/Tester2.java 3dccdb259bd1d737c6d104bdf488fb489063b40a113c03b311284e0287d0d5b7
F ext/jni/src/tests/000-000-sanity.test c3427a0e0ac84d7cbe4c95fdc1cd4b61f9ddcf43443408f3000139478c4dc745
F ext/jni/src/tests/000-001-ignored.test e17e874c6ab3c437f1293d88093cf06286083b65bf162317f91bbfd92f961b70
F ext/jni/src/tests/900-001-fts.test bf0ce17a8d082773450e91f2388f5bbb2dfa316d0b676c313c637a91198090f0
@@ -2129,8 +2129,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P abc82bf4b800dde1b6e6172c7be816edb391fdbed5dbd2749f54623fdf3bf8e6
-R 287c21329f3772a974832101be3bffee
+P 43b10a5cf9cb8be53d62914f340d533e60a70bf4caa8b9b91c0f867fa0f70493
+R b476ec63940a46ee7b1e2c0e07bbcf7b
U stephan
-Z a4e77b564ffa0b3970c5e65a1253c53d
+Z a39099e216c3c59927f5c5a18a7e93ef
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 2eac8e0f45..0ec7f3375d 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-43b10a5cf9cb8be53d62914f340d533e60a70bf4caa8b9b91c0f867fa0f70493
\ No newline at end of file
+a850535766d2243d9475e1523c753615875a2da9c9d82a41a9fb61b141c6334a
\ No newline at end of file
From 08747d44a27c47735c050bca68193677ef39b5ec Mon Sep 17 00:00:00 2001
From: stephan
Date: Mon, 16 Oct 2023 16:04:23 +0000
Subject: [PATCH 37/66] JNI: add aggregate function support to the wrapper1
API.
FossilOrigin-Name: 15b28b340a5c5efdbfe3fbed16ee0b699561edaeebb77446addf2374bdf9357e
---
ext/jni/GNUmakefile | 4 +
ext/jni/src/org/sqlite/jni/capi/Tester1.java | 11 --
.../src/org/sqlite/jni/capi/ValueHolder.java | 25 +++
.../jni/wrapper1/AggregateFunction.java | 82 +++++++++
.../org/sqlite/jni/wrapper1/SqlFunction.java | 157 +++++++++++++++---
.../src/org/sqlite/jni/wrapper1/Sqlite.java | 11 +-
.../src/org/sqlite/jni/wrapper1/Tester2.java | 41 +++--
.../org/sqlite/jni/wrapper1/ValueHolder.java | 25 +++
manifest | 23 +--
manifest.uuid | 2 +-
10 files changed, 327 insertions(+), 54 deletions(-)
create mode 100644 ext/jni/src/org/sqlite/jni/capi/ValueHolder.java
create mode 100644 ext/jni/src/org/sqlite/jni/wrapper1/AggregateFunction.java
create mode 100644 ext/jni/src/org/sqlite/jni/wrapper1/ValueHolder.java
diff --git a/ext/jni/GNUmakefile b/ext/jni/GNUmakefile
index e7f083a756..19a5080471 100644
--- a/ext/jni/GNUmakefile
+++ b/ext/jni/GNUmakefile
@@ -106,6 +106,7 @@ JAVA_FILES.main := $(patsubst %,$(dir.src.jni)/annotation/%,\
TableColumnMetadata.java \
TraceV2Callback.java \
UpdateHookCallback.java \
+ ValueHolder.java \
WindowFunction.java \
XDestroyCallback.java \
sqlite3.java \
@@ -113,9 +114,12 @@ JAVA_FILES.main := $(patsubst %,$(dir.src.jni)/annotation/%,\
sqlite3_stmt.java \
sqlite3_value.java \
) $(patsubst %,$(dir.src.jni)/wrapper1/%,\
+ AggregateFunction.java \
+ ScalarFunction.java \
SqlFunction.java \
Sqlite.java \
SqliteException.java \
+ ValueHolder.java \
)
JAVA_FILES.unittest := $(patsubst %,$(dir.src.jni)/%,\
diff --git a/ext/jni/src/org/sqlite/jni/capi/Tester1.java b/ext/jni/src/org/sqlite/jni/capi/Tester1.java
index 5c982ea5ed..6fb28e65b9 100644
--- a/ext/jni/src/org/sqlite/jni/capi/Tester1.java
+++ b/ext/jni/src/org/sqlite/jni/capi/Tester1.java
@@ -38,17 +38,6 @@ import java.util.concurrent.Future;
@java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD})
@interface SingleThreadOnly{}
-/**
- A helper class which simply holds a single value. Its current use
- is for communicating values out of anonymous classes, as doing so
- requires a "final" reference.
-*/
-class ValueHolder {
- public T value;
- public ValueHolder(){}
- public ValueHolder(T v){value = v;}
-}
-
public class Tester1 implements Runnable {
//! True when running in multi-threaded mode.
private static boolean mtMode = false;
diff --git a/ext/jni/src/org/sqlite/jni/capi/ValueHolder.java b/ext/jni/src/org/sqlite/jni/capi/ValueHolder.java
new file mode 100644
index 0000000000..b3f03ac867
--- /dev/null
+++ b/ext/jni/src/org/sqlite/jni/capi/ValueHolder.java
@@ -0,0 +1,25 @@
+/*
+** 2023-10-16
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+*************************************************************************
+** This file contains a set of tests for the sqlite3 JNI bindings.
+*/
+package org.sqlite.jni.capi;
+
+/**
+ A helper class which simply holds a single value. Its primary use
+ is for communicating values out of anonymous classes, as doing so
+ requires a "final" reference.
+*/
+public class ValueHolder {
+ public T value;
+ public ValueHolder(){}
+ public ValueHolder(T v){value = v;}
+}
diff --git a/ext/jni/src/org/sqlite/jni/wrapper1/AggregateFunction.java b/ext/jni/src/org/sqlite/jni/wrapper1/AggregateFunction.java
new file mode 100644
index 0000000000..173d775e62
--- /dev/null
+++ b/ext/jni/src/org/sqlite/jni/wrapper1/AggregateFunction.java
@@ -0,0 +1,82 @@
+/*
+** 2023-10-16
+**
+** 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 is part of the wrapper1 interface for sqlite3.
+*/
+package org.sqlite.jni.wrapper1;
+import org.sqlite.jni.capi.CApi;
+import org.sqlite.jni.annotation.*;
+import org.sqlite.jni.capi.sqlite3_context;
+import org.sqlite.jni.capi.sqlite3_value;
+
+/**
+ EXPERIMENTAL/INCOMPLETE/UNTESTED
+
+ A SqlFunction implementation for aggregate functions. The T type
+ represents the type of data accumulated by this aggregate while it
+ works. e.g. a SUM()-like UDF might use Integer or Long and a
+ CONCAT()-like UDF might use a StringBuilder or a List.
+*/
+public abstract class AggregateFunction implements SqlFunction {
+
+ /**
+ As for the xStep() argument of the C API's
+ sqlite3_create_function(). If this function throws, the
+ exception is reported via sqlite3_result_error().
+ */
+ public abstract void xStep(SqlFunction.Arguments args);
+
+ /**
+ As for the xFinal() argument of the C API's
+ sqlite3_create_function(). If this function throws, it is
+ translated into sqlite3_result_error().
+
+ Note that the passed-in object will not actually contain any
+ arguments for xFinal() but will contain the context object needed
+ for setting the call's result or error state.
+ */
+ public abstract void xFinal(SqlFunction.Arguments args);
+
+ /**
+ Optionally override to be notified when the UDF is finalized by
+ SQLite.
+ */
+ public void xDestroy() {}
+
+ /** Per-invocation state for the UDF. */
+ private final SqlFunction.PerContextState map =
+ new SqlFunction.PerContextState<>();
+
+ /**
+ To be called from the implementation's xStep() method, as well
+ as the xValue() and xInverse() methods of the {@link WindowFunction}
+ subclass, to fetch the current per-call UDF state. On the
+ first call to this method for any given sqlite3_context
+ argument, the context is set to the given initial value. On all other
+ calls, the 2nd argument is ignored.
+
+ @see SQLFunction.PerContextState#getAggregateState
+ */
+ protected final ValueHolder getAggregateState(SqlFunction.Arguments args, T initialValue){
+ return map.getAggregateState(args, initialValue);
+ }
+
+ /**
+ To be called from the implementation's xFinal() method to fetch
+ the final state of the UDF and remove its mapping.
+
+ see SQLFunction.PerContextState#takeAggregateState
+ */
+ protected final T takeAggregateState(SqlFunction.Arguments args){
+ return map.takeAggregateState(args);
+ }
+
+}
diff --git a/ext/jni/src/org/sqlite/jni/wrapper1/SqlFunction.java b/ext/jni/src/org/sqlite/jni/wrapper1/SqlFunction.java
index 6851bf8379..d6acda5aa5 100644
--- a/ext/jni/src/org/sqlite/jni/wrapper1/SqlFunction.java
+++ b/ext/jni/src/org/sqlite/jni/wrapper1/SqlFunction.java
@@ -13,22 +13,20 @@
*/
package org.sqlite.jni.wrapper1;
import org.sqlite.jni.capi.CApi;
-import org.sqlite.jni.annotation.*;
import org.sqlite.jni.capi.sqlite3_context;
import org.sqlite.jni.capi.sqlite3_value;
/**
- EXPERIMENTAL/INCOMPLETE/UNTESTED
+ Base marker interface for SQLite's three types of User-Defined SQL
+ Functions (UDFs): Scalar, Aggregate, and Window functions.
*/
public interface SqlFunction {
/**
- EXPERIMENTAL/INCOMPLETE/UNTESTED. An attempt at hiding UDF-side
- uses of the sqlite3_context and sqlite3_value classes from a
- high-level wrapper. This level of indirection requires more than
- twice as much Java code (in this API, not client-side) as using
- the lower-level API. Client-side it's roughly the same amount of
- code.
+ The Arguments type is an abstraction on top of the lower-level
+ UDF function argument types. It provides _most_ of the functionality
+ of the lower-level interface, insofar as possible without "leaking"
+ those types into this API.
*/
public final static class Arguments implements Iterable{
private final sqlite3_context cx;
@@ -37,29 +35,34 @@ public interface SqlFunction {
/**
Must be passed the context and arguments for the UDF call this
- object is wrapping.
+ object is wrapping. Intended to be used by internal proxy
+ classes which "convert" the lower-level interface into this
+ package's higher-level interface, e.g. ScalarAdapter and
+ AggregateAdapter.
+
+ Passing null for the args is equivalent to passing a length-0
+ array.
*/
- Arguments(@NotNull sqlite3_context cx, @NotNull sqlite3_value args[]){
+ Arguments(sqlite3_context cx, sqlite3_value args[]){
this.cx = cx;
- this.args = args;
- this.length = args.length;
+ this.args = args==null ? new sqlite3_value[0] : args;;
+ this.length = this.args.length;
}
/**
Wrapper for a single SqlFunction argument. Primarily intended
- for eventual use with the Arguments class's Iterable interface.
+ for use with the Arguments class's Iterable interface.
*/
public final static class Arg {
private final Arguments a;
private final int ndx;
/* Only for use by the Arguments class. */
- private Arg(@NotNull Arguments a, int ndx){
+ private Arg(Arguments a, int ndx){
this.a = a;
this.ndx = ndx;
}
/** Returns this argument's index in its parent argument list. */
public int getIndex(){return ndx;}
-
public int getInt(){return a.getInt(ndx);}
public long getInt64(){return a.getInt64(ndx);}
public double getDouble(){return a.getDouble(ndx);}
@@ -75,10 +78,9 @@ public interface SqlFunction {
public void setAuxData(Object o){a.setAuxData(ndx, o);}
}
- //! Untested!
@Override
public java.util.Iterator iterator(){
- Arg[] proxies = new Arg[args.length];
+ final Arg[] proxies = new Arg[args.length];
for( int i = 0; i < args.length; ++i ){
proxies[i] = new Arg(this, i);
}
@@ -98,6 +100,8 @@ public interface SqlFunction {
return args[ndx];
}
+ sqlite3_context getContext(){return cx;}
+
public int getArgCount(){ return args.length; }
public int getInt(int arg){return CApi.sqlite3_value_int(valueAt(arg));}
@@ -159,6 +163,73 @@ public interface SqlFunction {
}
}
+ /**
+ PerContextState assists aggregate and window functions in
+ managing their accumulator state across calls to the UDF's
+ callbacks.
+
+ T must be of a type which can be legally stored as a value in
+ java.util.HashMap.
+
+ If a given aggregate or window function is called multiple times
+ in a single SQL statement, e.g. SELECT MYFUNC(A), MYFUNC(B)...,
+ then the clients need some way of knowing which call is which so
+ that they can map their state between their various UDF callbacks
+ and reset it via xFinal(). This class takes care of such
+ mappings.
+
+
This class works by mapping
+ sqlite3_context.getAggregateContext() to a single piece of
+ state, of a client-defined type (the T part of this class), which
+ persists across a "matching set" of the UDF's callbacks.
+
+
This class is a helper providing commonly-needed functionality
+ - it is not required for use with aggregate or window functions.
+ Client UDFs are free to perform such mappings using custom
+ approaches. The provided {@link AggregateFunction} and {@link
+ WindowFunction} classes use this.
+ */
+ public static final class PerContextState {
+ private final java.util.Map> map
+ = new java.util.HashMap<>();
+
+ /**
+ Should be called from a UDF's xStep(), xValue(), and xInverse()
+ methods, passing it that method's first argument and an initial
+ value for the persistent state. If there is currently no
+ mapping for the given context within the map, one is created
+ using the given initial value, else the existing one is used
+ and the 2nd argument is ignored. It returns a ValueHolder
+ which can be used to modify that state directly without
+ requiring that the client update the underlying map's entry.
+
+ The caller is obligated to eventually call
+ takeAggregateState() to clear the mapping.
+ */
+ public ValueHolder getAggregateState(SqlFunction.Arguments args, T initialValue){
+ final Long key = args.getContext().getAggregateContext(true);
+ ValueHolder rc = null==key ? null : map.get(key);
+ if( null==rc ){
+ map.put(key, rc = new ValueHolder<>(initialValue));
+ }
+ return rc;
+ }
+
+ /**
+ Should be called from a UDF's xFinal() method and passed that
+ method's first argument. This function removes the value
+ associated with with the arguments' aggregate context from the
+ map and returns it, returning null if no other UDF method has
+ been called to set up such a mapping. The latter condition will
+ be the case if a UDF is used in a statement which has no result
+ rows.
+ */
+ public T takeAggregateState(SqlFunction.Arguments args){
+ final ValueHolder h = map.remove(args.getContext().getAggregateContext(false));
+ return null==h ? null : h.value;
+ }
+ }
+
/**
Internal-use adapter for wrapping this package's ScalarFunction
for use with the org.sqlite.jni.capi.ScalarFunction interface.
@@ -169,11 +240,57 @@ public interface SqlFunction {
this.impl = impl;
}
/**
- Proxies this.f.xFunc(), adapting the call arguments to that
- function's signature.
+ Proxies this.impl.xFunc(), adapting the call arguments to that
+ function's signature. If the proxy throws, it's translated to
+ sqlite_result_error() with the exception's message.
*/
public void xFunc(sqlite3_context cx, sqlite3_value[] args){
- impl.xFunc( new SqlFunction.Arguments(cx, args) );
+ try{
+ impl.xFunc( new SqlFunction.Arguments(cx, args) );
+ }catch(Exception e){
+ CApi.sqlite3_result_error(cx, e);
+ }
+ }
+
+ public void xDestroy(){
+ impl.xDestroy();
+ }
+ }
+
+ /**
+ Internal-use adapter for wrapping this package's AggregateFunction
+ for use with the org.sqlite.jni.capi.AggregateFunction interface.
+ */
+ static final class AggregateAdapter extends org.sqlite.jni.capi.AggregateFunction {
+ final AggregateFunction impl;
+ AggregateAdapter(AggregateFunction impl){
+ this.impl = impl;
+ }
+
+ /**
+ Proxies this.impl.xStep(), adapting the call arguments to that
+ function's signature. If the proxied function throws, it is
+ translated to sqlite_result_error() with the exception's
+ message.
+ */
+ public void xStep(sqlite3_context cx, sqlite3_value[] args){
+ try{
+ impl.xStep( new SqlFunction.Arguments(cx, args) );
+ }catch(Exception e){
+ CApi.sqlite3_result_error(cx, e);
+ }
+ }
+
+ /**
+ As for the xFinal() argument of the C API's sqlite3_create_function().
+ If the proxied function throws, it is translated into a sqlite3_result_error().
+ */
+ public void xFinal(sqlite3_context cx){
+ try{
+ impl.xFinal( new SqlFunction.Arguments(cx, null) );
+ }catch(Exception e){
+ CApi.sqlite3_result_error(cx, e);
+ }
}
public void xDestroy(){
diff --git a/ext/jni/src/org/sqlite/jni/wrapper1/Sqlite.java b/ext/jni/src/org/sqlite/jni/wrapper1/Sqlite.java
index 7321d7bb36..bcf97b2394 100644
--- a/ext/jni/src/org/sqlite/jni/wrapper1/Sqlite.java
+++ b/ext/jni/src/org/sqlite/jni/wrapper1/Sqlite.java
@@ -195,7 +195,6 @@ public final class Sqlite implements AutoCloseable {
return prepare(sql, 0);
}
-
public void createFunction(String name, int nArg, int eTextRep, ScalarFunction f ){
int rc = CApi.sqlite3_create_function(affirmOpen(), name, nArg, eTextRep,
new SqlFunction.ScalarAdapter(f));
@@ -206,4 +205,14 @@ public final class Sqlite implements AutoCloseable {
this.createFunction(name, nArg, CApi.SQLITE_UTF8, f);
}
+ public void createFunction(String name, int nArg, int eTextRep, AggregateFunction f ){
+ int rc = CApi.sqlite3_create_function(affirmOpen(), name, nArg, eTextRep,
+ new SqlFunction.AggregateAdapter(f));
+ if( 0!=rc ) throw new SqliteException(db);
+ }
+
+ public void createFunction(String name, int nArg, AggregateFunction f){
+ this.createFunction(name, nArg, CApi.SQLITE_UTF8, f);
+ }
+
}
diff --git a/ext/jni/src/org/sqlite/jni/wrapper1/Tester2.java b/ext/jni/src/org/sqlite/jni/wrapper1/Tester2.java
index 07a43b63dd..f5fd5f84e6 100644
--- a/ext/jni/src/org/sqlite/jni/wrapper1/Tester2.java
+++ b/ext/jni/src/org/sqlite/jni/wrapper1/Tester2.java
@@ -38,17 +38,6 @@ import org.sqlite.jni.capi.*;
@java.lang.annotation.Target({java.lang.annotation.ElementType.METHOD})
@interface SingleThreadOnly{}
-/**
- A helper class which simply holds a single value. Its current use
- is for communicating values out of anonymous classes, as doing so
- requires a "final" reference.
-*/
-class ValueHolder {
- public T value;
- public ValueHolder(){}
- public ValueHolder(T v){value = v;}
-}
-
public class Tester2 implements Runnable {
//! True when running in multi-threaded mode.
private static boolean mtMode = false;
@@ -279,6 +268,36 @@ public class Tester2 implements Runnable {
affirm( 1 == xDestroyCalled.value );
}
+ void testUdfAggregate(){
+ final ValueHolder xDestroyCalled = new ValueHolder<>(0);
+ final ValueHolder vh = new ValueHolder<>(0);
+ try (Sqlite db = openDb()) {
+ execSql(db, "create table t(a); insert into t(a) values(1),(2),(3)");
+ final AggregateFunction f = new AggregateFunction(){
+ public void xStep(SqlFunction.Arguments args){
+ final ValueHolder agg = this.getAggregateState(args, 0);
+ for( SqlFunction.Arguments.Arg arg : args ){
+ agg.value += arg.getInt();
+ }
+ }
+ public void xFinal(SqlFunction.Arguments args){
+ final Integer v = this.takeAggregateState(args);
+ if( null==v ) args.resultNull();
+ else args.resultInt(v);
+ vh.value = v;
+ }
+ public void xDestroy(){
+ ++xDestroyCalled.value;
+ }
+ };
+ db.createFunction("myagg", -1, f);
+ execSql(db, "select myagg(a) from t");
+ affirm( 6 == vh.value );
+ affirm( 0 == xDestroyCalled.value );
+ }
+ affirm( 1 == xDestroyCalled.value );
+ }
+
private void runTests(boolean fromThread) throws Exception {
List mlist = testMethods;
affirm( null!=mlist );
diff --git a/ext/jni/src/org/sqlite/jni/wrapper1/ValueHolder.java b/ext/jni/src/org/sqlite/jni/wrapper1/ValueHolder.java
new file mode 100644
index 0000000000..009936a43e
--- /dev/null
+++ b/ext/jni/src/org/sqlite/jni/wrapper1/ValueHolder.java
@@ -0,0 +1,25 @@
+/*
+** 2023-10-16
+**
+** The author disclaims copyright to this source code. In place of
+** a legal notice, here is a blessing:
+**
+** May you do good and not evil.
+** May you find forgiveness for yourself and forgive others.
+** May you share freely, never taking more than you give.
+**
+*************************************************************************
+** This file contains a set of tests for the sqlite3 JNI bindings.
+*/
+package org.sqlite.jni.wrapper1;
+
+/**
+ A helper class which simply holds a single value. Its primary use
+ is for communicating values out of anonymous classes, as doing so
+ requires a "final" reference.
+*/
+public class ValueHolder {
+ public T value;
+ public ValueHolder(){}
+ public ValueHolder(T v){value = v;}
+}
diff --git a/manifest b/manifest
index 1fb9230659..ed6c5f7f8a 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C JNI:\sadd\sscalar\sUDF\ssupport\sto\sthe\swrapper1\sAPI.
-D 2023-10-16T14:31:13.824
+C JNI:\sadd\saggregate\sfunction\ssupport\sto\sthe\swrapper1\sAPI.
+D 2023-10-16T16:04:23.203
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -235,7 +235,7 @@ F ext/fts5/tool/showfts5.tcl d54da0e067306663e2d5d523965ca487698e722c
F ext/icu/README.txt 7ab7ced8ae78e3a645b57e78570ff589d4c672b71370f5aa9e1cd7024f400fc9
F ext/icu/icu.c c074519b46baa484bb5396c7e01e051034da8884bad1a1cb7f09bbe6be3f0282
F ext/icu/sqliteicu.h fa373836ed5a1ee7478bdf8a1650689294e41d0c89c1daab26e9ae78a32075a8
-F ext/jni/GNUmakefile 069399d471af948a4293e79135907a8d58daa09e59b4cc1b9cc1a5124c87f589
+F ext/jni/GNUmakefile 5c3ac326bf3853486ebe0d70819abc790cc65c412182ce4ebd5012b008d9b059
F ext/jni/README.md ef9ac115e97704ea995d743b4a8334e23c659e5534c3b64065a5405256d5f2f4
F ext/jni/jar-dist.make 030aaa4ae71dd86e4ec5e7c1e6cd86f9dfa47c4592c070d2e35157e42498e1fa
F ext/jni/src/c/sqlite3-jni.c 8d32ca0598a11370a9e92a6d111f38934c225056b42b13512175acf6e37eed4c
@@ -266,9 +266,10 @@ F ext/jni/src/org/sqlite/jni/capi/SQLFunction.java fef556adbc3624292423083a648bd
F ext/jni/src/org/sqlite/jni/capi/SQLTester.java 09bee15aa0eedac68d767ae21d9a6a62a31ade59182a3ccbf036d6463d9e30b1
F ext/jni/src/org/sqlite/jni/capi/ScalarFunction.java 93b9700fca4c68075ccab12fe0fbbc76c91cafc9f368e835b9bd7cd7732c8615
F ext/jni/src/org/sqlite/jni/capi/TableColumnMetadata.java addf120e0e76e5be1ff2260daa7ce305ff9b5fafd64153a7a28e9d8f000a815f
-F ext/jni/src/org/sqlite/jni/capi/Tester1.java 8aacea90b0eed6e4e801cfba2515a66b5d602e124f1ba68fe3d2f0aa98f0f443
+F ext/jni/src/org/sqlite/jni/capi/Tester1.java ca195521b6bda3e0cd00e76bb71ec8060d1fab76a2f13b1af9feea40789f44bb
F ext/jni/src/org/sqlite/jni/capi/TraceV2Callback.java 0a25e117a0daae3394a77f24713e36d7b44c67d6e6d30e9e1d56a63442eef723
F ext/jni/src/org/sqlite/jni/capi/UpdateHookCallback.java 2766b8526bbffc4f1045f70e79f1bc1b1efe1c3e95ca06cdb8a7391032dda3b4
+F ext/jni/src/org/sqlite/jni/capi/ValueHolder.java 9f9e151f1da017b706c0ee5f40f4c86b54e773d6ae4339723e0cc85a456251ab
F ext/jni/src/org/sqlite/jni/capi/WindowFunction.java caf4396f91b2567904cf94bc538a069fd62260d975bd037d15a02a890ed1ef9e
F ext/jni/src/org/sqlite/jni/capi/XDestroyCallback.java f3abb8dd7381f53ebba909437090caf68200f06717b8a7d6aa96fa3e8133117d
F ext/jni/src/org/sqlite/jni/capi/package-info.java 08ff986a65d2be9162442c82d28a65ce431d826f188520717c2ecb1484d0a50e
@@ -289,10 +290,12 @@ F ext/jni/src/org/sqlite/jni/fts5/fts5_api.java a8e88c3783d21cec51b0748568a96653
F ext/jni/src/org/sqlite/jni/fts5/fts5_extension_function.java 9e2b954d210d572552b28aca523b272fae14bd41e318921b22f65b728d5bf978
F ext/jni/src/org/sqlite/jni/fts5/fts5_tokenizer.java 92bdaa3893bd684533004d64ade23d329843f809cd0d0f4f1a2856da6e6b4d90
F ext/jni/src/org/sqlite/jni/test-script-interpreter.md f9f25126127045d051e918fe59004a1485311c50a13edbf18c79a6ff9160030e
-F ext/jni/src/org/sqlite/jni/wrapper1/SqlFunction.java 8b422ec8a2e922c1c21db549e68e0eb93078d2c4d341354043975e111a43b10d
-F ext/jni/src/org/sqlite/jni/wrapper1/Sqlite.java 7826de9bea3102d8a2ecaef3cc84480d8d6f6bc617c531d2078b419913c866fd
+F ext/jni/src/org/sqlite/jni/wrapper1/AggregateFunction.java 5ad99bd74c85f56bbef324d9ec29b4048f4620547c9a80093d8586c3557f9f9a
+F ext/jni/src/org/sqlite/jni/wrapper1/SqlFunction.java 004394eeb944baa56e36cd7ae69ba6d4a52b52db3c49439db16e98270b861421
+F ext/jni/src/org/sqlite/jni/wrapper1/Sqlite.java a9ddc6a9e8c113168cc67592ae24c0e56d30dd06226eeab012f2761a0889d7bb
F ext/jni/src/org/sqlite/jni/wrapper1/SqliteException.java 1386f7b753134fc12253ce2fbbc448ba8c970567fac01a3356cb672e14408d73
-F ext/jni/src/org/sqlite/jni/wrapper1/Tester2.java 3dccdb259bd1d737c6d104bdf488fb489063b40a113c03b311284e0287d0d5b7
+F ext/jni/src/org/sqlite/jni/wrapper1/Tester2.java c24b510ebe801c30533cc62efdf69a4a5e2da9ec4b49f8d403f2060693f060a0
+F ext/jni/src/org/sqlite/jni/wrapper1/ValueHolder.java 7b89a7391f771692c5b83b0a5b86266abe8d59f1c77d7a0eccc9b79f259d79af
F ext/jni/src/tests/000-000-sanity.test c3427a0e0ac84d7cbe4c95fdc1cd4b61f9ddcf43443408f3000139478c4dc745
F ext/jni/src/tests/000-001-ignored.test e17e874c6ab3c437f1293d88093cf06286083b65bf162317f91bbfd92f961b70
F ext/jni/src/tests/900-001-fts.test bf0ce17a8d082773450e91f2388f5bbb2dfa316d0b676c313c637a91198090f0
@@ -2129,8 +2132,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 43b10a5cf9cb8be53d62914f340d533e60a70bf4caa8b9b91c0f867fa0f70493
-R b476ec63940a46ee7b1e2c0e07bbcf7b
+P a850535766d2243d9475e1523c753615875a2da9c9d82a41a9fb61b141c6334a
+R 41c1c0a2430694da022548afb899150c
U stephan
-Z a39099e216c3c59927f5c5a18a7e93ef
+Z b40ce65d6c09198a38c3804feb9178c7
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 0ec7f3375d..0973dce9e0 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-a850535766d2243d9475e1523c753615875a2da9c9d82a41a9fb61b141c6334a
\ No newline at end of file
+15b28b340a5c5efdbfe3fbed16ee0b699561edaeebb77446addf2374bdf9357e
\ No newline at end of file
From b866f983464a3b58aaef6e9dcf87182a51428562 Mon Sep 17 00:00:00 2001
From: stephan
Date: Tue, 17 Oct 2023 02:15:49 +0000
Subject: [PATCH 38/66] Harden API_ARMOR checks for
sqlite3_stmt_scanstatus_v2().
FossilOrigin-Name: d3f38e813ba3b887e973af034713cd58fdfbe07da375b154accc7b5790cfaeda
---
manifest | 12 ++++++------
manifest.uuid | 2 +-
src/vdbeapi.c | 6 +++++-
3 files changed, 12 insertions(+), 8 deletions(-)
diff --git a/manifest b/manifest
index ed6c5f7f8a..95bba15b39 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C JNI:\sadd\saggregate\sfunction\ssupport\sto\sthe\swrapper1\sAPI.
-D 2023-10-16T16:04:23.203
+C Harden\sAPI_ARMOR\schecks\sfor\ssqlite3_stmt_scanstatus_v2().
+D 2023-10-17T02:15:49.601
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -791,7 +791,7 @@ F src/vacuum.c 604fcdaebe76f3497c855afcbf91b8fa5046b32de3045bab89cc008d68e40104
F src/vdbe.c ae873b02ade06478b217ea38d90229dff68180d7a1fe526910b0d62a0fe0595a
F src/vdbe.h 41485521f68e9437fdb7ec4a90f9d86ab294e9bb8281e33b235915e29122cfc0
F src/vdbeInt.h 949669dfd8a41550d27dcb905b494f2ccde9a2e6c1b0b04daa1227e2e74c2b2c
-F src/vdbeapi.c 56fb801c15af34ba4e7de6804b1a143f045ca9d4b466f32d220d930823e05885
+F src/vdbeapi.c 9c1509ea78dbfb528fbca49601a5a39617eeca3315b141e3b28e2ee1ec45dc12
F src/vdbeaux.c 5b415e09b5b9d5be6c0f4fcbf18ea9d7d16f6a29ced2f14a3b2041020f63e9c1
F src/vdbeblob.c 13f9287b55b6356b4b1845410382d6bede203ceb29ef69388a4a3d007ffacbe5
F src/vdbemem.c ba9e21c579b58979a63d85e79088c9a9860b0ff4359f59a0db37427fb7807f66
@@ -2132,8 +2132,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P a850535766d2243d9475e1523c753615875a2da9c9d82a41a9fb61b141c6334a
-R 41c1c0a2430694da022548afb899150c
+P 15b28b340a5c5efdbfe3fbed16ee0b699561edaeebb77446addf2374bdf9357e
+R 6b89fd1d08788235ad034998751967c3
U stephan
-Z b40ce65d6c09198a38c3804feb9178c7
+Z f2c535ed4796a207a0fd6c4ff4bf7413
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 0973dce9e0..e3467df406 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-15b28b340a5c5efdbfe3fbed16ee0b699561edaeebb77446addf2374bdf9357e
\ No newline at end of file
+d3f38e813ba3b887e973af034713cd58fdfbe07da375b154accc7b5790cfaeda
\ No newline at end of file
diff --git a/src/vdbeapi.c b/src/vdbeapi.c
index b0a40cf6db..b7b3b94cdc 100644
--- a/src/vdbeapi.c
+++ b/src/vdbeapi.c
@@ -2351,7 +2351,11 @@ int sqlite3_stmt_scanstatus_v2(
int idx;
#ifdef SQLITE_ENABLE_API_ARMOR
- if( p==0 ) return 1;
+ if( p==0 || pOut==0
+ || iScanStatusOpSQLITE_SCANSTAT_NCYCLE ){
+ return 1;
+ }
#endif
aOp = p->aOp;
nOp = p->nOp;
From 11095bcb89a2386698743b948387bf46611b0d8f Mon Sep 17 00:00:00 2001
From: drh <>
Date: Tue, 17 Oct 2023 10:47:42 +0000
Subject: [PATCH 39/66] When an I/O or similar error occurs during a
transaction with journal_mode=MEMORY, attempt to rollback before closing the
journal, as all rollback information is forgotten when a memory rollback
journal is closed.
FossilOrigin-Name: 1d67f75de259e5a26b751a50432822a268ebe367cda6510891ab81a15e5daa1c
---
manifest | 14 +++++++-------
manifest.uuid | 2 +-
src/pager.c | 32 +++++++++++++++++++++++++++++++-
3 files changed, 39 insertions(+), 9 deletions(-)
diff --git a/manifest b/manifest
index 95bba15b39..0bb8ce077d 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Harden\sAPI_ARMOR\schecks\sfor\ssqlite3_stmt_scanstatus_v2().
-D 2023-10-17T02:15:49.601
+C When\san\sI/O\sor\ssimilar\serror\soccurs\sduring\sa\stransaction\swith\njournal_mode=MEMORY,\sattempt\sto\srollback\sbefore\sclosing\sthe\sjournal,\sas\nall\srollback\sinformation\sis\sforgotten\swhen\sa\smemory\srollback\sjournal\sis\nclosed.
+D 2023-10-17T10:47:42.224
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -705,7 +705,7 @@ F src/os_setup.h 6011ad7af5db4e05155f385eb3a9b4470688de6f65d6166b8956e58a3d87210
F src/os_unix.c 2e8b12107f75d1bd16412f312b4c5d5103191807a37836d3b81beb26436ad81b
F src/os_win.c 4a50a154aeebc66a1f8fb79c1ff6dd5fe3d005556533361e0d460d41cb6a45a8
F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
-F src/pager.c 4aa388e47138551c83ae265e2efd4e01f0aa5afb6a958f45579658847b3430ff
+F src/pager.c 2188897e1102a776dcb1bbe8b2eb70ac7de8863c9cb95ef09d35e9bad406cf45
F src/pager.h f4d33fec8052603758792045493423b8871a996da2d0973927b7d36cd6070473
F src/parse.y aeb7760d41cfa86465e3adba506500c021597049fd55f82a30e5b7045862c28c
F src/pcache.c 040b165f30622a21b7a9a77c6f2e4877a32fb7f22d4c7f0d2a6fa6833a156a75
@@ -2132,8 +2132,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 15b28b340a5c5efdbfe3fbed16ee0b699561edaeebb77446addf2374bdf9357e
-R 6b89fd1d08788235ad034998751967c3
-U stephan
-Z f2c535ed4796a207a0fd6c4ff4bf7413
+P d3f38e813ba3b887e973af034713cd58fdfbe07da375b154accc7b5790cfaeda
+R b56a9057afb3315b9dbeaacc1714889d
+U drh
+Z 10639baf7980722d71051df0aed0a0d8
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index e3467df406..4d645149e5 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-d3f38e813ba3b887e973af034713cd58fdfbe07da375b154accc7b5790cfaeda
\ No newline at end of file
+1d67f75de259e5a26b751a50432822a268ebe367cda6510891ab81a15e5daa1c
\ No newline at end of file
diff --git a/src/pager.c b/src/pager.c
index 1423b66541..5c2d556b3e 100644
--- a/src/pager.c
+++ b/src/pager.c
@@ -2161,6 +2161,9 @@ static int pager_end_transaction(Pager *pPager, int hasSuper, int bCommit){
return (rc==SQLITE_OK?rc2:rc);
}
+/* Forward reference */
+static int pager_playback(Pager *pPager, int isHot);
+
/*
** Execute a rollback if a transaction is active and unlock the
** database file.
@@ -2189,6 +2192,21 @@ static void pagerUnlockAndRollback(Pager *pPager){
assert( pPager->eState==PAGER_READER );
pager_end_transaction(pPager, 0, 0);
}
+ }else if( pPager->eState==PAGER_ERROR
+ && pPager->journalMode==PAGER_JOURNALMODE_MEMORY
+ && isOpen(pPager->jfd)
+ ){
+ /* Special case for a ROLLBACK due to I/O error with an in-memory
+ ** journal: We have to rollback immediately, before the journal is
+ ** closed, because once it is closed, all content is forgotten. */
+ int errCode = pPager->errCode;
+ u8 eLock = pPager->eLock;
+ pPager->eState = PAGER_OPEN;
+ pPager->errCode = SQLITE_OK;
+ pPager->eLock = EXCLUSIVE_LOCK;
+ pager_playback(pPager, 1);
+ pPager->errCode = errCode;
+ pPager->eLock = eLock;
}
pager_unlock(pPager);
}
@@ -5681,8 +5699,20 @@ int sqlite3PagerGet(
DbPage **ppPage, /* Write a pointer to the page here */
int flags /* PAGER_GET_XXX flags */
){
- /* printf("PAGE %u\n", pgno); fflush(stdout); */
+#if 0 /* Trace page fetch by setting to 1 */
+ int rc;
+ printf("PAGE %u\n", pgno);
+ fflush(stdout);
+ rc = pPager->xGet(pPager, pgno, ppPage, flags);
+ if( rc ){
+ printf("PAGE %u failed with 0x%02x\n", pgno, rc);
+ fflush(stdout);
+ }
+ return rc;
+#else
+ /* Normal, high-speed version of sqlite3PagerGet() */
return pPager->xGet(pPager, pgno, ppPage, flags);
+#endif
}
/*
From 5e0b11bda77dc6d48932601ffded969faec75aad Mon Sep 17 00:00:00 2001
From: drh <>
Date: Tue, 17 Oct 2023 11:57:36 +0000
Subject: [PATCH 40/66] Enhance the documentation of sqlite3_deserialize() to
make it clear that the input database may not be in WAL mode.
[forum:/forumpost/a7e272cee9ac469f|Forum post a7e272cee9ac469f]
FossilOrigin-Name: e754789971e019647e7068f76dc6f9778675e4849fe51d8b25b39d3edf2379e5
---
manifest | 12 ++++++------
manifest.uuid | 2 +-
src/sqlite.h.in | 7 +++++++
3 files changed, 14 insertions(+), 7 deletions(-)
diff --git a/manifest b/manifest
index 0bb8ce077d..d5866a77be 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C When\san\sI/O\sor\ssimilar\serror\soccurs\sduring\sa\stransaction\swith\njournal_mode=MEMORY,\sattempt\sto\srollback\sbefore\sclosing\sthe\sjournal,\sas\nall\srollback\sinformation\sis\sforgotten\swhen\sa\smemory\srollback\sjournal\sis\nclosed.
-D 2023-10-17T10:47:42.224
+C Enhance\sthe\sdocumentation\sof\ssqlite3_deserialize()\sto\smake\sit\sclear\sthat\nthe\sinput\sdatabase\smay\snot\sbe\sin\sWAL\smode.\n[forum:/forumpost/a7e272cee9ac469f|Forum\spost\sa7e272cee9ac469f]
+D 2023-10-17T11:57:36.538
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -720,7 +720,7 @@ F src/resolve.c 0c3046b88901336709cd09f474303a16fc54bce13a2befcab66d0fa6b44ca869
F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
F src/select.c 7f9155185be78902818b21c2cd3e33f01b4306279a15d6719eb1bbb9779034aa
F src/shell.c.in cf0a3387c5bb05ca2fe6073fa7df21aaa11e749ca5b3846b80b586a447e728aa
-F src/sqlite.h.in 4f39f61c35348f0c56dd2c7a2294d1f0564389a0086dab80ce0960bfd772dc1b
+F src/sqlite.h.in 60e5698417e674f44be17d5ceeb4c2d395ccedba18d6de05435dec0135d9eff1
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
F src/sqlite3ext.h 2f30b2671f4c03cd27a43f039e11251391066c97d11385f5f963bb40b03038ac
F src/sqliteInt.h 3c8a3f1bf889a632dbbaecbd3334e9e8d7fdb63b26ee09d6d384af0cc757d64c
@@ -2132,8 +2132,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P d3f38e813ba3b887e973af034713cd58fdfbe07da375b154accc7b5790cfaeda
-R b56a9057afb3315b9dbeaacc1714889d
+P 1d67f75de259e5a26b751a50432822a268ebe367cda6510891ab81a15e5daa1c
+R 6102819ec8d73f007027205c9baa6482
U drh
-Z 10639baf7980722d71051df0aed0a0d8
+Z fed638031c498e74c10adafc1fcef571
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 4d645149e5..9cde1130e7 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-1d67f75de259e5a26b751a50432822a268ebe367cda6510891ab81a15e5daa1c
\ No newline at end of file
+e754789971e019647e7068f76dc6f9778675e4849fe51d8b25b39d3edf2379e5
\ No newline at end of file
diff --git a/src/sqlite.h.in b/src/sqlite.h.in
index 54192422d6..af648829d6 100644
--- a/src/sqlite.h.in
+++ b/src/sqlite.h.in
@@ -10676,6 +10676,13 @@ unsigned char *sqlite3_serialize(
** S argument to sqlite3_deserialize(D,S,P,N,M,F) is "temp" then the
** function returns SQLITE_ERROR.
**
+** The deserialized database should not be in [WAL mode]. If the database
+** is in WAL mode, then any attempt to use the database file will result
+** in an [SQLITE_CANTOPEN] error. The application can set the
+** [file format version numbers] (bytes 18 and 19) of the input database P
+** to 0x01 prior to invoking sqlite3_deserialize(D,S,P,N,M,F) to force the
+** database file into rollback mode and work around this limitation.
+**
** If sqlite3_deserialize(D,S,P,N,M,F) fails for any reason and if the
** SQLITE_DESERIALIZE_FREEONCLOSE bit is set in argument F, then
** [sqlite3_free()] is invoked on argument P prior to returning.
From 52d934e3164f5a0666b2f5f00b9ab4aee9ef9618 Mon Sep 17 00:00:00 2001
From: drh <>
Date: Tue, 17 Oct 2023 13:41:41 +0000
Subject: [PATCH 41/66] Fix a JSON bug introduced by the optimization of
[df099ad713011b67] and first appearing in 3.43.0. The problem occurs when
doing a JSON_EXTRACT() on an array element that was added by JSON_SET()
without first reparsing. Reported by [forum:/forumpost/fc0e3f1e2a|forum post
fc0e3f1e2a].
FossilOrigin-Name: e5099c549a1d8959d4015516f090b8e6438e517a64b20651175bf5413d94fb58
---
manifest | 14 +++++++-------
manifest.uuid | 2 +-
src/json.c | 1 +
test/json101.test | 13 +++++++++++++
4 files changed, 22 insertions(+), 8 deletions(-)
diff --git a/manifest b/manifest
index d5866a77be..12f27004eb 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Enhance\sthe\sdocumentation\sof\ssqlite3_deserialize()\sto\smake\sit\sclear\sthat\nthe\sinput\sdatabase\smay\snot\sbe\sin\sWAL\smode.\n[forum:/forumpost/a7e272cee9ac469f|Forum\spost\sa7e272cee9ac469f]
-D 2023-10-17T11:57:36.538
+C Fix\sa\sJSON\sbug\sintroduced\sby\sthe\soptimization\sof\s[df099ad713011b67]\sand\nfirst\sappearing\sin\s3.43.0.\s\sThe\sproblem\soccurs\swhen\sdoing\sa\sJSON_EXTRACT()\non\san\sarray\selement\sthat\swas\sadded\sby\sJSON_SET()\swithout\sfirst\sreparsing.\nReported\sby\s[forum:/forumpost/fc0e3f1e2a|forum\spost\sfc0e3f1e2a].
+D 2023-10-17T13:41:41.074
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -678,7 +678,7 @@ F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51
F src/hwtime.h f9c2dfb84dce7acf95ce6d289e46f5f9d3d1afd328e53da8f8e9008e3b3caae6
F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71
F src/insert.c 3f0a94082d978bbdd33c38fefea15346c6c6bffb70bc645a71dc0f1f87dd3276
-F src/json.c 799430345d16fed21713416318e6ca616f1264224f708555f387bfa2ab2496c7
+F src/json.c a803f6eb684a8e24e99761138ee233e6d3140f8691146e4667a8fe700c0c16a5
F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa
F src/loadext.c 7d56c6f28aaf9b42e2772289e0d0a12a77b57c2baed021dbfd1fcafec69c156a
F src/main.c 73ae4cab166b0fd36352446de7f7d91f89bde86686ae18f0bb7b245173479831
@@ -1310,7 +1310,7 @@ F test/json/README.md 63e3e589e1df8fd3cc1588ba1faaff659214003f8b77a15af5c6452b35
F test/json/json-generator.tcl dc0dd0f393800c98658fc4c47eaa6af29d4e17527380cd28656fb261bddc8a3f
F test/json/json-q1.txt 65f9d1cdcc4cffa9823fb73ed936aae5658700cd001fde448f68bfb91c807307
F test/json/json-speed-check.sh 8b7babf530faa58bd59d6d362cec8e9036a68c5457ff46f3b1f1511d21af6737 x
-F test/json101.test 1ad070e5616dee76bffbe9724e6add16ab7ad506d5af9e606627b163baf1a7b4
+F test/json101.test bc05d2476fd6f7ead31ec05b43d1b24b2b193ae112fd8f0d2ed56d9a904f9fa5
F test/json102.test 4c69694773a470f1fda34e5f4ba24920b35184fb66050b450fc2ef9ab5ad310b
F test/json103.test 53df87f83a4e5fa0c0a56eb29ff6c94055c6eb919f33316d62161a8880112dbe
F test/json104.test 1b844a70cddcfa2e4cd81a5db0657b2e61e7f00868310f24f56a9ba0114348c1
@@ -2132,8 +2132,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 1d67f75de259e5a26b751a50432822a268ebe367cda6510891ab81a15e5daa1c
-R 6102819ec8d73f007027205c9baa6482
+P e754789971e019647e7068f76dc6f9778675e4849fe51d8b25b39d3edf2379e5
+R 3f9b22b9a01bc799e241ff3ddd4c2083
U drh
-Z fed638031c498e74c10adafc1fcef571
+Z 0e3dd3d1b219ba9ab7384c8b1f01954c
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 9cde1130e7..aec3af3110 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-e754789971e019647e7068f76dc6f9778675e4849fe51d8b25b39d3edf2379e5
\ No newline at end of file
+e5099c549a1d8959d4015516f090b8e6438e517a64b20651175bf5413d94fb58
\ No newline at end of file
diff --git a/src/json.c b/src/json.c
index e334b22140..bb1834dd89 100644
--- a/src/json.c
+++ b/src/json.c
@@ -2156,6 +2156,7 @@ static JsonNode *jsonLookupStep(
if( (pRoot[j].jnFlags & JNODE_REMOVE)==0 || pParse->useMod==0 ) i--;
j += jsonNodeSize(&pRoot[j]);
}
+ if( i==0 && j<=pRoot->n ) break;
if( (pRoot->jnFlags & JNODE_APPEND)==0 ) break;
if( pParse->useMod==0 ) break;
assert( pRoot->eU==2 );
diff --git a/test/json101.test b/test/json101.test
index d734dbb0e1..c62991bbbf 100644
--- a/test/json101.test
+++ b/test/json101.test
@@ -1042,5 +1042,18 @@ do_execsql_test json101-22.2 {
);
} {{{"a":2,"b":4,"c":6}}}
+# 2023-10-17 https://sqlite.org/forum/forumpost/fc0e3f1e2a
+# Incorrect accesss to '$[0]' in parsed + edited JSON.
+#
+do_execsql_test json101-23.1 {
+ SELECT j, j->>0, j->>1
+ FROM (SELECT json_set(json_set('[]','$[#]',0), '$[#]',1) AS j);
+} {{[0,1]} 0 1}
+do_execsql_test json101-23.2 {
+ SELECT j, j->>0, j->>1
+ FROM (SELECT json_set('[]','$[#]',0,'$[#]',1) AS j);
+} {{[0,1]} 0 1}
+
+
finish_test
From 4c827feba18d91ecee7680d3026ccd909957b127 Mon Sep 17 00:00:00 2001
From: drh <>
Date: Tue, 17 Oct 2023 17:53:46 +0000
Subject: [PATCH 42/66] Changes to sqlite3IntFloatCompare() in an attempt to
better measure branch coverage in the face of aggressive compiler
optimization.
FossilOrigin-Name: 5781d043ffeccda03357ee530564987443dc1deb6111a4028701b4a98fdfe16d
---
manifest | 12 ++++++------
manifest.uuid | 2 +-
src/vdbeaux.c | 22 +++++++++++++++-------
3 files changed, 22 insertions(+), 14 deletions(-)
diff --git a/manifest b/manifest
index 12f27004eb..e0207305ff 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sa\sJSON\sbug\sintroduced\sby\sthe\soptimization\sof\s[df099ad713011b67]\sand\nfirst\sappearing\sin\s3.43.0.\s\sThe\sproblem\soccurs\swhen\sdoing\sa\sJSON_EXTRACT()\non\san\sarray\selement\sthat\swas\sadded\sby\sJSON_SET()\swithout\sfirst\sreparsing.\nReported\sby\s[forum:/forumpost/fc0e3f1e2a|forum\spost\sfc0e3f1e2a].
-D 2023-10-17T13:41:41.074
+C Changes\sto\ssqlite3IntFloatCompare()\sin\san\sattempt\sto\sbetter\smeasure\nbranch\scoverage\sin\sthe\sface\sof\saggressive\scompiler\soptimization.
+D 2023-10-17T17:53:46.671
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -792,7 +792,7 @@ F src/vdbe.c ae873b02ade06478b217ea38d90229dff68180d7a1fe526910b0d62a0fe0595a
F src/vdbe.h 41485521f68e9437fdb7ec4a90f9d86ab294e9bb8281e33b235915e29122cfc0
F src/vdbeInt.h 949669dfd8a41550d27dcb905b494f2ccde9a2e6c1b0b04daa1227e2e74c2b2c
F src/vdbeapi.c 9c1509ea78dbfb528fbca49601a5a39617eeca3315b141e3b28e2ee1ec45dc12
-F src/vdbeaux.c 5b415e09b5b9d5be6c0f4fcbf18ea9d7d16f6a29ced2f14a3b2041020f63e9c1
+F src/vdbeaux.c 1a11270d4b7cd1fad29a7c3f1d175a816fca2fb6ecaa3e5ecbe1eb4baf575f75
F src/vdbeblob.c 13f9287b55b6356b4b1845410382d6bede203ceb29ef69388a4a3d007ffacbe5
F src/vdbemem.c ba9e21c579b58979a63d85e79088c9a9860b0ff4359f59a0db37427fb7807f66
F src/vdbesort.c 237840ca1947511fa59bd4e18b9eeae93f2af2468c34d2427b059f896230a547
@@ -2132,8 +2132,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P e754789971e019647e7068f76dc6f9778675e4849fe51d8b25b39d3edf2379e5
-R 3f9b22b9a01bc799e241ff3ddd4c2083
+P e5099c549a1d8959d4015516f090b8e6438e517a64b20651175bf5413d94fb58
+R 75216e177755e8e74b67bf7e07c7ed2b
U drh
-Z 0e3dd3d1b219ba9ab7384c8b1f01954c
+Z a40626b169d3eb0845d6fccf462c01da
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index aec3af3110..915eb30ed5 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-e5099c549a1d8959d4015516f090b8e6438e517a64b20651175bf5413d94fb58
\ No newline at end of file
+5781d043ffeccda03357ee530564987443dc1deb6111a4028701b4a98fdfe16d
\ No newline at end of file
diff --git a/src/vdbeaux.c b/src/vdbeaux.c
index eafc038562..1ed7a6dca3 100644
--- a/src/vdbeaux.c
+++ b/src/vdbeaux.c
@@ -4461,6 +4461,16 @@ SQLITE_NOINLINE int sqlite3BlobCompare(const Mem *pB1, const Mem *pB2){
return n1 - n2;
}
+/* The following two functions are used only within testcase() to prove
+** test coverage. These functions do no exist for production builds.
+** We must use separate SQLITE_NOINLINE functions here, since otherwise
+** optimizer code movement causes gcov to become very confused.
+*/
+#if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_DEBUG)
+static int SQLITE_NOINLINE doubleLt(double a, double b){ return ar );
testcase( x==r );
- if( xr; /*NO_TEST*/ /* work around bug in gcov */
+ return (xr);
}else{
i64 y;
double s;
@@ -4482,12 +4491,11 @@ int sqlite3IntFloatCompare(i64 i, double r){
y = (i64)r;
if( iy ) return +1;
- testcase( r<(double)i );
- testcase( r>(double)i );
- testcase( r==(double)i );
s = (double)i;
- if( sr; /*NO_TEST*/ /* work around bug in gcov */
+ testcase( doubleLt(s,r) );
+ testcase( doubleLt(r,s) );
+ testcase( doubleEq(r,s) );
+ return (sr);
}
}
From 42b49a3138aa7009c8f36744aa309d932edcd4af Mon Sep 17 00:00:00 2001
From: drh <>
Date: Tue, 17 Oct 2023 18:28:27 +0000
Subject: [PATCH 43/66] Omit an unreachable branch when SQLITE_ENABLE_API_ARMOR
is not defined.
FossilOrigin-Name: 5f8b807b568f4f9ec65f1c924e0e1ac2f996f405e045204145ad7116be7580ee
---
manifest | 12 ++++++------
manifest.uuid | 2 +-
src/vdbeapi.c | 7 ++++++-
3 files changed, 13 insertions(+), 8 deletions(-)
diff --git a/manifest b/manifest
index e0207305ff..889a0c5c2b 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Changes\sto\ssqlite3IntFloatCompare()\sin\san\sattempt\sto\sbetter\smeasure\nbranch\scoverage\sin\sthe\sface\sof\saggressive\scompiler\soptimization.
-D 2023-10-17T17:53:46.671
+C Omit\san\sunreachable\sbranch\swhen\sSQLITE_ENABLE_API_ARMOR\sis\snot\sdefined.
+D 2023-10-17T18:28:27.757
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -791,7 +791,7 @@ F src/vacuum.c 604fcdaebe76f3497c855afcbf91b8fa5046b32de3045bab89cc008d68e40104
F src/vdbe.c ae873b02ade06478b217ea38d90229dff68180d7a1fe526910b0d62a0fe0595a
F src/vdbe.h 41485521f68e9437fdb7ec4a90f9d86ab294e9bb8281e33b235915e29122cfc0
F src/vdbeInt.h 949669dfd8a41550d27dcb905b494f2ccde9a2e6c1b0b04daa1227e2e74c2b2c
-F src/vdbeapi.c 9c1509ea78dbfb528fbca49601a5a39617eeca3315b141e3b28e2ee1ec45dc12
+F src/vdbeapi.c fe654b1f54e1feebcaed6c2ae3ed035cc65bfeb9a1169bed866abc42bfc63ff6
F src/vdbeaux.c 1a11270d4b7cd1fad29a7c3f1d175a816fca2fb6ecaa3e5ecbe1eb4baf575f75
F src/vdbeblob.c 13f9287b55b6356b4b1845410382d6bede203ceb29ef69388a4a3d007ffacbe5
F src/vdbemem.c ba9e21c579b58979a63d85e79088c9a9860b0ff4359f59a0db37427fb7807f66
@@ -2132,8 +2132,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P e5099c549a1d8959d4015516f090b8e6438e517a64b20651175bf5413d94fb58
-R 75216e177755e8e74b67bf7e07c7ed2b
+P 5781d043ffeccda03357ee530564987443dc1deb6111a4028701b4a98fdfe16d
+R 513dac248a540d96596079e13af2bfae
U drh
-Z a40626b169d3eb0845d6fccf462c01da
+Z 1e907b0b1d9f5c01eabd8840863bba73
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 915eb30ed5..a162b38132 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-5781d043ffeccda03357ee530564987443dc1deb6111a4028701b4a98fdfe16d
\ No newline at end of file
+5f8b807b568f4f9ec65f1c924e0e1ac2f996f405e045204145ad7116be7580ee
\ No newline at end of file
diff --git a/src/vdbeapi.c b/src/vdbeapi.c
index b7b3b94cdc..31ebbc6976 100644
--- a/src/vdbeapi.c
+++ b/src/vdbeapi.c
@@ -375,7 +375,7 @@ void sqlite3_value_free(sqlite3_value *pOld){
** is too big or if an OOM occurs.
**
** The invokeValueDestructor(P,X) routine invokes destructor function X()
-** on value P is not going to be used and need to be destroyed.
+** on value P if P is not going to be used and need to be destroyed.
*/
static void setResultStrOrError(
sqlite3_context *pCtx, /* Function context */
@@ -415,9 +415,14 @@ static int invokeValueDestructor(
}else{
xDel((void*)p);
}
+#ifdef SQLITE_ENABLE_API_ARMOR
if( pCtx!=0 ){
sqlite3_result_error_toobig(pCtx);
}
+#else
+ assert( pCtx!=0 );
+ sqlite3_result_error_toobig(pCtx);
+#endif
return SQLITE_TOOBIG;
}
void sqlite3_result_blob(
From 6db4e5ed4cc2247381bb2b93bdb66979d081cf94 Mon Sep 17 00:00:00 2001
From: drh <>
Date: Tue, 17 Oct 2023 18:59:13 +0000
Subject: [PATCH 44/66] Make a new branch in the SqlExec opcode reachable by
tests.
FossilOrigin-Name: 023ad470b68b7c09e159244493a6d0285d706efdecd8719a71e6885509d4750c
---
manifest | 12 ++++++------
manifest.uuid | 2 +-
src/vdbe.c | 2 +-
3 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/manifest b/manifest
index 889a0c5c2b..ccb1b3b8c3 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Omit\san\sunreachable\sbranch\swhen\sSQLITE_ENABLE_API_ARMOR\sis\snot\sdefined.
-D 2023-10-17T18:28:27.757
+C Make\sa\snew\sbranch\sin\sthe\sSqlExec\sopcode\sreachable\sby\stests.
+D 2023-10-17T18:59:13.292
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -788,7 +788,7 @@ F src/upsert.c fa125a8d3410ce9a97b02cb50f7ae68a2476c405c76aa692d3acf6b8586e9242
F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0
F src/util.c e87f66258c37f87724f46e849572c3ece4c74ef5614ba41eb221e98f0dbc95de
F src/vacuum.c 604fcdaebe76f3497c855afcbf91b8fa5046b32de3045bab89cc008d68e40104
-F src/vdbe.c ae873b02ade06478b217ea38d90229dff68180d7a1fe526910b0d62a0fe0595a
+F src/vdbe.c fb7697e9292e74d6b63e37349edbae5fb2116a7753f71744d41a699bd28e2d3a
F src/vdbe.h 41485521f68e9437fdb7ec4a90f9d86ab294e9bb8281e33b235915e29122cfc0
F src/vdbeInt.h 949669dfd8a41550d27dcb905b494f2ccde9a2e6c1b0b04daa1227e2e74c2b2c
F src/vdbeapi.c fe654b1f54e1feebcaed6c2ae3ed035cc65bfeb9a1169bed866abc42bfc63ff6
@@ -2132,8 +2132,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 5781d043ffeccda03357ee530564987443dc1deb6111a4028701b4a98fdfe16d
-R 513dac248a540d96596079e13af2bfae
+P 5f8b807b568f4f9ec65f1c924e0e1ac2f996f405e045204145ad7116be7580ee
+R 9f71db9b261c5cdc2f29e944e28307f6
U drh
-Z 1e907b0b1d9f5c01eabd8840863bba73
+Z 35b981188468f296d580751db3ae3f1e
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index a162b38132..ca1349f344 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-5f8b807b568f4f9ec65f1c924e0e1ac2f996f405e045204145ad7116be7580ee
\ No newline at end of file
+023ad470b68b7c09e159244493a6d0285d706efdecd8719a71e6885509d4750c
\ No newline at end of file
diff --git a/src/vdbe.c b/src/vdbe.c
index ce094f9970..8077d2185a 100644
--- a/src/vdbe.c
+++ b/src/vdbe.c
@@ -6927,7 +6927,7 @@ case OP_SqlExec: {
db->nSqlExec--;
db->xAuth = xAuth;
db->mTrace = mTrace;
- if( rc || zErr ){
+ if( zErr || rc ){
sqlite3VdbeError(p, "%s", zErr);
sqlite3_free(zErr);
if( rc==SQLITE_NOMEM ) goto no_mem;
From 43dc31cf1feff10d37e7a5dc3ce141698054768a Mon Sep 17 00:00:00 2001
From: drh <>
Date: Tue, 17 Oct 2023 19:33:52 +0000
Subject: [PATCH 45/66] Fix a harmless compiler warning about variant types for
a pointer function.
FossilOrigin-Name: 37ff0d8e7f91c32e8c53bb015280be47c66bf599281b640a8d3fd41335b55289
---
manifest | 20 ++++++++++----------
manifest.uuid | 2 +-
src/json.c | 10 +++++-----
src/printf.c | 2 +-
src/sqliteInt.h | 2 +-
src/vdbe.c | 4 ++--
src/vdbemem.c | 2 +-
7 files changed, 21 insertions(+), 21 deletions(-)
diff --git a/manifest b/manifest
index ccb1b3b8c3..d7fd51770a 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Make\sa\snew\sbranch\sin\sthe\sSqlExec\sopcode\sreachable\sby\stests.
-D 2023-10-17T18:59:13.292
+C Fix\sa\sharmless\scompiler\swarning\sabout\svariant\stypes\sfor\sa\spointer\sfunction.
+D 2023-10-17T19:33:52.248
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -678,7 +678,7 @@ F src/hash.h 3340ab6e1d13e725571d7cee6d3e3135f0779a7d8e76a9ce0a85971fa3953c51
F src/hwtime.h f9c2dfb84dce7acf95ce6d289e46f5f9d3d1afd328e53da8f8e9008e3b3caae6
F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71
F src/insert.c 3f0a94082d978bbdd33c38fefea15346c6c6bffb70bc645a71dc0f1f87dd3276
-F src/json.c a803f6eb684a8e24e99761138ee233e6d3140f8691146e4667a8fe700c0c16a5
+F src/json.c d69c6e28ff7b602877bda68cd20583b8487c059759aa4d154dd21b3fd99c6238
F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa
F src/loadext.c 7d56c6f28aaf9b42e2772289e0d0a12a77b57c2baed021dbfd1fcafec69c156a
F src/main.c 73ae4cab166b0fd36352446de7f7d91f89bde86686ae18f0bb7b245173479831
@@ -714,7 +714,7 @@ F src/pcache1.c 602acb23c471bb8d557a6f0083cc2be641d6cafcafa19e481eba7ef4c9ca0f00
F src/pragma.c 9f9b8828624ee98de22a2a9793a651daa39bc06cd9e701b6eda23c6d75260f1d
F src/pragma.h e690a356c18e98414d2e870ea791c1be1545a714ba623719deb63f7f226d8bb7
F src/prepare.c bde74add20fc0e8ce0c4e937a1f70a36d17413afe4f71d3e103f5cb74b17c8d9
-F src/printf.c e3ba080e2f409f9bfcc8d34724e6fc160e9c718dc92d0548f6b71b8b6f860ce2
+F src/printf.c 9da63b9ae1c14789bcae12840f5d800fd9302500cd2d62733fac77f0041b4750
F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
F src/resolve.c 0c3046b88901336709cd09f474303a16fc54bce13a2befcab66d0fa6b44ca869
F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
@@ -723,7 +723,7 @@ F src/shell.c.in cf0a3387c5bb05ca2fe6073fa7df21aaa11e749ca5b3846b80b586a447e728a
F src/sqlite.h.in 60e5698417e674f44be17d5ceeb4c2d395ccedba18d6de05435dec0135d9eff1
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
F src/sqlite3ext.h 2f30b2671f4c03cd27a43f039e11251391066c97d11385f5f963bb40b03038ac
-F src/sqliteInt.h 3c8a3f1bf889a632dbbaecbd3334e9e8d7fdb63b26ee09d6d384af0cc757d64c
+F src/sqliteInt.h 2784a4c7cd99c21290a3c6608827ab18af82f2774bd3d3d74b510f792912317d
F src/sqliteLimit.h 33b1c9baba578d34efe7dfdb43193b366111cdf41476b1e82699e14c11ee1fb6
F src/status.c 160c445d7d28c984a0eae38c144f6419311ed3eace59b44ac6dafc20db4af749
F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
@@ -788,13 +788,13 @@ F src/upsert.c fa125a8d3410ce9a97b02cb50f7ae68a2476c405c76aa692d3acf6b8586e9242
F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0
F src/util.c e87f66258c37f87724f46e849572c3ece4c74ef5614ba41eb221e98f0dbc95de
F src/vacuum.c 604fcdaebe76f3497c855afcbf91b8fa5046b32de3045bab89cc008d68e40104
-F src/vdbe.c fb7697e9292e74d6b63e37349edbae5fb2116a7753f71744d41a699bd28e2d3a
+F src/vdbe.c 300b1ac9339a5b7db9ccd48c1a13c3d71722da13352a38ee042ca0a399b4dd7e
F src/vdbe.h 41485521f68e9437fdb7ec4a90f9d86ab294e9bb8281e33b235915e29122cfc0
F src/vdbeInt.h 949669dfd8a41550d27dcb905b494f2ccde9a2e6c1b0b04daa1227e2e74c2b2c
F src/vdbeapi.c fe654b1f54e1feebcaed6c2ae3ed035cc65bfeb9a1169bed866abc42bfc63ff6
F src/vdbeaux.c 1a11270d4b7cd1fad29a7c3f1d175a816fca2fb6ecaa3e5ecbe1eb4baf575f75
F src/vdbeblob.c 13f9287b55b6356b4b1845410382d6bede203ceb29ef69388a4a3d007ffacbe5
-F src/vdbemem.c ba9e21c579b58979a63d85e79088c9a9860b0ff4359f59a0db37427fb7807f66
+F src/vdbemem.c c936e9002af4993b84c4eb7133d6b1190efe46d391cc86117ecd67ba17b1a04b
F src/vdbesort.c 237840ca1947511fa59bd4e18b9eeae93f2af2468c34d2427b059f896230a547
F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf823
F src/vdbevtab.c 2143db7db0ceed69b21422581f434baffc507a08d831565193a7a02882a1b6a7
@@ -2132,8 +2132,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 5f8b807b568f4f9ec65f1c924e0e1ac2f996f405e045204145ad7116be7580ee
-R 9f71db9b261c5cdc2f29e944e28307f6
+P 023ad470b68b7c09e159244493a6d0285d706efdecd8719a71e6885509d4750c
+R 2891ade350d5b9b23e69233a322b4f0b
U drh
-Z 35b981188468f296d580751db3ae3f1e
+Z 8ab84523dcdf2fbda2ee418136868215
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index ca1349f344..33a330abb9 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-023ad470b68b7c09e159244493a6d0285d706efdecd8719a71e6885509d4750c
\ No newline at end of file
+37ff0d8e7f91c32e8c53bb015280be47c66bf599281b640a8d3fd41335b55289
\ No newline at end of file
diff --git a/src/json.c b/src/json.c
index bb1834dd89..c2129a026e 100644
--- a/src/json.c
+++ b/src/json.c
@@ -602,7 +602,7 @@ static void jsonResult(JsonString *p){
}else if( jsonForceRCStr(p) ){
sqlite3RCStrRef(p->zBuf);
sqlite3_result_text64(p->pCtx, p->zBuf, p->nUsed,
- (void(*)(void*))sqlite3RCStrUnref,
+ sqlite3RCStrUnref,
SQLITE_UTF8);
}
}
@@ -1942,7 +1942,7 @@ static JsonParse *jsonParseCached(
/* The input JSON was not found anywhere in the cache. We will need
** to parse it ourselves and generate a new JsonParse object.
*/
- bJsonRCStr = sqlite3ValueIsOfClass(pJson,(void(*)(void*))sqlite3RCStrUnref);
+ bJsonRCStr = sqlite3ValueIsOfClass(pJson,sqlite3RCStrUnref);
p = sqlite3_malloc64( sizeof(*p) + (bJsonRCStr ? 0 : nJson+1) );
if( p==0 ){
sqlite3_result_error_nomem(pCtx);
@@ -3127,7 +3127,7 @@ static void jsonArrayCompute(sqlite3_context *ctx, int isFinal){
}else if( isFinal ){
sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed,
pStr->bStatic ? SQLITE_TRANSIENT :
- (void(*)(void*))sqlite3RCStrUnref);
+ sqlite3RCStrUnref);
pStr->bStatic = 1;
}else{
sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed, SQLITE_TRANSIENT);
@@ -3236,7 +3236,7 @@ static void jsonObjectCompute(sqlite3_context *ctx, int isFinal){
}else if( isFinal ){
sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed,
pStr->bStatic ? SQLITE_TRANSIENT :
- (void(*)(void*))sqlite3RCStrUnref);
+ sqlite3RCStrUnref);
pStr->bStatic = 1;
}else{
sqlite3_result_text(ctx, pStr->zBuf, (int)pStr->nUsed, SQLITE_TRANSIENT);
@@ -3668,7 +3668,7 @@ static int jsonEachFilter(
if( z==0 ) return SQLITE_OK;
memset(&p->sParse, 0, sizeof(p->sParse));
p->sParse.nJPRef = 1;
- if( sqlite3ValueIsOfClass(argv[0], (void(*)(void*))sqlite3RCStrUnref) ){
+ if( sqlite3ValueIsOfClass(argv[0], sqlite3RCStrUnref) ){
p->sParse.zJson = sqlite3RCStrRef((char*)z);
}else{
n = sqlite3_value_bytes(argv[0]);
diff --git a/src/printf.c b/src/printf.c
index 87ad91f795..3c0b182d39 100644
--- a/src/printf.c
+++ b/src/printf.c
@@ -1389,7 +1389,7 @@ char *sqlite3RCStrRef(char *z){
** Decrease the reference count by one. Free the string when the
** reference count reaches zero.
*/
-void sqlite3RCStrUnref(char *z){
+void sqlite3RCStrUnref(void *z){
RCStr *p = (RCStr*)z;
assert( p!=0 );
p--;
diff --git a/src/sqliteInt.h b/src/sqliteInt.h
index 54f8db50a5..bee53b6c78 100644
--- a/src/sqliteInt.h
+++ b/src/sqliteInt.h
@@ -5352,7 +5352,7 @@ int sqlite3ApiExit(sqlite3 *db, int);
int sqlite3OpenTempDatabase(Parse *);
char *sqlite3RCStrRef(char*);
-void sqlite3RCStrUnref(char*);
+void sqlite3RCStrUnref(void*);
char *sqlite3RCStrNew(u64);
char *sqlite3RCStrResize(char*,u64);
diff --git a/src/vdbe.c b/src/vdbe.c
index 8077d2185a..b7bf8c0ec7 100644
--- a/src/vdbe.c
+++ b/src/vdbe.c
@@ -762,11 +762,11 @@ static SQLITE_NOINLINE int vdbeColumnFromOverflow(
sqlite3RCStrRef(pBuf);
if( t&1 ){
rc = sqlite3VdbeMemSetStr(pDest, pBuf, len, encoding,
- (void(*)(void*))sqlite3RCStrUnref);
+ sqlite3RCStrUnref);
pDest->flags |= MEM_Term;
}else{
rc = sqlite3VdbeMemSetStr(pDest, pBuf, len, 0,
- (void(*)(void*))sqlite3RCStrUnref);
+ sqlite3RCStrUnref);
}
}else{
rc = sqlite3VdbeMemFromBtree(pC->uc.pCursor, iOffset, len, pDest);
diff --git a/src/vdbemem.c b/src/vdbemem.c
index 27dfc73fd0..eee828143a 100644
--- a/src/vdbemem.c
+++ b/src/vdbemem.c
@@ -336,7 +336,7 @@ void sqlite3VdbeMemZeroTerminateIfAble(Mem *pMem){
pMem->flags |= MEM_Term;
return;
}
- if( pMem->xDel==(void(*)(void*))sqlite3RCStrUnref ){
+ if( pMem->xDel==sqlite3RCStrUnref ){
/* Blindly assume that all RCStr objects are zero-terminated */
pMem->flags |= MEM_Term;
return;
From 0b4de1acac7da83cfaf72cbd00d1d1f2fd456b1a Mon Sep 17 00:00:00 2001
From: stephan
Date: Tue, 17 Oct 2023 23:35:47 +0000
Subject: [PATCH 46/66] JS: replace one errant reference to 'self' with
'globalThis' and remove a separate dead-code 'self' reference.
FossilOrigin-Name: da1a47932ea96755b1e11fc2547ce11780b87846af6885857318ff18f1e62c31
---
ext/wasm/api/sqlite3-api-worker1.js | 3 +--
ext/wasm/api/sqlite3-worker1.c-pp.js | 2 +-
manifest | 16 ++++++++--------
manifest.uuid | 2 +-
4 files changed, 11 insertions(+), 12 deletions(-)
diff --git a/ext/wasm/api/sqlite3-api-worker1.js b/ext/wasm/api/sqlite3-api-worker1.js
index 9a386c13e7..29f7d2be63 100644
--- a/ext/wasm/api/sqlite3-api-worker1.js
+++ b/ext/wasm/api/sqlite3-api-worker1.js
@@ -333,7 +333,6 @@ sqlite3.initWorker1API = function(){
if(!(globalThis.WorkerGlobalScope instanceof Function)){
toss("initWorker1API() must be run from a Worker thread.");
}
- const self = this.self;
const sqlite3 = this.sqlite3 || toss("Missing this.sqlite3 object.");
const DB = sqlite3.oo1.DB;
@@ -657,5 +656,5 @@ sqlite3.initWorker1API = function(){
}, wState.xfer);
};
globalThis.postMessage({type:'sqlite3-api',result:'worker1-ready'});
-}.bind({self, sqlite3});
+}.bind({sqlite3});
});
diff --git a/ext/wasm/api/sqlite3-worker1.c-pp.js b/ext/wasm/api/sqlite3-worker1.c-pp.js
index f260422309..220722ffe1 100644
--- a/ext/wasm/api/sqlite3-worker1.c-pp.js
+++ b/ext/wasm/api/sqlite3-worker1.c-pp.js
@@ -37,7 +37,7 @@ import {default as sqlite3InitModule} from './sqlite3-bundler-friendly.mjs';
"use strict";
{
const urlParams = globalThis.location
- ? new URL(self.location.href).searchParams
+ ? new URL(globalThis.location.href).searchParams
: new URLSearchParams();
let theJs = 'sqlite3.js';
if(urlParams.has('sqlite3.dir')){
diff --git a/manifest b/manifest
index d7fd51770a..ec337ca6ad 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sa\sharmless\scompiler\swarning\sabout\svariant\stypes\sfor\sa\spointer\sfunction.
-D 2023-10-17T19:33:52.248
+C JS:\sreplace\sone\serrant\sreference\sto\s'self'\swith\s'globalThis'\sand\sremove\sa\sseparate\sdead-code\s'self'\sreference.
+D 2023-10-17T23:35:47.218
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -579,7 +579,7 @@ F ext/wasm/api/sqlite3-api-cleanup.js d235ad237df6954145404305040991c72ef8b18817
F ext/wasm/api/sqlite3-api-glue.js 26aedfb27915f4f316f6eac84078443e4f0d2dfe5f012310014923ed4b77b2b6
F ext/wasm/api/sqlite3-api-oo1.js 9678dc4d9a5d39632b6ffe6ea94a023119260815bf32f265bf5f6c36c9516db8
F ext/wasm/api/sqlite3-api-prologue.js 9aeba7b45cf41b3a26d34d7fb2525633cd1adfc544888c1ea8dbb077496f4ce9
-F ext/wasm/api/sqlite3-api-worker1.js 9f32af64df1a031071912eea7a201557fe39b1738645c0134562bb84e88e2fec
+F ext/wasm/api/sqlite3-api-worker1.js f941382f21006b4a817754184e2661b0a63ce650201f3419cd60f4758b6fd60e
F ext/wasm/api/sqlite3-license-version-header.js 0c807a421f0187e778dc1078f10d2994b915123c1223fe752b60afdcd1263f89
F ext/wasm/api/sqlite3-opfs-async-proxy.js 8cf8a897726f14071fae6be6648125162b256dfb4f96555b865dbb7a6b65e379
F ext/wasm/api/sqlite3-v-helper.js 7daa0eab0a513a25b05e9abae7b5beaaa39209b3ed12f86aeae9ef8d2719ed25
@@ -587,7 +587,7 @@ F ext/wasm/api/sqlite3-vfs-opfs-sahpool.c-pp.js f7c965cf9ac0b66a538cd8f6c156f3f2
F ext/wasm/api/sqlite3-vfs-opfs.c-pp.js 46c4afa6c50d7369252c104f274ad977a97e91ccfafc38b400fe36e90bdda88e
F ext/wasm/api/sqlite3-wasm.c c8c5b81b838cef2053b1eb6e7a79c44a2caedcf0c9e6b0d12a45d73ce0617be0
F ext/wasm/api/sqlite3-worker1-promiser.c-pp.js bc06df0d599e625bde6a10a394e326dc68da9ff07fa5404354580f81566e591f
-F ext/wasm/api/sqlite3-worker1.c-pp.js da509469755035e919c015deea41b4514b5e84c12a1332e6cc8d42cb2cc1fb75
+F ext/wasm/api/sqlite3-worker1.c-pp.js a541112aa51e16705f13a99bb943c64efe178aa28c86704a955f8fd9afe4ba37
F ext/wasm/batch-runner.html 4deeed44fe41496dc6898d9fb17938ea3291f40f4bfb977e29d0cef96fbbe4c8
F ext/wasm/batch-runner.js 0dad6a02ad796f1003d3b7048947d275c4d6277f63767b8e685c27df8fdac93e
F ext/wasm/c-pp.c 6d80d8569d85713effe8b0818a3cf51dc779e3f0bf8dc88771b8998552ee25b4
@@ -2132,8 +2132,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 023ad470b68b7c09e159244493a6d0285d706efdecd8719a71e6885509d4750c
-R 2891ade350d5b9b23e69233a322b4f0b
-U drh
-Z 8ab84523dcdf2fbda2ee418136868215
+P 37ff0d8e7f91c32e8c53bb015280be47c66bf599281b640a8d3fd41335b55289
+R 02d0e707fb1cf1d9efb28ab84c90dee6
+U stephan
+Z 455d6debd64ad95ee72e444517f71e6f
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 33a330abb9..7700963681 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-37ff0d8e7f91c32e8c53bb015280be47c66bf599281b640a8d3fd41335b55289
\ No newline at end of file
+da1a47932ea96755b1e11fc2547ce11780b87846af6885857318ff18f1e62c31
\ No newline at end of file
From f8202f1ff3ff84908ff1038886f6c6c01eba8dc2 Mon Sep 17 00:00:00 2001
From: drh <>
Date: Wed, 18 Oct 2023 13:18:52 +0000
Subject: [PATCH 47/66] Enhance the parser so that it can accept an ORDER BY
clause on a function invocation. For this incremental check-in, the ORDER BY
clause is currently ignored.
FossilOrigin-Name: 3a98ff24bf468ed42d410a9a12d9f9b2ca154c7babe99fd6bc6f7b0565e0d132
---
manifest | 23 +++++++++++++----------
manifest.uuid | 2 +-
src/expr.c | 38 ++++++++++++++++++++++++++++++++++++++
src/parse.y | 9 +++++++++
src/sqliteInt.h | 1 +
src/treeview.c | 6 ++++++
6 files changed, 68 insertions(+), 11 deletions(-)
diff --git a/manifest b/manifest
index ec337ca6ad..c119b5f7d2 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C JS:\sreplace\sone\serrant\sreference\sto\s'self'\swith\s'globalThis'\sand\sremove\sa\sseparate\sdead-code\s'self'\sreference.
-D 2023-10-17T23:35:47.218
+C Enhance\sthe\sparser\sso\sthat\sit\scan\saccept\san\sORDER\sBY\sclause\son\sa\sfunction\ninvocation.\s\sFor\sthis\sincremental\scheck-in,\sthe\sORDER\sBY\sclause\sis\scurrently\nignored.
+D 2023-10-18T13:18:52.383
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -668,7 +668,7 @@ F src/date.c eebc54a00e888d3c56147779e9f361b77d62fd69ff2008c5373946aa1ba1d574
F src/dbpage.c 80e46e1df623ec40486da7a5086cb723b0275a6e2a7b01d9f9b5da0f04ba2782
F src/dbstat.c 3b677254d512fcafd4d0b341bf267b38b235ccfddbef24f9154e19360fa22e43
F src/delete.c cb766727c78e715f9fb7ec8a7d03658ed2a3016343ca687acfcec9083cdca500
-F src/expr.c 8a5045ac7aae5ecebe7236ec05841693b5a0012af70a4d73933333172546c50d
+F src/expr.c c1a2aa866a146a5329d562ad1cf7bc53a6e08aeb6d350a5766269a3f22f08ace
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
F src/fkey.c a7fcbf7e66d14dbb73cf49f31489ebf66d0e6006c62b95246924a3bae9f37b36
F src/func.c e8d7b3587a225f4f1116f720b72090511fe9feb936e960bd26a053cea6a17a63
@@ -707,7 +707,7 @@ F src/os_win.c 4a50a154aeebc66a1f8fb79c1ff6dd5fe3d005556533361e0d460d41cb6a45a8
F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
F src/pager.c 2188897e1102a776dcb1bbe8b2eb70ac7de8863c9cb95ef09d35e9bad406cf45
F src/pager.h f4d33fec8052603758792045493423b8871a996da2d0973927b7d36cd6070473
-F src/parse.y aeb7760d41cfa86465e3adba506500c021597049fd55f82a30e5b7045862c28c
+F src/parse.y 020d80386eb216ec9520549106353c517d2bbc89be28752ffdca649a9eaf56ec
F src/pcache.c 040b165f30622a21b7a9a77c6f2e4877a32fb7f22d4c7f0d2a6fa6833a156a75
F src/pcache.h 1497ce1b823cf00094bb0cf3bac37b345937e6f910890c626b16512316d3abf5
F src/pcache1.c 602acb23c471bb8d557a6f0083cc2be641d6cafcafa19e481eba7ef4c9ca0f00
@@ -723,7 +723,7 @@ F src/shell.c.in cf0a3387c5bb05ca2fe6073fa7df21aaa11e749ca5b3846b80b586a447e728a
F src/sqlite.h.in 60e5698417e674f44be17d5ceeb4c2d395ccedba18d6de05435dec0135d9eff1
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
F src/sqlite3ext.h 2f30b2671f4c03cd27a43f039e11251391066c97d11385f5f963bb40b03038ac
-F src/sqliteInt.h 2784a4c7cd99c21290a3c6608827ab18af82f2774bd3d3d74b510f792912317d
+F src/sqliteInt.h bc1da6f5605dd0f8433904c2b4e6f9960f6cf327b42f00d1885dc11a290e0641
F src/sqliteLimit.h 33b1c9baba578d34efe7dfdb43193b366111cdf41476b1e82699e14c11ee1fb6
F src/status.c 160c445d7d28c984a0eae38c144f6419311ed3eace59b44ac6dafc20db4af749
F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
@@ -781,7 +781,7 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394
F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c
F src/tokenize.c 23d9f4539880b40226254ad9072f4ecf12eb1902e62aea47aac29928afafcfd5
-F src/treeview.c 1d52fbc4e97161e65858d36e3424ea6e3fc045dd8a679c82b4b9593dc30de3bd
+F src/treeview.c 6c441500139d46c147216dac667510987ecd0e91a27735cd6d9dd77f81e465a7
F src/trigger.c 5286019b152f622a38900284109e4aae1e5f566deb7ad9ba7e931f0660771f32
F src/update.c 6904814dd62a7a93bbb86d9f1419c7f134a9119582645854ab02b36b676d9f92
F src/upsert.c fa125a8d3410ce9a97b02cb50f7ae68a2476c405c76aa692d3acf6b8586e9242
@@ -2132,8 +2132,11 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 37ff0d8e7f91c32e8c53bb015280be47c66bf599281b640a8d3fd41335b55289
-R 02d0e707fb1cf1d9efb28ab84c90dee6
-U stephan
-Z 455d6debd64ad95ee72e444517f71e6f
+P da1a47932ea96755b1e11fc2547ce11780b87846af6885857318ff18f1e62c31
+R 4d323de4f6e44235324bfe080b4895e2
+T *branch * agg-orderby
+T *sym-agg-orderby *
+T -sym-trunk *
+U drh
+Z 1ba4c9d9b0d3f5c9086b8a02e3617a21
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 7700963681..639cc87ac6 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-da1a47932ea96755b1e11fc2547ce11780b87846af6885857318ff18f1e62c31
\ No newline at end of file
+3a98ff24bf468ed42d410a9a12d9f9b2ca154c7babe99fd6bc6f7b0565e0d132
\ No newline at end of file
diff --git a/src/expr.c b/src/expr.c
index f7290262e5..07b6dfcef6 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -1181,6 +1181,44 @@ Expr *sqlite3ExprFunction(
return pNew;
}
+/*
+** Attach an ORDER BY clause to a function call.
+**
+** functionname( arguments ORDER BY sortlist )
+** \_____________________/ \______/
+** pExpr pOrderBy
+**
+** The ORDER BY clause is inserted into a new Expr node of type TK_ORDER
+** and added to the Expr.pLeft field of the parent TK_FUNCTION node.
+*/
+void sqlite3ExprAddFunctionOrderBy(
+ Parse *pParse, /* Parsing context */
+ Expr *pExpr, /* The function call to which ORDER BY is to be added */
+ ExprList *pOrderBy /* The ORDER BY clause to add */
+){
+ Expr *pOB;
+ sqlite3 *db = pParse->db;
+ if( pOrderBy==0 ){
+ assert( db->mallocFailed );
+ return;
+ }
+ if( pExpr==0 ){
+ assert( db->mallocFailed );
+ sqlite3ExprListDelete(db, pOrderBy);
+ return;
+ }
+ assert( pExpr->op==TK_FUNCTION );
+ assert( pExpr->pLeft==0 );
+ pOB = sqlite3ExprAlloc(db, TK_ORDER, 0, 0);
+ if( pOB==0 ){
+ sqlite3ExprListDelete(db, pOrderBy);
+ return;
+ }
+ pOB->x.pList = pOrderBy;
+ assert( ExprUseXList(pOB) );
+ pExpr->pLeft = pOB;
+}
+
/*
** Check to see if a function is usable according to current access
** rules:
diff --git a/src/parse.y b/src/parse.y
index 867b62aa7a..19491192e3 100644
--- a/src/parse.y
+++ b/src/parse.y
@@ -1144,6 +1144,10 @@ expr(A) ::= CAST LP expr(E) AS typetoken(T) RP. {
expr(A) ::= idj(X) LP distinct(D) exprlist(Y) RP. {
A = sqlite3ExprFunction(pParse, Y, &X, D);
}
+expr(A) ::= idj(X) LP distinct(D) exprlist(Y) ORDER BY sortlist(O) RP. {
+ A = sqlite3ExprFunction(pParse, Y, &X, D);
+ sqlite3ExprAddFunctionOrderBy(pParse, A, O);
+}
expr(A) ::= idj(X) LP STAR RP. {
A = sqlite3ExprFunction(pParse, 0, &X, 0);
}
@@ -1153,6 +1157,11 @@ expr(A) ::= idj(X) LP distinct(D) exprlist(Y) RP filter_over(Z). {
A = sqlite3ExprFunction(pParse, Y, &X, D);
sqlite3WindowAttach(pParse, A, Z);
}
+expr(A) ::= idj(X) LP distinct(D) exprlist(Y) ORDER BY sortlist(O) RP filter_over(Z). {
+ A = sqlite3ExprFunction(pParse, Y, &X, D);
+ sqlite3WindowAttach(pParse, A, Z);
+ sqlite3ExprAddFunctionOrderBy(pParse, A, O);
+}
expr(A) ::= idj(X) LP STAR RP filter_over(Z). {
A = sqlite3ExprFunction(pParse, 0, &X, 0);
sqlite3WindowAttach(pParse, A, Z);
diff --git a/src/sqliteInt.h b/src/sqliteInt.h
index bee53b6c78..16da1db4c2 100644
--- a/src/sqliteInt.h
+++ b/src/sqliteInt.h
@@ -4786,6 +4786,7 @@ void sqlite3PExprAddSelect(Parse*, Expr*, Select*);
Expr *sqlite3ExprAnd(Parse*,Expr*, Expr*);
Expr *sqlite3ExprSimplifiedAndOr(Expr*);
Expr *sqlite3ExprFunction(Parse*,ExprList*, const Token*, int);
+void sqlite3ExprAddFunctionOrderBy(Parse*,Expr*,ExprList*);
void sqlite3ExprFunctionUsable(Parse*,const Expr*,const FuncDef*);
void sqlite3ExprAssignVarNumber(Parse*, Expr*, u32);
void sqlite3ExprDelete(sqlite3*, Expr*);
diff --git a/src/treeview.c b/src/treeview.c
index d55adab384..6852a61ddd 100644
--- a/src/treeview.c
+++ b/src/treeview.c
@@ -709,6 +709,12 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){
}
if( pFarg ){
sqlite3TreeViewExprList(pView, pFarg, pWin!=0, 0);
+ if( pExpr->pLeft ){
+ Expr *pOB = pExpr->pLeft;
+ assert( pOB->op==TK_ORDER );
+ assert( ExprUseXList(pOB) );
+ sqlite3TreeViewExprList(pView, pOB->x.pList, pWin!=0, "ORDERBY");
+ }
}
#ifndef SQLITE_OMIT_WINDOWFUNC
if( pWin ){
From db19f48b698bc1327ff4a83309a26d4ebead503e Mon Sep 17 00:00:00 2001
From: drh <>
Date: Wed, 18 Oct 2023 13:58:31 +0000
Subject: [PATCH 48/66] Basic error checking. Resolve symbols in the aggregate
ORDER BY expressions.
FossilOrigin-Name: c83a53a574d312130d1238c05ffa449d8bed2535d5ef5b5d9cf02f894494cca4
---
manifest | 18 ++++++++----------
manifest.uuid | 2 +-
src/expr.c | 1 +
src/resolve.c | 13 +++++++++++++
test/aggorderby.test | 31 +++++++++++++++++++++++++++++++
5 files changed, 54 insertions(+), 11 deletions(-)
create mode 100644 test/aggorderby.test
diff --git a/manifest b/manifest
index c119b5f7d2..45e7a5f7a6 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Enhance\sthe\sparser\sso\sthat\sit\scan\saccept\san\sORDER\sBY\sclause\son\sa\sfunction\ninvocation.\s\sFor\sthis\sincremental\scheck-in,\sthe\sORDER\sBY\sclause\sis\scurrently\nignored.
-D 2023-10-18T13:18:52.383
+C Basic\serror\schecking.\s\sResolve\ssymbols\sin\sthe\saggregate\sORDER\sBY\sexpressions.
+D 2023-10-18T13:58:31.861
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -668,7 +668,7 @@ F src/date.c eebc54a00e888d3c56147779e9f361b77d62fd69ff2008c5373946aa1ba1d574
F src/dbpage.c 80e46e1df623ec40486da7a5086cb723b0275a6e2a7b01d9f9b5da0f04ba2782
F src/dbstat.c 3b677254d512fcafd4d0b341bf267b38b235ccfddbef24f9154e19360fa22e43
F src/delete.c cb766727c78e715f9fb7ec8a7d03658ed2a3016343ca687acfcec9083cdca500
-F src/expr.c c1a2aa866a146a5329d562ad1cf7bc53a6e08aeb6d350a5766269a3f22f08ace
+F src/expr.c dbe1be4833e5d1737bc3b685fcc4b8849023b93ebd82538fcd3a5029ea685106
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
F src/fkey.c a7fcbf7e66d14dbb73cf49f31489ebf66d0e6006c62b95246924a3bae9f37b36
F src/func.c e8d7b3587a225f4f1116f720b72090511fe9feb936e960bd26a053cea6a17a63
@@ -716,7 +716,7 @@ F src/pragma.h e690a356c18e98414d2e870ea791c1be1545a714ba623719deb63f7f226d8bb7
F src/prepare.c bde74add20fc0e8ce0c4e937a1f70a36d17413afe4f71d3e103f5cb74b17c8d9
F src/printf.c 9da63b9ae1c14789bcae12840f5d800fd9302500cd2d62733fac77f0041b4750
F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
-F src/resolve.c 0c3046b88901336709cd09f474303a16fc54bce13a2befcab66d0fa6b44ca869
+F src/resolve.c ee4011c8ed177de113e617e514f66ec5c38772cf2f00efa33f9576cbf076361c
F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
F src/select.c 7f9155185be78902818b21c2cd3e33f01b4306279a15d6719eb1bbb9779034aa
F src/shell.c.in cf0a3387c5bb05ca2fe6073fa7df21aaa11e749ca5b3846b80b586a447e728aa
@@ -814,6 +814,7 @@ F test/affinity3.test f094773025eddf31135c7ad4cde722b7696f8eb07b97511f98585addf2
F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
F test/aggfault.test 777f269d0da5b0c2524c7ff6d99ae9a93db4f1b1839a914dd2a12e3035c29829
F test/aggnested.test 7269d07ac879fce161cb26c8fabe65cba5715742fac8a1fccac570dcdaf28f00
+F test/aggorderby.test 155f0ed2e44f91b13413a84743f829efa23105866c33b66da03d5c6c62308232
F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87
F test/all.test 2ecb8bbd52416642e41c9081182a8df05d42c75637afd4488aace78cc4b69e13
F test/alter.test 403a7f8842457044a994d0ffb42963d6e84fcfbf5e8f54556063b25d966cd454
@@ -2132,11 +2133,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P da1a47932ea96755b1e11fc2547ce11780b87846af6885857318ff18f1e62c31
-R 4d323de4f6e44235324bfe080b4895e2
-T *branch * agg-orderby
-T *sym-agg-orderby *
-T -sym-trunk *
+P 3a98ff24bf468ed42d410a9a12d9f9b2ca154c7babe99fd6bc6f7b0565e0d132
+R 151cfa4119235187f9a8c82d8ecde04d
U drh
-Z 1ba4c9d9b0d3f5c9086b8a02e3617a21
+Z 7081aae7959eb43f46824edbdfe856c6
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 639cc87ac6..2c8835c078 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-3a98ff24bf468ed42d410a9a12d9f9b2ca154c7babe99fd6bc6f7b0565e0d132
\ No newline at end of file
+c83a53a574d312130d1238c05ffa449d8bed2535d5ef5b5d9cf02f894494cca4
\ No newline at end of file
diff --git a/src/expr.c b/src/expr.c
index 07b6dfcef6..6ae6dc331e 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -4361,6 +4361,7 @@ expr_code_doover:
assert( !ExprHasVVAProperty(pExpr,EP_Immutable) );
op = pExpr->op;
}
+ assert( op!=TK_ORDER );
switch( op ){
case TK_AGG_COLUMN: {
AggInfo *pAggInfo = pExpr->pAggInfo;
diff --git a/src/resolve.c b/src/resolve.c
index bd890c9f8d..532306e9c0 100644
--- a/src/resolve.c
+++ b/src/resolve.c
@@ -1052,6 +1052,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
Window *pWin = (IsWindowFunc(pExpr) ? pExpr->y.pWin : 0);
#endif
assert( !ExprHasProperty(pExpr, EP_xIsSelect|EP_IntValue) );
+ assert( pExpr->pLeft==0 || pExpr->pLeft->op==TK_ORDER );
zId = pExpr->u.zToken;
pDef = sqlite3FindFunction(pParse->db, zId, n, enc, 0);
if( pDef==0 ){
@@ -1193,6 +1194,13 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
pNC->nNcErr++;
}
#endif
+ else if( is_agg==0 && pExpr->pLeft ){
+ sqlite3ErrorMsg(pParse,
+ "ORDER BY may not be used with non-aggregate %#T()",
+ pExpr
+ );
+ pNC->nNcErr++;
+ }
if( is_agg ){
/* Window functions may not be arguments of aggregate functions.
** Or arguments of other window functions. But aggregate functions
@@ -1211,6 +1219,11 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
#endif
sqlite3WalkExprList(pWalker, pList);
if( is_agg ){
+ if( pExpr->pLeft ){
+ assert( pExpr->pLeft->op==TK_ORDER );
+ assert( ExprUseXList(pExpr->pLeft) );
+ sqlite3WalkExprList(pWalker, pExpr->pLeft->x.pList);
+ }
#ifndef SQLITE_OMIT_WINDOWFUNC
if( pWin ){
Select *pSel = pNC->pWinSelect;
diff --git a/test/aggorderby.test b/test/aggorderby.test
new file mode 100644
index 0000000000..aa868d2faf
--- /dev/null
+++ b/test/aggorderby.test
@@ -0,0 +1,31 @@
+# 2023-10-18
+#
+# 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 tests for ORDER BY on aggregate functions.
+#
+
+set testdir [file dirname $argv0]
+source $testdir/tester.tcl
+
+do_execsql_test aggorderby-1.1 {
+ CREATE TABLE t1(a,b,c,d);
+ WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<20)
+ INSERT INTO t1(a,b,c,d) SELECT printf('x%d',x),1,x,200-x FROM c;
+ INSERT INTO t1(a,b,c,d) SELECT a, 2, c-3, -d FROM t1;
+ CREATE INDEX t1b ON t1(b);
+}
+do_catchsql_test aggorderby-1.2 {
+ SELECT b, group_concat(a ORDER BY max(d)) FROM t1 GROUP BY b;
+} {1 {misuse of aggregate function max()}}
+do_catchsql_test aggorderby-1.3 {
+ SELECT abs(a ORDER BY max(d)) FROM t1;
+} {1 {ORDER BY may not be used with non-aggregate abs()}}
+
+finish_test
From 59a0d0bbf9a40e678e99f71920bd1cc7ec06d24d Mon Sep 17 00:00:00 2001
From: drh <>
Date: Wed, 18 Oct 2023 18:11:11 +0000
Subject: [PATCH 49/66] ORDER BY on aggregates seem to work, at least for
simple smoke tests. Lots more testing is needed though. Surely there are
many bugs.
FossilOrigin-Name: 64c12a835b6f1df8f2f5f4a41de083f6b3fc7f8030042c6aac0082382cd9cc4d
---
manifest | 16 +++---
manifest.uuid | 2 +-
src/expr.c | 41 +++++++++++---
src/select.c | 146 ++++++++++++++++++++++++++++++++++++++++++------
src/sqliteInt.h | 3 +
5 files changed, 173 insertions(+), 35 deletions(-)
diff --git a/manifest b/manifest
index 45e7a5f7a6..24129053b0 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Basic\serror\schecking.\s\sResolve\ssymbols\sin\sthe\saggregate\sORDER\sBY\sexpressions.
-D 2023-10-18T13:58:31.861
+C ORDER\sBY\son\saggregates\sseem\sto\swork,\sat\sleast\sfor\ssimple\ssmoke\stests.\s\sLots\nmore\stesting\sis\sneeded\sthough.\s\sSurely\sthere\sare\smany\sbugs.
+D 2023-10-18T18:11:11.181
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -668,7 +668,7 @@ F src/date.c eebc54a00e888d3c56147779e9f361b77d62fd69ff2008c5373946aa1ba1d574
F src/dbpage.c 80e46e1df623ec40486da7a5086cb723b0275a6e2a7b01d9f9b5da0f04ba2782
F src/dbstat.c 3b677254d512fcafd4d0b341bf267b38b235ccfddbef24f9154e19360fa22e43
F src/delete.c cb766727c78e715f9fb7ec8a7d03658ed2a3016343ca687acfcec9083cdca500
-F src/expr.c dbe1be4833e5d1737bc3b685fcc4b8849023b93ebd82538fcd3a5029ea685106
+F src/expr.c 7210855080a90215508cada806ee2aba2138907ca5fca19ba047955a3f094e04
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
F src/fkey.c a7fcbf7e66d14dbb73cf49f31489ebf66d0e6006c62b95246924a3bae9f37b36
F src/func.c e8d7b3587a225f4f1116f720b72090511fe9feb936e960bd26a053cea6a17a63
@@ -718,12 +718,12 @@ F src/printf.c 9da63b9ae1c14789bcae12840f5d800fd9302500cd2d62733fac77f0041b4750
F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
F src/resolve.c ee4011c8ed177de113e617e514f66ec5c38772cf2f00efa33f9576cbf076361c
F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
-F src/select.c 7f9155185be78902818b21c2cd3e33f01b4306279a15d6719eb1bbb9779034aa
+F src/select.c dd0f0ed89668f298e12226127ac4d977a696475a4b6572218c14511022001d42
F src/shell.c.in cf0a3387c5bb05ca2fe6073fa7df21aaa11e749ca5b3846b80b586a447e728aa
F src/sqlite.h.in 60e5698417e674f44be17d5ceeb4c2d395ccedba18d6de05435dec0135d9eff1
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
F src/sqlite3ext.h 2f30b2671f4c03cd27a43f039e11251391066c97d11385f5f963bb40b03038ac
-F src/sqliteInt.h bc1da6f5605dd0f8433904c2b4e6f9960f6cf327b42f00d1885dc11a290e0641
+F src/sqliteInt.h 8eac2e94e597add7bbef6bab315dc8e761410a599be7a344aba8b7af615ff2a6
F src/sqliteLimit.h 33b1c9baba578d34efe7dfdb43193b366111cdf41476b1e82699e14c11ee1fb6
F src/status.c 160c445d7d28c984a0eae38c144f6419311ed3eace59b44ac6dafc20db4af749
F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
@@ -2133,8 +2133,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 3a98ff24bf468ed42d410a9a12d9f9b2ca154c7babe99fd6bc6f7b0565e0d132
-R 151cfa4119235187f9a8c82d8ecde04d
+P c83a53a574d312130d1238c05ffa449d8bed2535d5ef5b5d9cf02f894494cca4
+R c20d0fa6dc56e340bbaa31e8a36615e8
U drh
-Z 7081aae7959eb43f46824edbdfe856c6
+Z 66c7548e2f839878f6f4ddcf4735c183
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 2c8835c078..312ea1e8ab 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-c83a53a574d312130d1238c05ffa449d8bed2535d5ef5b5d9cf02f894494cca4
\ No newline at end of file
+64c12a835b6f1df8f2f5f4a41de083f6b3fc7f8030042c6aac0082382cd9cc4d
\ No newline at end of file
diff --git a/src/expr.c b/src/expr.c
index 6ae6dc331e..dd543a98d8 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -1209,6 +1209,12 @@ void sqlite3ExprAddFunctionOrderBy(
}
assert( pExpr->op==TK_FUNCTION );
assert( pExpr->pLeft==0 );
+ assert( ExprUseXList(pExpr) );
+ if( pExpr->x.pList==0 || NEVER(pExpr->x.pList->nExpr==0) ){
+ /* Ignore ORDER BY on zero-argument aggregates */
+ sqlite3ExprListDelete(db, pOrderBy);
+ return;
+ }
pOB = sqlite3ExprAlloc(db, TK_ORDER, 0, 0);
if( pOB==0 ){
sqlite3ExprListDelete(db, pOrderBy);
@@ -1902,11 +1908,7 @@ Select *sqlite3SelectDup(sqlite3 *db, const Select *p, int flags){
** initially NULL, then create a new expression list.
**
** The pList argument must be either NULL or a pointer to an ExprList
-** obtained from a prior call to sqlite3ExprListAppend(). This routine
-** may not be used with an ExprList obtained from sqlite3ExprListDup().
-** Reason: This routine assumes that the number of slots in pList->a[]
-** is a power of two. That is true for sqlite3ExprListAppend() returns
-** but is not necessarily true from the return value of sqlite3ExprListDup().
+** obtained from a prior call to sqlite3ExprListAppend().
**
** If a memory allocation error occurs, the entire list is freed and
** NULL is returned. If non-NULL is returned, then it is guaranteed
@@ -6712,14 +6714,37 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){
u8 enc = ENC(pParse->db);
i = addAggInfoFunc(pParse->db, pAggInfo);
if( i>=0 ){
+ int nArg;
assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
pItem = &pAggInfo->aFunc[i];
pItem->pFExpr = pExpr;
assert( ExprUseUToken(pExpr) );
+ nArg = pExpr->x.pList ? pExpr->x.pList->nExpr : 0;
pItem->pFunc = sqlite3FindFunction(pParse->db,
- pExpr->u.zToken,
- pExpr->x.pList ? pExpr->x.pList->nExpr : 0, enc, 0);
- if( pExpr->flags & EP_Distinct ){
+ pExpr->u.zToken, nArg, enc, 0);
+ assert( pItem->bOBUnique==0 );
+ if( pExpr->pLeft ){
+ ExprList *pOBList;
+ assert( nArg>0 );
+ assert( pExpr->pLeft->op==TK_ORDER );
+ assert( ExprUseXList(pExpr->pLeft) );
+ pItem->iOBTab = pParse->nTab++;
+ pOBList = pExpr->pLeft->x.pList;
+ assert( pOBList->nExpr>0 );
+ if( pOBList->nExpr==1
+ && nArg==1
+ && sqlite3ExprCompare(0,pOBList->a[0].pExpr,
+ pExpr->x.pList->a[0].pExpr,0)==0
+ ){
+ pItem->bOBPayload = 0;
+ pItem->bOBUnique = ExprHasProperty(pExpr, EP_Distinct);
+ }else{
+ pItem->bOBPayload = 1;
+ }
+ }else{
+ pItem->iOBTab = -1;
+ }
+ if( ExprHasProperty(pExpr, EP_Distinct) && !pItem->bOBUnique ){
pItem->iDistinct = pParse->nTab++;
}else{
pItem->iDistinct = -1;
diff --git a/src/select.c b/src/select.c
index a55545d513..36b6e0dd7b 100644
--- a/src/select.c
+++ b/src/select.c
@@ -6646,6 +6646,32 @@ static void resetAccumulator(Parse *pParse, AggInfo *pAggInfo){
pFunc->pFunc->zName));
}
}
+ if( pFunc->iOBTab>=0 ){
+ ExprList *pOBList;
+ KeyInfo *pKeyInfo;
+ int nExtra = 0;
+ assert( pFunc->pFExpr->pLeft!=0 );
+ assert( pFunc->pFExpr->pLeft->op==TK_ORDER );
+ assert( ExprUseXList(pFunc->pFExpr->pLeft) );
+ pOBList = pFunc->pFExpr->pLeft->x.pList;
+ if( !pFunc->bOBUnique ){
+ nExtra++; /* One extra column for the OP_Sequence */
+ }
+ if( pFunc->bOBPayload ){
+ /* extra columns for the function arguments */
+ assert( ExprUseXList(pFunc->pFExpr) );
+ nExtra += pFunc->pFExpr->x.pList->nExpr;
+ }
+ pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pOBList, 0, nExtra);
+ if( !pFunc->bOBUnique ){
+ pKeyInfo->nKeyField++;
+ }
+ sqlite3VdbeAddOp4(v, OP_OpenEphemeral,
+ pFunc->iOBTab, pOBList->nExpr+nExtra, 0,
+ (char*)pKeyInfo, P4_KEYINFO);
+ ExplainQueryPlan((pParse, 0, "USE TEMP B-TREE FOR %s(ORDER BY)",
+ pFunc->pFunc->zName));
+ }
}
}
@@ -6661,13 +6687,46 @@ static void finalizeAggFunctions(Parse *pParse, AggInfo *pAggInfo){
ExprList *pList;
assert( ExprUseXList(pF->pFExpr) );
pList = pF->pFExpr->x.pList;
+ if( pF->iOBTab ){
+ /* For an ORDER BY aggregate, calls to OP_AggStep where deferred and
+ ** all content was stored in emphermal table pF->iOBTab. Extract that
+ ** content now (in ORDER BY order) and make all calls to OP_AggStep
+ ** before doing the OP_AggFinal call. */
+ int iTop; /* Start of loop for extracting columns */
+ int nArg; /* Number of columns to extract */
+ int nKey; /* Key columns to be skipped */
+ int regAgg; /* Extract into this array */
+ int j; /* Loop counter */
+
+ nArg = pList->nExpr;
+ regAgg = sqlite3GetTempRange(pParse, nArg);
+
+ if( pF->bOBPayload==0 ){
+ nKey = 0;
+ }else{
+ assert( pF->pFExpr->pLeft!=0 );
+ assert( ExprUseXList(pF->pFExpr->pLeft) );
+ assert( pF->pFExpr->pLeft->x.pList!=0 );
+ nKey = pF->pFExpr->pLeft->x.pList->nExpr;
+ if( !pF->bOBUnique ) nKey++;
+ }
+ iTop = sqlite3VdbeAddOp1(v, OP_Rewind, pF->iOBTab);
+ for(j=nArg-1; j>=0; j--){
+ sqlite3VdbeAddOp3(v, OP_Column, pF->iOBTab, nKey+j, regAgg+j);
+ }
+ sqlite3VdbeAddOp3(v, OP_AggStep, 0, regAgg, AggInfoFuncReg(pAggInfo,i));
+ sqlite3VdbeAppendP4(v, pF->pFunc, P4_FUNCDEF);
+ sqlite3VdbeChangeP5(v, (u8)nArg);
+ sqlite3VdbeAddOp2(v, OP_Next, pF->iOBTab, iTop+1);
+ sqlite3VdbeJumpHere(v, iTop);
+ sqlite3ReleaseTempRange(pParse, regAgg, nArg);
+ }
sqlite3VdbeAddOp2(v, OP_AggFinal, AggInfoFuncReg(pAggInfo,i),
pList ? pList->nExpr : 0);
sqlite3VdbeAppendP4(v, pF->pFunc, P4_FUNCDEF);
}
}
-
/*
** Generate code that will update the accumulator memory cells for an
** aggregate based on the current cursor position.
@@ -6676,6 +6735,13 @@ static void finalizeAggFunctions(Parse *pParse, AggInfo *pAggInfo){
** in pAggInfo, then only populate the pAggInfo->nAccumulator accumulator
** registers if register regAcc contains 0. The caller will take care
** of setting and clearing regAcc.
+**
+** For an ORDER BY aggregate, the actually accumulator memory cell update
+** is deferred until after all input rows have been received, so that they
+** can be run in the requested order. In that case, instead of invoking
+** OP_AggStep to update accumulator, just add the arguments that would
+** have been passed into OP_AggStep into the sorting ephemeral table
+** (along with the appropriate sort key).
*/
static void updateAccumulator(
Parse *pParse,
@@ -6697,6 +6763,7 @@ static void updateAccumulator(
int nArg;
int addrNext = 0;
int regAgg;
+ int regAggSz = 0;
ExprList *pList;
assert( ExprUseXList(pF->pFExpr) );
assert( !IsWindowFunc(pF->pFExpr) );
@@ -6723,7 +6790,39 @@ static void updateAccumulator(
addrNext = sqlite3VdbeMakeLabel(pParse);
sqlite3ExprIfFalse(pParse, pFilter, addrNext, SQLITE_JUMPIFNULL);
}
- if( pList ){
+ if( pF->iOBTab>=0 ){
+ /* Instead of invoking AggStep, we must push the arguments that would
+ ** have been passed to AggStep onto the sorting table. */
+ int jj; /* Registered used so far in building the record */
+ ExprList *pOBList; /* The ORDER BY clause */
+ assert( pList!=0 );
+ nArg = pList->nExpr;
+ assert( nArg>0 );
+ assert( pF->pFExpr->pLeft!=0 );
+ assert( pF->pFExpr->pLeft->op==TK_ORDER );
+ assert( ExprUseXList(pF->pFExpr->pLeft) );
+ pOBList = pF->pFExpr->pLeft->x.pList;
+ assert( pOBList!=0 );
+ assert( pOBList->nExpr>0 );
+ regAggSz = pOBList->nExpr;
+ if( !pF->bOBUnique ){
+ regAggSz++; /* One register for OP_Sequence */
+ }
+ if( pF->bOBPayload ){
+ regAggSz += nArg;
+ }
+ regAggSz++; /* One extra register to hold result of MakeRecord */
+ regAgg = sqlite3GetTempRange(pParse, regAggSz);
+ sqlite3ExprCodeExprList(pParse, pOBList, regAgg, 0, SQLITE_ECEL_DUP);
+ jj = pOBList->nExpr;
+ if( !pF->bOBUnique ){
+ sqlite3VdbeAddOp2(v, OP_Sequence, pF->iOBTab, regAgg+jj);
+ jj++;
+ }
+ if( pF->bOBPayload ){
+ sqlite3ExprCodeExprList(pParse, pList, regAgg+jj, 0, SQLITE_ECEL_DUP);
+ }
+ }else if( pList ){
nArg = pList->nExpr;
regAgg = sqlite3GetTempRange(pParse, nArg);
sqlite3ExprCodeExprList(pParse, pList, regAgg, 0, SQLITE_ECEL_DUP);
@@ -6738,24 +6837,35 @@ static void updateAccumulator(
pF->iDistinct = codeDistinct(pParse, eDistinctType,
pF->iDistinct, addrNext, pList, regAgg);
}
- if( pF->pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL ){
- CollSeq *pColl = 0;
- struct ExprList_item *pItem;
- int j;
- assert( pList!=0 ); /* pList!=0 if pF->pFunc has NEEDCOLL */
- for(j=0, pItem=pList->a; !pColl && jpExpr);
+ if( pF->iOBTab>=0 ){
+ /* Insert a new record into the ORDER BY table */
+ sqlite3VdbeAddOp3(v, OP_MakeRecord, regAgg, regAggSz-1,
+ regAgg+regAggSz-1);
+ sqlite3VdbeAddOp4Int(v, OP_IdxInsert, pF->iOBTab, regAgg+regAggSz-1,
+ regAgg, regAggSz-1);
+ sqlite3ReleaseTempRange(pParse, regAgg, regAggSz);
+ }else{
+ /* Invoke the AggStep function */
+ if( pF->pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL ){
+ CollSeq *pColl = 0;
+ struct ExprList_item *pItem;
+ int j;
+ assert( pList!=0 ); /* pList!=0 if pF->pFunc has NEEDCOLL */
+ for(j=0, pItem=pList->a; !pColl && jpExpr);
+ }
+ if( !pColl ){
+ pColl = pParse->db->pDfltColl;
+ }
+ if( regHit==0 && pAggInfo->nAccumulator ) regHit = ++pParse->nMem;
+ sqlite3VdbeAddOp4(v, OP_CollSeq, regHit, 0, 0,
+ (char *)pColl, P4_COLLSEQ);
}
- if( !pColl ){
- pColl = pParse->db->pDfltColl;
- }
- if( regHit==0 && pAggInfo->nAccumulator ) regHit = ++pParse->nMem;
- sqlite3VdbeAddOp4(v, OP_CollSeq, regHit, 0, 0, (char *)pColl, P4_COLLSEQ);
+ sqlite3VdbeAddOp3(v, OP_AggStep, 0, regAgg, AggInfoFuncReg(pAggInfo,i));
+ sqlite3VdbeAppendP4(v, pF->pFunc, P4_FUNCDEF);
+ sqlite3VdbeChangeP5(v, (u8)nArg);
+ sqlite3ReleaseTempRange(pParse, regAgg, nArg);
}
- sqlite3VdbeAddOp3(v, OP_AggStep, 0, regAgg, AggInfoFuncReg(pAggInfo,i));
- sqlite3VdbeAppendP4(v, pF->pFunc, P4_FUNCDEF);
- sqlite3VdbeChangeP5(v, (u8)nArg);
- sqlite3ReleaseTempRange(pParse, regAgg, nArg);
if( addrNext ){
sqlite3VdbeResolveLabel(v, addrNext);
}
diff --git a/src/sqliteInt.h b/src/sqliteInt.h
index 16da1db4c2..cb90fba4a7 100644
--- a/src/sqliteInt.h
+++ b/src/sqliteInt.h
@@ -2860,6 +2860,9 @@ struct AggInfo {
FuncDef *pFunc; /* The aggregate function implementation */
int iDistinct; /* Ephemeral table used to enforce DISTINCT */
int iDistAddr; /* Address of OP_OpenEphemeral */
+ int iOBTab; /* Ephemeral table to implement ORDER BY */
+ u8 bOBPayload; /* iOBTab has payload columns separate from key */
+ u8 bOBUnique; /* Enforce uniqueness on iOBTab keys */
} *aFunc;
int nFunc; /* Number of entries in aFunc[] */
u32 selId; /* Select to which this AggInfo belongs */
From 0021079ceb4f0583ae66d66bac510cb1644ff149 Mon Sep 17 00:00:00 2001
From: drh <>
Date: Wed, 18 Oct 2023 19:07:45 +0000
Subject: [PATCH 50/66] Fix one minor error in order to get all legacy tests to
pass.
FossilOrigin-Name: 5a885139c433a143302ab43dc5aaac1fed9db61548b4ff7d4b19b3a6a46c8fcc
---
manifest | 12 ++++++------
manifest.uuid | 2 +-
src/select.c | 2 +-
3 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/manifest b/manifest
index 24129053b0..7bfe811a5d 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C ORDER\sBY\son\saggregates\sseem\sto\swork,\sat\sleast\sfor\ssimple\ssmoke\stests.\s\sLots\nmore\stesting\sis\sneeded\sthough.\s\sSurely\sthere\sare\smany\sbugs.
-D 2023-10-18T18:11:11.181
+C Fix\sone\sminor\serror\sin\sorder\sto\sget\sall\slegacy\stests\sto\spass.
+D 2023-10-18T19:07:45.183
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -718,7 +718,7 @@ F src/printf.c 9da63b9ae1c14789bcae12840f5d800fd9302500cd2d62733fac77f0041b4750
F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
F src/resolve.c ee4011c8ed177de113e617e514f66ec5c38772cf2f00efa33f9576cbf076361c
F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
-F src/select.c dd0f0ed89668f298e12226127ac4d977a696475a4b6572218c14511022001d42
+F src/select.c 80c5c95fcd5d9354884d825ca3f00cc20655484679cb9c995a2bb4f5d5b84a7b
F src/shell.c.in cf0a3387c5bb05ca2fe6073fa7df21aaa11e749ca5b3846b80b586a447e728aa
F src/sqlite.h.in 60e5698417e674f44be17d5ceeb4c2d395ccedba18d6de05435dec0135d9eff1
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
@@ -2133,8 +2133,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P c83a53a574d312130d1238c05ffa449d8bed2535d5ef5b5d9cf02f894494cca4
-R c20d0fa6dc56e340bbaa31e8a36615e8
+P 64c12a835b6f1df8f2f5f4a41de083f6b3fc7f8030042c6aac0082382cd9cc4d
+R d6ccbf7622f816d9126033156316cd20
U drh
-Z 66c7548e2f839878f6f4ddcf4735c183
+Z d5004cc6bd28c98dd137858c93e3d27b
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 312ea1e8ab..ce4e3fb168 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-64c12a835b6f1df8f2f5f4a41de083f6b3fc7f8030042c6aac0082382cd9cc4d
\ No newline at end of file
+5a885139c433a143302ab43dc5aaac1fed9db61548b4ff7d4b19b3a6a46c8fcc
\ No newline at end of file
diff --git a/src/select.c b/src/select.c
index 36b6e0dd7b..60583b20a3 100644
--- a/src/select.c
+++ b/src/select.c
@@ -6687,7 +6687,7 @@ static void finalizeAggFunctions(Parse *pParse, AggInfo *pAggInfo){
ExprList *pList;
assert( ExprUseXList(pF->pFExpr) );
pList = pF->pFExpr->x.pList;
- if( pF->iOBTab ){
+ if( pF->iOBTab>=0 ){
/* For an ORDER BY aggregate, calls to OP_AggStep where deferred and
** all content was stored in emphermal table pF->iOBTab. Extract that
** content now (in ORDER BY order) and make all calls to OP_AggStep
From 49dc1be96f76ce01325cdb2d8b475f25a51f3605 Mon Sep 17 00:00:00 2001
From: drh <>
Date: Wed, 18 Oct 2023 19:44:59 +0000
Subject: [PATCH 51/66] Basic test cases.
FossilOrigin-Name: 6cccf86c362631ada0c6cbaf661520648f8bbf7ae2b137b3d7d959647387e5c2
---
manifest | 14 +++++++-------
manifest.uuid | 2 +-
src/expr.c | 6 +++++-
test/aggorderby.test | 41 +++++++++++++++++++++++++++++++++++++----
4 files changed, 50 insertions(+), 13 deletions(-)
diff --git a/manifest b/manifest
index 7bfe811a5d..bb22cd96f2 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sone\sminor\serror\sin\sorder\sto\sget\sall\slegacy\stests\sto\spass.
-D 2023-10-18T19:07:45.183
+C Basic\stest\scases.
+D 2023-10-18T19:44:59.620
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -668,7 +668,7 @@ F src/date.c eebc54a00e888d3c56147779e9f361b77d62fd69ff2008c5373946aa1ba1d574
F src/dbpage.c 80e46e1df623ec40486da7a5086cb723b0275a6e2a7b01d9f9b5da0f04ba2782
F src/dbstat.c 3b677254d512fcafd4d0b341bf267b38b235ccfddbef24f9154e19360fa22e43
F src/delete.c cb766727c78e715f9fb7ec8a7d03658ed2a3016343ca687acfcec9083cdca500
-F src/expr.c 7210855080a90215508cada806ee2aba2138907ca5fca19ba047955a3f094e04
+F src/expr.c ae9224fba771a8471775c25bdf77dbbd395d9448625d9b57c0803c72a14eee27
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
F src/fkey.c a7fcbf7e66d14dbb73cf49f31489ebf66d0e6006c62b95246924a3bae9f37b36
F src/func.c e8d7b3587a225f4f1116f720b72090511fe9feb936e960bd26a053cea6a17a63
@@ -814,7 +814,7 @@ F test/affinity3.test f094773025eddf31135c7ad4cde722b7696f8eb07b97511f98585addf2
F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
F test/aggfault.test 777f269d0da5b0c2524c7ff6d99ae9a93db4f1b1839a914dd2a12e3035c29829
F test/aggnested.test 7269d07ac879fce161cb26c8fabe65cba5715742fac8a1fccac570dcdaf28f00
-F test/aggorderby.test 155f0ed2e44f91b13413a84743f829efa23105866c33b66da03d5c6c62308232
+F test/aggorderby.test a77c92a0eb05239ccecc36b6593f6fe965b20d3516d8c9dcc31786405d5f4d8a
F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87
F test/all.test 2ecb8bbd52416642e41c9081182a8df05d42c75637afd4488aace78cc4b69e13
F test/alter.test 403a7f8842457044a994d0ffb42963d6e84fcfbf5e8f54556063b25d966cd454
@@ -2133,8 +2133,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 64c12a835b6f1df8f2f5f4a41de083f6b3fc7f8030042c6aac0082382cd9cc4d
-R d6ccbf7622f816d9126033156316cd20
+P 5a885139c433a143302ab43dc5aaac1fed9db61548b4ff7d4b19b3a6a46c8fcc
+R 0d6047c558f607c2eae8d487564b4699
U drh
-Z d5004cc6bd28c98dd137858c93e3d27b
+Z a5d3b645b078b22a6e4c48aa8f04c82d
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index ce4e3fb168..5df3a0921a 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-5a885139c433a143302ab43dc5aaac1fed9db61548b4ff7d4b19b3a6a46c8fcc
\ No newline at end of file
+6cccf86c362631ada0c6cbaf661520648f8bbf7ae2b137b3d7d959647387e5c2
\ No newline at end of file
diff --git a/src/expr.c b/src/expr.c
index dd543a98d8..26f0b4c5c0 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -6723,7 +6723,11 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){
pItem->pFunc = sqlite3FindFunction(pParse->db,
pExpr->u.zToken, nArg, enc, 0);
assert( pItem->bOBUnique==0 );
- if( pExpr->pLeft ){
+ if( pExpr->pLeft
+ && (pItem->pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL)==0
+ ){
+ /* The NEEDCOLL test above causes any ORDER BY clause on
+ ** aggregate min() or max() to be ignored. */
ExprList *pOBList;
assert( nArg>0 );
assert( pExpr->pLeft->op==TK_ORDER );
diff --git a/test/aggorderby.test b/test/aggorderby.test
index aa868d2faf..e90ea0a57c 100644
--- a/test/aggorderby.test
+++ b/test/aggorderby.test
@@ -15,10 +15,10 @@ set testdir [file dirname $argv0]
source $testdir/tester.tcl
do_execsql_test aggorderby-1.1 {
- CREATE TABLE t1(a,b,c,d);
- WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<20)
- INSERT INTO t1(a,b,c,d) SELECT printf('x%d',x),1,x,200-x FROM c;
- INSERT INTO t1(a,b,c,d) SELECT a, 2, c-3, -d FROM t1;
+ CREATE TABLE t1(a TEXT,b INT,c INT,d INT);
+ WITH RECURSIVE c(x) AS (VALUES(0) UNION ALL SELECT x+1 FROM c WHERE x<9)
+ INSERT INTO t1(a,b,c,d) SELECT printf('%d',(x*7)%10),1,x,10-x FROM c;
+ INSERT INTO t1(a,b,c,d) SELECT a, 2, c, 10-d FROM t1;
CREATE INDEX t1b ON t1(b);
}
do_catchsql_test aggorderby-1.2 {
@@ -28,4 +28,37 @@ do_catchsql_test aggorderby-1.3 {
SELECT abs(a ORDER BY max(d)) FROM t1;
} {1 {ORDER BY may not be used with non-aggregate abs()}}
+do_execsql_test aggorderby-2.0 {
+ SELECT group_concat(a ORDER BY a) FROM t1 WHERE b=1;
+} {0,1,2,3,4,5,6,7,8,9}
+do_execsql_test aggorderby-2.1 {
+ SELECT group_concat(a ORDER BY c) FROM t1 WHERE b=1;
+} {0,7,4,1,8,5,2,9,6,3}
+do_execsql_test aggorderby-2.2 {
+ SELECT group_concat(a ORDER BY b, d) FROM t1;
+} {3,6,9,2,5,8,1,4,7,0,0,7,4,1,8,5,2,9,6,3}
+do_execsql_test aggorderby-2.3 {
+ SELECT group_concat(a ORDER BY b DESC, d) FROM t1;
+} {0,7,4,1,8,5,2,9,6,3,3,6,9,2,5,8,1,4,7,0}
+do_execsql_test aggorderby-2.4 {
+ SELECT b, group_concat(a ORDER BY d) FROM t1 GROUP BY b ORDER BY b;
+} {1 3,6,9,2,5,8,1,4,7,0 2 0,7,4,1,8,5,2,9,6,3}
+
+do_execsql_test aggorderby-3.0 {
+ SELECT group_concat(DISTINCT a ORDER BY a) FROM t1;
+} {0,1,2,3,4,5,6,7,8,9}
+do_execsql_test aggorderby-3.1 {
+ SELECT group_concat(DISTINCT a ORDER BY c) FROM t1;
+} {0,7,4,1,8,5,2,9,6,3}
+
+do_execsql_test aggorderby-4.0 {
+ SELECT count(ORDER BY a) FROM t1;
+} 20
+do_execsql_test aggorderby-4.1 {
+ SELECT c, max(a ORDER BY a) FROM t1;
+} {7 9}
+
+
+
+
finish_test
From 20b95f8d3fc34d6fe8a049a3b2abebefce12eea1 Mon Sep 17 00:00:00 2001
From: drh <>
Date: Wed, 18 Oct 2023 22:03:48 +0000
Subject: [PATCH 52/66] Make sure all terms of the ORDER BY within an aggregate
go through aggregate analysis. Do not attach an aggregate ORDER BY to a
window function.
FossilOrigin-Name: 16f3805514a741405f70e0ee3b5a6b67720bc75719372e82daa4136fe411ea2b
---
manifest | 18 +++++++++---------
manifest.uuid | 2 +-
src/expr.c | 16 ++++++++++++++++
src/resolve.c | 5 +----
src/select.c | 6 ++++++
src/sqliteInt.h | 1 +
6 files changed, 34 insertions(+), 14 deletions(-)
diff --git a/manifest b/manifest
index bb22cd96f2..0fae9862b8 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Basic\stest\scases.
-D 2023-10-18T19:44:59.620
+C Make\ssure\sall\sterms\sof\sthe\sORDER\sBY\swithin\san\saggregate\sgo\sthrough\saggregate\nanalysis.\s\sDo\snot\sattach\san\saggregate\sORDER\sBY\sto\sa\swindow\sfunction.
+D 2023-10-18T22:03:48.889
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -668,7 +668,7 @@ F src/date.c eebc54a00e888d3c56147779e9f361b77d62fd69ff2008c5373946aa1ba1d574
F src/dbpage.c 80e46e1df623ec40486da7a5086cb723b0275a6e2a7b01d9f9b5da0f04ba2782
F src/dbstat.c 3b677254d512fcafd4d0b341bf267b38b235ccfddbef24f9154e19360fa22e43
F src/delete.c cb766727c78e715f9fb7ec8a7d03658ed2a3016343ca687acfcec9083cdca500
-F src/expr.c ae9224fba771a8471775c25bdf77dbbd395d9448625d9b57c0803c72a14eee27
+F src/expr.c 3c147581955ec30fc4732eb05d9fd6ebd6ee713284642e42bd5b9cfe22527abf
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
F src/fkey.c a7fcbf7e66d14dbb73cf49f31489ebf66d0e6006c62b95246924a3bae9f37b36
F src/func.c e8d7b3587a225f4f1116f720b72090511fe9feb936e960bd26a053cea6a17a63
@@ -716,14 +716,14 @@ F src/pragma.h e690a356c18e98414d2e870ea791c1be1545a714ba623719deb63f7f226d8bb7
F src/prepare.c bde74add20fc0e8ce0c4e937a1f70a36d17413afe4f71d3e103f5cb74b17c8d9
F src/printf.c 9da63b9ae1c14789bcae12840f5d800fd9302500cd2d62733fac77f0041b4750
F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
-F src/resolve.c ee4011c8ed177de113e617e514f66ec5c38772cf2f00efa33f9576cbf076361c
+F src/resolve.c 77d07bcec1b3101ce36ebf4aa04dd0340e77cbfc4f31bd1a6e43fcd2db904626
F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
-F src/select.c 80c5c95fcd5d9354884d825ca3f00cc20655484679cb9c995a2bb4f5d5b84a7b
+F src/select.c 12733c8abdfffa7d383830a258885eeccc32b10eedbe068edd3137b1b05b3b1a
F src/shell.c.in cf0a3387c5bb05ca2fe6073fa7df21aaa11e749ca5b3846b80b586a447e728aa
F src/sqlite.h.in 60e5698417e674f44be17d5ceeb4c2d395ccedba18d6de05435dec0135d9eff1
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
F src/sqlite3ext.h 2f30b2671f4c03cd27a43f039e11251391066c97d11385f5f963bb40b03038ac
-F src/sqliteInt.h 8eac2e94e597add7bbef6bab315dc8e761410a599be7a344aba8b7af615ff2a6
+F src/sqliteInt.h 834656265db68d42cf615e01b107b16d43c2bcad4837f197c88928448fc1de71
F src/sqliteLimit.h 33b1c9baba578d34efe7dfdb43193b366111cdf41476b1e82699e14c11ee1fb6
F src/status.c 160c445d7d28c984a0eae38c144f6419311ed3eace59b44ac6dafc20db4af749
F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
@@ -2133,8 +2133,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 5a885139c433a143302ab43dc5aaac1fed9db61548b4ff7d4b19b3a6a46c8fcc
-R 0d6047c558f607c2eae8d487564b4699
+P 6cccf86c362631ada0c6cbaf661520648f8bbf7ae2b137b3d7d959647387e5c2
+R 67ae4f4c3cb6848472e4d3dd82fce25b
U drh
-Z a5d3b645b078b22a6e4c48aa8f04c82d
+Z dc2e81b0f2992d3e49cb5d6bc5c317b5
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 5df3a0921a..03d4b453fd 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-6cccf86c362631ada0c6cbaf661520648f8bbf7ae2b137b3d7d959647387e5c2
\ No newline at end of file
+16f3805514a741405f70e0ee3b5a6b67720bc75719372e82daa4136fe411ea2b
\ No newline at end of file
diff --git a/src/expr.c b/src/expr.c
index 26f0b4c5c0..72a5fae7d2 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -1181,6 +1181,16 @@ Expr *sqlite3ExprFunction(
return pNew;
}
+/*
+** Report an error when attempting to use an ORDER BY clause within
+** the arguments of a non-aggregate function.
+*/
+void sqlite3ExprOrderByAggregateError(Parse *pParse, Expr *p){
+ sqlite3ErrorMsg(pParse,
+ "ORDER BY may not be used with non-aggregate %#T()", p
+ );
+}
+
/*
** Attach an ORDER BY clause to a function call.
**
@@ -1215,6 +1225,12 @@ void sqlite3ExprAddFunctionOrderBy(
sqlite3ExprListDelete(db, pOrderBy);
return;
}
+ if( IsWindowFunc(pExpr) ){
+ sqlite3ExprOrderByAggregateError(pParse, pExpr);
+ sqlite3ExprListDelete(db, pOrderBy);
+ return;
+ }
+
pOB = sqlite3ExprAlloc(db, TK_ORDER, 0, 0);
if( pOB==0 ){
sqlite3ExprListDelete(db, pOrderBy);
diff --git a/src/resolve.c b/src/resolve.c
index 532306e9c0..7eba26938a 100644
--- a/src/resolve.c
+++ b/src/resolve.c
@@ -1195,10 +1195,7 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
}
#endif
else if( is_agg==0 && pExpr->pLeft ){
- sqlite3ErrorMsg(pParse,
- "ORDER BY may not be used with non-aggregate %#T()",
- pExpr
- );
+ sqlite3ExprOrderByAggregateError(pParse, pExpr);
pNC->nNcErr++;
}
if( is_agg ){
diff --git a/src/select.c b/src/select.c
index 60583b20a3..05aeb42e05 100644
--- a/src/select.c
+++ b/src/select.c
@@ -6490,8 +6490,14 @@ static void analyzeAggFuncArgs(
pNC->ncFlags |= NC_InAggFunc;
for(i=0; inFunc; i++){
Expr *pExpr = pAggInfo->aFunc[i].pFExpr;
+ assert( pExpr->op==TK_FUNCTION || pExpr->op==TK_AGG_FUNCTION );
assert( ExprUseXList(pExpr) );
sqlite3ExprAnalyzeAggList(pNC, pExpr->x.pList);
+ if( pExpr->pLeft ){
+ assert( pExpr->pLeft->op==TK_ORDER );
+ assert( ExprUseXList(pExpr->pLeft) );
+ sqlite3ExprAnalyzeAggList(pNC, pExpr->pLeft->x.pList);
+ }
#ifndef SQLITE_OMIT_WINDOWFUNC
assert( !IsWindowFunc(pExpr) );
if( ExprHasProperty(pExpr, EP_WinFunc) ){
diff --git a/src/sqliteInt.h b/src/sqliteInt.h
index cb90fba4a7..4becf92227 100644
--- a/src/sqliteInt.h
+++ b/src/sqliteInt.h
@@ -4790,6 +4790,7 @@ Expr *sqlite3ExprAnd(Parse*,Expr*, Expr*);
Expr *sqlite3ExprSimplifiedAndOr(Expr*);
Expr *sqlite3ExprFunction(Parse*,ExprList*, const Token*, int);
void sqlite3ExprAddFunctionOrderBy(Parse*,Expr*,ExprList*);
+void sqlite3ExprOrderByAggregateError(Parse*,Expr*);
void sqlite3ExprFunctionUsable(Parse*,const Expr*,const FuncDef*);
void sqlite3ExprAssignVarNumber(Parse*, Expr*, u32);
void sqlite3ExprDelete(sqlite3*, Expr*);
From ce51b313670889aea8c92ce0517d136203a27729 Mon Sep 17 00:00:00 2001
From: drh <>
Date: Wed, 18 Oct 2023 22:27:59 +0000
Subject: [PATCH 53/66] Deal with an OOM condition while processing aggregate
ORDER BYs.
FossilOrigin-Name: b6d44427ec0184880ad14919667e2f526777c5085ffa636f6734cb5951a31225
---
manifest | 12 ++++++------
manifest.uuid | 2 +-
src/select.c | 2 +-
3 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/manifest b/manifest
index 0fae9862b8..b7c394baed 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Make\ssure\sall\sterms\sof\sthe\sORDER\sBY\swithin\san\saggregate\sgo\sthrough\saggregate\nanalysis.\s\sDo\snot\sattach\san\saggregate\sORDER\sBY\sto\sa\swindow\sfunction.
-D 2023-10-18T22:03:48.889
+C Deal\swith\san\sOOM\scondition\swhile\sprocessing\saggregate\sORDER\sBYs.
+D 2023-10-18T22:27:59.265
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -718,7 +718,7 @@ F src/printf.c 9da63b9ae1c14789bcae12840f5d800fd9302500cd2d62733fac77f0041b4750
F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
F src/resolve.c 77d07bcec1b3101ce36ebf4aa04dd0340e77cbfc4f31bd1a6e43fcd2db904626
F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
-F src/select.c 12733c8abdfffa7d383830a258885eeccc32b10eedbe068edd3137b1b05b3b1a
+F src/select.c 9b6fd8e12eb607013d32c41448521495e0f6ee65be13076eca56418f36606241
F src/shell.c.in cf0a3387c5bb05ca2fe6073fa7df21aaa11e749ca5b3846b80b586a447e728aa
F src/sqlite.h.in 60e5698417e674f44be17d5ceeb4c2d395ccedba18d6de05435dec0135d9eff1
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
@@ -2133,8 +2133,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 6cccf86c362631ada0c6cbaf661520648f8bbf7ae2b137b3d7d959647387e5c2
-R 67ae4f4c3cb6848472e4d3dd82fce25b
+P 16f3805514a741405f70e0ee3b5a6b67720bc75719372e82daa4136fe411ea2b
+R 6802737776ac151bb19cf65ccd4a04fb
U drh
-Z dc2e81b0f2992d3e49cb5d6bc5c317b5
+Z 63e8f8ba6a775006c8b7c4fe41a1d182
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 03d4b453fd..dde82f9eb8 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-16f3805514a741405f70e0ee3b5a6b67720bc75719372e82daa4136fe411ea2b
\ No newline at end of file
+b6d44427ec0184880ad14919667e2f526777c5085ffa636f6734cb5951a31225
\ No newline at end of file
diff --git a/src/select.c b/src/select.c
index 05aeb42e05..69e22ba3ef 100644
--- a/src/select.c
+++ b/src/select.c
@@ -6669,7 +6669,7 @@ static void resetAccumulator(Parse *pParse, AggInfo *pAggInfo){
nExtra += pFunc->pFExpr->x.pList->nExpr;
}
pKeyInfo = sqlite3KeyInfoFromExprList(pParse, pOBList, 0, nExtra);
- if( !pFunc->bOBUnique ){
+ if( !pFunc->bOBUnique && pParse->nErr==0 ){
pKeyInfo->nKeyField++;
}
sqlite3VdbeAddOp4(v, OP_OpenEphemeral,
From 42f5ea354e8ec698e52837c44f094d6f55d61aca Mon Sep 17 00:00:00 2001
From: drh <>
Date: Wed, 18 Oct 2023 22:53:22 +0000
Subject: [PATCH 54/66] Test case for alter column that is used in the ORDER BY
of an aggregate.
FossilOrigin-Name: 648ddb3a8eb358fc6c95aaa561ae68476c77996abda23890054ac07166278cef
---
manifest | 12 ++++++------
manifest.uuid | 2 +-
test/altercol.test | 15 +++++++++++++++
3 files changed, 22 insertions(+), 7 deletions(-)
diff --git a/manifest b/manifest
index b7c394baed..a200c332b0 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Deal\swith\san\sOOM\scondition\swhile\sprocessing\saggregate\sORDER\sBYs.
-D 2023-10-18T22:27:59.265
+C Test\scase\sfor\salter\scolumn\sthat\sis\sused\sin\sthe\sORDER\sBY\sof\san\saggregate.
+D 2023-10-18T22:53:22.341
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -823,7 +823,7 @@ F test/alter3.test ffc4ab29ce78a3517a66afd69b2730667e3471622509c283b2bd4c46f680f
F test/alter4.test 716caa071dd8a3c6d57225778d15d3c3cbf5e34b2e84ae44199aeb2bbf50a707
F test/alterauth.test 63442ba61ceb0c1eeb63aac1f4f5cebfa509d352276059d27106ae256bafc959
F test/alterauth2.test 48967abae0494d9a300d1c92473d99fcb66edfcc23579c89322f033f49410adc
-F test/altercol.test 8465ca659c2c55a359cf16cc261df4fcb5c45a5f104a50827c337ae66c09dc15
+F test/altercol.test 29fed774747777fbbaacdd865b4413ed2d0844a4c824f8af531b5c7d4a832087
F test/altercorrupt.test 2e1d705342cf9d7de884518ddbb053fd52d7e60d2b8869b7b63b2fda68435c12
F test/alterdropcol.test a653a3945f964d26845ec0cd0a8e74189f46de3119a984c5bc45457da392612e
F test/alterdropcol2.test 527fce683b200d620f560f666c44ae33e22728e990a10a48a543280dfd4b4d41
@@ -2133,8 +2133,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 16f3805514a741405f70e0ee3b5a6b67720bc75719372e82daa4136fe411ea2b
-R 6802737776ac151bb19cf65ccd4a04fb
+P b6d44427ec0184880ad14919667e2f526777c5085ffa636f6734cb5951a31225
+R bfd41b51d8c40e8811533ae7ac911f64
U drh
-Z 63e8f8ba6a775006c8b7c4fe41a1d182
+Z bf6fd600101e04b72e58dadb7f157c54
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index dde82f9eb8..49d6cfc305 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-b6d44427ec0184880ad14919667e2f526777c5085ffa636f6734cb5951a31225
\ No newline at end of file
+648ddb3a8eb358fc6c95aaa561ae68476c77996abda23890054ac07166278cef
\ No newline at end of file
diff --git a/test/altercol.test b/test/altercol.test
index e39793aa9f..f44aa2e065 100644
--- a/test/altercol.test
+++ b/test/altercol.test
@@ -343,6 +343,21 @@ do_catchsql_test 8.4.5 {
ALTER TABLE b1 RENAME a TO aaa;
} {1 {error in view zzz: no such column: george}}
+do_execsql_test 8.5 {
+ DROP VIEW zzz;
+ CREATE TABLE t5(a TEXT, b INT);
+ INSERT INTO t5(a,b) VALUES('aaa',7),('bbb',3),('ccc',4);
+ CREATE VIEW vt5(x) AS SELECT group_concat(a ORDER BY b) FROM t5;
+ SELECT x FROM vt5;
+} {bbb,ccc,aaa}
+do_execsql_test 8.5.1 {
+ ALTER TABLE t5 RENAME COLUMN b TO bbb;
+ SELECT sql FROM sqlite_schema WHERE name='vt5';
+} {{CREATE VIEW vt5(x) AS SELECT group_concat(a ORDER BY bbb) FROM t5}}
+do_execsql_test 8.5.2 {
+ SELECT x FROM vt5;
+} {bbb,ccc,aaa}
+
#-------------------------------------------------------------------------
# More triggers.
#
From d05e54efffa9f212af45f741fe651fb5766ad947 Mon Sep 17 00:00:00 2001
From: drh <>
Date: Wed, 18 Oct 2023 23:48:24 +0000
Subject: [PATCH 55/66] Changes for test coverage.
FossilOrigin-Name: ddfa09c6031afd4391a9888381bf09214cd542a826b431eeb1537a070f65c5f9
---
manifest | 14 +++++++-------
manifest.uuid | 2 +-
src/expr.c | 4 ++--
src/select.c | 4 ++--
4 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/manifest b/manifest
index a200c332b0..f402a01bd6 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Test\scase\sfor\salter\scolumn\sthat\sis\sused\sin\sthe\sORDER\sBY\sof\san\saggregate.
-D 2023-10-18T22:53:22.341
+C Changes\sfor\stest\scoverage.
+D 2023-10-18T23:48:24.293
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -668,7 +668,7 @@ F src/date.c eebc54a00e888d3c56147779e9f361b77d62fd69ff2008c5373946aa1ba1d574
F src/dbpage.c 80e46e1df623ec40486da7a5086cb723b0275a6e2a7b01d9f9b5da0f04ba2782
F src/dbstat.c 3b677254d512fcafd4d0b341bf267b38b235ccfddbef24f9154e19360fa22e43
F src/delete.c cb766727c78e715f9fb7ec8a7d03658ed2a3016343ca687acfcec9083cdca500
-F src/expr.c 3c147581955ec30fc4732eb05d9fd6ebd6ee713284642e42bd5b9cfe22527abf
+F src/expr.c 167dcf2ecc7ea7c6c2ce0c56eeec6a7d3c805c8d2721cb76a1790fe917a6f86d
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
F src/fkey.c a7fcbf7e66d14dbb73cf49f31489ebf66d0e6006c62b95246924a3bae9f37b36
F src/func.c e8d7b3587a225f4f1116f720b72090511fe9feb936e960bd26a053cea6a17a63
@@ -718,7 +718,7 @@ F src/printf.c 9da63b9ae1c14789bcae12840f5d800fd9302500cd2d62733fac77f0041b4750
F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
F src/resolve.c 77d07bcec1b3101ce36ebf4aa04dd0340e77cbfc4f31bd1a6e43fcd2db904626
F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
-F src/select.c 9b6fd8e12eb607013d32c41448521495e0f6ee65be13076eca56418f36606241
+F src/select.c 21bee7bc4ac897070b7f570354e9c6d38c6bf9499aeb92f585e675337d45dce0
F src/shell.c.in cf0a3387c5bb05ca2fe6073fa7df21aaa11e749ca5b3846b80b586a447e728aa
F src/sqlite.h.in 60e5698417e674f44be17d5ceeb4c2d395ccedba18d6de05435dec0135d9eff1
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
@@ -2133,8 +2133,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P b6d44427ec0184880ad14919667e2f526777c5085ffa636f6734cb5951a31225
-R bfd41b51d8c40e8811533ae7ac911f64
+P 648ddb3a8eb358fc6c95aaa561ae68476c77996abda23890054ac07166278cef
+R 8ee0996b86b0afe5585fa6ea088a2916
U drh
-Z bf6fd600101e04b72e58dadb7f157c54
+Z c40adbb172f79debd1a61052cc23946c
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 49d6cfc305..994c21ecb4 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-648ddb3a8eb358fc6c95aaa561ae68476c77996abda23890054ac07166278cef
\ No newline at end of file
+ddfa09c6031afd4391a9888381bf09214cd542a826b431eeb1537a070f65c5f9
\ No newline at end of file
diff --git a/src/expr.c b/src/expr.c
index 72a5fae7d2..549888ec69 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -1208,7 +1208,7 @@ void sqlite3ExprAddFunctionOrderBy(
){
Expr *pOB;
sqlite3 *db = pParse->db;
- if( pOrderBy==0 ){
+ if( NEVER(pOrderBy==0) ){
assert( db->mallocFailed );
return;
}
@@ -6757,10 +6757,10 @@ static int analyzeAggregate(Walker *pWalker, Expr *pExpr){
pExpr->x.pList->a[0].pExpr,0)==0
){
pItem->bOBPayload = 0;
- pItem->bOBUnique = ExprHasProperty(pExpr, EP_Distinct);
}else{
pItem->bOBPayload = 1;
}
+ pItem->bOBUnique = ExprHasProperty(pExpr, EP_Distinct);
}else{
pItem->iOBTab = -1;
}
diff --git a/src/select.c b/src/select.c
index 69e22ba3ef..30a44d0458 100644
--- a/src/select.c
+++ b/src/select.c
@@ -6716,14 +6716,14 @@ static void finalizeAggFunctions(Parse *pParse, AggInfo *pAggInfo){
nKey = pF->pFExpr->pLeft->x.pList->nExpr;
if( !pF->bOBUnique ) nKey++;
}
- iTop = sqlite3VdbeAddOp1(v, OP_Rewind, pF->iOBTab);
+ iTop = sqlite3VdbeAddOp1(v, OP_Rewind, pF->iOBTab); VdbeCoverage(v);
for(j=nArg-1; j>=0; j--){
sqlite3VdbeAddOp3(v, OP_Column, pF->iOBTab, nKey+j, regAgg+j);
}
sqlite3VdbeAddOp3(v, OP_AggStep, 0, regAgg, AggInfoFuncReg(pAggInfo,i));
sqlite3VdbeAppendP4(v, pF->pFunc, P4_FUNCDEF);
sqlite3VdbeChangeP5(v, (u8)nArg);
- sqlite3VdbeAddOp2(v, OP_Next, pF->iOBTab, iTop+1);
+ sqlite3VdbeAddOp2(v, OP_Next, pF->iOBTab, iTop+1); VdbeCoverage(v);
sqlite3VdbeJumpHere(v, iTop);
sqlite3ReleaseTempRange(pParse, regAgg, nArg);
}
From 69ff726d4d82eb070f798f854472b21518627c59 Mon Sep 17 00:00:00 2001
From: drh <>
Date: Thu, 19 Oct 2023 00:25:35 +0000
Subject: [PATCH 56/66] Fix a false-positive in run-time error checking.
FossilOrigin-Name: cd63eec0758960d9ee63d7b964ec62e2bd622f8c94a58bd9556046381ffa18d0
---
manifest | 16 ++++++++--------
manifest.uuid | 2 +-
src/expr.c | 2 +-
src/vdbeaux.c | 4 ++++
4 files changed, 14 insertions(+), 10 deletions(-)
diff --git a/manifest b/manifest
index ec337ca6ad..28a5a3f0e5 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C JS:\sreplace\sone\serrant\sreference\sto\s'self'\swith\s'globalThis'\sand\sremove\sa\sseparate\sdead-code\s'self'\sreference.
-D 2023-10-17T23:35:47.218
+C Fix\sa\sfalse-positive\sin\srun-time\serror\schecking.
+D 2023-10-19T00:25:35.141
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -668,7 +668,7 @@ F src/date.c eebc54a00e888d3c56147779e9f361b77d62fd69ff2008c5373946aa1ba1d574
F src/dbpage.c 80e46e1df623ec40486da7a5086cb723b0275a6e2a7b01d9f9b5da0f04ba2782
F src/dbstat.c 3b677254d512fcafd4d0b341bf267b38b235ccfddbef24f9154e19360fa22e43
F src/delete.c cb766727c78e715f9fb7ec8a7d03658ed2a3016343ca687acfcec9083cdca500
-F src/expr.c 8a5045ac7aae5ecebe7236ec05841693b5a0012af70a4d73933333172546c50d
+F src/expr.c 243ef7e11095afe09cccd157ce5f42e637ae34f064ebb6ad12297e7af02f9e5a
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
F src/fkey.c a7fcbf7e66d14dbb73cf49f31489ebf66d0e6006c62b95246924a3bae9f37b36
F src/func.c e8d7b3587a225f4f1116f720b72090511fe9feb936e960bd26a053cea6a17a63
@@ -792,7 +792,7 @@ F src/vdbe.c 300b1ac9339a5b7db9ccd48c1a13c3d71722da13352a38ee042ca0a399b4dd7e
F src/vdbe.h 41485521f68e9437fdb7ec4a90f9d86ab294e9bb8281e33b235915e29122cfc0
F src/vdbeInt.h 949669dfd8a41550d27dcb905b494f2ccde9a2e6c1b0b04daa1227e2e74c2b2c
F src/vdbeapi.c fe654b1f54e1feebcaed6c2ae3ed035cc65bfeb9a1169bed866abc42bfc63ff6
-F src/vdbeaux.c 1a11270d4b7cd1fad29a7c3f1d175a816fca2fb6ecaa3e5ecbe1eb4baf575f75
+F src/vdbeaux.c 2ebd996a266851d82b93346136fc074c8f9f31a5b139bd76a484b1a6e8b52f1d
F src/vdbeblob.c 13f9287b55b6356b4b1845410382d6bede203ceb29ef69388a4a3d007ffacbe5
F src/vdbemem.c c936e9002af4993b84c4eb7133d6b1190efe46d391cc86117ecd67ba17b1a04b
F src/vdbesort.c 237840ca1947511fa59bd4e18b9eeae93f2af2468c34d2427b059f896230a547
@@ -2132,8 +2132,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 37ff0d8e7f91c32e8c53bb015280be47c66bf599281b640a8d3fd41335b55289
-R 02d0e707fb1cf1d9efb28ab84c90dee6
-U stephan
-Z 455d6debd64ad95ee72e444517f71e6f
+P da1a47932ea96755b1e11fc2547ce11780b87846af6885857318ff18f1e62c31
+R 2dc67760b798e4f6a6331f176070e794
+U drh
+Z a96532a01a60297c343bac9ca71674a1
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 7700963681..d2f4420581 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-da1a47932ea96755b1e11fc2547ce11780b87846af6885857318ff18f1e62c31
\ No newline at end of file
+cd63eec0758960d9ee63d7b964ec62e2bd622f8c94a58bd9556046381ffa18d0
\ No newline at end of file
diff --git a/src/expr.c b/src/expr.c
index f7290262e5..67863395dc 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -4336,7 +4336,7 @@ expr_code_doover:
#ifdef SQLITE_VDBE_COVERAGE
/* Verify that the OP_Null above is exercised by tests
** tag-20230325-2 */
- sqlite3VdbeAddOp2(v, OP_NotNull, target, 1);
+ sqlite3VdbeAddOp3(v, OP_NotNull, target, 1, 20230325);
VdbeCoverageNeverTaken(v);
#endif
break;
diff --git a/src/vdbeaux.c b/src/vdbeaux.c
index 1ed7a6dca3..c8dbe1e6d1 100644
--- a/src/vdbeaux.c
+++ b/src/vdbeaux.c
@@ -1002,6 +1002,10 @@ void sqlite3VdbeNoJumpsOutsideSubrtn(
int iDest = pOp->p2; /* Jump destination */
if( iDest==0 ) continue;
if( pOp->opcode==OP_Gosub ) continue;
+ if( pOp->p3==20230325 && pOp->opcode==OP_NotNull ){
+ /* This is a deliberately taken illegal branch. tag-20230325-2 */
+ continue;
+ }
if( iDest<0 ){
int j = ADDR(iDest);
assert( j>=0 );
From 519017f25ae6d8189bc04dd815a987ec4967a8ea Mon Sep 17 00:00:00 2001
From: drh <>
Date: Thu, 19 Oct 2023 12:12:49 +0000
Subject: [PATCH 57/66] Fix the sqlite3ReferencesSrcList() routine so that it
recognizes columns in the ORDER BY clause of an aggregate. Fixes a problem
with [634286828dad873d] discoverd by dbsqlfuzz.
FossilOrigin-Name: 3d26f1aaa4876f21f2c3abf13bbc37933c8f32471153e29019880cc9530cb011
---
manifest | 15 +++++++--------
manifest.uuid | 2 +-
src/expr.c | 6 ++++++
test/aggorderby.test | 17 ++++++++++++++++-
4 files changed, 30 insertions(+), 10 deletions(-)
diff --git a/manifest b/manifest
index 36d4e32a39..65ace52b28 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Add\ssupport\sfor\sORDER\sBY\son\sthe\sargument\slist\sof\saggregate\sfunctions.
-D 2023-10-19T01:26:34.354
+C Fix\sthe\ssqlite3ReferencesSrcList()\sroutine\sso\sthat\sit\srecognizes\scolumns\nin\sthe\sORDER\sBY\sclause\sof\san\saggregate.\s\sFixes\sa\sproblem\swith\n[634286828dad873d]\sdiscoverd\sby\sdbsqlfuzz.
+D 2023-10-19T12:12:49.878
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -668,7 +668,7 @@ F src/date.c eebc54a00e888d3c56147779e9f361b77d62fd69ff2008c5373946aa1ba1d574
F src/dbpage.c 80e46e1df623ec40486da7a5086cb723b0275a6e2a7b01d9f9b5da0f04ba2782
F src/dbstat.c 3b677254d512fcafd4d0b341bf267b38b235ccfddbef24f9154e19360fa22e43
F src/delete.c cb766727c78e715f9fb7ec8a7d03658ed2a3016343ca687acfcec9083cdca500
-F src/expr.c 6090c2d44a8b705618dff2e9e5c26742125c95cd937a21467dd792546318e6ee
+F src/expr.c 77191fed30bf1df1a70718cca9c8c1d17d5f9df15ec0f66ce7f122d11a97fe40
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
F src/fkey.c a7fcbf7e66d14dbb73cf49f31489ebf66d0e6006c62b95246924a3bae9f37b36
F src/func.c e8d7b3587a225f4f1116f720b72090511fe9feb936e960bd26a053cea6a17a63
@@ -814,7 +814,7 @@ F test/affinity3.test f094773025eddf31135c7ad4cde722b7696f8eb07b97511f98585addf2
F test/aggerror.test a867e273ef9e3d7919f03ef4f0e8c0d2767944f2
F test/aggfault.test 777f269d0da5b0c2524c7ff6d99ae9a93db4f1b1839a914dd2a12e3035c29829
F test/aggnested.test 7269d07ac879fce161cb26c8fabe65cba5715742fac8a1fccac570dcdaf28f00
-F test/aggorderby.test a77c92a0eb05239ccecc36b6593f6fe965b20d3516d8c9dcc31786405d5f4d8a
+F test/aggorderby.test d0011beb1dec691ee18978d2d43e0f4af7043a1726f33e06c9f60e83112a917b
F test/alias.test 4529fbc152f190268a15f9384a5651bbbabc9d87
F test/all.test 2ecb8bbd52416642e41c9081182a8df05d42c75637afd4488aace78cc4b69e13
F test/alter.test 403a7f8842457044a994d0ffb42963d6e84fcfbf5e8f54556063b25d966cd454
@@ -2133,9 +2133,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P cd63eec0758960d9ee63d7b964ec62e2bd622f8c94a58bd9556046381ffa18d0 d18bc400146812c8c5048af7eaf4a5371ddd80fc9ce895d253b6114b9eae7fc3
-R 560408bb648a1c13d94a9c653c0e9458
-T +closed d18bc400146812c8c5048af7eaf4a5371ddd80fc9ce895d253b6114b9eae7fc3
+P 634286828dad873dba244751441aa729cd37b6ed5899fa5875643d4af03c006c
+R 9bc375407ac96c58fb0984b4c1dff2e5
U drh
-Z 8e33b937afab31ce742f2f1e881ff028
+Z c78ae0510d52a6a34f15df4050bb8417
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 603b79adaa..885dddf00f 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-634286828dad873dba244751441aa729cd37b6ed5899fa5875643d4af03c006c
\ No newline at end of file
+3d26f1aaa4876f21f2c3abf13bbc37933c8f32471153e29019880cc9530cb011
\ No newline at end of file
diff --git a/src/expr.c b/src/expr.c
index 08d5ae36ea..38da1ab690 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -6466,6 +6466,12 @@ int sqlite3ReferencesSrcList(Parse *pParse, Expr *pExpr, SrcList *pSrcList){
assert( pExpr->op==TK_AGG_FUNCTION );
assert( ExprUseXList(pExpr) );
sqlite3WalkExprList(&w, pExpr->x.pList);
+ if( pExpr->pLeft ){
+ assert( pExpr->pLeft->op==TK_ORDER );
+ assert( ExprUseXList(pExpr->pLeft) );
+ assert( pExpr->pLeft->x.pList!=0 );
+ sqlite3WalkExprList(&w, pExpr->pLeft->x.pList);
+ }
#ifndef SQLITE_OMIT_WINDOWFUNC
if( ExprHasProperty(pExpr, EP_WinFunc) ){
sqlite3WalkExpr(&w, pExpr->y.pWin->pFilter);
diff --git a/test/aggorderby.test b/test/aggorderby.test
index e90ea0a57c..7d7d86a09f 100644
--- a/test/aggorderby.test
+++ b/test/aggorderby.test
@@ -59,6 +59,21 @@ do_execsql_test aggorderby-4.1 {
} {7 9}
-
+do_execsql_test aggorderby-5.0 {
+ DROP TABLE IF EXISTS t1;
+ DROP TABLE IF EXISTS t3;
+ CREATE TABLE t1(a TEXT); INSERT INTO t1 VALUES('aaa'),('bbb');
+ CREATE TABLE t3(d TEXT); INSERT INTO t3 VALUES('/'),('-');
+ SELECT (SELECT group_concat(a,d) FROM t3) FROM t1;
+} {aaa-aaa bbb-bbb}
+do_execsql_test aggorderby-5.1 {
+ SELECT (SELECT group_concat(a,d ORDER BY d) FROM t3) FROM t1;
+} {aaa/aaa bbb/bbb}
+do_execsql_test aggorderby-5.2 {
+ SELECT (SELECT group_concat(a,d ORDER BY d DESC) FROM t3) FROM t1;
+} {aaa-aaa bbb-bbb}
+do_execsql_test aggorderby-5.3 {
+ SELECT (SELECT group_concat(a,'#' ORDER BY d) FROM t3) FROM t1;
+} {aaa#aaa bbb#bbb}
finish_test
From 266178f3695ac08f6240e1612309b5d17d1f6630 Mon Sep 17 00:00:00 2001
From: drh <>
Date: Thu, 19 Oct 2023 12:36:59 +0000
Subject: [PATCH 58/66] New assert() statements to help verify correctness of
the ORDER BY aggregate code.
FossilOrigin-Name: 8b6fffb552c30f9cbf7102c2e26a7b486c4c9edd9f494d803de7004db3018277
---
manifest | 12 ++++++------
manifest.uuid | 2 +-
src/select.c | 2 ++
3 files changed, 9 insertions(+), 7 deletions(-)
diff --git a/manifest b/manifest
index 65ace52b28..95084c8ac1 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sthe\ssqlite3ReferencesSrcList()\sroutine\sso\sthat\sit\srecognizes\scolumns\nin\sthe\sORDER\sBY\sclause\sof\san\saggregate.\s\sFixes\sa\sproblem\swith\n[634286828dad873d]\sdiscoverd\sby\sdbsqlfuzz.
-D 2023-10-19T12:12:49.878
+C New\sassert()\sstatements\sto\shelp\sverify\scorrectness\sof\sthe\sORDER\sBY\saggregate\ncode.
+D 2023-10-19T12:36:59.371
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -718,7 +718,7 @@ F src/printf.c 9da63b9ae1c14789bcae12840f5d800fd9302500cd2d62733fac77f0041b4750
F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
F src/resolve.c 77d07bcec1b3101ce36ebf4aa04dd0340e77cbfc4f31bd1a6e43fcd2db904626
F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
-F src/select.c 21bee7bc4ac897070b7f570354e9c6d38c6bf9499aeb92f585e675337d45dce0
+F src/select.c 28f136d35ca8b7b2ac87493e8be6685b0f364c8aec814893e47b8e3d5e00a90e
F src/shell.c.in cf0a3387c5bb05ca2fe6073fa7df21aaa11e749ca5b3846b80b586a447e728aa
F src/sqlite.h.in 60e5698417e674f44be17d5ceeb4c2d395ccedba18d6de05435dec0135d9eff1
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
@@ -2133,8 +2133,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 634286828dad873dba244751441aa729cd37b6ed5899fa5875643d4af03c006c
-R 9bc375407ac96c58fb0984b4c1dff2e5
+P 3d26f1aaa4876f21f2c3abf13bbc37933c8f32471153e29019880cc9530cb011
+R e4538bd0a85cafb308a7c103d072a211
U drh
-Z c78ae0510d52a6a34f15df4050bb8417
+Z 139757f6f7292db6c0b58e22a2f14879
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 885dddf00f..7fce4dcce7 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-3d26f1aaa4876f21f2c3abf13bbc37933c8f32471153e29019880cc9530cb011
\ No newline at end of file
+8b6fffb552c30f9cbf7102c2e26a7b486c4c9edd9f494d803de7004db3018277
\ No newline at end of file
diff --git a/src/select.c b/src/select.c
index 30a44d0458..128b33ee00 100644
--- a/src/select.c
+++ b/src/select.c
@@ -417,6 +417,7 @@ void sqlite3SetJoinExpr(Expr *p, int iTable, u32 joinFlag){
p->w.iJoin = iTable;
if( p->op==TK_FUNCTION ){
assert( ExprUseXList(p) );
+ assert( p->pLeft==0 );
if( p->x.pList ){
int i;
for(i=0; ix.pList->nExpr; i++){
@@ -454,6 +455,7 @@ static void unsetJoinExpr(Expr *p, int iTable, int nullable){
}
if( p->op==TK_FUNCTION ){
assert( ExprUseXList(p) );
+ assert( p->pLeft==0 );
if( p->x.pList ){
int i;
for(i=0; ix.pList->nExpr; i++){
From 11877c6ba4a4a80cb08366017a881287538321f1 Mon Sep 17 00:00:00 2001
From: drh <>
Date: Thu, 19 Oct 2023 13:00:41 +0000
Subject: [PATCH 59/66] Fix an error in a debugging routine used inside of
testcase(). Does not appear in production. Problem discovered by
scan-build.
FossilOrigin-Name: c6c9d7ed6dbc71b998aeaaa1bdeb36b1bb9b902f9d6088ad36db29f8ea8b7ef6
---
manifest | 12 ++++++------
manifest.uuid | 2 +-
src/vdbeaux.c | 2 +-
3 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/manifest b/manifest
index 95084c8ac1..722e3176eb 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C New\sassert()\sstatements\sto\shelp\sverify\scorrectness\sof\sthe\sORDER\sBY\saggregate\ncode.
-D 2023-10-19T12:36:59.371
+C Fix\san\serror\sin\sa\sdebugging\sroutine\sused\sinside\sof\stestcase().\s\sDoes\snot\nappear\sin\sproduction.\s\sProblem\sdiscovered\sby\sscan-build.
+D 2023-10-19T13:00:41.210
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -792,7 +792,7 @@ F src/vdbe.c 300b1ac9339a5b7db9ccd48c1a13c3d71722da13352a38ee042ca0a399b4dd7e
F src/vdbe.h 41485521f68e9437fdb7ec4a90f9d86ab294e9bb8281e33b235915e29122cfc0
F src/vdbeInt.h 949669dfd8a41550d27dcb905b494f2ccde9a2e6c1b0b04daa1227e2e74c2b2c
F src/vdbeapi.c fe654b1f54e1feebcaed6c2ae3ed035cc65bfeb9a1169bed866abc42bfc63ff6
-F src/vdbeaux.c 2ebd996a266851d82b93346136fc074c8f9f31a5b139bd76a484b1a6e8b52f1d
+F src/vdbeaux.c 929a4edecf9845fb063b47b23b9d187473a648470d915521cf72419f5219c4b7
F src/vdbeblob.c 13f9287b55b6356b4b1845410382d6bede203ceb29ef69388a4a3d007ffacbe5
F src/vdbemem.c c936e9002af4993b84c4eb7133d6b1190efe46d391cc86117ecd67ba17b1a04b
F src/vdbesort.c 237840ca1947511fa59bd4e18b9eeae93f2af2468c34d2427b059f896230a547
@@ -2133,8 +2133,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 3d26f1aaa4876f21f2c3abf13bbc37933c8f32471153e29019880cc9530cb011
-R e4538bd0a85cafb308a7c103d072a211
+P 8b6fffb552c30f9cbf7102c2e26a7b486c4c9edd9f494d803de7004db3018277
+R 4aca618a679e8419cd172eea36c7911d
U drh
-Z 139757f6f7292db6c0b58e22a2f14879
+Z 1bb915481df03cc399372db91bbfa483
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 7fce4dcce7..0e3a256c2b 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-8b6fffb552c30f9cbf7102c2e26a7b486c4c9edd9f494d803de7004db3018277
\ No newline at end of file
+c6c9d7ed6dbc71b998aeaaa1bdeb36b1bb9b902f9d6088ad36db29f8ea8b7ef6
\ No newline at end of file
diff --git a/src/vdbeaux.c b/src/vdbeaux.c
index c8dbe1e6d1..27be95a6b5 100644
--- a/src/vdbeaux.c
+++ b/src/vdbeaux.c
@@ -4472,7 +4472,7 @@ SQLITE_NOINLINE int sqlite3BlobCompare(const Mem *pB1, const Mem *pB2){
*/
#if defined(SQLITE_COVERAGE_TEST) || defined(SQLITE_DEBUG)
static int SQLITE_NOINLINE doubleLt(double a, double b){ return a
Date: Thu, 19 Oct 2023 13:35:22 +0000
Subject: [PATCH 60/66] Simplification to sqlite3GetVarint32() to avoid
confusing gcov.
FossilOrigin-Name: 89862c51ad9715bedf5b029db484602e740f0db7404970d482ce503c1b9a0ed2
---
manifest | 12 ++---
manifest.uuid | 2 +-
src/util.c | 125 ++++++++------------------------------------------
3 files changed, 25 insertions(+), 114 deletions(-)
diff --git a/manifest b/manifest
index 722e3176eb..0d2df1c196 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\san\serror\sin\sa\sdebugging\sroutine\sused\sinside\sof\stestcase().\s\sDoes\snot\nappear\sin\sproduction.\s\sProblem\sdiscovered\sby\sscan-build.
-D 2023-10-19T13:00:41.210
+C Simplification\sto\ssqlite3GetVarint32()\sto\savoid\sconfusing\sgcov.
+D 2023-10-19T13:35:22.869
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -786,7 +786,7 @@ F src/trigger.c 5286019b152f622a38900284109e4aae1e5f566deb7ad9ba7e931f0660771f32
F src/update.c 6904814dd62a7a93bbb86d9f1419c7f134a9119582645854ab02b36b676d9f92
F src/upsert.c fa125a8d3410ce9a97b02cb50f7ae68a2476c405c76aa692d3acf6b8586e9242
F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0
-F src/util.c e87f66258c37f87724f46e849572c3ece4c74ef5614ba41eb221e98f0dbc95de
+F src/util.c b22cc9f203a8c0b9ee5338a67f8860347d14845864c10248bebe84518a781677
F src/vacuum.c 604fcdaebe76f3497c855afcbf91b8fa5046b32de3045bab89cc008d68e40104
F src/vdbe.c 300b1ac9339a5b7db9ccd48c1a13c3d71722da13352a38ee042ca0a399b4dd7e
F src/vdbe.h 41485521f68e9437fdb7ec4a90f9d86ab294e9bb8281e33b235915e29122cfc0
@@ -2133,8 +2133,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 8b6fffb552c30f9cbf7102c2e26a7b486c4c9edd9f494d803de7004db3018277
-R 4aca618a679e8419cd172eea36c7911d
+P c6c9d7ed6dbc71b998aeaaa1bdeb36b1bb9b902f9d6088ad36db29f8ea8b7ef6
+R 2d6d822f4f032385b3965cf0ea67965f
U drh
-Z 1bb915481df03cc399372db91bbfa483
+Z 984079d068cf9e399e4e739b1e691268
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 0e3a256c2b..8b7d689343 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-c6c9d7ed6dbc71b998aeaaa1bdeb36b1bb9b902f9d6088ad36db29f8ea8b7ef6
\ No newline at end of file
+89862c51ad9715bedf5b029db484602e740f0db7404970d482ce503c1b9a0ed2
\ No newline at end of file
diff --git a/src/util.c b/src/util.c
index 58591590dc..e9c7cccb03 100644
--- a/src/util.c
+++ b/src/util.c
@@ -1367,121 +1367,32 @@ u8 sqlite3GetVarint(const unsigned char *p, u64 *v){
** this function assumes the single-byte case has already been handled.
*/
u8 sqlite3GetVarint32(const unsigned char *p, u32 *v){
- u32 a,b;
+ u64 v64;
+ u8 n;
- /* The 1-byte case. Overwhelmingly the most common. Handled inline
- ** by the getVarin32() macro */
- a = *p;
- /* a: p0 (unmasked) */
-#ifndef getVarint32
- if (!(a&0x80))
- {
- /* Values between 0 and 127 */
- *v = a;
- return 1;
- }
-#endif
+ /* Assume that the single-byte case has already been handled by
+ ** the getVarint32() macro */
+ assert( (p[0] & 0x80)!=0 );
- /* The 2-byte case */
- p++;
- b = *p;
- /* b: p1 (unmasked) */
- if (!(b&0x80))
- {
- /* Values between 128 and 16383 */
- a &= 0x7f;
- a = a<<7;
- *v = a | b;
+ if( (p[1] & 0x80)==0 ){
+ /* This is the two-byte case */
+ *v = ((p[0]&0x7f)<<7) | p[1];
return 2;
}
-
- /* The 3-byte case */
- p++;
- a = a<<14;
- a |= *p;
- /* a: p0<<14 | p2 (unmasked) */
- if (!(a&0x80))
- {
- /* Values between 16384 and 2097151 */
- a &= (0x7f<<14)|(0x7f);
- b &= 0x7f;
- b = b<<7;
- *v = a | b;
+ if( (p[2] & 0x80)==0 ){
+ /* This is the three-byte case */
+ *v = ((p[0]&0x7f)<<14) | ((p[1]&0x7f)<<7) | p[2];
return 3;
}
-
- /* A 32-bit varint is used to store size information in btrees.
- ** Objects are rarely larger than 2MiB limit of a 3-byte varint.
- ** A 3-byte varint is sufficient, for example, to record the size
- ** of a 1048569-byte BLOB or string.
- **
- ** We only unroll the first 1-, 2-, and 3- byte cases. The very
- ** rare larger cases can be handled by the slower 64-bit varint
- ** routine.
- */
-#if 1
- {
- u64 v64;
- u8 n;
-
- n = sqlite3GetVarint(p-2, &v64);
- assert( n>3 && n<=9 );
- if( (v64 & SQLITE_MAX_U32)!=v64 ){
- *v = 0xffffffff;
- }else{
- *v = (u32)v64;
- }
- return n;
- }
-
-#else
- /* For following code (kept for historical record only) shows an
- ** unrolling for the 3- and 4-byte varint cases. This code is
- ** slightly faster, but it is also larger and much harder to test.
- */
- p++;
- b = b<<14;
- b |= *p;
- /* b: p1<<14 | p3 (unmasked) */
- if (!(b&0x80))
- {
- /* Values between 2097152 and 268435455 */
- b &= (0x7f<<14)|(0x7f);
- a &= (0x7f<<14)|(0x7f);
- a = a<<7;
- *v = a | b;
- return 4;
- }
-
- p++;
- a = a<<14;
- a |= *p;
- /* a: p0<<28 | p2<<14 | p4 (unmasked) */
- if (!(a&0x80))
- {
- /* Values between 268435456 and 34359738367 */
- a &= SLOT_4_2_0;
- b &= SLOT_4_2_0;
- b = b<<7;
- *v = a | b;
- return 5;
- }
-
- /* We can only reach this point when reading a corrupt database
- ** file. In that case we are not in any hurry. Use the (relatively
- ** slow) general-purpose sqlite3GetVarint() routine to extract the
- ** value. */
- {
- u64 v64;
- u8 n;
-
- p -= 4;
- n = sqlite3GetVarint(p, &v64);
- assert( n>5 && n<=9 );
+ /* four or more bytes */
+ n = sqlite3GetVarint(p, &v64);
+ assert( n>3 && n<=9 );
+ if( (v64 & SQLITE_MAX_U32)!=v64 ){
+ *v = 0xffffffff;
+ }else{
*v = (u32)v64;
- return n;
}
-#endif
+ return n;
}
/*
From 4e254641ff2a5aefbce3398346dcb250aef7bbda Mon Sep 17 00:00:00 2001
From: drh <>
Date: Thu, 19 Oct 2023 18:07:58 +0000
Subject: [PATCH 61/66] Simplify the Expr compression logic slightly by adding
the new EP_FullSize property to expressions that are exceptions to the rule
and should not be compressed.
FossilOrigin-Name: d5ae82ec52eafed5e3dc8c9d99685f6523fce7d973ef7e8d9d75ed9b8912426a
---
manifest | 16 ++++++++--------
manifest.uuid | 2 +-
src/expr.c | 7 ++-----
src/sqliteInt.h | 3 ++-
src/window.c | 3 ++-
5 files changed, 15 insertions(+), 16 deletions(-)
diff --git a/manifest b/manifest
index 0d2df1c196..51ee3db8e2 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Simplification\sto\ssqlite3GetVarint32()\sto\savoid\sconfusing\sgcov.
-D 2023-10-19T13:35:22.869
+C Simplify\sthe\sExpr\scompression\slogic\sslightly\sby\sadding\sthe\snew\sEP_FullSize\nproperty\sto\sexpressions\sthat\sare\sexceptions\sto\sthe\srule\sand\sshould\snot\sbe\ncompressed.
+D 2023-10-19T18:07:58.432
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -668,7 +668,7 @@ F src/date.c eebc54a00e888d3c56147779e9f361b77d62fd69ff2008c5373946aa1ba1d574
F src/dbpage.c 80e46e1df623ec40486da7a5086cb723b0275a6e2a7b01d9f9b5da0f04ba2782
F src/dbstat.c 3b677254d512fcafd4d0b341bf267b38b235ccfddbef24f9154e19360fa22e43
F src/delete.c cb766727c78e715f9fb7ec8a7d03658ed2a3016343ca687acfcec9083cdca500
-F src/expr.c 77191fed30bf1df1a70718cca9c8c1d17d5f9df15ec0f66ce7f122d11a97fe40
+F src/expr.c 7650672b74f1a5e944f93a47b2d21bef23cc2331103ffbf4bcdaa13624354f38
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
F src/fkey.c a7fcbf7e66d14dbb73cf49f31489ebf66d0e6006c62b95246924a3bae9f37b36
F src/func.c e8d7b3587a225f4f1116f720b72090511fe9feb936e960bd26a053cea6a17a63
@@ -723,7 +723,7 @@ F src/shell.c.in cf0a3387c5bb05ca2fe6073fa7df21aaa11e749ca5b3846b80b586a447e728a
F src/sqlite.h.in 60e5698417e674f44be17d5ceeb4c2d395ccedba18d6de05435dec0135d9eff1
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
F src/sqlite3ext.h 2f30b2671f4c03cd27a43f039e11251391066c97d11385f5f963bb40b03038ac
-F src/sqliteInt.h 834656265db68d42cf615e01b107b16d43c2bcad4837f197c88928448fc1de71
+F src/sqliteInt.h 849004dd6f4315e05a8ec892999b0972484eb5438d122adc9444ed854bd905ce
F src/sqliteLimit.h 33b1c9baba578d34efe7dfdb43193b366111cdf41476b1e82699e14c11ee1fb6
F src/status.c 160c445d7d28c984a0eae38c144f6419311ed3eace59b44ac6dafc20db4af749
F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
@@ -807,7 +807,7 @@ F src/where.c 313ce81270d2a414672370e1ee74e65949ad620519193d4cac2986d073cbc8a0
F src/whereInt.h 4b38c5889514e3aead3f27d0ee9a26e47c3f150efc59e2a8b4e3bc8835e4d7a1
F src/wherecode.c 5d77db30a2a3dd532492ae882de114edba2fae672622056b1c7fd61f5917a8f1
F src/whereexpr.c dc5096eca5ed503999be3bdee8a90c51361289a678d396a220912e9cb73b3c00
-F src/window.c b7ad9cff3ce8ae6f8cc25e18e1a258426cb6bd2999aace6f5248d781b2a74098
+F src/window.c ad21e2b73ec75acc79dde2576c573f54a338b0c49e9de847ce984f9b9595b5e2
F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
F test/affinity2.test ce1aafc86e110685b324e9a763eab4f2a73f737842ec3b687bd965867de90627
F test/affinity3.test f094773025eddf31135c7ad4cde722b7696f8eb07b97511f98585addf2a510a9
@@ -2133,8 +2133,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P c6c9d7ed6dbc71b998aeaaa1bdeb36b1bb9b902f9d6088ad36db29f8ea8b7ef6
-R 2d6d822f4f032385b3965cf0ea67965f
+P 89862c51ad9715bedf5b029db484602e740f0db7404970d482ce503c1b9a0ed2
+R cafbded15ce259abcd81ee283e9b7816
U drh
-Z 984079d068cf9e399e4e739b1e691268
+Z f727cd73dc6d9e2bf2cf8af2294d32ea
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 8b7d689343..f2b5f60a4b 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-89862c51ad9715bedf5b029db484602e740f0db7404970d482ce503c1b9a0ed2
\ No newline at end of file
+d5ae82ec52eafed5e3dc8c9d99685f6523fce7d973ef7e8d9d75ed9b8912426a
\ No newline at end of file
diff --git a/src/expr.c b/src/expr.c
index 38da1ab690..cc0b0dacc0 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -591,6 +591,7 @@ Expr *sqlite3ExprForVectorField(
*/
pRet = sqlite3PExpr(pParse, TK_SELECT_COLUMN, 0, 0);
if( pRet ){
+ ExprSetProperty(pRet, EP_FullSize);
pRet->iTable = nField;
pRet->iColumn = iField;
pRet->pLeft = pVector;
@@ -1494,11 +1495,7 @@ static int dupedExprStructSize(const Expr *p, int flags){
assert( flags==EXPRDUP_REDUCE || flags==0 ); /* Only one flag value allowed */
assert( EXPR_FULLSIZE<=0xfff );
assert( (0xfff & (EP_Reduced|EP_TokenOnly))==0 );
- if( 0==flags || p->op==TK_SELECT_COLUMN
-#ifndef SQLITE_OMIT_WINDOWFUNC
- || ExprHasProperty(p, EP_WinFunc)
-#endif
- ){
+ if( 0==flags || ExprHasProperty(p, EP_FullSize) ){
nSize = EXPR_FULLSIZE;
}else{
assert( !ExprHasProperty(p, EP_TokenOnly|EP_Reduced) );
diff --git a/src/sqliteInt.h b/src/sqliteInt.h
index 4becf92227..85492fbec6 100644
--- a/src/sqliteInt.h
+++ b/src/sqliteInt.h
@@ -3047,7 +3047,7 @@ struct Expr {
#define EP_Reduced 0x004000 /* Expr struct EXPR_REDUCEDSIZE bytes only */
#define EP_Win 0x008000 /* Contains window functions */
#define EP_TokenOnly 0x010000 /* Expr struct EXPR_TOKENONLYSIZE bytes only */
- /* 0x020000 // Available for reuse */
+#define EP_FullSize 0x020000 /* Expr structure must remain full sized */
#define EP_IfNullRow 0x040000 /* The TK_IF_NULL_ROW opcode */
#define EP_Unlikely 0x080000 /* unlikely() or likelihood() function */
#define EP_ConstFunc 0x100000 /* A SQLITE_FUNC_CONSTANT or _SLOCHNG function */
@@ -3077,6 +3077,7 @@ struct Expr {
#define ExprClearProperty(E,P) (E)->flags&=~(P)
#define ExprAlwaysTrue(E) (((E)->flags&(EP_OuterON|EP_IsTrue))==EP_IsTrue)
#define ExprAlwaysFalse(E) (((E)->flags&(EP_OuterON|EP_IsFalse))==EP_IsFalse)
+#define ExprIsFullSize(E) (((E)->flags&(EP_Reduced|EP_TokenOnly))==0)
/* Macros used to ensure that the correct members of unions are accessed
** in Expr.
diff --git a/src/window.c b/src/window.c
index d46eabc3b4..2c449592d7 100644
--- a/src/window.c
+++ b/src/window.c
@@ -1312,8 +1312,9 @@ void sqlite3WindowAttach(Parse *pParse, Expr *p, Window *pWin){
if( p ){
assert( p->op==TK_FUNCTION );
assert( pWin );
+ assert( ExprIsFullSize(p) );
p->y.pWin = pWin;
- ExprSetProperty(p, EP_WinFunc);
+ ExprSetProperty(p, EP_WinFunc|EP_FullSize);
pWin->pOwner = p;
if( (p->flags & EP_Distinct) && pWin->eFrmType!=TK_FILTER ){
sqlite3ErrorMsg(pParse,
From ee3c55471ca02af8090f893b4deb461fab53dd35 Mon Sep 17 00:00:00 2001
From: dan
Date: Thu, 19 Oct 2023 18:23:17 +0000
Subject: [PATCH 62/66] Fix an fts3 problem caused by reducing the page size
using the undocumented "nodesize" option, then running an incremental-merge.
FossilOrigin-Name: 2875dcb1ac86db2704ad377d719f308c8837e196b49c98b20ceda1324f2d27ea
---
ext/fts3/fts3_write.c | 12 ++++++++----
manifest | 16 ++++++++--------
manifest.uuid | 2 +-
test/fts3fuzz001.test | 27 +++++++++++++++++++++++++++
4 files changed, 44 insertions(+), 13 deletions(-)
diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c
index de07c52c13..9bacd4235c 100644
--- a/ext/fts3/fts3_write.c
+++ b/ext/fts3/fts3_write.c
@@ -4034,9 +4034,13 @@ static int fts3IncrmergeAppend(
nSpace += sqlite3Fts3VarintLen(nDoclist) + nDoclist;
/* If the current block is not empty, and if adding this term/doclist
- ** to the current block would make it larger than Fts3Table.nNodeSize
- ** bytes, write this block out to the database. */
- if( pLeaf->block.n>0 && (pLeaf->block.n + nSpace)>p->nNodeSize ){
+ ** to the current block would make it larger than Fts3Table.nNodeSize bytes,
+ ** and if there is still room for another leaf page, write this block out to
+ ** the database. */
+ if( pLeaf->block.n>0
+ && (pLeaf->block.n + nSpace)>p->nNodeSize
+ && pLeaf->iBlock < (pWriter->iStart + pWriter->nLeafEst)
+ ){
rc = fts3WriteSegment(p, pLeaf->iBlock, pLeaf->block.a, pLeaf->block.n);
pWriter->nWork++;
@@ -4368,7 +4372,7 @@ static int fts3IncrmergeLoad(
rc = sqlite3Fts3ReadBlock(p, reader.iChild, &aBlock, &nBlock,0);
blobGrowBuffer(&pNode->block,
MAX(nBlock, p->nNodeSize)+FTS3_NODE_PADDING, &rc
- );
+ );
if( rc==SQLITE_OK ){
memcpy(pNode->block.a, aBlock, nBlock);
pNode->block.n = nBlock;
diff --git a/manifest b/manifest
index 51ee3db8e2..759ee440f6 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Simplify\sthe\sExpr\scompression\slogic\sslightly\sby\sadding\sthe\snew\sEP_FullSize\nproperty\sto\sexpressions\sthat\sare\sexceptions\sto\sthe\srule\sand\sshould\snot\sbe\ncompressed.
-D 2023-10-19T18:07:58.432
+C Fix\san\sfts3\sproblem\scaused\sby\sreducing\sthe\spage\ssize\susing\sthe\sundocumented\s"nodesize"\soption,\sthen\srunning\san\sincremental-merge.
+D 2023-10-19T18:23:17.869
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -78,7 +78,7 @@ F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3
F ext/fts3/fts3_tokenizer1.c c1de4ae28356ad98ccb8b2e3388a7fdcce7607b5523738c9afb6275dab765154
F ext/fts3/fts3_unicode.c de426ff05c1c2e7bce161cf6b706638419c3a1d9c2667de9cb9dc0458c18e226
F ext/fts3/fts3_unicode2.c 416eb7e1e81142703520d284b768ca2751d40e31fa912cae24ba74860532bf0f
-F ext/fts3/fts3_write.c b28f4cde90ed560245ecb76a882b45aa62da16ff6f61e9884eae5c7c5eff16ea
+F ext/fts3/fts3_write.c 3a0043bb527c5d11e90493fd9fead30836e161a5330ba2ba739b372b03ea0459
F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9
F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87fea4ac01b73
F ext/fts3/tool/fts3view.c 413c346399159df81f86c4928b7c4a455caab73bfbc8cd68f950f632e5751674
@@ -1148,7 +1148,7 @@ F test/fts3f.test 8c438d5e1cab526b0021988fb1dc70cf3597b006a33ffd6c955ee89929077f
F test/fts3fault.test f4e1342acfe6d216a001490e8cd52afac1f9ffe4a11bbcdcb296129a45c5df45
F test/fts3fault2.test 7b2741e5095367238380b0fcdb837f36c24484c7a5f353659b387df63cf039ec
F test/fts3first.test dbdedd20914c8d539aa3206c9b34a23775644641
-F test/fts3fuzz001.test e3c7b0ce9b04cc02281dcc96812a277f02df03cd7dc082055d87e11eb18aaf56
+F test/fts3fuzz001.test c78afcd8ad712ea0b8d2ed50851a8aab3bc9dc52c64a536291e07112f519357c
F test/fts3join.test 1a4d786539b2b79a41c28ef2ac22cacd92a8ee830249b68a7dee4a020848e3bb
F test/fts3malloc.test b0e4c133b8d61d4f6d112d8110f8320e9e453ef6
F test/fts3matchinfo.test aa66cc50615578b30f6df9984819ae5b702511cf8a94251ec7c594096a703a4a
@@ -2133,8 +2133,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 89862c51ad9715bedf5b029db484602e740f0db7404970d482ce503c1b9a0ed2
-R cafbded15ce259abcd81ee283e9b7816
-U drh
-Z f727cd73dc6d9e2bf2cf8af2294d32ea
+P d5ae82ec52eafed5e3dc8c9d99685f6523fce7d973ef7e8d9d75ed9b8912426a
+R 02c4f3ff3085bada857f44e872f54862
+U dan
+Z ffd740135c1cbc63e13e90b6f1ec66d6
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index f2b5f60a4b..33933915c4 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-d5ae82ec52eafed5e3dc8c9d99685f6523fce7d973ef7e8d9d75ed9b8912426a
\ No newline at end of file
+2875dcb1ac86db2704ad377d719f308c8837e196b49c98b20ceda1324f2d27ea
\ No newline at end of file
diff --git a/test/fts3fuzz001.test b/test/fts3fuzz001.test
index 41b22d33da..6b1ae90ee4 100644
--- a/test/fts3fuzz001.test
+++ b/test/fts3fuzz001.test
@@ -13,6 +13,7 @@
set testdir [file dirname $argv0]
source $testdir/tester.tcl
+set testprefix fts3fuzz001
ifcapable !deserialize||!fts3 {
finish_test
@@ -110,5 +111,31 @@ do_test fts3fuzz001-121 {
}
} {1 {database disk image is malformed}}
+#-------------------------------------------------------------------------
+reset_db
+do_execsql_test 200 {
+ CREATE VIRTUAL TABLE x1 USING fts3(x);
+
+ INSERT INTO x1 VALUES('braes brag bragged bragger bragging');
+ INSERT INTO x1 VALUES('brags braid braided braiding braids');
+ INSERT INTO x1 VALUES('brain brainchild brained braining brains');
+ INSERT INTO x1 VALUES('brainstem brainstems brainstorm brainstorms');
+ INSERT INTO x1(x1) VALUES('nodesize=24');
+}
+
+do_execsql_test 210 {
+ PRAGMA integrity_check;
+} {ok}
+
+do_execsql_test 220 {
+ INSERT INTO x1(x1) VALUES('merge=10,2')
+}
+
+do_execsql_test 220 {
+ PRAGMA integrity_check;
+} {ok}
+
+
+
finish_test
From d8b840a4f4bdcadfe755c966f1ee583f506cad0f Mon Sep 17 00:00:00 2001
From: drh <>
Date: Thu, 19 Oct 2023 19:08:33 +0000
Subject: [PATCH 63/66] In the TreeView logic (used for debugging only) do not
show unnecessary fields of the Window object when a function has a FILTER.
FossilOrigin-Name: d2c6b82c346dbf39e07f09d187e4a8216a56caa7df3dcfafc82e32f676a1db8a
---
manifest | 14 +++++++-------
manifest.uuid | 2 +-
src/treeview.c | 9 +++++----
3 files changed, 13 insertions(+), 12 deletions(-)
diff --git a/manifest b/manifest
index 759ee440f6..2ec42087c4 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\san\sfts3\sproblem\scaused\sby\sreducing\sthe\spage\ssize\susing\sthe\sundocumented\s"nodesize"\soption,\sthen\srunning\san\sincremental-merge.
-D 2023-10-19T18:23:17.869
+C In\sthe\sTreeView\slogic\s(used\sfor\sdebugging\sonly)\sdo\snot\sshow\sunnecessary\sfields\nof\sthe\sWindow\sobject\swhen\sa\sfunction\shas\sa\sFILTER.
+D 2023-10-19T19:08:33.080
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -781,7 +781,7 @@ F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394
F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9
F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c
F src/tokenize.c 23d9f4539880b40226254ad9072f4ecf12eb1902e62aea47aac29928afafcfd5
-F src/treeview.c 6c441500139d46c147216dac667510987ecd0e91a27735cd6d9dd77f81e465a7
+F src/treeview.c bd8ec60f37e3c5d133e00dbff6ba44bb7e3a102728bab83ec420b3feb7d04440
F src/trigger.c 5286019b152f622a38900284109e4aae1e5f566deb7ad9ba7e931f0660771f32
F src/update.c 6904814dd62a7a93bbb86d9f1419c7f134a9119582645854ab02b36b676d9f92
F src/upsert.c fa125a8d3410ce9a97b02cb50f7ae68a2476c405c76aa692d3acf6b8586e9242
@@ -2133,8 +2133,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P d5ae82ec52eafed5e3dc8c9d99685f6523fce7d973ef7e8d9d75ed9b8912426a
-R 02c4f3ff3085bada857f44e872f54862
-U dan
-Z ffd740135c1cbc63e13e90b6f1ec66d6
+P 2875dcb1ac86db2704ad377d719f308c8837e196b49c98b20ceda1324f2d27ea
+R 45852c93d35e0d900ce3d50d808ec604
+U drh
+Z 4a6691c4f5ab92ae34d088813bdd99dd
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 33933915c4..95865b7d32 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-2875dcb1ac86db2704ad377d719f308c8837e196b49c98b20ceda1324f2d27ea
\ No newline at end of file
+d2c6b82c346dbf39e07f09d187e4a8216a56caa7df3dcfafc82e32f676a1db8a
\ No newline at end of file
diff --git a/src/treeview.c b/src/treeview.c
index 6852a61ddd..a3f128cab2 100644
--- a/src/treeview.c
+++ b/src/treeview.c
@@ -412,6 +412,7 @@ void sqlite3TreeViewWindow(TreeView *pView, const Window *pWin, u8 more){
sqlite3TreeViewItem(pView, "FILTER", 1);
sqlite3TreeViewExpr(pView, pWin->pFilter, 0);
sqlite3TreeViewPop(&pView);
+ if( pWin->eFrmType==TK_FILTER ) return;
}
sqlite3TreeViewPush(&pView, more);
if( pWin->zName ){
@@ -421,7 +422,7 @@ void sqlite3TreeViewWindow(TreeView *pView, const Window *pWin, u8 more){
}
if( pWin->zBase ) nElement++;
if( pWin->pOrderBy ) nElement++;
- if( pWin->eFrmType ) nElement++;
+ if( pWin->eFrmType!=0 && pWin->eFrmType!=TK_FILTER ) nElement++;
if( pWin->eExclude ) nElement++;
if( pWin->zBase ){
sqlite3TreeViewPush(&pView, (--nElement)>0);
@@ -434,7 +435,7 @@ void sqlite3TreeViewWindow(TreeView *pView, const Window *pWin, u8 more){
if( pWin->pOrderBy ){
sqlite3TreeViewExprList(pView, pWin->pOrderBy, (--nElement)>0, "ORDER-BY");
}
- if( pWin->eFrmType ){
+ if( pWin->eFrmType!=0 && pWin->eFrmType!=TK_FILTER ){
char zBuf[30];
const char *zFrmType = "ROWS";
if( pWin->eFrmType==TK_RANGE ) zFrmType = "RANGE";
@@ -682,7 +683,7 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){
assert( ExprUseXList(pExpr) );
pFarg = pExpr->x.pList;
#ifndef SQLITE_OMIT_WINDOWFUNC
- pWin = ExprHasProperty(pExpr, EP_WinFunc) ? pExpr->y.pWin : 0;
+ pWin = IsWindowFunc(pExpr) ? pExpr->y.pWin : 0;
#else
pWin = 0;
#endif
@@ -708,7 +709,7 @@ void sqlite3TreeViewExpr(TreeView *pView, const Expr *pExpr, u8 moreToFollow){
sqlite3TreeViewLine(pView, "FUNCTION %Q%s", pExpr->u.zToken, zFlgs);
}
if( pFarg ){
- sqlite3TreeViewExprList(pView, pFarg, pWin!=0, 0);
+ sqlite3TreeViewExprList(pView, pFarg, pWin!=0 || pExpr->pLeft, 0);
if( pExpr->pLeft ){
Expr *pOB = pExpr->pLeft;
assert( pOB->op==TK_ORDER );
From 5080397e67e16a5b72f0139274661ddd8f661bb4 Mon Sep 17 00:00:00 2001
From: drh <>
Date: Thu, 19 Oct 2023 19:19:59 +0000
Subject: [PATCH 64/66] Fix an adverse interaction between the new aggregate
ORDER BY logic and the expression compressor.
FossilOrigin-Name: f371e4c0f8ea73aee9ea0645f396e3da20f1eb97be34c83de9d94c9cbb959934
---
manifest | 12 ++++++------
manifest.uuid | 2 +-
src/expr.c | 5 +++--
3 files changed, 10 insertions(+), 9 deletions(-)
diff --git a/manifest b/manifest
index 2ec42087c4..ee9b2d6e44 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C In\sthe\sTreeView\slogic\s(used\sfor\sdebugging\sonly)\sdo\snot\sshow\sunnecessary\sfields\nof\sthe\sWindow\sobject\swhen\sa\sfunction\shas\sa\sFILTER.
-D 2023-10-19T19:08:33.080
+C Fix\san\sadverse\sinteraction\sbetween\sthe\snew\saggregate\sORDER\sBY\slogic\sand\sthe\nexpression\scompressor.
+D 2023-10-19T19:19:59.307
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -668,7 +668,7 @@ F src/date.c eebc54a00e888d3c56147779e9f361b77d62fd69ff2008c5373946aa1ba1d574
F src/dbpage.c 80e46e1df623ec40486da7a5086cb723b0275a6e2a7b01d9f9b5da0f04ba2782
F src/dbstat.c 3b677254d512fcafd4d0b341bf267b38b235ccfddbef24f9154e19360fa22e43
F src/delete.c cb766727c78e715f9fb7ec8a7d03658ed2a3016343ca687acfcec9083cdca500
-F src/expr.c 7650672b74f1a5e944f93a47b2d21bef23cc2331103ffbf4bcdaa13624354f38
+F src/expr.c 18a23aeeb4f0f1999163c273a823e7812a179de110025d07f6db58cfd9d3ddf0
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
F src/fkey.c a7fcbf7e66d14dbb73cf49f31489ebf66d0e6006c62b95246924a3bae9f37b36
F src/func.c e8d7b3587a225f4f1116f720b72090511fe9feb936e960bd26a053cea6a17a63
@@ -2133,8 +2133,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 2875dcb1ac86db2704ad377d719f308c8837e196b49c98b20ceda1324f2d27ea
-R 45852c93d35e0d900ce3d50d808ec604
+P d2c6b82c346dbf39e07f09d187e4a8216a56caa7df3dcfafc82e32f676a1db8a
+R 9da72bfce06dbb3400677ef0c3b1a035
U drh
-Z 4a6691c4f5ab92ae34d088813bdd99dd
+Z c6070fdc6625bfd39e8b2f9924ac4aea
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 95865b7d32..002a508a44 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-d2c6b82c346dbf39e07f09d187e4a8216a56caa7df3dcfafc82e32f676a1db8a
\ No newline at end of file
+f371e4c0f8ea73aee9ea0645f396e3da20f1eb97be34c83de9d94c9cbb959934
\ No newline at end of file
diff --git a/src/expr.c b/src/expr.c
index cc0b0dacc0..2dcba6e524 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -1572,7 +1572,7 @@ static Expr *exprDup(sqlite3 *db, const Expr *p, int dupFlags, u8 **pzBuffer){
staticFlag = EP_Static;
assert( zAlloc!=0 );
}else{
- zAlloc = sqlite3DbMallocRawNN(db, dupedExprSize(p, dupFlags));
+ zAlloc = sqlite3DbMallocRawNN(db, dupedExprSize(p, dupFlags)*5);
staticFlag = 0;
}
pNew = (Expr *)zAlloc;
@@ -1622,7 +1622,8 @@ static Expr *exprDup(sqlite3 *db, const Expr *p, int dupFlags, u8 **pzBuffer){
if( ExprUseXSelect(p) ){
pNew->x.pSelect = sqlite3SelectDup(db, p->x.pSelect, dupFlags);
}else{
- pNew->x.pList = sqlite3ExprListDup(db, p->x.pList, dupFlags);
+ pNew->x.pList = sqlite3ExprListDup(db, p->x.pList,
+ p->op!=TK_ORDER ? dupFlags : 0);
}
}
From 5f53f85e22df1c5e1e36106b5e4d1db5089519aa Mon Sep 17 00:00:00 2001
From: drh <>
Date: Thu, 19 Oct 2023 19:57:57 +0000
Subject: [PATCH 65/66] For TK_ORDER expression nodes to always be full-size.
FossilOrigin-Name: a5c73b46f4772f214ffbfa31cb87dce82ebd690addabef539bd09def26b7744d
---
manifest | 12 ++++++------
manifest.uuid | 2 +-
src/expr.c | 1 +
3 files changed, 8 insertions(+), 7 deletions(-)
diff --git a/manifest b/manifest
index ee9b2d6e44..0abfc0faf1 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\san\sadverse\sinteraction\sbetween\sthe\snew\saggregate\sORDER\sBY\slogic\sand\sthe\nexpression\scompressor.
-D 2023-10-19T19:19:59.307
+C For\sTK_ORDER\sexpression\snodes\sto\salways\sbe\sfull-size.
+D 2023-10-19T19:57:57.476
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -668,7 +668,7 @@ F src/date.c eebc54a00e888d3c56147779e9f361b77d62fd69ff2008c5373946aa1ba1d574
F src/dbpage.c 80e46e1df623ec40486da7a5086cb723b0275a6e2a7b01d9f9b5da0f04ba2782
F src/dbstat.c 3b677254d512fcafd4d0b341bf267b38b235ccfddbef24f9154e19360fa22e43
F src/delete.c cb766727c78e715f9fb7ec8a7d03658ed2a3016343ca687acfcec9083cdca500
-F src/expr.c 18a23aeeb4f0f1999163c273a823e7812a179de110025d07f6db58cfd9d3ddf0
+F src/expr.c 0756a4116a60666e31e77297444e628262cac913eebdac955a17c8cc8177429b
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
F src/fkey.c a7fcbf7e66d14dbb73cf49f31489ebf66d0e6006c62b95246924a3bae9f37b36
F src/func.c e8d7b3587a225f4f1116f720b72090511fe9feb936e960bd26a053cea6a17a63
@@ -2133,8 +2133,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P d2c6b82c346dbf39e07f09d187e4a8216a56caa7df3dcfafc82e32f676a1db8a
-R 9da72bfce06dbb3400677ef0c3b1a035
+P f371e4c0f8ea73aee9ea0645f396e3da20f1eb97be34c83de9d94c9cbb959934
+R 6e8e24ae6b4cb9a95bb70c9f80125f71
U drh
-Z c6070fdc6625bfd39e8b2f9924ac4aea
+Z 5b3ced1de2a96a932e2087f4a6248f87
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index 002a508a44..bcdd04358b 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-f371e4c0f8ea73aee9ea0645f396e3da20f1eb97be34c83de9d94c9cbb959934
\ No newline at end of file
+a5c73b46f4772f214ffbfa31cb87dce82ebd690addabef539bd09def26b7744d
\ No newline at end of file
diff --git a/src/expr.c b/src/expr.c
index 2dcba6e524..86b5f5f1e7 100644
--- a/src/expr.c
+++ b/src/expr.c
@@ -1240,6 +1240,7 @@ void sqlite3ExprAddFunctionOrderBy(
pOB->x.pList = pOrderBy;
assert( ExprUseXList(pOB) );
pExpr->pLeft = pOB;
+ ExprSetProperty(pOB, EP_FullSize);
}
/*
From dcf76a8bbda9028c391945834d67471fc8e2821f Mon Sep 17 00:00:00 2001
From: drh <>
Date: Thu, 19 Oct 2023 20:06:20 +0000
Subject: [PATCH 66/66] Remove a faulty assert() that was added just a few
check-ins ago by [8b6fffb552c30f9c].
FossilOrigin-Name: 18e7c826f08bce51719ef045daa60200b33790f2fe312c6853f9ef6c7e9d5030
---
manifest | 12 ++++++------
manifest.uuid | 2 +-
src/select.c | 1 -
3 files changed, 7 insertions(+), 8 deletions(-)
diff --git a/manifest b/manifest
index 0abfc0faf1..e7ee8b1264 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C For\sTK_ORDER\sexpression\snodes\sto\salways\sbe\sfull-size.
-D 2023-10-19T19:57:57.476
+C Remove\sa\sfaulty\sassert()\sthat\swas\sadded\sjust\sa\sfew\scheck-ins\sago\sby\n[8b6fffb552c30f9c].
+D 2023-10-19T20:06:20.075
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -718,7 +718,7 @@ F src/printf.c 9da63b9ae1c14789bcae12840f5d800fd9302500cd2d62733fac77f0041b4750
F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
F src/resolve.c 77d07bcec1b3101ce36ebf4aa04dd0340e77cbfc4f31bd1a6e43fcd2db904626
F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
-F src/select.c 28f136d35ca8b7b2ac87493e8be6685b0f364c8aec814893e47b8e3d5e00a90e
+F src/select.c f9d8ece7f0742d7b835efa9590ccda4eccee5b9def7581ec94f556e3c52efe51
F src/shell.c.in cf0a3387c5bb05ca2fe6073fa7df21aaa11e749ca5b3846b80b586a447e728aa
F src/sqlite.h.in 60e5698417e674f44be17d5ceeb4c2d395ccedba18d6de05435dec0135d9eff1
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
@@ -2133,8 +2133,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P f371e4c0f8ea73aee9ea0645f396e3da20f1eb97be34c83de9d94c9cbb959934
-R 6e8e24ae6b4cb9a95bb70c9f80125f71
+P a5c73b46f4772f214ffbfa31cb87dce82ebd690addabef539bd09def26b7744d
+R 028a712d10c14e79ed79d3b08f83b31c
U drh
-Z 5b3ced1de2a96a932e2087f4a6248f87
+Z 37bf27ee369c257065f7353841ae889a
# Remove this line to create a well-formed Fossil manifest.
diff --git a/manifest.uuid b/manifest.uuid
index bcdd04358b..d04bbb41aa 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-a5c73b46f4772f214ffbfa31cb87dce82ebd690addabef539bd09def26b7744d
\ No newline at end of file
+18e7c826f08bce51719ef045daa60200b33790f2fe312c6853f9ef6c7e9d5030
\ No newline at end of file
diff --git a/src/select.c b/src/select.c
index 128b33ee00..29df3325f3 100644
--- a/src/select.c
+++ b/src/select.c
@@ -417,7 +417,6 @@ void sqlite3SetJoinExpr(Expr *p, int iTable, u32 joinFlag){
p->w.iJoin = iTable;
if( p->op==TK_FUNCTION ){
assert( ExprUseXList(p) );
- assert( p->pLeft==0 );
if( p->x.pList ){
int i;
for(i=0; ix.pList->nExpr; i++){