Radish alpha
H
rad:z3QDZAW2FAfuLvihrhiyDC9fAD8G9
HardenedBSD Package Manager
Radicle
Git
sqlite: update to 3.39.3
Baptiste Daroussin committed 3 years ago
commit 771364004d60e66ba17c64ead122dec78767a596
parent 1791ee3
2 files changed +100 -32
modified external/sqlite/sqlite3.c
@@ -1,6 +1,6 @@
/******************************************************************************
** This file is an amalgamation of many separate C source files from SQLite
-
** version 3.39.2.  By combining all the individual C code files into this
+
** version 3.39.3.  By combining all the individual C code files into this
** single large file, the entire code can be compiled as a single translation
** unit.  This allows many compilers to do optimizations that would not be
** possible if the files were compiled separately.  Performance improvements
@@ -452,9 +452,9 @@ extern "C" {
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
** [sqlite_version()] and [sqlite_source_id()].
*/
-
#define SQLITE_VERSION        "3.39.2"
-
#define SQLITE_VERSION_NUMBER 3039002
-
#define SQLITE_SOURCE_ID      "2022-07-21 15:24:47 698edb77537b67c41adc68f9b892db56bcf9a55e00371a61420f3ddd668e6603"
+
#define SQLITE_VERSION        "3.39.3"
+
#define SQLITE_VERSION_NUMBER 3039003
+
#define SQLITE_SOURCE_ID      "2022-09-05 11:02:23 4635f4a69c8c2a8df242b384a992aea71224e39a2ccab42d8c0b0602f1e826e8"

/*
** CAPI3REF: Run-Time Library Version Numbers
@@ -13145,6 +13145,11 @@ struct fts5_api {
/************** Continuing where we left off in sqliteInt.h ******************/

/*
+
** Reuse the STATIC_LRU for mutex access to sqlite3_temp_directory.
+
*/
+
#define SQLITE_MUTEX_STATIC_TEMPDIR SQLITE_MUTEX_STATIC_VFS1
+

+
/*
** Include the configuration header output by 'configure' if we're using the
** autoconf-based build
*/
@@ -29563,8 +29568,13 @@ SQLITE_PRIVATE void *sqlite3OomFault(sqlite3 *db){
    }
    DisableLookaside;
    if( db->pParse ){
+
      Parse *pParse;
      sqlite3ErrorMsg(db->pParse, "out of memory");
      db->pParse->rc = SQLITE_NOMEM_BKPT;
+
      for(pParse=db->pParse->pOuterParse; pParse; pParse = pParse->pOuterParse){
+
        pParse->nErr++;
+
        pParse->rc = SQLITE_NOMEM;
+
      }
    }
  }
  return 0;
