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++){