extralite-bundle 2.3 → 2.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
  /*