@@ -33459,7 +33469,7 @@ SQLITE_PRIVATE void sqlite3ErrorMsg(Parse *pParse, const char *zFormat, ...){
  va_list ap;
  sqlite3 *db = pParse->db;
  assert( db!=0 );
-
  assert( db->pParse==pParse );
+
  assert( db->pParse==pParse || db->pParse->pToplevel==pParse );
  db->errByteOffset = -2;
  va_start(ap, zFormat);
  zMsg = sqlite3VMPrintf(db, zFormat, ap);
@@ -41320,6 +41330,7 @@ static const char *unixTempFileDir(void){
static int unixGetTempname(int nBuf, char *zBuf){
  const char *zDir;
  int iLimit = 0;
+
  int rc = SQLITE_OK;

  /* It's odd to simulate an io-error here, but really this is just
  ** using the io-error infrastructure to test that SQLite handles this
@@ -41328,18 +41339,26 @@ static int unixGetTempname(int nBuf, char *zBuf){
  zBuf[0] = 0;
  SimulateIOError( return SQLITE_IOERR );

+
  sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR));
  zDir = unixTempFileDir();
-
  if( zDir==0 ) return SQLITE_IOERR_GETTEMPPATH;
-
  do{
-
    u64 r;
-
    sqlite3_randomness(sizeof(r), &r);
-
    assert( nBuf>2 );
-
    zBuf[nBuf-2] = 0;
-
    sqlite3_snprintf(nBuf, zBuf, "%s/"SQLITE_TEMP_FILE_PREFIX"%llx%c",
-
                     zDir, r, 0);
-
    if( zBuf[nBuf-2]!=0 || (iLimit++)>10 ) return SQLITE_ERROR;
-
  }while( osAccess(zBuf,0)==0 );
-
  return SQLITE_OK;
+
  if( zDir==0 ){
+
    rc = SQLITE_IOERR_GETTEMPPATH;
+
  }else{
+
    do{
+
      u64 r;
+
      sqlite3_randomness(sizeof(r), &r);
+
      assert( nBuf>2 );
+
      zBuf[nBuf-2] = 0;
+
      sqlite3_snprintf(nBuf, zBuf, "%s/"SQLITE_TEMP_FILE_PREFIX"%llx%c",
+
                       zDir, r, 0);
+
      if( zBuf[nBuf-2]!=0 || (iLimit++)>10 ){
+
        rc = SQLITE_ERROR;
+
        break;
+
      }
+
    }while( osAccess(zBuf,0)==0 );
+
  }
+
  sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR));
+
  return rc;
}

#if SQLITE_ENABLE_LOCKING_STYLE && defined(__APPLE__)
@@ -45482,6 +45501,7 @@ SQLITE_API int sqlite3_win32_set_directory8(
  int rc = sqlite3_initialize();
  if( rc ) return rc;
#endif
+
  sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR));
  if( type==SQLITE_WIN32_DATA_DIRECTORY_TYPE ){
    ppDirectory = &sqlite3_data_directory;
  }else if( type==SQLITE_WIN32_TEMP_DIRECTORY_TYPE ){
@@ -45496,14 +45516,19 @@ SQLITE_API int sqlite3_win32_set_directory8(
    if( zValue && zValue[0] ){
      zCopy = sqlite3_mprintf("%s", zValue);
      if ( zCopy==0 ){
-
        return SQLITE_NOMEM_BKPT;
+
        rc = SQLITE_NOMEM_BKPT;
+
        goto set_directory8_done;
      }
    }
    sqlite3_free(*ppDirectory);
    *ppDirectory = zCopy;
-
    return SQLITE_OK;
+
    rc = SQLITE_OK;
+
  }else{
+
    rc = SQLITE_ERROR;
  }
-
  return SQLITE_ERROR;
+
set_directory8_done:
+
  sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR));
+
  return rc;
}

/*
@@ -48278,6 +48303,18 @@ static int winMakeEndInDirSep(int nBuf, char *zBuf){
}

/*
+
** If sqlite3_temp_directory is not, take the mutex and return true.
+
**
+
** If sqlite3_temp_directory is NULL, omit the mutex and return false.
+
*/
+
static int winTempDirDefined(void){
+
  sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR));
+
  if( sqlite3_temp_directory!=0 ) return 1;
+
  sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR));
+
  return 0;
+
}
+

+
/*
** Create a temporary file name and store the resulting pointer into pzBuf.
** The pointer returned in pzBuf must be freed via sqlite3_free().
*/
@@ -48313,20 +48350,23 @@ static int winGetTempname(sqlite3_vfs *pVfs, char **pzBuf){
  */
  nDir = nMax - (nPre + 15);
  assert( nDir>0 );
-
  if( sqlite3_temp_directory ){
+
  if( winTempDirDefined() ){
    int nDirLen = sqlite3Strlen30(sqlite3_temp_directory);
    if( nDirLen>0 ){
      if( !winIsDirSep(sqlite3_temp_directory[nDirLen-1]) ){
        nDirLen++;
      }
      if( nDirLen>nDir ){
+
        sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR));
        sqlite3_free(zBuf);
        OSTRACE(("TEMP-FILENAME rc=SQLITE_ERROR\n"));
        return winLogError(SQLITE_ERROR, 0, "winGetTempname1", 0);
      }
      sqlite3_snprintf(nMax, zBuf, "%s", sqlite3_temp_directory);
    }
+
    sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR));
  }
+

