better-sqlite3-multiple-ciphers 7.5.1-beta.2 → 7.5.1-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -23,10 +23,10 @@ The fastest and simplest library for SQLite3 in Node.js. This particular fork su
23
23
  - **SQLite3 Multiple Ciphers** - [`1.3.7`](https://github.com/utelle/SQLite3MultipleCiphers/releases/tag/v1.3.7)
24
24
 
25
25
  - ### Beta
26
- - **better-sqlite3-multiple-ciphers** - [`7.5.1-beta.2`](https://github.com/m4heshd/better-sqlite3-multiple-ciphers/releases/tag/v7.5.1-beta.2)
26
+ - **better-sqlite3-multiple-ciphers** - [`7.5.1-beta.3`](https://github.com/m4heshd/better-sqlite3-multiple-ciphers/releases/tag/v7.5.1-beta.3)
27
27
  - **better-sqlite3** - [`7.5.0`](https://github.com/JoshuaWise/better-sqlite3/releases/tag/v7.5.0)
28
- - **SQLite** - [`3.38.0`](https://www.sqlite.org/draft/releaselog/3_38_0.html)
29
- - **SQLite3 Multiple Ciphers** - [`1.3.8`](https://github.com/utelle/SQLite3MultipleCiphers/releases/tag/v1.3.8)
28
+ - **SQLite** - [`3.38.1`](https://www.sqlite.org/draft/releaselog/3_38_1.html)
29
+ - **SQLite3 Multiple Ciphers** - [`1.3.9`](https://github.com/utelle/SQLite3MultipleCiphers/releases/tag/v1.3.9)
30
30
 
31
31
  ## Help this project stay strong! 💪
32
32
 
package/deps/setup.ps1 CHANGED
@@ -2,7 +2,7 @@
2
2
  $ErrorActionPreference = "Stop"
3
3
 
4
4
  # SQLite Info
5
- $SQLITEMC_VER = "v1.3.8"
5
+ $SQLITEMC_VER = "v1.3.9"
6
6
  $API_URL = "https://api.github.com/repos/utelle/SQLite3MultipleCiphers/releases/tags/" + $SQLITEMC_VER
7
7
 
8
8
  # Paths
@@ -92,7 +92,7 @@ extern SQLITE_API LPWSTR sqlite3_win32_utf8_to_unicode(const char*);
92
92
  /*** Begin of #include "sqlite3patched.c" ***/
93
93
  /******************************************************************************
94
94
  ** This file is an amalgamation of many separate C source files from SQLite
95
- ** version 3.38.0. By combining all the individual C code files into this
95
+ ** version 3.38.1. By combining all the individual C code files into this
96
96
  ** single large file, the entire code can be compiled as a single translation
97
97
  ** unit. This allows many compilers to do optimizations that would not be
98
98
  ** possible if the files were compiled separately. Performance improvements
@@ -544,9 +544,9 @@ extern "C" {
544
544
  ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
545
545
  ** [sqlite_version()] and [sqlite_source_id()].
546
546
  */
547
- #define SQLITE_VERSION "3.38.0"
548
- #define SQLITE_VERSION_NUMBER 3038000
549
- #define SQLITE_SOURCE_ID "2022-02-22 18:58:40 40fa792d359f84c3b9e9d6623743e1a59826274e221df1bde8f47086968a1bab"
547
+ #define SQLITE_VERSION "3.38.1"
548
+ #define SQLITE_VERSION_NUMBER 3038001
549
+ #define SQLITE_SOURCE_ID "2022-03-12 13:37:29 38c210fdd258658321c85ec9c01a072fda3ada94540e3239d29b34dc547a8cbc"
550
550
 
551
551
  /*
552
552
  ** CAPI3REF: Run-Time Library Version Numbers
@@ -5377,6 +5377,10 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
5377
5377
  ** even empty strings, are always zero-terminated. ^The return
5378
5378
  ** value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer.
5379
5379
  **
5380
+ ** ^Strings returned by sqlite3_column_text16() always have the endianness
5381
+ ** which is native to the platform, regardless of the text encoding set
5382
+ ** for the database.
5383
+ **
5380
5384
  ** <b>Warning:</b> ^The object returned by [sqlite3_column_value()] is an
5381
5385
  ** [unprotected sqlite3_value] object. In a multithreaded environment,
5382
5386
  ** an unprotected sqlite3_value object may only be used safely with
@@ -5390,7 +5394,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
5390
5394
  ** [application-defined SQL functions] or [virtual tables], not within
5391
5395
  ** top-level application code.
5392
5396
  **
5393
- ** The these routines may attempt to convert the datatype of the result.
5397
+ ** These routines may attempt to convert the datatype of the result.
5394
5398
  ** ^For example, if the internal representation is FLOAT and a text result
5395
5399
  ** is requested, [sqlite3_snprintf()] is used internally to perform the
5396
5400
  ** conversion automatically. ^(The following table details the conversions
@@ -5415,7 +5419,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
5415
5419
  ** <tr><td> TEXT <td> BLOB <td> No change
5416
5420
  ** <tr><td> BLOB <td> INTEGER <td> [CAST] to INTEGER
5417
5421
  ** <tr><td> BLOB <td> FLOAT <td> [CAST] to REAL
5418
- ** <tr><td> BLOB <td> TEXT <td> Add a zero terminator if needed
5422
+ ** <tr><td> BLOB <td> TEXT <td> [CAST] to TEXT, ensure zero terminator
5419
5423
  ** </table>
5420
5424
  ** </blockquote>)^
5421
5425
  **
@@ -10165,7 +10169,7 @@ SQLITE_API int sqlite3_vtab_in_next(sqlite3_value *pVal, sqlite3_value **ppOut);
10165
10169
  ** ^When xBestIndex returns, the sqlite3_value object returned by
10166
10170
  ** sqlite3_vtab_rhs_value() is automatically deallocated.
10167
10171
  **
10168
- ** The "_rhs_" in the name of this routine is an appreviation for
10172
+ ** The "_rhs_" in the name of this routine is an abbreviation for
10169
10173
  ** "Right-Hand Side".
10170
10174
  */
10171
10175
  SQLITE_API int sqlite3_vtab_rhs_value(sqlite3_index_info*, int, sqlite3_value **ppVal);
@@ -20463,7 +20467,12 @@ SQLITE_PRIVATE int sqlite3VtabCallCreate(sqlite3*, int, const char *, char **);
20463
20467
  SQLITE_PRIVATE int sqlite3VtabCallConnect(Parse*, Table*);
20464
20468
  SQLITE_PRIVATE int sqlite3VtabCallDestroy(sqlite3*, int, const char *);
20465
20469
  SQLITE_PRIVATE int sqlite3VtabBegin(sqlite3 *, VTable *);
20470
+
20466
20471
  SQLITE_PRIVATE FuncDef *sqlite3VtabOverloadFunction(sqlite3 *,FuncDef*, int nArg, Expr*);
20472
+ #if (defined(SQLITE_ENABLE_DBPAGE_VTAB) || defined(SQLITE_TEST)) \
20473
+ && !defined(SQLITE_OMIT_VIRTUALTABLE)
20474
+ SQLITE_PRIVATE void sqlite3VtabWriteAll(sqlite3_index_info*);
20475
+ #endif
20467
20476
  SQLITE_PRIVATE sqlite3_int64 sqlite3StmtCurrentTime(sqlite3_context*);
20468
20477
  SQLITE_PRIVATE int sqlite3VdbeParameterIndex(Vdbe*, const char*, int);
20469
20478
  SQLITE_PRIVATE int sqlite3TransferBindings(sqlite3_stmt *, sqlite3_stmt *);
@@ -23753,7 +23762,7 @@ static int toLocaltime(
23753
23762
  p->D = sLocal.tm_mday;
23754
23763
  p->h = sLocal.tm_hour;
23755
23764
  p->m = sLocal.tm_min;
23756
- p->s = sLocal.tm_sec;
23765
+ p->s = sLocal.tm_sec + (p->iJD%1000)*0.001;
23757
23766
  p->validYMD = 1;
23758
23767
  p->validHMS = 1;
23759
23768
  p->validJD = 0;
@@ -51006,7 +51015,8 @@ SQLITE_PRIVATE void sqlite3PcacheDrop(PgHdr *p){
51006
51015
  ** make it so.
51007
51016
  */
51008
51017
  SQLITE_PRIVATE void sqlite3PcacheMakeDirty(PgHdr *p){
51009
- assert( p->nRef>0 );
51018
+ assert( p->nRef>0 || p->pCache->bPurgeable==0 );
51019
+ testcase( p->nRef==0 );
51010
51020
  assert( sqlite3PcachePageSanity(p) );
51011
51021
  if( p->flags & (PGHDR_CLEAN|PGHDR_DONT_WRITE) ){ /*OPTIMIZATION-IF-FALSE*/
51012
51022
  p->flags &= ~PGHDR_DONT_WRITE;
@@ -56138,6 +56148,9 @@ static int pager_playback(Pager *pPager, int isHot){
56138
56148
  goto end_playback;
56139
56149
  }
56140
56150
  pPager->dbSize = mxPg;
56151
+ if( pPager->mxPgno<mxPg ){
56152
+ pPager->mxPgno = mxPg;
56153
+ }
56141
56154
  }
56142
56155
 
56143
56156
  /* Copy original pages out of the journal and back into the
@@ -65497,7 +65510,9 @@ struct MemPage {
65497
65510
  u8 *apOvfl[4]; /* Pointers to the body of overflow cells */
65498
65511
  BtShared *pBt; /* Pointer to BtShared that this page is part of */
65499
65512
  u8 *aData; /* Pointer to disk image of the page data */
65500
- u8 *aDataEnd; /* One byte past the end of usable data */
65513
+ u8 *aDataEnd; /* One byte past the end of the entire page - not just
65514
+ ** the usable space, the entire page. Used to prevent
65515
+ ** corruption-induced of buffer overflow. */
65501
65516
  u8 *aCellIdx; /* The cell index area */
65502
65517
  u8 *aDataOfst; /* Same as aData for leaves. aData+4 for interior */
65503
65518
  DbPage *pDbPage; /* Pager page handle */
@@ -68282,7 +68297,7 @@ static int btreeInitPage(MemPage *pPage){
68282
68297
  pPage->nOverflow = 0;
68283
68298
  pPage->cellOffset = pPage->hdrOffset + 8 + pPage->childPtrSize;
68284
68299
  pPage->aCellIdx = data + pPage->childPtrSize + 8;
68285
- pPage->aDataEnd = pPage->aData + pBt->usableSize;
68300
+ pPage->aDataEnd = pPage->aData + pBt->pageSize;
68286
68301
  pPage->aDataOfst = pPage->aData + pPage->childPtrSize;
68287
68302
  /* EVIDENCE-OF: R-37002-32774 The two-byte integer at offset 3 gives the
68288
68303
  ** number of cells on the page. */
@@ -68317,7 +68332,7 @@ static void zeroPage(MemPage *pPage, int flags){
68317
68332
  u8 hdr = pPage->hdrOffset;
68318
68333
  u16 first;
68319
68334
 
68320
- assert( sqlite3PagerPagenumber(pPage->pDbPage)==pPage->pgno );
68335
+ assert( sqlite3PagerPagenumber(pPage->pDbPage)==pPage->pgno || CORRUPT_DB );
68321
68336
  assert( sqlite3PagerGetExtra(pPage->pDbPage) == (void*)pPage );
68322
68337
  assert( sqlite3PagerGetData(pPage->pDbPage) == data );
68323
68338
  assert( sqlite3PagerIswriteable(pPage->pDbPage) );
@@ -68333,7 +68348,7 @@ static void zeroPage(MemPage *pPage, int flags){
68333
68348
  pPage->nFree = (u16)(pBt->usableSize - first);
68334
68349
  decodeFlags(pPage, flags);
68335
68350
  pPage->cellOffset = first;
68336
- pPage->aDataEnd = &data[pBt->usableSize];
68351
+ pPage->aDataEnd = &data[pBt->pageSize];
68337
68352
  pPage->aCellIdx = &data[first];
68338
68353
  pPage->aDataOfst = &data[pPage->childPtrSize];
68339
68354
  pPage->nOverflow = 0;
@@ -68459,7 +68474,7 @@ static int getAndInitPage(
68459
68474
  goto getAndInitPage_error2;
68460
68475
  }
68461
68476
  }
68462
- assert( (*ppPage)->pgno==pgno );
68477
+ assert( (*ppPage)->pgno==pgno || CORRUPT_DB );
68463
68478
  assert( (*ppPage)->aData==sqlite3PagerGetData(pDbPage) );
68464
68479
 
68465
68480
  /* If obtaining a child page for a cursor, we must verify that the page is
@@ -71546,7 +71561,7 @@ static int moveToRoot(BtCursor *pCur){
71546
71561
  pCur->curIntKey = pCur->pPage->intKey;
71547
71562
  }
71548
71563
  pRoot = pCur->pPage;
71549
- assert( pRoot->pgno==pCur->pgnoRoot );
71564
+ assert( pRoot->pgno==pCur->pgnoRoot || CORRUPT_DB );
71550
71565
 
71551
71566
  /* If pCur->pKeyInfo is not NULL, then the caller that opened this cursor
71552
71567
  ** expected to open it on an index b-tree. Otherwise, if pKeyInfo is
@@ -75214,7 +75229,7 @@ SQLITE_PRIVATE int sqlite3BtreeInsert(
75214
75229
  assert( pPage->intKey || pX->nKey>=0 || (flags & BTREE_PREFORMAT) );
75215
75230
  assert( pPage->leaf || !pPage->intKey );
75216
75231
  if( pPage->nFree<0 ){
75217
- if( NEVER(pCur->eState>CURSOR_INVALID) ){
75232
+ if( pCur->eState>CURSOR_INVALID ){
75218
75233
  rc = SQLITE_CORRUPT_BKPT;
75219
75234
  }else{
75220
75235
  rc = btreeComputeFreeSpace(pPage);
@@ -78835,6 +78850,7 @@ SQLITE_PRIVATE void sqlite3VdbeMemSetPointer(
78835
78850
  void (*xDestructor)(void*)
78836
78851
  ){
78837
78852
  assert( pMem->flags==MEM_Null );
78853
+ vdbeMemClear(pMem);
78838
78854
  pMem->u.zPType = zPType ? zPType : "";
78839
78855
  pMem->z = pPtr;
78840
78856
  pMem->flags = MEM_Null|MEM_Dyn|MEM_Subtype|MEM_Term;
@@ -90089,10 +90105,18 @@ case OP_Offset: { /* out3 */
90089
90105
  assert( pOp->p1>=0 && pOp->p1<p->nCursor );
90090
90106
  pC = p->apCsr[pOp->p1];
90091
90107
  pOut = &p->aMem[pOp->p3];
90092
- if( NEVER(pC==0) || pC->eCurType!=CURTYPE_BTREE ){
90108
+ if( pC==0 || pC->eCurType!=CURTYPE_BTREE ){
90093
90109
  sqlite3VdbeMemSetNull(pOut);
90094
90110
  }else{
90095
- sqlite3VdbeMemSetInt64(pOut, sqlite3BtreeOffset(pC->uc.pCursor));
90111
+ if( pC->deferredMoveto ){
90112
+ rc = sqlite3VdbeFinishMoveto(pC);
90113
+ if( rc ) goto abort_due_to_error;
90114
+ }
90115
+ if( sqlite3BtreeEof(pC->uc.pCursor) ){
90116
+ sqlite3VdbeMemSetNull(pOut);
90117
+ }else{
90118
+ sqlite3VdbeMemSetInt64(pOut, sqlite3BtreeOffset(pC->uc.pCursor));
90119
+ }
90096
90120
  }
90097
90121
  break;
90098
90122
  }
@@ -93171,6 +93195,10 @@ case OP_Rowid: { /* out2 */
93171
93195
  ** Move the cursor P1 to a null row. Any OP_Column operations
93172
93196
  ** that occur while the cursor is on the null row will always
93173
93197
  ** write a NULL.
93198
+ **
93199
+ ** Or, if P1 is a Pseudo-Cursor (a cursor opened using OP_OpenPseudo)
93200
+ ** just reset the cache for that cursor. This causes the row of
93201
+ ** content held by the pseudo-cursor to be reparsed.
93174
93202
  */
93175
93203
  case OP_NullRow: {
93176
93204
  VdbeCursor *pC;
@@ -110017,19 +110045,21 @@ static int renameParseSql(
110017
110045
  ){
110018
110046
  int rc;
110019
110047
 
110020
- db->init.iDb = bTemp ? 1 : sqlite3FindDbName(db, zDb);
110021
-
110022
- /* Parse the SQL statement passed as the first argument. If no error
110023
- ** occurs and the parse does not result in a new table, index or
110024
- ** trigger object, the database must be corrupt. */
110025
110048
  sqlite3ParseObjectInit(p, db);
110049
+ if( zSql==0 ){
110050
+ return SQLITE_NOMEM;
110051
+ }
110052
+ if( sqlite3StrNICmp(zSql,"CREATE ",7)!=0 ){
110053
+ return SQLITE_CORRUPT_BKPT;
110054
+ }
110055
+ db->init.iDb = bTemp ? 1 : sqlite3FindDbName(db, zDb);
110026
110056
  p->eParseMode = PARSE_MODE_RENAME;
110027
110057
  p->db = db;
110028
110058
  p->nQueryLoop = 1;
110029
- rc = zSql ? sqlite3RunParser(p, zSql) : SQLITE_NOMEM;
110059
+ rc = sqlite3RunParser(p, zSql);
110030
110060
  if( db->mallocFailed ) rc = SQLITE_NOMEM;
110031
110061
  if( rc==SQLITE_OK
110032
- && p->pNewTable==0 && p->pNewIndex==0 && p->pNewTrigger==0
110062
+ && NEVER(p->pNewTable==0 && p->pNewIndex==0 && p->pNewTrigger==0)
110033
110063
  ){
110034
110064
  rc = SQLITE_CORRUPT_BKPT;
110035
110065
  }
@@ -116783,6 +116813,11 @@ SQLITE_PRIVATE void sqlite3EndTable(
116783
116813
  int addrInsLoop; /* Top of the loop for inserting rows */
116784
116814
  Table *pSelTab; /* A table that describes the SELECT results */
116785
116815
 
116816
+ if( IN_SPECIAL_PARSE ){
116817
+ pParse->rc = SQLITE_ERROR;
116818
+ pParse->nErr++;
116819
+ return;
116820
+ }
116786
116821
  regYield = ++pParse->nMem;
116787
116822
  regRec = ++pParse->nMem;
116788
116823
  regRowid = ++pParse->nMem;
@@ -123362,8 +123397,8 @@ SQLITE_PRIVATE void sqlite3RegisterBuiltinFunctions(void){
123362
123397
  INLINE_FUNC(likelihood, 2, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY),
123363
123398
  INLINE_FUNC(likely, 1, INLINEFUNC_unlikely, SQLITE_FUNC_UNLIKELY),
123364
123399
  #ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC
123365
- FUNCTION2(sqlite_offset, 1, 0, 0, noopFunc, SQLITE_FUNC_OFFSET|
123366
- SQLITE_FUNC_TYPEOF),
123400
+ {1, SQLITE_FUNC_BUILTIN|SQLITE_UTF8|SQLITE_FUNC_OFFSET|SQLITE_FUNC_TYPEOF,
123401
+ 0, 0, noopFunc, 0, 0, 0, "sqlite_offset", {0} },
123367
123402
  #endif
123368
123403
  FUNCTION(ltrim, 1, 1, 0, trimFunc ),
123369
123404
  FUNCTION(ltrim, 2, 1, 0, trimFunc ),
@@ -125781,7 +125816,11 @@ SQLITE_PRIVATE void sqlite3Insert(
125781
125816
  **
125782
125817
  ** This is the 2nd template.
125783
125818
  */
125784
- if( pColumn==0 && xferOptimization(pParse, pTab, pSelect, onError, iDb) ){
125819
+ if( pColumn==0
125820
+ && pSelect!=0
125821
+ && pTrigger==0
125822
+ && xferOptimization(pParse, pTab, pSelect, onError, iDb)
125823
+ ){
125785
125824
  assert( !pTrigger );
125786
125825
  assert( pList==0 );
125787
125826
  goto insert_end;
@@ -127752,18 +127791,13 @@ static int xferOptimization(
127752
127791
  int destHasUniqueIdx = 0; /* True if pDest has a UNIQUE index */
127753
127792
  int regData, regRowid; /* Registers holding data and rowid */
127754
127793
 
127755
- if( pSelect==0 ){
127756
- return 0; /* Must be of the form INSERT INTO ... SELECT ... */
127757
- }
127794
+ assert( pSelect!=0 );
127758
127795
  if( pParse->pWith || pSelect->pWith ){
127759
127796
  /* Do not attempt to process this query if there are an WITH clauses
127760
127797
  ** attached to it. Proceeding may generate a false "no such table: xxx"
127761
127798
  ** error if pSelect reads from a CTE named "xxx". */
127762
127799
  return 0;
127763
127800
  }
127764
- if( sqlite3TriggerList(pParse, pDest) ){
127765
- return 0; /* tab1 must not have triggers */
127766
- }
127767
127801
  #ifndef SQLITE_OMIT_VIRTUALTABLE
127768
127802
  if( IsVirtual(pDest) ){
127769
127803
  return 0; /* tab1 must not be a virtual table */
@@ -142476,6 +142510,7 @@ static TriggerStep *triggerStepAllocate(
142476
142510
  sqlite3 *db = pParse->db;
142477
142511
  TriggerStep *pTriggerStep;
142478
142512
 
142513
+ if( pParse->nErr ) return 0;
142479
142514
  pTriggerStep = sqlite3DbMallocZero(db, sizeof(TriggerStep) + pName->n + 1);
142480
142515
  if( pTriggerStep ){
142481
142516
  char *z = (char*)&pTriggerStep[1];
@@ -148289,6 +148324,7 @@ static int codeAllEqualityTerms(
148289
148324
  VdbeCoverageIf(v, bRev!=0);
148290
148325
  VdbeComment((v, "begin skip-scan on %s", pIdx->zName));
148291
148326
  j = sqlite3VdbeAddOp0(v, OP_Goto);
148327
+ assert( pLevel->addrSkip==0 );
148292
148328
  pLevel->addrSkip = sqlite3VdbeAddOp4Int(v, (bRev?OP_SeekLT:OP_SeekGT),
148293
148329
  iIdxCur, 0, regBase, nSkip);
148294
148330
  VdbeCoverageIf(v, bRev==0);
@@ -148886,6 +148922,7 @@ static SQLITE_NOINLINE void filterPullDown(
148886
148922
  WhereLevel *pLevel = &pWInfo->a[iLevel];
148887
148923
  WhereLoop *pLoop = pLevel->pWLoop;
148888
148924
  if( pLevel->regFilter==0 ) continue;
148925
+ if( pLevel->pWLoop->nSkip ) continue;
148889
148926
  /* ,--- Because sqlite3ConstructBloomFilter() has will not have set
148890
148927
  ** vvvvv--' pLevel->regFilter if this were true. */
148891
148928
  if( NEVER(pLoop->prereq & notReady) ) continue;
@@ -149020,7 +149057,6 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
149020
149057
  int iReg; /* P3 Value for OP_VFilter */
149021
149058
  int addrNotFound;
149022
149059
  int nConstraint = pLoop->nLTerm;
149023
- int iIn; /* Counter for IN constraints */
149024
149060
 
149025
149061
  iReg = sqlite3GetTempRange(pParse, nConstraint+2);
149026
149062
  addrNotFound = pLevel->addrBrk;
@@ -149066,50 +149102,54 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
149066
149102
  pLevel->op = pWInfo->eOnePass ? OP_Noop : OP_VNext;
149067
149103
  pLevel->p2 = sqlite3VdbeCurrentAddr(v);
149068
149104
  assert( (pLoop->wsFlags & WHERE_MULTI_OR)==0 );
149069
- if( pLoop->wsFlags & WHERE_IN_ABLE ){
149070
- iIn = pLevel->u.in.nIn;
149071
- }else{
149072
- iIn = 0;
149073
- }
149074
- for(j=nConstraint-1; j>=0; j--){
149075
- int bIn; /* True to generate byte code to loop over RHS IN values */
149105
+
149106
+ for(j=0; j<nConstraint; j++){
149076
149107
  pTerm = pLoop->aLTerm[j];
149108
+ if( j<16 && (pLoop->u.vtab.omitMask>>j)&1 ){
149109
+ disableTerm(pLevel, pTerm);
149110
+ continue;
149111
+ }
149077
149112
  if( (pTerm->eOperator & WO_IN)!=0
149078
149113
  && (SMASKBIT32(j) & pLoop->u.vtab.mHandleIn)==0
149114
+ && !db->mallocFailed
149079
149115
  ){
149080
- bIn = 1;
149081
- }else{
149082
- bIn = 0;
149083
- }
149084
- if( bIn ) iIn--;
149085
- if( j<16 && (pLoop->u.vtab.omitMask>>j)&1 ){
149086
- disableTerm(pLevel, pTerm);
149087
- }else if( bIn && sqlite3ExprVectorSize(pTerm->pExpr->pLeft)==1 ){
149088
149116
  Expr *pCompare; /* The comparison operator */
149089
149117
  Expr *pRight; /* RHS of the comparison */
149090
149118
  VdbeOp *pOp; /* Opcode to access the value of the IN constraint */
149119
+ int iIn; /* IN loop corresponding to the j-th constraint */
149091
149120
 
149092
149121
  /* Reload the constraint value into reg[iReg+j+2]. The same value
149093
149122
  ** was loaded into the same register prior to the OP_VFilter, but
149094
149123
  ** the xFilter implementation might have changed the datatype or
149095
- ** encoding of the value in the register, so it *must* be reloaded. */
149096
- assert( pLevel->u.in.aInLoop!=0 || db->mallocFailed );
149097
- if( !db->mallocFailed ){
149098
- assert( iIn>=0 && iIn<pLevel->u.in.nIn );
149124
+ ** encoding of the value in the register, so it *must* be reloaded.
149125
+ */
149126
+ for(iIn=0; ALWAYS(iIn<pLevel->u.in.nIn); iIn++){
149099
149127
  pOp = sqlite3VdbeGetOp(v, pLevel->u.in.aInLoop[iIn].addrInTop);
149100
- assert( pOp->opcode==OP_Column || pOp->opcode==OP_Rowid );
149101
- assert( pOp->opcode!=OP_Column || pOp->p3==iReg+j+2 );
149102
- assert( pOp->opcode!=OP_Rowid || pOp->p2==iReg+j+2 );
149103
- testcase( pOp->opcode==OP_Rowid );
149104
- sqlite3VdbeAddOp3(v, pOp->opcode, pOp->p1, pOp->p2, pOp->p3);
149128
+ if( (pOp->opcode==OP_Column && pOp->p3==iReg+j+2)
149129
+ || (pOp->opcode==OP_Rowid && pOp->p2==iReg+j+2)
149130
+ ){
149131
+ testcase( pOp->opcode==OP_Rowid );
149132
+ sqlite3VdbeAddOp3(v, pOp->opcode, pOp->p1, pOp->p2, pOp->p3);
149133
+ break;
149134
+ }
149105
149135
  }
149106
149136
 
149107
149137
  /* Generate code that will continue to the next row if
149108
- ** the IN constraint is not satisfied */
149138
+ ** the IN constraint is not satisfied
149139
+ */
149109
149140
  pCompare = sqlite3PExpr(pParse, TK_EQ, 0, 0);
149110
- assert( pCompare!=0 || db->mallocFailed );
149111
- if( pCompare ){
149112
- pCompare->pLeft = pTerm->pExpr->pLeft;
149141
+ if( !db->mallocFailed ){
149142
+ int iFld = pTerm->u.x.iField;
149143
+ Expr *pLeft = pTerm->pExpr->pLeft;
149144
+ assert( pLeft!=0 );
149145
+ if( iFld>0 ){
149146
+ assert( pLeft->op==TK_VECTOR );
149147
+ assert( ExprUseXList(pLeft) );
149148
+ assert( iFld<=pLeft->x.pList->nExpr );
149149
+ pCompare->pLeft = pLeft->x.pList->a[iFld-1].pExpr;
149150
+ }else{
149151
+ pCompare->pLeft = pLeft;
149152
+ }
149113
149153
  pCompare->pRight = pRight = sqlite3Expr(db, TK_REGISTER, 0);
149114
149154
  if( pRight ){
149115
149155
  pRight->iTable = iReg+j+2;
@@ -149118,11 +149158,11 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
149118
149158
  );
149119
149159
  }
149120
149160
  pCompare->pLeft = 0;
149121
- sqlite3ExprDelete(db, pCompare);
149122
149161
  }
149162
+ sqlite3ExprDelete(db, pCompare);
149123
149163
  }
149124
149164
  }
149125
- assert( iIn==0 || db->mallocFailed );
149165
+
149126
149166
  /* These registers need to be preserved in case there is an IN operator
149127
149167
  ** loop. So we could deallocate the registers here (and potentially
149128
149168
  ** reuse them later) if (pLoop->wsFlags & WHERE_IN_ABLE)==0. But it seems
@@ -149832,6 +149872,14 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
149832
149872
  ** the initialization of the right-hand operand of the vector comparison
149833
149873
  ** might not occur, or might occur only in an OR branch that is not
149834
149874
  ** taken. dbsqlfuzz 80a9fade844b4fb43564efc972bcb2c68270f5d1.
149875
+ **
149876
+ ** 2022-03-03: Do not push down expressions that involve subqueries.
149877
+ ** The subquery might get coded as a subroutine. Any table-references
149878
+ ** in the subquery might be resolved to index-references for the index on
149879
+ ** the OR branch in which the subroutine is coded. But if the subroutine
149880
+ ** is invoked from a different OR branch that uses a different index, such
149881
+ ** index-references will not work. tag-20220303a
149882
+ ** https://sqlite.org/forum/forumpost/36937b197273d403
149835
149883
  */
149836
149884
  if( pWC->nTerm>1 ){
149837
149885
  int iTerm;
@@ -149845,7 +149893,7 @@ SQLITE_PRIVATE Bitmask sqlite3WhereCodeOneLoopStart(
149845
149893
  continue;
149846
149894
  }
149847
149895
  if( (pWC->a[iTerm].eOperator & WO_ALL)==0 ) continue;
149848
- testcase( pWC->a[iTerm].wtFlags & TERM_ORINFO );
149896
+ if( ExprHasProperty(pExpr, EP_Subquery) ) continue; /* tag-20220303a */
149849
149897
  pExpr = sqlite3ExprDup(db, pExpr, 0);
149850
149898
  pAndExpr = sqlite3ExprAnd(pParse, pAndExpr, pExpr);
149851
149899
  }
@@ -153122,7 +153170,10 @@ static SQLITE_NOINLINE void sqlite3ConstructBloomFilter(
153122
153170
  pLoop->wsFlags &= ~WHERE_BLOOMFILTER;
153123
153171
  if( OptimizationDisabled(pParse->db, SQLITE_BloomPulldown) ) break;
153124
153172
  while( ++iLevel < pWInfo->nLevel ){
153173
+ const SrcItem *pTabItem;
153125
153174
  pLevel = &pWInfo->a[iLevel];
153175
+ pTabItem = &pWInfo->pTabList->a[pLevel->iFrom];
153176
+ if( pTabItem->fg.jointype & JT_LEFT ) continue;
153126
153177
  pLoop = pLevel->pWLoop;
153127
153178
  if( NEVER(pLoop==0) ) continue;
153128
153179
  if( pLoop->prereq & notReady ) continue;
@@ -155805,7 +155856,6 @@ SQLITE_API int sqlite3_vtab_rhs_value(
155805
155856
  return rc;
155806
155857
  }
155807
155858
 
155808
-
155809
155859
  /*
155810
155860
  ** Return true if ORDER BY clause may be handled as DISTINCT.
155811
155861
  */
@@ -155817,6 +155867,22 @@ SQLITE_API int sqlite3_vtab_distinct(sqlite3_index_info *pIdxInfo){
155817
155867
  return pHidden->eDistinct;
155818
155868
  }
155819
155869
 
155870
+ #if (defined(SQLITE_ENABLE_DBPAGE_VTAB) || defined(SQLITE_TEST)) \
155871
+ && !defined(SQLITE_OMIT_VIRTUALTABLE)
155872
+ /*
155873
+ ** Cause the prepared statement that is associated with a call to
155874
+ ** xBestIndex to open write transactions on all attached schemas.
155875
+ ** This is used by the (built-in) sqlite_dbpage virtual table.
155876
+ */
155877
+ SQLITE_PRIVATE void sqlite3VtabWriteAll(sqlite3_index_info *pIdxInfo){
155878
+ HiddenIndexInfo *pHidden = (HiddenIndexInfo*)&pIdxInfo[1];
155879
+ Parse *pParse = pHidden->pParse;
155880
+ int nDb = pParse->db->nDb;
155881
+ int i;
155882
+ for(i=0; i<nDb; i++) sqlite3BeginWriteOperation(pParse, 0, i);
155883
+ }
155884
+ #endif
155885
+
155820
155886
  /*
155821
155887
  ** Add all WhereLoop objects for a table of the join identified by
155822
155888
  ** pBuilder->pNew->iTab. That table is guaranteed to be a virtual table.
@@ -158176,6 +158242,10 @@ SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo *pWInfo){
158176
158242
  Index *pPk = sqlite3PrimaryKeyIndex(pTab);
158177
158243
  x = pPk->aiColumn[x];
158178
158244
  assert( x>=0 );
158245
+ #ifdef SQLITE_ENABLE_OFFSET_SQL_FUNC
158246
+ }else if( pOp->opcode==OP_Offset ){
158247
+ /* Do not need to translate the column number */
158248
+ #endif
158179
158249
  }else{
158180
158250
  testcase( x!=sqlite3StorageColumnToTable(pTab,x) );
158181
158251
  x = sqlite3StorageColumnToTable(pTab,x);
@@ -159175,7 +159245,11 @@ static int disallowAggregatesInOrderByCb(Walker *pWalker, Expr *pExpr){
159175
159245
  */
159176
159246
  SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){
159177
159247
  int rc = SQLITE_OK;
159178
- if( p->pWin && p->pPrior==0 && ALWAYS((p->selFlags & SF_WinRewrite)==0) ){
159248
+ if( p->pWin
159249
+ && p->pPrior==0
159250
+ && ALWAYS((p->selFlags & SF_WinRewrite)==0)
159251
+ && ALWAYS(!IN_RENAME_OBJECT)
159252
+ ){
159179
159253
  Vdbe *v = sqlite3GetVdbe(pParse);
159180
159254
  sqlite3 *db = pParse->db;
159181
159255
  Select *pSub = 0; /* The subquery */
@@ -159250,6 +159324,7 @@ SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){
159250
159324
  for(pWin=pMWin; pWin; pWin=pWin->pNextWin){
159251
159325
  ExprList *pArgs;
159252
159326
  assert( ExprUseXList(pWin->pOwner) );
159327
+ assert( pWin->pFunc!=0 );
159253
159328
  pArgs = pWin->pOwner->x.pList;
159254
159329
  if( pWin->pFunc->funcFlags & SQLITE_FUNC_SUBTYPE ){
159255
159330
  selectWindowRewriteEList(pParse, pMWin, pSrc, pArgs, pTab, &pSublist);
@@ -210066,6 +210141,7 @@ static int dbpageBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){
210066
210141
  ){
210067
210142
  pIdxInfo->orderByConsumed = 1;
210068
210143
  }
210144
+ sqlite3VtabWriteAll(pIdxInfo);
210069
210145
  return SQLITE_OK;
210070
210146
  }
210071
210147
 
@@ -232420,7 +232496,7 @@ static int fts5SorterNext(Fts5Cursor *pCsr){
232420
232496
  rc = sqlite3_step(pSorter->pStmt);
232421
232497
  if( rc==SQLITE_DONE ){
232422
232498
  rc = SQLITE_OK;
232423
- CsrFlagSet(pCsr, FTS5CSR_EOF);
232499
+ CsrFlagSet(pCsr, FTS5CSR_EOF|FTS5CSR_REQUIRE_CONTENT);
232424
232500
  }else if( rc==SQLITE_ROW ){
232425
232501
  const u8 *a;
232426
232502
  const u8 *aBlob;
@@ -234409,7 +234485,7 @@ static void fts5SourceIdFunc(
234409
234485
  ){
234410
234486
  assert( nArg==0 );
234411
234487
  UNUSED_PARAM2(nArg, apUnused);
234412
- sqlite3_result_text(pCtx, "fts5: 2022-02-22 18:58:40 40fa792d359f84c3b9e9d6623743e1a59826274e221df1bde8f47086968a1bab", -1, SQLITE_TRANSIENT);
234488
+ sqlite3_result_text(pCtx, "fts5: 2022-03-12 13:37:29 38c210fdd258658321c85ec9c01a072fda3ada94540e3239d29b34dc547a8cbc", -1, SQLITE_TRANSIENT);
234413
234489
  }
234414
234490
 
234415
234491
  /*
@@ -239527,7 +239603,7 @@ SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; }
239527
239603
  ** Purpose: SQLite3 Multiple Ciphers version numbers
239528
239604
  ** Author: Ulrich Telle
239529
239605
  ** Created: 2020-08-05
239530
- ** Copyright: (c) 2020-2021 Ulrich Telle
239606
+ ** Copyright: (c) 2020-2022 Ulrich Telle
239531
239607
  ** License: MIT
239532
239608
  */
239533
239609
 
@@ -239538,9 +239614,9 @@ SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; }
239538
239614
 
239539
239615
  #define SQLITE3MC_VERSION_MAJOR 1
239540
239616
  #define SQLITE3MC_VERSION_MINOR 3
239541
- #define SQLITE3MC_VERSION_RELEASE 8
239617
+ #define SQLITE3MC_VERSION_RELEASE 9
239542
239618
  #define SQLITE3MC_VERSION_SUBRELEASE 0
239543
- #define SQLITE3MC_VERSION_STRING "SQLite3 Multiple Ciphers 1.3.8"
239619
+ #define SQLITE3MC_VERSION_STRING "SQLite3 Multiple Ciphers 1.3.9"
239544
239620
 
239545
239621
  #endif /* SQLITE3MC_VERSION_H_ */
239546
239622
  /*** End of #include "sqlite3mc_version.h" ***/
@@ -239699,9 +239775,9 @@ extern "C" {
239699
239775
  ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
239700
239776
  ** [sqlite_version()] and [sqlite_source_id()].
239701
239777
  */
239702
- #define SQLITE_VERSION "3.38.0"
239703
- #define SQLITE_VERSION_NUMBER 3038000
239704
- #define SQLITE_SOURCE_ID "2022-02-22 18:58:40 40fa792d359f84c3b9e9d6623743e1a59826274e221df1bde8f47086968a1bab"
239778
+ #define SQLITE_VERSION "3.38.1"
239779
+ #define SQLITE_VERSION_NUMBER 3038001
239780
+ #define SQLITE_SOURCE_ID "2022-03-12 13:37:29 38c210fdd258658321c85ec9c01a072fda3ada94540e3239d29b34dc547a8cbc"
239705
239781
 
239706
239782
  /*
239707
239783
  ** CAPI3REF: Run-Time Library Version Numbers
@@ -244532,6 +244608,10 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
244532
244608
  ** even empty strings, are always zero-terminated. ^The return
244533
244609
  ** value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer.
244534
244610
  **
244611
+ ** ^Strings returned by sqlite3_column_text16() always have the endianness
244612
+ ** which is native to the platform, regardless of the text encoding set
244613
+ ** for the database.
244614
+ **
244535
244615
  ** <b>Warning:</b> ^The object returned by [sqlite3_column_value()] is an
244536
244616
  ** [unprotected sqlite3_value] object. In a multithreaded environment,
244537
244617
  ** an unprotected sqlite3_value object may only be used safely with
@@ -244545,7 +244625,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
244545
244625
  ** [application-defined SQL functions] or [virtual tables], not within
244546
244626
  ** top-level application code.
244547
244627
  **
244548
- ** The these routines may attempt to convert the datatype of the result.
244628
+ ** These routines may attempt to convert the datatype of the result.
244549
244629
  ** ^For example, if the internal representation is FLOAT and a text result
244550
244630
  ** is requested, [sqlite3_snprintf()] is used internally to perform the
244551
244631
  ** conversion automatically. ^(The following table details the conversions
@@ -244570,7 +244650,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
244570
244650
  ** <tr><td> TEXT <td> BLOB <td> No change
244571
244651
  ** <tr><td> BLOB <td> INTEGER <td> [CAST] to INTEGER
244572
244652
  ** <tr><td> BLOB <td> FLOAT <td> [CAST] to REAL
244573
- ** <tr><td> BLOB <td> TEXT <td> Add a zero terminator if needed
244653
+ ** <tr><td> BLOB <td> TEXT <td> [CAST] to TEXT, ensure zero terminator
244574
244654
  ** </table>
244575
244655
  ** </blockquote>)^
244576
244656
  **
@@ -249320,7 +249400,7 @@ SQLITE_API int sqlite3_vtab_in_next(sqlite3_value *pVal, sqlite3_value **ppOut);
249320
249400
  ** ^When xBestIndex returns, the sqlite3_value object returned by
249321
249401
  ** sqlite3_vtab_rhs_value() is automatically deallocated.
249322
249402
  **
249323
- ** The "_rhs_" in the name of this routine is an appreviation for
249403
+ ** The "_rhs_" in the name of this routine is an abbreviation for
249324
249404
  ** "Right-Hand Side".
249325
249405
  */
249326
249406
  SQLITE_API int sqlite3_vtab_rhs_value(sqlite3_index_info*, int, sqlite3_value **ppVal);
@@ -262467,7 +262547,7 @@ sqlite3mcBtreeSetPageSize(Btree* p, int pageSize, int nReserve, int iFix)
262467
262547
  ** Change 4: Call sqlite3mcBtreeSetPageSize instead of sqlite3BtreeSetPageSize for main database
262468
262548
  ** (sqlite3mcBtreeSetPageSize allows to reduce the number of reserved bytes)
262469
262549
  **
262470
- ** This code is generated by the script rekeyvacuum.sh from SQLite version 3.38.0 amalgamation.
262550
+ ** This code is generated by the script rekeyvacuum.sh from SQLite version 3.38.1 amalgamation.
262471
262551
  */
262472
262552
  SQLITE_PRIVATE SQLITE_NOINLINE int sqlite3mcRunVacuumForRekey(
262473
262553
  char **pzErrMsg, /* Write error message here */
@@ -20,7 +20,7 @@
20
20
  ** Purpose: SQLite3 Multiple Ciphers version numbers
21
21
  ** Author: Ulrich Telle
22
22
  ** Created: 2020-08-05
23
- ** Copyright: (c) 2020-2021 Ulrich Telle
23
+ ** Copyright: (c) 2020-2022 Ulrich Telle
24
24
  ** License: MIT
25
25
  */
26
26
 
@@ -31,9 +31,9 @@
31
31
 
32
32
  #define SQLITE3MC_VERSION_MAJOR 1
33
33
  #define SQLITE3MC_VERSION_MINOR 3
34
- #define SQLITE3MC_VERSION_RELEASE 8
34
+ #define SQLITE3MC_VERSION_RELEASE 9
35
35
  #define SQLITE3MC_VERSION_SUBRELEASE 0
36
- #define SQLITE3MC_VERSION_STRING "SQLite3 Multiple Ciphers 1.3.8"
36
+ #define SQLITE3MC_VERSION_STRING "SQLite3 Multiple Ciphers 1.3.9"
37
37
 
38
38
  #endif /* SQLITE3MC_VERSION_H_ */
39
39
  /*** End of #include "sqlite3mc_version.h" ***/
@@ -192,9 +192,9 @@ extern "C" {
192
192
  ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
193
193
  ** [sqlite_version()] and [sqlite_source_id()].
194
194
  */
195
- #define SQLITE_VERSION "3.38.0"
196
- #define SQLITE_VERSION_NUMBER 3038000
197
- #define SQLITE_SOURCE_ID "2022-02-22 18:58:40 40fa792d359f84c3b9e9d6623743e1a59826274e221df1bde8f47086968a1bab"
195
+ #define SQLITE_VERSION "3.38.1"
196
+ #define SQLITE_VERSION_NUMBER 3038001
197
+ #define SQLITE_SOURCE_ID "2022-03-12 13:37:29 38c210fdd258658321c85ec9c01a072fda3ada94540e3239d29b34dc547a8cbc"
198
198
 
199
199
  /*
200
200
  ** CAPI3REF: Run-Time Library Version Numbers
@@ -5025,6 +5025,10 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
5025
5025
  ** even empty strings, are always zero-terminated. ^The return
5026
5026
  ** value from sqlite3_column_blob() for a zero-length BLOB is a NULL pointer.
5027
5027
  **
5028
+ ** ^Strings returned by sqlite3_column_text16() always have the endianness
5029
+ ** which is native to the platform, regardless of the text encoding set
5030
+ ** for the database.
5031
+ **
5028
5032
  ** <b>Warning:</b> ^The object returned by [sqlite3_column_value()] is an
5029
5033
  ** [unprotected sqlite3_value] object. In a multithreaded environment,
5030
5034
  ** an unprotected sqlite3_value object may only be used safely with
@@ -5038,7 +5042,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
5038
5042
  ** [application-defined SQL functions] or [virtual tables], not within
5039
5043
  ** top-level application code.
5040
5044
  **
5041
- ** The these routines may attempt to convert the datatype of the result.
5045
+ ** These routines may attempt to convert the datatype of the result.
5042
5046
  ** ^For example, if the internal representation is FLOAT and a text result
5043
5047
  ** is requested, [sqlite3_snprintf()] is used internally to perform the
5044
5048
  ** conversion automatically. ^(The following table details the conversions
@@ -5063,7 +5067,7 @@ SQLITE_API int sqlite3_data_count(sqlite3_stmt *pStmt);
5063
5067
  ** <tr><td> TEXT <td> BLOB <td> No change
5064
5068
  ** <tr><td> BLOB <td> INTEGER <td> [CAST] to INTEGER
5065
5069
  ** <tr><td> BLOB <td> FLOAT <td> [CAST] to REAL
5066
- ** <tr><td> BLOB <td> TEXT <td> Add a zero terminator if needed
5070
+ ** <tr><td> BLOB <td> TEXT <td> [CAST] to TEXT, ensure zero terminator
5067
5071
  ** </table>
5068
5072
  ** </blockquote>)^
5069
5073
  **
@@ -9813,7 +9817,7 @@ SQLITE_API int sqlite3_vtab_in_next(sqlite3_value *pVal, sqlite3_value **ppOut);
9813
9817
  ** ^When xBestIndex returns, the sqlite3_value object returned by
9814
9818
  ** sqlite3_vtab_rhs_value() is automatically deallocated.
9815
9819
  **
9816
- ** The "_rhs_" in the name of this routine is an appreviation for
9820
+ ** The "_rhs_" in the name of this routine is an abbreviation for
9817
9821
  ** "Right-Hand Side".
9818
9822
  */
9819
9823
  SQLITE_API int sqlite3_vtab_rhs_value(sqlite3_index_info*, int, sqlite3_value **ppVal);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "better-sqlite3-multiple-ciphers",
3
- "version": "7.5.1-beta.2",
3
+ "version": "7.5.1-beta.3",
4
4
  "description": "better-sqlite3 with multiple-cipher encryption support",
5
5
  "homepage": "https://github.com/m4heshd/better-sqlite3-multiple-ciphers",
6
6
  "author": "Mahesh Bandara Wijerathna (m4heshd) <m4heshd@gmail.com>",