extralite-bundle 2.3 → 2.4

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.
@@ -1,6 +1,6 @@
1
1
  /******************************************************************************
2
2
  ** This file is an amalgamation of many separate C source files from SQLite
3
- ** version 3.44.0. By combining all the individual C code files into this
3
+ ** version 3.44.2. By combining all the individual C code files into this
4
4
  ** single large file, the entire code can be compiled as a single translation
5
5
  ** unit. This allows many compilers to do optimizations that would not be
6
6
  ** possible if the files were compiled separately. Performance improvements
@@ -18,7 +18,7 @@
18
18
  ** separate file. This file contains only code for the core SQLite library.
19
19
  **
20
20
  ** The content in this amalgamation comes from Fossil check-in
21
- ** 17129ba1ff7f0daf37100ee82d507aef7827.
21
+ ** ebead0e7230cd33bcec9f95d2183069565b9.
22
22
  */
23
23
  #define SQLITE_CORE 1
24
24
  #define SQLITE_AMALGAMATION 1
@@ -459,9 +459,9 @@ extern "C" {
459
459
  ** [sqlite3_libversion_number()], [sqlite3_sourceid()],
460
460
  ** [sqlite_version()] and [sqlite_source_id()].
461
461
  */
462
- #define SQLITE_VERSION "3.44.0"
463
- #define SQLITE_VERSION_NUMBER 3044000
464
- #define SQLITE_SOURCE_ID "2023-11-01 11:23:50 17129ba1ff7f0daf37100ee82d507aef7827cf38de1866e2633096ae6ad81301"
462
+ #define SQLITE_VERSION "3.44.2"
463
+ #define SQLITE_VERSION_NUMBER 3044002
464
+ #define SQLITE_SOURCE_ID "2023-11-24 11:41:44 ebead0e7230cd33bcec9f95d2183069565b9e709bf745c9b5db65cc0cbf92c0f"
465
465
 
466
466
  /*
467
467
  ** CAPI3REF: Run-Time Library Version Numbers
@@ -5886,13 +5886,27 @@ SQLITE_API int sqlite3_create_window_function(
5886
5886
  ** </dd>
5887
5887
  **
5888
5888
  ** [[SQLITE_SUBTYPE]] <dt>SQLITE_SUBTYPE</dt><dd>
5889
- ** The SQLITE_SUBTYPE flag indicates to SQLite that a function may call
5889
+ ** The SQLITE_SUBTYPE flag indicates to SQLite that a function might call
5890
5890
  ** [sqlite3_value_subtype()] to inspect the sub-types of its arguments.
5891
- ** Specifying this flag makes no difference for scalar or aggregate user
5892
- ** functions. However, if it is not specified for a user-defined window
5893
- ** function, then any sub-types belonging to arguments passed to the window
5894
- ** function may be discarded before the window function is called (i.e.
5895
- ** sqlite3_value_subtype() will always return 0).
5891
+ ** This flag instructs SQLite to omit some corner-case optimizations that
5892
+ ** might disrupt the operation of the [sqlite3_value_subtype()] function,
5893
+ ** causing it to return zero rather than the correct subtype().
5894
+ ** SQL functions that invokes [sqlite3_value_subtype()] should have this
5895
+ ** property. If the SQLITE_SUBTYPE property is omitted, then the return
5896
+ ** value from [sqlite3_value_subtype()] might sometimes be zero even though
5897
+ ** a non-zero subtype was specified by the function argument expression.
5898
+ **
5899
+ ** [[SQLITE_RESULT_SUBTYPE]] <dt>SQLITE_RESULT_SUBTYPE</dt><dd>
5900
+ ** The SQLITE_RESULT_SUBTYPE flag indicates to SQLite that a function might call
5901
+ ** [sqlite3_result_subtype()] to cause a sub-type to be associated with its
5902
+ ** result.
5903
+ ** Every function that invokes [sqlite3_result_subtype()] should have this
5904
+ ** property. If it does not, then the call to [sqlite3_result_subtype()]
5905
+ ** might become a no-op if the function is used as term in an
5906
+ ** [expression index]. On the other hand, SQL functions that never invoke
5907
+ ** [sqlite3_result_subtype()] should avoid setting this property, as the
5908
+ ** purpose of this property is to disable certain optimizations that are
5909
+ ** incompatible with subtypes.
5896
5910
  ** </dd>
5897
5911
  ** </dl>
5898
5912
  */
@@ -5900,6 +5914,7 @@ SQLITE_API int sqlite3_create_window_function(
5900
5914
  #define SQLITE_DIRECTONLY 0x000080000
5901
5915
  #define SQLITE_SUBTYPE 0x000100000
5902
5916
  #define SQLITE_INNOCUOUS 0x000200000
5917
+ #define SQLITE_RESULT_SUBTYPE 0x001000000
5903
5918
 
5904
5919
  /*
5905
5920
  ** CAPI3REF: Deprecated Functions
@@ -6096,6 +6111,12 @@ SQLITE_API int sqlite3_value_encoding(sqlite3_value*);
6096
6111
  ** information can be used to pass a limited amount of context from
6097
6112
  ** one SQL function to another. Use the [sqlite3_result_subtype()]
6098
6113
  ** routine to set the subtype for the return value of an SQL function.
6114
+ **
6115
+ ** Every [application-defined SQL function] that invoke this interface
6116
+ ** should include the [SQLITE_SUBTYPE] property in the text
6117
+ ** encoding argument when the function is [sqlite3_create_function|registered].
6118
+ ** If the [SQLITE_SUBTYPE] property is omitted, then sqlite3_value_subtype()
6119
+ ** might return zero instead of the upstream subtype in some corner cases.
6099
6120
  */
6100
6121
  SQLITE_API unsigned int sqlite3_value_subtype(sqlite3_value*);
6101
6122
 
@@ -6226,14 +6247,22 @@ SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*);
6226
6247
  ** <li> ^(when sqlite3_set_auxdata() is invoked again on the same
6227
6248
  ** parameter)^, or
6228
6249
  ** <li> ^(during the original sqlite3_set_auxdata() call when a memory
6229
- ** allocation error occurs.)^ </ul>
6250
+ ** allocation error occurs.)^
6251
+ ** <li> ^(during the original sqlite3_set_auxdata() call if the function
6252
+ ** is evaluated during query planning instead of during query execution,
6253
+ ** as sometimes happens with [SQLITE_ENABLE_STAT4].)^ </ul>
6230
6254
  **