#if defined(__CYGWIN__)
  else{
    static const char *azDirs[] = {
@@ -49115,7 +49155,7 @@ static BOOL winIsVerbatimPathname(
** pathname into zOut[].  zOut[] will be at least pVfs->mxPathname
** bytes in size.
*/
-
static int winFullPathname(
+
static int winFullPathnameNoMutex(
  sqlite3_vfs *pVfs,            /* Pointer to vfs object */
  const char *zRelative,        /* Possibly relative input path */
  int nFull,                    /* Size of output buffer in bytes */
@@ -49294,6 +49334,19 @@ static int winFullPathname(
  }
#endif
}
+
static int winFullPathname(
+
  sqlite3_vfs *pVfs,            /* Pointer to vfs object */
+
  const char *zRelative,        /* Possibly relative input path */
+
  int nFull,                    /* Size of output buffer in bytes */
+
  char *zFull                   /* Output buffer */
+
){
+
  int rc;
+
  sqlite3_mutex *pMutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR);
+
  sqlite3_mutex_enter(pMutex);
+
  rc = winFullPathnameNoMutex(pVfs, zRelative, nFull, zFull);
+
  sqlite3_mutex_leave(pMutex);
+
  return rc;
+
}

#ifndef SQLITE_OMIT_LOAD_EXTENSION
/*
@@ -59676,6 +59729,7 @@ static int pager_open_journal(Pager *pPager){
  if( rc!=SQLITE_OK ){
    sqlite3BitvecDestroy(pPager->pInJournal);
    pPager->pInJournal = 0;
+
    pPager->journalOff = 0;
  }else{
    assert( pPager->eState==PAGER_WRITER_LOCKED );
    pPager->eState = PAGER_WRITER_CACHEMOD;
@@ -61231,7 +61285,7 @@ SQLITE_PRIVATE int sqlite3PagerGetJournalMode(Pager *pPager){
SQLITE_PRIVATE int sqlite3PagerOkToChangeJournalMode(Pager *pPager){
  assert( assert_pager_state(pPager) );
  if( pPager->eState>=PAGER_WRITER_CACHEMOD ) return 0;
-
  if( NEVER(isOpen(pPager->jfd) && pPager->journalOff>0) ) return 0;
+
  if( isOpen(pPager->jfd) && pPager->journalOff>0 ) return 0;
  return 1;
}

@@ -81035,6 +81089,7 @@ SQLITE_PRIVATE int sqlite3VdbeAddFunctionCall(
  addr = sqlite3VdbeAddOp4(v, eCallCtx ? OP_PureFunc : OP_Function,
                           p1, p2, p3, (char*)pCtx, P4_FUNCCTX);
  sqlite3VdbeChangeP5(v, eCallCtx & NC_SelfRef);
+
  sqlite3MayAbort(pParse);
  return addr;
}

@@ -81370,6 +81425,7 @@ SQLITE_PRIVATE int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){
     || opcode==OP_VDestroy
     || opcode==OP_VCreate
     || opcode==OP_ParseSchema
+
     || opcode==OP_Function || opcode==OP_PureFunc
     || ((opcode==OP_Halt || opcode==OP_HaltIfNull)
      && ((pOp->p1)!=SQLITE_OK && pOp->p2==OE_Abort))
    ){
@@ -132704,6 +132760,7 @@ SQLITE_PRIVATE void sqlite3Pragma(
  **
  */
  case PragTyp_TEMP_STORE_DIRECTORY: {
+
    sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR));
    if( !zRight ){
      returnSingleText(v, sqlite3_temp_directory);
    }else{
@@ -132713,6 +132770,7 @@ SQLITE_PRIVATE void sqlite3Pragma(
        rc = sqlite3OsAccess(db->pVfs, zRight, SQLITE_ACCESS_READWRITE, &res);
        if( rc!=SQLITE_OK || res==0 ){
          sqlite3ErrorMsg(pParse, "not a writable directory");
+
          sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR));
          goto pragma_out;
        }
      }
@@ -132730,6 +132788,7 @@ SQLITE_PRIVATE void sqlite3Pragma(
      }
#endif /* SQLITE_OMIT_WSD */
    }
+
    sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR));
    break;
  }

@@ -132748,6 +132807,7 @@ SQLITE_PRIVATE void sqlite3Pragma(
  **
  */
  case PragTyp_DATA_STORE_DIRECTORY: {
+
    sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR));
    if( !zRight ){
      returnSingleText(v, sqlite3_data_directory);
    }else{
@@ -132757,6 +132817,7 @@ SQLITE_PRIVATE void sqlite3Pragma(
        rc = sqlite3OsAccess(db->pVfs, zRight, SQLITE_ACCESS_READWRITE, &res);
        if( rc!=SQLITE_OK || res==0 ){
          sqlite3ErrorMsg(pParse, "not a writable directory");
+
          sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR));
          goto pragma_out;
        }
      }
@@ -132768,6 +132829,7 @@ SQLITE_PRIVATE void sqlite3Pragma(
      }
#endif /* SQLITE_OMIT_WSD */
    }
+
    sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR));
    break;
  }
#endif
@@ -137213,7 +137275,7 @@ static void generateSortTail(
    if( addrOnce ) sqlite3VdbeJumpHere(v, addrOnce);
    addr = 1 + sqlite3VdbeAddOp2(v, OP_SorterSort, iTab, addrBreak);
    VdbeCoverage(v);
-
    codeOffset(v, p->iOffset, addrContinue);
+
    assert( p->iLimit==0 && p->iOffset==0 );
    sqlite3VdbeAddOp3(v, OP_SorterData, iTab, regSortOut, iSortTab);
    bSeq = 0;
  }else{
@@ -137221,6 +137283,9 @@ static void generateSortTail(
    codeOffset(v, p->iOffset, addrContinue);
    iSortTab = iTab;
    bSeq = 1;
+
    if( p->iOffset>0 ){
+
      sqlite3VdbeAddOp2(v, OP_AddImm, p->iLimit, -1);
+
    }
  }
  for(i=0, iCol=nKey+bSeq-1; i<nColumn; i++){
#ifdef SQLITE_ENABLE_SORTER_REFERENCES
@@ -139213,10 +139278,11 @@ static int multiSelectOrderBy(
  */
  sqlite3VdbeResolveLabel(v, labelEnd);

-
  /* Reassembly the compound query so that it will be freed correctly
+
  /* Reassemble the compound query so that it will be freed correctly
  ** by the calling function */
  if( pSplit->pPrior ){
-
    sqlite3SelectDelete(db, pSplit->pPrior);
+
    sqlite3ParserAddCleanup(pParse,
+
       (void(*)(sqlite3*,void*))sqlite3SelectDelete, pSplit->pPrior);
  }
  pSplit->pPrior = pPrior;
  pPrior->pNext = pSplit;
@@ -140735,6 +140801,7 @@ static Table *isSimpleCount(Select *p, AggInfo *pAggInfo){
   || p->pSrc->nSrc!=1
   || p->pSrc->a[0].pSelect
   || pAggInfo->nFunc!=1
+
   || p->pHaving
  ){
    return 0;
  }
@@ -149783,7 +149850,8 @@ static int codeEqualityTerm(
        }
        sqlite3ExprDelete(db, pX);
      }else{
-
        aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*nEq);
+
        int n = sqlite3ExprVectorSize(pX->pLeft);
+
        aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*MAX(nEq,n));
        eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap, &iTab);
      }
      pX = pExpr;
@@ -181120,7 +181188,7 @@ static int fts3EvalDeferredPhrase(Fts3Cursor *pCsr, Fts3Phrase *pPhrase){
        nDistance = iPrev - nMaxUndeferred;
      }

-
      aOut = (char *)sqlite3_malloc(nPoslist+8);
+
      aOut = (char *)sqlite3Fts3MallocZero(nPoslist+FTS3_BUFFER_PADDING);
      if( !aOut ){
        sqlite3_free(aPoslist);
        return SQLITE_NOMEM;
@@ -204146,7 +204214,7 @@ static int geopolyUpdate(
      sqlite3_free(p);
      nChange = 1;
    }
-
    for(jj=1; jj<pRtree->nAux; jj++){
+
    for(jj=1; jj<nData-2; jj++){
      nChange++;
      sqlite3_bind_value(pUp, jj+2, aData[jj+2]);
    }
@@ -236636,7 +236704,7 @@ static void fts5SourceIdFunc(
){
  assert( nArg==0 );
  UNUSED_PARAM2(nArg, apUnused);
-
  sqlite3_result_text(pCtx, "fts5: 2022-07-21 15:24:47 698edb77537b67c41adc68f9b892db56bcf9a55e00371a61420f3ddd668e6603", -1, SQLITE_TRANSIENT);
+
  sqlite3_result_text(pCtx, "fts5: 2022-09-05 11:02:23 4635f4a69c8c2a8df242b384a992aea71224e39a2ccab42d8c0b0602f1e826e8", -1, SQLITE_TRANSIENT);
}

/*
modified external/sqlite/sqlite3.h
@@ -146,9 +146,9 @@ extern "C" {
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
** [sqlite_version()] and [sqlite_source_id()].
*/
-
#define SQLITE_VERSION        "3.39.2"
-
#define SQLITE_VERSION_NUMBER 3039002
-
#define SQLITE_SOURCE_ID      "2022-07-21 15:24:47 698edb77537b67c41adc68f9b892db56bcf9a55e00371a61420f3ddd668e6603"
+
#define SQLITE_VERSION        "3.39.3"
+
#define SQLITE_VERSION_NUMBER 3039003
+
#define SQLITE_SOURCE_ID      "2022-09-05 11:02:23 4635f4a69c8c2a8df242b384a992aea71224e39a2ccab42d8c0b0602f1e826e8"

/*
** CAPI3REF: Run-Time Library Version Numbers