6231
- ** Note the last bullet in particular. The destructor X in
6255
+ ** Note the last two bullets in particular. The destructor X in
6232
6256
  ** sqlite3_set_auxdata(C,N,P,X) might be called immediately, before the
6233
6257
  ** sqlite3_set_auxdata() interface even returns. Hence sqlite3_set_auxdata()
6234
6258
  ** should be called near the end of the function implementation and the
6235
6259
  ** function implementation should not make any use of P after
6236
- ** sqlite3_set_auxdata() has been called.
6260
+ ** sqlite3_set_auxdata() has been called. Furthermore, a call to
6261
+ ** sqlite3_get_auxdata() that occurs immediately after a corresponding call
6262
+ ** to sqlite3_set_auxdata() might still return NULL if an out-of-memory
6263
+ ** condition occurred during the sqlite3_set_auxdata() call or if the
6264
+ ** function is being evaluated during query planning rather than during
6265
+ ** query execution.
6237
6266
  **
6238
6267
  ** ^(In practice, auxiliary data is preserved between function calls for
6239
6268
  ** function parameters that are compile-time constants, including literal
@@ -6507,6 +6536,20 @@ SQLITE_API int sqlite3_result_zeroblob64(sqlite3_context*, sqlite3_uint64 n);
6507
6536
  ** higher order bits are discarded.
6508
6537
  ** The number of subtype bytes preserved by SQLite might increase
6509
6538
  ** in future releases of SQLite.
6539
+ **
6540
+ ** Every [application-defined SQL function] that invokes this interface
6541
+ ** should include the [SQLITE_RESULT_SUBTYPE] property in its
6542
+ ** text encoding argument when the SQL function is
6543
+ ** [sqlite3_create_function|registered]. If the [SQLITE_RESULT_SUBTYPE]
6544
+ ** property is omitted from the function that invokes sqlite3_result_subtype(),
6545
+ ** then in some cases the sqlite3_result_subtype() might fail to set
6546
+ ** the result subtype.
6547
+ **
6548
+ ** If SQLite is compiled with -DSQLITE_STRICT_SUBTYPE=1, then any
6549
+ ** SQL function that invokes the sqlite3_result_subtype() interface
6550
+ ** and that does not have the SQLITE_RESULT_SUBTYPE property will raise
6551
+ ** an error. Future versions of SQLite might enable -DSQLITE_STRICT_SUBTYPE=1
6552
+ ** by default.
6510
6553
  */
6511
6554
  SQLITE_API void sqlite3_result_subtype(sqlite3_context*,unsigned int);
6512
6555
 
@@ -17811,14 +17854,15 @@ struct FuncDestructor {
17811
17854
  #define SQLITE_FUNC_SLOCHNG 0x2000 /* "Slow Change". Value constant during a
17812
17855
  ** single query - might change over time */
17813
17856
  #define SQLITE_FUNC_TEST 0x4000 /* Built-in testing functions */
17814
- /* 0x8000 -- available for reuse */
17857
+ #define SQLITE_FUNC_RUNONLY 0x8000 /* Cannot be used by valueFromFunction */
17815
17858
  #define SQLITE_FUNC_WINDOW 0x00010000 /* Built-in window-only function */
17816
17859
  #define SQLITE_FUNC_INTERNAL 0x00040000 /* For use by NestedParse() only */
17817
17860
  #define SQLITE_FUNC_DIRECT 0x00080000 /* Not for use in TRIGGERs or VIEWs */
17818
- #define SQLITE_FUNC_SUBTYPE 0x00100000 /* Result likely to have sub-type */
17861
+ /* SQLITE_SUBTYPE 0x00100000 // Consumer of subtypes */
17819
17862
  #define SQLITE_FUNC_UNSAFE 0x00200000 /* Function has side effects */
17820
17863
  #define SQLITE_FUNC_INLINE 0x00400000 /* Functions implemented in-line */
17821
17864
  #define SQLITE_FUNC_BUILTIN 0x00800000 /* This is a built-in function */
17865
+ /* SQLITE_RESULT_SUBTYPE 0x01000000 // Generator of subtypes */
17822
17866
  #define SQLITE_FUNC_ANYORDER 0x08000000 /* count/min/max aggregate */
17823
17867
 
17824
17868
  /* Identifier numbers for each in-line function */
@@ -17910,9 +17954,10 @@ struct FuncDestructor {
17910
17954
  #define MFUNCTION(zName, nArg, xPtr, xFunc) \
17911
17955
  {nArg, SQLITE_FUNC_BUILTIN|SQLITE_FUNC_CONSTANT|SQLITE_UTF8, \
17912
17956
  xPtr, 0, xFunc, 0, 0, 0, #zName, {0} }
17913
- #define JFUNCTION(zName, nArg, iArg, xFunc) \
17914
- {nArg, SQLITE_FUNC_BUILTIN|SQLITE_DETERMINISTIC|\
17915
- SQLITE_FUNC_CONSTANT|SQLITE_UTF8, \
17957
+ #define JFUNCTION(zName, nArg, bUseCache, bWS, bRS, iArg, xFunc) \
17958
+ {nArg, SQLITE_FUNC_BUILTIN|SQLITE_DETERMINISTIC|SQLITE_FUNC_CONSTANT|\
17959
+ SQLITE_UTF8|((bUseCache)*SQLITE_FUNC_RUNONLY)|\
17960
+ ((bRS)*SQLITE_SUBTYPE)|((bWS)*SQLITE_RESULT_SUBTYPE), \
17916
17961
  SQLITE_INT_TO_PTR(iArg), 0, xFunc, 0, 0, 0, #zName, {0} }
17917
17962
  #define INLINE_FUNC(zName, nArg, iArg, mFlags) \
17918
17963
  {nArg, SQLITE_FUNC_BUILTIN|\
@@ -29453,7 +29498,7 @@ SQLITE_PRIVATE void sqlite3MemoryBarrier(void){
29453
29498
  SQLITE_MEMORY_BARRIER;
29454
29499
  #elif defined(__GNUC__)
29455
29500
  __sync_synchronize();
29456
- #elif MSVC_VERSION>=1300
29501
+ #elif MSVC_VERSION>=1400
29457
29502
  _ReadWriteBarrier();
29458
29503
  #elif defined(MemoryBarrier)
29459
29504
  MemoryBarrier();
@@ -61447,10 +61492,13 @@ act_like_temp_file:
61447
61492
  */
61448
61493
  SQLITE_API sqlite3_file *sqlite3_database_file_object(const char *zName){
61449
61494
  Pager *pPager;
61495
+ const char *p;
61450
61496
  while( zName[-1]!=0 || zName[-2]!=0 || zName[-3]!=0 || zName[-4]!=0 ){
61451
61497
  zName--;
61452
61498
  }
61453
- pPager = *(Pager**)(zName - 4 - sizeof(Pager*));
61499
+ p = zName - 4 - sizeof(Pager*);
61500
+ assert( EIGHT_BYTE_ALIGNMENT(p) );
61501
+ pPager = *(Pager**)p;
61454
61502
  return pPager->fd;
61455
61503
  }
61456
61504
 
@@ -83411,7 +83459,7 @@ static int valueFromFunction(
83411
83459
  #endif
83412
83460
  assert( pFunc );
83413
83461
  if( (pFunc->funcFlags & (SQLITE_FUNC_CONSTANT|SQLITE_FUNC_SLOCHNG))==0
83414
- || (pFunc->funcFlags & SQLITE_FUNC_NEEDCOLL)
83462
+ || (pFunc->funcFlags & (SQLITE_FUNC_NEEDCOLL|SQLITE_FUNC_RUNONLY))!=0
83415
83463
  ){
83416
83464
  return SQLITE_OK;
83417
83465
  }
@@ -84135,10 +84183,11 @@ static int growOpArray(Vdbe *v, int nOp){
84135
84183
  ** sqlite3CantopenError(lineno)
84136
84184
  */
84137
84185
  static void test_addop_breakpoint(int pc, Op *pOp){
84138
- static int n = 0;
84186
+ static u64 n = 0;
84139
84187
  (void)pc;
84140
84188
  (void)pOp;
84141
84189
  n++;
84190
+ if( n==LARGEST_UINT64 ) abort(); /* so that n is used, preventing a warning */
84142
84191
  }
84143
84192
  #endif
84144
84193
 
@@ -89952,6 +90001,18 @@ SQLITE_API void sqlite3_result_subtype(sqlite3_context *pCtx, unsigned int eSubt
89952
90001
  #ifdef SQLITE_ENABLE_API_ARMOR
89953
90002
  if( pCtx==0 ) return;
89954
90003
  #endif
90004
+ #if defined(SQLITE_STRICT_SUBTYPE) && SQLITE_STRICT_SUBTYPE+0!=0
90005
+ if( pCtx->pFunc!=0
90006
+ && (pCtx->pFunc->funcFlags & SQLITE_RESULT_SUBTYPE)==0
90007
+ ){
90008
+ char zErr[200];
90009
+ sqlite3_snprintf(sizeof(zErr), zErr,
90010
+ "misuse of sqlite3_result_subtype() by %s()",
90011
+ pCtx->pFunc->zName);
90012
+ sqlite3_result_error(pCtx, zErr, -1);
90013
+ return;
90014
+ }
90015
+ #endif /* SQLITE_STRICT_SUBTYPE */
89955
90016
  pOut = pCtx->pOut;
89956
90017
  assert( sqlite3_mutex_held(pOut->db->mutex) );
89957
90018
  pOut->eSubtype = eSubtype & 0xff;
@@ -92270,11 +92331,12 @@ SQLITE_API int sqlite3_found_count = 0;
92270
92331
  ** sqlite3CantopenError(lineno)
92271
92332
  */
92272
92333
  static void test_trace_breakpoint(int pc, Op *pOp, Vdbe *v){
92273
- static int n = 0;
92334
+ static u64 n = 0;
92274
92335
  (void)pc;
92275
92336
  (void)pOp;
92276
92337
  (void)v;
92277
92338
  n++;
92339
+ if( n==LARGEST_UINT64 ) abort(); /* So that n is used, preventing a warning */
92278
92340
  }
92279
92341
  #endif
92280
92342
 
@@ -100321,7 +100383,7 @@ case OP_VCheck: { /* out2 */
100321
100383
  pTab = pOp->p4.pTab;
100322
100384
  assert( pTab!=0 );
100323
100385
  assert( IsVirtual(pTab) );
100324
- assert( pTab->u.vtab.p!=0 );
100386
+ if( pTab->u.vtab.p==0 ) break;
100325
100387
  pVtab = pTab->u.vtab.p->pVtab;
100326
100388
  assert( pVtab!=0 );
100327
100389
  pModule = pVtab->pModule;
@@ -113917,8 +113979,8 @@ SQLITE_PRIVATE int sqlite3ExprListCompare(const ExprList *pA, const ExprList *pB
113917
113979
  */
113918
113980
  SQLITE_PRIVATE int sqlite3ExprCompareSkip(Expr *pA,Expr *pB, int iTab){
113919
113981
  return sqlite3ExprCompare(0,
113920
- sqlite3ExprSkipCollateAndLikely(pA),
113921
- sqlite3ExprSkipCollateAndLikely(pB),
113982
+ sqlite3ExprSkipCollate(pA),
113983
+ sqlite3ExprSkipCollate(pB),
113922
113984
  iTab);
113923
113985
  }
113924
113986
 
@@ -143552,7 +143614,8 @@ SQLITE_PRIVATE void sqlite3SubqueryColumnTypes(
143552
143614
  NameContext sNC;
143553
143615
 
143554
143616
  assert( pSelect!=0 );
143555
- assert( (pSelect->selFlags & SF_Resolved)!=0 );
143617
+ testcase( (pSelect->selFlags & SF_Resolved)==0 );
143618
+ assert( (pSelect->selFlags & SF_Resolved)!=0 || IN_RENAME_OBJECT );
143556
143619
  assert( pTab->nCol==pSelect->pEList->nExpr || pParse->nErr>0 );
143557
143620
  assert( aff==SQLITE_AFF_NONE || aff==SQLITE_AFF_BLOB );
143558
143621
  if( db->mallocFailed || IN_RENAME_OBJECT ) return;
@@ -147605,10 +147668,11 @@ static void selectAddSubqueryTypeInfo(Walker *pWalker, Select *p){
147605
147668
  SrcList *pTabList;
147606
147669
  SrcItem *pFrom;
147607
147670
 
147608
- assert( p->selFlags & SF_Resolved );
147609
147671
  if( p->selFlags & SF_HasTypeInfo ) return;
147610
147672
  p->selFlags |= SF_HasTypeInfo;
147611
147673
  pParse = pWalker->pParse;
147674
+ testcase( (p->selFlags & SF_Resolved)==0 );
147675
+ assert( (p->selFlags & SF_Resolved) || IN_RENAME_OBJECT );
147612
147676
  pTabList = p->pSrc;
147613
147677
  for(i=0, pFrom=pTabList->a; i<pTabList->nSrc; i++, pFrom++){
147614
147678
  Table *pTab = pFrom->pTab;
@@ -148630,6 +148694,7 @@ SQLITE_PRIVATE int sqlite3Select(
148630
148694
  TREETRACE(0x1000,pParse,p,
148631
148695
  ("LEFT-JOIN simplifies to JOIN on term %d\n",i));
148632
148696
  pItem->fg.jointype &= ~(JT_LEFT|JT_OUTER);
148697
+ unsetJoinExpr(p->pWhere, pItem->iCursor, 0);
148633
148698
  }
148634
148699
  }
148635
148700
  if( pItem->fg.jointype & JT_LTORJ ){
@@ -148644,17 +148709,15 @@ SQLITE_PRIVATE int sqlite3Select(
148644
148709
  TREETRACE(0x1000,pParse,p,
148645
148710
  ("RIGHT-JOIN simplifies to JOIN on term %d\n",j));
148646
148711
  pI2->fg.jointype &= ~(JT_RIGHT|JT_OUTER);
148712
+ unsetJoinExpr(p->pWhere, pI2->iCursor, 1);
148647
148713
  }
148648
148714
  }
148649
148715
  }
148650
- for(j=pTabList->nSrc-1; j>=i; j--){
148716
+ for(j=pTabList->nSrc-1; j>=0; j--){
148651
148717
  pTabList->a[j].fg.jointype &= ~JT_LTORJ;
148652
148718
  if( pTabList->a[j].fg.jointype & JT_RIGHT ) break;
148653
148719
  }
148654
148720
  }
148655
- assert( pItem->iCursor>=0 );
148656
- unsetJoinExpr(p->pWhere, pItem->iCursor,
148657
- pTabList->a[0].fg.jointype & JT_LTORJ);
148658
148721
  }
148659
148722
 
148660
148723
  /* No further action if this term of the FROM clause is not a subquery */
@@ -166058,6 +166121,20 @@ static SQLITE_NOINLINE void whereAddIndexedExpr(
166058
166121
  continue;
166059
166122
  }
166060
166123
  if( sqlite3ExprIsConstant(pExpr) ) continue;
166124
+ if( pExpr->op==TK_FUNCTION ){
166125
+ /* Functions that might set a subtype should not be replaced by the
166126
+ ** value taken from an expression index since the index omits the
166127
+ ** subtype. https://sqlite.org/forum/forumpost/68d284c86b082c3e */
166128
+ int n;
166129
+ FuncDef *pDef;
166130
+ sqlite3 *db = pParse->db;
166131
+ assert( ExprUseXList(pExpr) );
166132
+ n = pExpr->x.pList ? pExpr->x.pList->nExpr : 0;
166133
+ pDef = sqlite3FindFunction(db, pExpr->u.zToken, n, ENC(db), 0);
166134
+ if( pDef==0 || (pDef->funcFlags & SQLITE_RESULT_SUBTYPE)!=0 ){
166135
+ continue;
166136
+ }
166137
+ }
166061
166138
  p = sqlite3DbMallocRaw(pParse->db, sizeof(IndexedExpr));
166062
166139
  if( p==0 ) break;
166063
166140
  p->pIENext = pParse->pIdxEpr;
@@ -168240,7 +168317,7 @@ SQLITE_PRIVATE int sqlite3WindowRewrite(Parse *pParse, Select *p){
168240
168317
  assert( ExprUseXList(pWin->pOwner) );
168241
168318
  assert( pWin->pWFunc!=0 );
168242
168319
  pArgs = pWin->pOwner->x.pList;
168243
- if( pWin->pWFunc->funcFlags & SQLITE_FUNC_SUBTYPE ){
168320
+ if( pWin->pWFunc->funcFlags & SQLITE_SUBTYPE ){
168244
168321
  selectWindowRewriteEList(pParse, pMWin, pSrc, pArgs, pTab, &pSublist);
168245
168322
  pWin->iArgCol = (pSublist ? pSublist->nExpr : 0);
168246
168323
  pWin->bExprArgs = 1;
@@ -179414,7 +179491,7 @@ SQLITE_PRIVATE int sqlite3CreateFunc(
179414
179491
  assert( SQLITE_FUNC_CONSTANT==SQLITE_DETERMINISTIC );
179415
179492
  assert( SQLITE_FUNC_DIRECT==SQLITE_DIRECTONLY );
179416
179493
  extraFlags = enc & (SQLITE_DETERMINISTIC|SQLITE_DIRECTONLY|
179417
- SQLITE_SUBTYPE|SQLITE_INNOCUOUS);
179494
+ SQLITE_SUBTYPE|SQLITE_INNOCUOUS|SQLITE_RESULT_SUBTYPE);
179418
179495
  enc &= (SQLITE_FUNC_ENCMASK|SQLITE_ANY);
179419
179496
 
179420
179497
  /* The SQLITE_INNOCUOUS flag is the same bit as SQLITE_FUNC_UNSAFE. But
@@ -202995,13 +203072,19 @@ static void jsonAppendNormalizedString(JsonString *p, const char *zIn, u32 N){
202995
203072
  zIn++;
202996
203073
  N -= 2;
202997
203074
  while( N>0 ){
202998
- for(i=0; i<N && zIn[i]!='\\'; i++){}
203075
+ for(i=0; i<N && zIn[i]!='\\' && zIn[i]!='"'; i++){}
202999
203076
  if( i>0 ){
203000
203077
  jsonAppendRawNZ(p, zIn, i);
203001
203078
  zIn += i;
203002
203079
  N -= i;
203003
203080
  if( N==0 ) break;
203004
203081
  }
203082
+ if( zIn[0]=='"' ){
203083
+ jsonAppendRawNZ(p, "\\\"", 2);
203084
+ zIn++;
203085
+ N--;
203086
+ continue;
203087
+ }
203005
203088
  assert( zIn[0]=='\\' );
203006
203089
  switch( (u8)zIn[1] ){
203007
203090
  case '\'':
@@ -203396,7 +203479,8 @@ static void jsonReturnJson(
203396
203479
  JsonParse *pParse, /* The complete JSON */
203397
203480
  JsonNode *pNode, /* Node to return */
203398
203481
  sqlite3_context *pCtx, /* Return value for this function */
203399
- int bGenerateAlt /* Also store the rendered text in zAlt */
203482
+ int bGenerateAlt, /* Also store the rendered text in zAlt */
203483
+ int omitSubtype /* Do not call sqlite3_result_subtype() */
203400
203484
  ){
203401
203485
  JsonString s;
203402
203486
  if( pParse->oom ){
@@ -203411,7 +203495,7 @@ static void jsonReturnJson(
203411
203495
  pParse->nAlt = s.nUsed;
203412
203496
  }
203413
203497
  jsonResult(&s);
203414
- sqlite3_result_subtype(pCtx, JSON_SUBTYPE);
203498
+ if( !omitSubtype ) sqlite3_result_subtype(pCtx, JSON_SUBTYPE);
203415
203499
  }
203416
203500
  }
203417
203501
 
@@ -203452,7 +203536,8 @@ static u32 jsonHexToInt4(const char *z){
203452
203536
  static void jsonReturn(
203453
203537
  JsonParse *pParse, /* Complete JSON parse tree */
203454
203538
  JsonNode *pNode, /* Node to return */
203455
- sqlite3_context *pCtx /* Return value for this function */
203539
+ sqlite3_context *pCtx, /* Return value for this function */
203540
+ int omitSubtype /* Do not call sqlite3_result_subtype() */
203456
203541
  ){
203457
203542
  switch( pNode->eType ){
203458
203543
  default: {
@@ -203598,7 +203683,7 @@ static void jsonReturn(
203598
203683
  }
203599
203684
  case JSON_ARRAY:
203600
203685
  case JSON_OBJECT: {
203601
- jsonReturnJson(pParse, pNode, pCtx, 0);
203686
+ jsonReturnJson(pParse, pNode, pCtx, 0, omitSubtype);
203602
203687
  break;
203603
203688
  }
203604
203689
  }
@@ -204950,7 +205035,7 @@ static void jsonParseFunc(
204950
205035
  printf("iSubst = %u\n", p->iSubst);
204951
205036
  printf("iHold = %u\n", p->iHold);
204952
205037
  jsonDebugPrintNodeEntries(p->aNode, p->nNode);
204953
- jsonReturnJson(p, p->aNode, ctx, 1);
205038
+ jsonReturnJson(p, p->aNode, ctx, 1, 0);
204954
205039
  }
204955
205040
 
204956
205041
  /*
@@ -205136,15 +205221,14 @@ static void jsonExtractFunc(
205136
205221
  }
205137
205222
  if( pNode ){
205138
205223
  if( flags & JSON_JSON ){
205139
- jsonReturnJson(p, pNode, ctx, 0);
205224
+ jsonReturnJson(p, pNode, ctx, 0, 0);
205140
205225
  }else{
205141
- jsonReturn(p, pNode, ctx);
205142
- sqlite3_result_subtype(ctx, 0);
205226
+ jsonReturn(p, pNode, ctx, 1);
205143
205227
  }
205144
205228
  }
205145
205229
  }else{
205146
205230
  pNode = jsonLookup(p, zPath, 0, ctx);
205147
- if( p->nErr==0 && pNode ) jsonReturn(p, pNode, ctx);
205231
+ if( p->nErr==0 && pNode ) jsonReturn(p, pNode, ctx, 0);
205148
205232
  }
205149
205233
  }else{
205150
205234
  /* Two or more PATH arguments results in a JSON array with each
@@ -205270,7 +205354,7 @@ static void jsonPatchFunc(
205270
205354
  if( pResult && pX->oom==0 ){
205271
205355
  jsonDebugPrintParse(pX);
205272
205356
  jsonDebugPrintNode(pResult);
205273
- jsonReturnJson(pX, pResult, ctx, 0);
205357
+ jsonReturnJson(pX, pResult, ctx, 0, 0);
205274
205358
  }else{
205275
205359
  sqlite3_result_error_nomem(ctx);
205276
205360
  }
@@ -205349,7 +205433,7 @@ static void jsonRemoveFunc(
205349
205433
  }
205350
205434
  }
205351
205435
  if( (pParse->aNode[0].jnFlags & JNODE_REMOVE)==0 ){
205352
- jsonReturnJson(pParse, pParse->aNode, ctx, 1);
205436
+ jsonReturnJson(pParse, pParse->aNode, ctx, 1, 0);
205353
205437
  }
205354
205438
  remove_done:
205355
205439
  jsonDebugPrintParse(p);
@@ -205478,7 +205562,7 @@ static void jsonReplaceFunc(
205478
205562
  jsonReplaceNode(ctx, pParse, (u32)(pNode - pParse->aNode), argv[i+1]);
205479
205563
  }
205480
205564
  }
205481
- jsonReturnJson(pParse, pParse->aNode, ctx, 1);
205565
+ jsonReturnJson(pParse, pParse->aNode, ctx, 1, 0);
205482
205566
  replace_err:
205483
205567
  jsonDebugPrintParse(pParse);
205484
205568
  jsonParseFree(pParse);
@@ -205532,7 +205616,7 @@ static void jsonSetFunc(
205532
205616
  }
205533
205617
  }
205534
205618
  jsonDebugPrintParse(pParse);
205535
- jsonReturnJson(pParse, pParse->aNode, ctx, 1);
205619
+ jsonReturnJson(pParse, pParse->aNode, ctx, 1, 0);
205536
205620
  jsonSetDone:
205537
205621
  jsonParseFree(pParse);
205538
205622
  }
@@ -206047,7 +206131,7 @@ static int jsonEachColumn(
206047
206131
  case JEACH_KEY: {
206048
206132
  if( p->i==0 ) break;
206049
206133
  if( p->eType==JSON_OBJECT ){
206050
- jsonReturn(&p->sParse, pThis, ctx);
206134
+ jsonReturn(&p->sParse, pThis, ctx, 0);
206051
206135
  }else if( p->eType==JSON_ARRAY ){
206052
206136
  u32 iKey;
206053
206137
  if( p->bRecursive ){
@@ -206063,7 +206147,7 @@ static int jsonEachColumn(
206063
206147
  }
206064
206148
  case JEACH_VALUE: {
206065
206149
  if( pThis->jnFlags & JNODE_LABEL ) pThis++;
206066
- jsonReturn(&p->sParse, pThis, ctx);
206150
+ jsonReturn(&p->sParse, pThis, ctx, 0);
206067
206151
  break;
206068
206152
  }
206069
206153
  case JEACH_TYPE: {
@@ -206074,7 +206158,7 @@ static int jsonEachColumn(
206074
206158
  case JEACH_ATOM: {
206075
206159
  if( pThis->jnFlags & JNODE_LABEL ) pThis++;
206076
206160
  if( pThis->eType>=JSON_ARRAY ) break;
206077
- jsonReturn(&p->sParse, pThis, ctx);
206161
+ jsonReturn(&p->sParse, pThis, ctx, 0);
206078
206162
  break;
206079
206163
  }
206080
206164
  case JEACH_ID: {
@@ -206367,34 +206451,43 @@ static sqlite3_module jsonTreeModule = {
206367
206451
  SQLITE_PRIVATE void sqlite3RegisterJsonFunctions(void){
206368
206452
  #ifndef SQLITE_OMIT_JSON
206369
206453
  static FuncDef aJsonFunc[] = {
206370
- JFUNCTION(json, 1, 0, jsonRemoveFunc),
206371
- JFUNCTION(json_array, -1, 0, jsonArrayFunc),
206372
- JFUNCTION(json_array_length, 1, 0, jsonArrayLengthFunc),
206373
- JFUNCTION(json_array_length, 2, 0, jsonArrayLengthFunc),
206374
- JFUNCTION(json_error_position,1, 0, jsonErrorFunc),
206375
- JFUNCTION(json_extract, -1, 0, jsonExtractFunc),
206376
- JFUNCTION(->, 2, JSON_JSON, jsonExtractFunc),
206377
- JFUNCTION(->>, 2, JSON_SQL, jsonExtractFunc),
206378
- JFUNCTION(json_insert, -1, 0, jsonSetFunc),
206379
- JFUNCTION(json_object, -1, 0, jsonObjectFunc),
206380
- JFUNCTION(json_patch, 2, 0, jsonPatchFunc),
206381
- JFUNCTION(json_quote, 1, 0, jsonQuoteFunc),
206382
- JFUNCTION(json_remove, -1, 0, jsonRemoveFunc),
206383
- JFUNCTION(json_replace, -1, 0, jsonReplaceFunc),
206384
- JFUNCTION(json_set, -1, JSON_ISSET, jsonSetFunc),
206385
- JFUNCTION(json_type, 1, 0, jsonTypeFunc),
206386
- JFUNCTION(json_type, 2, 0, jsonTypeFunc),
206387
- JFUNCTION(json_valid, 1, 0, jsonValidFunc),
206388
- #if SQLITE_DEBUG
206389
- JFUNCTION(json_parse, 1, 0, jsonParseFunc),
206390
- JFUNCTION(json_test1, 1, 0, jsonTest1Func),
206454
+ /* calls sqlite3_result_subtype() */
206455
+ /* | */
206456
+ /* Uses cache ______ | __ calls sqlite3_value_subtype() */
206457
+ /* | | | */
206458
+ /* Num args _________ | | | ___ Flags */
206459
+ /* | | | | | */
206460
+ /* | | | | | */
206461
+ JFUNCTION(json, 1, 1, 1, 0, 0, jsonRemoveFunc),
206462
+ JFUNCTION(json_array, -1, 0, 1, 1, 0, jsonArrayFunc),
206463
+ JFUNCTION(json_array_length, 1, 1, 0, 0, 0, jsonArrayLengthFunc),
206464
+ JFUNCTION(json_array_length, 2, 1, 0, 0, 0, jsonArrayLengthFunc),
206465
+ JFUNCTION(json_error_position,1, 1, 0, 0, 0, jsonErrorFunc),
206466
+ JFUNCTION(json_extract, -1, 1, 1, 0, 0, jsonExtractFunc),
206467
+ JFUNCTION(->, 2, 1, 1, 0, JSON_JSON, jsonExtractFunc),
206468
+ JFUNCTION(->>, 2, 1, 0, 0, JSON_SQL, jsonExtractFunc),
206469
+ JFUNCTION(json_insert, -1, 1, 1, 1, 0, jsonSetFunc),
206470
+ JFUNCTION(json_object, -1, 0, 1, 1, 0, jsonObjectFunc),
206471
+ JFUNCTION(json_patch, 2, 1, 1, 0, 0, jsonPatchFunc),
206472
+ JFUNCTION(json_quote, 1, 0, 1, 1, 0, jsonQuoteFunc),
206473
+ JFUNCTION(json_remove, -1, 1, 1, 0, 0, jsonRemoveFunc),
206474
+ JFUNCTION(json_replace, -1, 1, 1, 1, 0, jsonReplaceFunc),
206475
+ JFUNCTION(json_set, -1, 1, 1, 1, JSON_ISSET, jsonSetFunc),
206476
+ JFUNCTION(json_type, 1, 1, 0, 0, 0, jsonTypeFunc),
206477
+ JFUNCTION(json_type, 2, 1, 0, 0, 0, jsonTypeFunc),
206478
+ JFUNCTION(json_valid, 1, 1, 0, 0, 0, jsonValidFunc),
206479
+ #ifdef SQLITE_DEBUG
206480
+ JFUNCTION(json_parse, 1, 1, 1, 0, 0, jsonParseFunc),
206481
+ JFUNCTION(json_test1, 1, 1, 0, 1, 0, jsonTest1Func),
206391
206482
  #endif
206392
206483
  WAGGREGATE(json_group_array, 1, 0, 0,
206393
206484
  jsonArrayStep, jsonArrayFinal, jsonArrayValue, jsonGroupInverse,
206394
- SQLITE_SUBTYPE|SQLITE_UTF8|SQLITE_DETERMINISTIC),
206485
+ SQLITE_SUBTYPE|SQLITE_RESULT_SUBTYPE|SQLITE_UTF8|
206486
+ SQLITE_DETERMINISTIC),
206395
206487
  WAGGREGATE(json_group_object, 2, 0, 0,
206396
206488
  jsonObjectStep, jsonObjectFinal, jsonObjectValue, jsonGroupInverse,
206397
- SQLITE_SUBTYPE|SQLITE_UTF8|SQLITE_DETERMINISTIC)
206489
+ SQLITE_SUBTYPE|SQLITE_RESULT_SUBTYPE|SQLITE_UTF8|
206490
+ SQLITE_DETERMINISTIC)
206398
206491
  };
206399
206492
  sqlite3InsertBuiltinFuncs(aJsonFunc, ArraySize(aJsonFunc));
206400
206493
  #endif
@@ -236131,10 +236224,8 @@ static Fts5HashEntry *fts5HashEntryMerge(
236131
236224
  }
236132
236225
 
236133
236226
  /*
236134
- ** Extract all tokens from hash table iHash and link them into a list
236135
- ** in sorted order. The hash table is cleared before returning. It is
236136
- ** the responsibility of the caller to free the elements of the returned
236137
- ** list.
236227
+ ** Link all tokens from hash table iHash into a list in sorted order. The
236228
+ ** tokens are not removed from the hash table.
236138
236229
  */
236139
236230
  static int fts5HashEntrySort(
236140
236231
  Fts5Hash *pHash,
@@ -239000,6 +239091,14 @@ static void fts5SegIterHashInit(
239000
239091
  pLeaf->p = (u8*)pList;
239001
239092
  }
239002
239093
  }
239094
+
239095
+ /* The call to sqlite3Fts5HashScanInit() causes the hash table to
239096
+ ** fill the size field of all existing position lists. This means they
239097
+ ** can no longer be appended to. Since the only scenario in which they
239098
+ ** can be appended to is if the previous operation on this table was
239099
+ ** a DELETE, by clearing the Fts5Index.bDelete flag we can avoid this
239100
+ ** possibility altogether. */
239101
+ p->bDelete = 0;
239003
239102
  }else{
239004
239103
  p->rc = sqlite3Fts5HashQuery(p->pHash, sizeof(Fts5Data),
239005
239104
  (const char*)pTerm, nTerm, (void**)&pLeaf, &nList
@@ -240677,7 +240776,7 @@ static void fts5WriteAppendPoslistData(
240677
240776
  const u8 *a = aData;
240678
240777
  int n = nData;
240679
240778
 
240680
- assert( p->pConfig->pgsz>0 );
240779
+ assert( p->pConfig->pgsz>0 || p->rc!=SQLITE_OK );
240681
240780
  while( p->rc==SQLITE_OK
240682
240781
  && (pPage->buf.n + pPage->pgidx.n + n)>=p->pConfig->pgsz
240683
240782
  ){
@@ -241410,18 +241509,24 @@ static void fts5DoSecureDelete(
241410
241509
 
241411
241510
  iOff = iStart;
241412
241511
 
241413
- /* Set variable bLastInDoclist to true if this entry happens to be
241414
- ** the last rowid in the doclist for its term. */
241512
+ /* If the position-list for the entry being removed flows over past
241513
+ ** the end of this page, delete the portion of the position-list on the
241514
+ ** next page and beyond.
241515
+ **
241516
+ ** Set variable bLastInDoclist to true if this entry happens
241517
+ ** to be the last rowid in the doclist for its term. */
241518
+ if( iNextOff>=iPgIdx ){
241519
+ int pgno = pSeg->iLeafPgno+1;
241520
+ fts5SecureDeleteOverflow(p, pSeg->pSeg, pgno, &bLastInDoclist);
241521
+ iNextOff = iPgIdx;
241522
+ }
241523
+
241415
241524
  if( pSeg->bDel==0 ){
241416
- if( iNextOff>=iPgIdx ){
241417
- int pgno = pSeg->iLeafPgno+1;
241418
- fts5SecureDeleteOverflow(p, pSeg->pSeg, pgno, &bLastInDoclist);
241419
- iNextOff = iPgIdx;
241420
- }else{
241525
+ if( iNextOff!=iPgIdx ){
241421
241526
  /* Loop through the page-footer. If iNextOff (offset of the
241422
241527
  ** entry following the one we are removing) is equal to the
241423
241528
  ** offset of a key on this page, then the entry is the last
241424
- ** in its doclist. */
241529
+ ** in its doclist. */
241425
241530
  int iKeyOff = 0;
241426
241531
  for(iIdx=0; iIdx<nIdx; /* no-op */){
241427
241532
  u32 iVal = 0;
@@ -241937,8 +242042,9 @@ static int sqlite3Fts5IndexOptimize(Fts5Index *p){
241937
242042
 
241938
242043
  assert( p->rc==SQLITE_OK );
241939
242044
  fts5IndexFlush(p);
241940
- assert( p->nContentlessDelete==0 );
242045
+ assert( p->rc!=SQLITE_OK || p->nContentlessDelete==0 );
241941
242046
  pStruct = fts5StructureRead(p);
242047
+ assert( p->rc!=SQLITE_OK || pStruct!=0 );
241942
242048
  fts5StructureInvalidate(p);
241943
242049
 
241944
242050
  if( pStruct ){
@@ -247515,7 +247621,7 @@ static void fts5SourceIdFunc(
247515
247621
  ){
247516
247622
  assert( nArg==0 );
247517
247623
  UNUSED_PARAM2(nArg, apUnused);
247518
- sqlite3_result_text(pCtx, "fts5: 2023-11-01 11:23:50 17129ba1ff7f0daf37100ee82d507aef7827cf38de1866e2633096ae6ad81301", -1, SQLITE_TRANSIENT);
247624
+ sqlite3_result_text(pCtx, "fts5: 2023-11-24 11:41:44 ebead0e7230cd33bcec9f95d2183069565b9e709bf745c9b5db65cc0cbf92c0f", -1, SQLITE_TRANSIENT);
247519
247625
  }
247520
247626
 
247521
247627
  /*