mirror of
				https://github.com/isar/rusqlite.git
				synced 2025-10-31 05:48:56 +08:00 
			
		
		
		
	Update vendored SQLcipher to 4.5.3 (compatible with SQLite 3.39.4)
This commit is contained in:
		| @@ -1,9 +1,9 @@ | ||||
| /* automatically generated by rust-bindgen 0.61.0 */ | ||||
| /* automatically generated by rust-bindgen 0.63.0 */ | ||||
|  | ||||
| pub const SQLITE_VERSION: &[u8; 7usize] = b"3.39.2\0"; | ||||
| pub const SQLITE_VERSION_NUMBER: i32 = 3039002; | ||||
| pub const SQLITE_VERSION: &[u8; 7usize] = b"3.39.4\0"; | ||||
| pub const SQLITE_VERSION_NUMBER: i32 = 3039004; | ||||
| pub const SQLITE_SOURCE_ID: &[u8; 85usize] = | ||||
|     b"2022-07-21 15:24:47 698edb77537b67c41adc68f9b892db56bcf9a55e00371a61420f3ddd668ealt1\0"; | ||||
|     b"2022-09-29 15:55:41 a29f9949895322123f7c38fbe94c649a9d6e6c9cd0c3b41c96d694552f26alt1\0"; | ||||
| pub const SQLITE_OK: i32 = 0; | ||||
| pub const SQLITE_ERROR: i32 = 1; | ||||
| pub const SQLITE_INTERNAL: i32 = 2; | ||||
|   | ||||
							
								
								
									
										309
									
								
								libsqlite3-sys/sqlcipher/sqlite3.c
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										309
									
								
								libsqlite3-sys/sqlcipher/sqlite3.c
									
									
									
									
										vendored
									
									
								
							| @@ -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.4.  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 698edb77537b67c41adc68f9b892db56bcf9a55e00371a61420f3ddd668ealt1" | ||||
| #define SQLITE_VERSION        "3.39.4" | ||||
| #define SQLITE_VERSION_NUMBER 3039004 | ||||
| #define SQLITE_SOURCE_ID      "2022-09-29 15:55:41 a29f9949895322123f7c38fbe94c649a9d6e6c9cd0c3b41c96d694552f26alt1" | ||||
| 
 | ||||
| /*
 | ||||
| ** CAPI3REF: Run-Time Library Version Numbers | ||||
| @@ -13204,6 +13204,11 @@ struct fts5_api { | ||||
| /************** End of sqlite3.h *********************************************/ | ||||
| /************** 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 | ||||
| @@ -29665,8 +29670,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; | ||||
| @@ -33561,7 +33571,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); | ||||
| @@ -41424,6 +41434,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 | ||||
| @@ -41432,18 +41443,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__) | ||||
| @@ -45582,10 +45601,12 @@ SQLITE_API int sqlite3_win32_set_directory8( | ||||
|   const char *zValue  /* New value for directory being set or reset */ | ||||
| ){ | ||||
|   char **ppDirectory = 0; | ||||
|   int rc; | ||||
| #ifndef SQLITE_OMIT_AUTOINIT | ||||
|   int rc = sqlite3_initialize(); | ||||
|   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 ){ | ||||
| @@ -45600,14 +45621,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; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
| @@ -48381,6 +48407,18 @@ static int winMakeEndInDirSep(int nBuf, char *zBuf){ | ||||
|   return 0; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
| ** 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(). | ||||
| @@ -48417,20 +48455,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[] = { | ||||
| @@ -49219,7 +49260,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 */ | ||||
| @@ -49398,6 +49439,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 | ||||
| /*
 | ||||
| @@ -51742,14 +51796,24 @@ SQLITE_PRIVATE void sqlite3PcacheClearSyncFlags(PCache *pCache){ | ||||
| */ | ||||
| SQLITE_PRIVATE void sqlite3PcacheMove(PgHdr *p, Pgno newPgno){ | ||||
|   PCache *pCache = p->pCache; | ||||
|   sqlite3_pcache_page *pOther; | ||||
|   assert( p->nRef>0 ); | ||||
|   assert( newPgno>0 ); | ||||
|   assert( sqlite3PcachePageSanity(p) ); | ||||
|   pcacheTrace(("%p.MOVE %d -> %d\n",pCache,p->pgno,newPgno)); | ||||
|   pOther = sqlite3GlobalConfig.pcache2.xFetch(pCache->pCache, newPgno, 0); | ||||
|   if( pOther ){ | ||||
|     PgHdr *pXPage = (PgHdr*)pOther->pExtra; | ||||
|     assert( pXPage->nRef==0 ); | ||||
|     pXPage->nRef++; | ||||
|     pCache->nRefSum++; | ||||
|     sqlite3PcacheDrop(pXPage); | ||||
|   } | ||||
|   sqlite3GlobalConfig.pcache2.xRekey(pCache->pCache, p->pPage, p->pgno,newPgno); | ||||
|   p->pgno = newPgno; | ||||
|   if( (p->flags&PGHDR_DIRTY) && (p->flags&PGHDR_NEED_SYNC) ){ | ||||
|     pcacheManageDirtyList(p, PCACHE_DIRTYLIST_FRONT); | ||||
|     assert( sqlite3PcachePageSanity(p) ); | ||||
|   } | ||||
| } | ||||
| 
 | ||||
| @@ -53131,23 +53195,26 @@ static void pcache1Rekey( | ||||
|   PCache1 *pCache = (PCache1 *)p; | ||||
|   PgHdr1 *pPage = (PgHdr1 *)pPg; | ||||
|   PgHdr1 **pp; | ||||
|   unsigned int h; | ||||
|   unsigned int hOld, hNew; | ||||
|   assert( pPage->iKey==iOld ); | ||||
|   assert( pPage->pCache==pCache ); | ||||
|   assert( iOld!=iNew );               /* The page number really is changing */ | ||||
| 
 | ||||
|   pcache1EnterMutex(pCache->pGroup); | ||||
| 
 | ||||
|   h = iOld%pCache->nHash; | ||||
|   pp = &pCache->apHash[h]; | ||||
|   assert( pcache1FetchNoMutex(p, iOld, 0)==pPage ); /* pPg really is iOld */ | ||||
|   hOld = iOld%pCache->nHash; | ||||
|   pp = &pCache->apHash[hOld]; | ||||
|   while( (*pp)!=pPage ){ | ||||
|     pp = &(*pp)->pNext; | ||||
|   } | ||||
|   *pp = pPage->pNext; | ||||
| 
 | ||||
|   h = iNew%pCache->nHash; | ||||
|   assert( pcache1FetchNoMutex(p, iNew, 0)==0 ); /* iNew not in cache */ | ||||
|   hNew = iNew%pCache->nHash; | ||||
|   pPage->iKey = iNew; | ||||
|   pPage->pNext = pCache->apHash[h]; | ||||
|   pCache->apHash[h] = pPage; | ||||
|   pPage->pNext = pCache->apHash[hNew]; | ||||
|   pCache->apHash[hNew] = pPage; | ||||
|   if( iNew>pCache->iMaxKey ){ | ||||
|     pCache->iMaxKey = iNew; | ||||
|   } | ||||
| @@ -59905,6 +59972,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; | ||||
| @@ -61503,7 +61571,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; | ||||
| } | ||||
| 
 | ||||
| @@ -68647,7 +68715,7 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){ | ||||
|           if( iFree2+sz2 > usableSize ) return SQLITE_CORRUPT_PAGE(pPage); | ||||
|           memmove(&data[iFree+sz+sz2], &data[iFree+sz], iFree2-(iFree+sz)); | ||||
|           sz += sz2; | ||||
|         }else if( NEVER(iFree+sz>usableSize) ){ | ||||
|         }else if( iFree+sz>usableSize ){ | ||||
|           return SQLITE_CORRUPT_PAGE(pPage); | ||||
|         } | ||||
| 
 | ||||
| @@ -75003,8 +75071,6 @@ static int balance_nonroot( | ||||
|   Pgno pgno;                   /* Temp var to store a page number in */ | ||||
|   u8 abDone[NB+2];             /* True after i'th new page is populated */ | ||||
|   Pgno aPgno[NB+2];            /* Page numbers of new pages before shuffling */ | ||||
|   Pgno aPgOrder[NB+2];         /* Copy of aPgno[] used for sorting pages */ | ||||
|   u16 aPgFlags[NB+2];          /* flags field of new pages before shuffling */ | ||||
|   CellArray b;                 /* Parsed information on cells being balanced */ | ||||
| 
 | ||||
|   memset(abDone, 0, sizeof(abDone)); | ||||
| @@ -75428,42 +75494,39 @@ static int balance_nonroot( | ||||
|   ** of the table is closer to a linear scan through the file. That in turn | ||||
|   ** helps the operating system to deliver pages from the disk more rapidly. | ||||
|   ** | ||||
|   ** An O(n^2) insertion sort algorithm is used, but since n is never more | ||||
|   ** than (NB+2) (a small constant), that should not be a problem. | ||||
|   ** An O(N*N) sort algorithm is used, but since N is never more than NB+2 | ||||
|   ** (5), that is not a performance concern. | ||||
|   ** | ||||
|   ** When NB==3, this one optimization makes the database about 25% faster | ||||
|   ** for large insertions and deletions. | ||||
|   */ | ||||
|   for(i=0; i<nNew; i++){ | ||||
|     aPgOrder[i] = aPgno[i] = apNew[i]->pgno; | ||||
|     aPgFlags[i] = apNew[i]->pDbPage->flags; | ||||
|     for(j=0; j<i; j++){ | ||||
|       if( NEVER(aPgno[j]==aPgno[i]) ){ | ||||
|         /* This branch is taken if the set of sibling pages somehow contains
 | ||||
|         ** duplicate entries. This can happen if the database is corrupt. | ||||
|         ** It would be simpler to detect this as part of the loop below, but | ||||
|         ** we do the detection here in order to avoid populating the pager | ||||
|         ** cache with two separate objects associated with the same | ||||
|         ** page number.  */ | ||||
|         assert( CORRUPT_DB ); | ||||
|         rc = SQLITE_CORRUPT_BKPT; | ||||
|         goto balance_cleanup; | ||||
|       } | ||||
|     } | ||||
|     aPgno[i] = apNew[i]->pgno; | ||||
|     assert( apNew[i]->pDbPage->flags & PGHDR_WRITEABLE ); | ||||
|     assert( apNew[i]->pDbPage->flags & PGHDR_DIRTY ); | ||||
|   } | ||||
|   for(i=0; i<nNew; i++){ | ||||
|     int iBest = 0;                /* aPgno[] index of page number to use */ | ||||
|     for(j=1; j<nNew; j++){ | ||||
|       if( aPgOrder[j]<aPgOrder[iBest] ) iBest = j; | ||||
|   for(i=0; i<nNew-1; i++){ | ||||
|     int iB = i; | ||||
|     for(j=i+1; j<nNew; j++){ | ||||
|       if( apNew[j]->pgno < apNew[iB]->pgno ) iB = j; | ||||
|     } | ||||
|     pgno = aPgOrder[iBest]; | ||||
|     aPgOrder[iBest] = 0xffffffff; | ||||
|     if( iBest!=i ){ | ||||
|       if( iBest>i ){ | ||||
|         sqlite3PagerRekey(apNew[iBest]->pDbPage, pBt->nPage+iBest+1, 0); | ||||
|       } | ||||
|       sqlite3PagerRekey(apNew[i]->pDbPage, pgno, aPgFlags[iBest]); | ||||
|       apNew[i]->pgno = pgno; | ||||
| 
 | ||||
|     /* If apNew[i] has a page number that is bigger than any of the
 | ||||
|     ** subsequence apNew[i] entries, then swap apNew[i] with the subsequent | ||||
|     ** entry that has the smallest page number (which we know to be | ||||
|     ** entry apNew[iB]). | ||||
|     */ | ||||
|     if( iB!=i ){ | ||||
|       Pgno pgnoA = apNew[i]->pgno; | ||||
|       Pgno pgnoB = apNew[iB]->pgno; | ||||
|       Pgno pgnoTemp = (PENDING_BYTE/pBt->pageSize)+1; | ||||
|       u16 fgA = apNew[i]->pDbPage->flags; | ||||
|       u16 fgB = apNew[iB]->pDbPage->flags; | ||||
|       sqlite3PagerRekey(apNew[i]->pDbPage, pgnoTemp, fgB); | ||||
|       sqlite3PagerRekey(apNew[iB]->pDbPage, pgnoA, fgA); | ||||
|       sqlite3PagerRekey(apNew[i]->pDbPage, pgnoB, fgB); | ||||
|       apNew[i]->pgno = pgnoB; | ||||
|       apNew[iB]->pgno = pgnoA; | ||||
|     } | ||||
|   } | ||||
| 
 | ||||
| @@ -81395,6 +81458,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; | ||||
| } | ||||
| 
 | ||||
| @@ -81730,6 +81794,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)) | ||||
|     ){ | ||||
| @@ -101783,7 +101848,7 @@ SQLITE_API void sqlite3pager_reset(Pager *pPager); | ||||
| #define CIPHER_STR(s) #s | ||||
| 
 | ||||
| #ifndef CIPHER_VERSION_NUMBER | ||||
| #define CIPHER_VERSION_NUMBER 4.5.2 | ||||
| #define CIPHER_VERSION_NUMBER 4.5.3 | ||||
| #endif | ||||
| 
 | ||||
| #ifndef CIPHER_VERSION_BUILD | ||||
| @@ -138008,6 +138073,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{ | ||||
| @@ -138017,6 +138083,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; | ||||
|         } | ||||
|       } | ||||
| @@ -138034,6 +138101,7 @@ SQLITE_PRIVATE void sqlite3Pragma( | ||||
|       } | ||||
| #endif /* SQLITE_OMIT_WSD */ | ||||
|     } | ||||
|     sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); | ||||
|     break; | ||||
|   } | ||||
| 
 | ||||
| @@ -138052,6 +138120,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{ | ||||
| @@ -138061,6 +138130,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; | ||||
|         } | ||||
|       } | ||||
| @@ -138072,6 +138142,7 @@ SQLITE_PRIVATE void sqlite3Pragma( | ||||
|       } | ||||
| #endif /* SQLITE_OMIT_WSD */ | ||||
|     } | ||||
|     sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_TEMPDIR)); | ||||
|     break; | ||||
|   } | ||||
| #endif | ||||
| @@ -142560,7 +142631,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{ | ||||
| @@ -142568,6 +142639,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 | ||||
| @@ -144560,10 +144634,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; | ||||
| @@ -146082,6 +146157,7 @@ static Table *isSimpleCount(Select *p, AggInfo *pAggInfo){ | ||||
|    || p->pSrc->nSrc!=1 | ||||
|    || p->pSrc->a[0].pSelect | ||||
|    || pAggInfo->nFunc!=1 | ||||
|    || p->pHaving | ||||
|   ){ | ||||
|     return 0; | ||||
|   } | ||||
| @@ -149319,6 +149395,23 @@ SQLITE_PRIVATE void sqlite3FinishTrigger( | ||||
|     Vdbe *v; | ||||
|     char *z; | ||||
| 
 | ||||
|     /* If this is a new CREATE TABLE statement, and if shadow tables
 | ||||
|     ** are read-only, and the trigger makes a change to a shadow table, | ||||
|     ** then raise an error - do not allow the trigger to be created. */ | ||||
|     if( sqlite3ReadOnlyShadowTables(db) ){ | ||||
|       TriggerStep *pStep; | ||||
|       for(pStep=pTrig->step_list; pStep; pStep=pStep->pNext){ | ||||
|         if( pStep->zTarget!=0 | ||||
|          && sqlite3ShadowTableName(db, pStep->zTarget) | ||||
|         ){ | ||||
|           sqlite3ErrorMsg(pParse, | ||||
|             "trigger \"%s\" may not write to shadow table \"%s\"", | ||||
|             pTrig->zName, pStep->zTarget); | ||||
|           goto triggerfinish_cleanup; | ||||
|         } | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     /* Make an entry in the sqlite_schema table */ | ||||
|     v = sqlite3GetVdbe(pParse); | ||||
|     if( v==0 ) goto triggerfinish_cleanup; | ||||
| @@ -155143,7 +155236,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; | ||||
| @@ -182345,7 +182439,7 @@ struct Fts3MultiSegReader { | ||||
|   int nAdvance;                   /* How many seg-readers to advance */ | ||||
|   Fts3SegFilter *pFilter;         /* Pointer to filter object */ | ||||
|   char *aBuffer;                  /* Buffer to merge doclists in */ | ||||
|   int nBuffer;                    /* Allocated size of aBuffer[] in bytes */ | ||||
|   i64 nBuffer;                    /* Allocated size of aBuffer[] in bytes */ | ||||
| 
 | ||||
|   int iColFilter;                 /* If >=0, filter for this column */ | ||||
|   int bRestart; | ||||
| @@ -185041,7 +185135,7 @@ static int fts3TermSelectMerge( | ||||
|     ** | ||||
|     ** Similar padding is added in the fts3DoclistOrMerge() function. | ||||
|     */ | ||||
|     pTS->aaOutput[0] = sqlite3_malloc(nDoclist + FTS3_VARINT_MAX + 1); | ||||
|     pTS->aaOutput[0] = sqlite3_malloc64((i64)nDoclist + FTS3_VARINT_MAX + 1); | ||||
|     pTS->anOutput[0] = nDoclist; | ||||
|     if( pTS->aaOutput[0] ){ | ||||
|       memcpy(pTS->aaOutput[0], aDoclist, nDoclist); | ||||
| @@ -186529,7 +186623,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; | ||||
| @@ -186898,7 +186992,7 @@ static int fts3EvalIncrPhraseNext( | ||||
|       if( bEof==0 ){ | ||||
|         int nList = 0; | ||||
|         int nByte = a[p->nToken-1].nList; | ||||
|         char *aDoclist = sqlite3_malloc(nByte+FTS3_BUFFER_PADDING); | ||||
|         char *aDoclist = sqlite3_malloc64((i64)nByte+FTS3_BUFFER_PADDING); | ||||
|         if( !aDoclist ) return SQLITE_NOMEM; | ||||
|         memcpy(aDoclist, a[p->nToken-1].pList, nByte+1); | ||||
|         memset(&aDoclist[nByte], 0, FTS3_BUFFER_PADDING); | ||||
| @@ -191134,7 +191228,7 @@ static int porterNext( | ||||
|       if( n>c->nAllocated ){ | ||||
|         char *pNew; | ||||
|         c->nAllocated = n+20; | ||||
|         pNew = sqlite3_realloc(c->zToken, c->nAllocated); | ||||
|         pNew = sqlite3_realloc64(c->zToken, c->nAllocated); | ||||
|         if( !pNew ) return SQLITE_NOMEM; | ||||
|         c->zToken = pNew; | ||||
|       } | ||||
| @@ -191886,7 +191980,7 @@ static int simpleNext( | ||||
|       if( n>c->nTokenAllocated ){ | ||||
|         char *pNew; | ||||
|         c->nTokenAllocated = n+20; | ||||
|         pNew = sqlite3_realloc(c->pToken, c->nTokenAllocated); | ||||
|         pNew = sqlite3_realloc64(c->pToken, c->nTokenAllocated); | ||||
|         if( !pNew ) return SQLITE_NOMEM; | ||||
|         c->pToken = pNew; | ||||
|       } | ||||
| @@ -193048,7 +193142,7 @@ static int fts3PendingListAppendVarint( | ||||
| 
 | ||||
|   /* Allocate or grow the PendingList as required. */ | ||||
|   if( !p ){ | ||||
|     p = sqlite3_malloc(sizeof(*p) + 100); | ||||
|     p = sqlite3_malloc64(sizeof(*p) + 100); | ||||
|     if( !p ){ | ||||
|       return SQLITE_NOMEM; | ||||
|     } | ||||
| @@ -193057,14 +193151,14 @@ static int fts3PendingListAppendVarint( | ||||
|     p->nData = 0; | ||||
|   } | ||||
|   else if( p->nData+FTS3_VARINT_MAX+1>p->nSpace ){ | ||||
|     int nNew = p->nSpace * 2; | ||||
|     p = sqlite3_realloc(p, sizeof(*p) + nNew); | ||||
|     i64 nNew = p->nSpace * 2; | ||||
|     p = sqlite3_realloc64(p, sizeof(*p) + nNew); | ||||
|     if( !p ){ | ||||
|       sqlite3_free(*pp); | ||||
|       *pp = 0; | ||||
|       return SQLITE_NOMEM; | ||||
|     } | ||||
|     p->nSpace = nNew; | ||||
|     p->nSpace = (int)nNew; | ||||
|     p->aData = (char *)&p[1]; | ||||
|   } | ||||
| 
 | ||||
| @@ -193621,7 +193715,7 @@ SQLITE_PRIVATE int sqlite3Fts3ReadBlock( | ||||
|     int nByte = sqlite3_blob_bytes(p->pSegments); | ||||
|     *pnBlob = nByte; | ||||
|     if( paBlob ){ | ||||
|       char *aByte = sqlite3_malloc(nByte + FTS3_NODE_PADDING); | ||||
|       char *aByte = sqlite3_malloc64((i64)nByte + FTS3_NODE_PADDING); | ||||
|       if( !aByte ){ | ||||
|         rc = SQLITE_NOMEM; | ||||
|       }else{ | ||||
| @@ -193738,7 +193832,7 @@ static int fts3SegReaderNext( | ||||
|         int nTerm = fts3HashKeysize(pElem); | ||||
|         if( (nTerm+1)>pReader->nTermAlloc ){ | ||||
|           sqlite3_free(pReader->zTerm); | ||||
|           pReader->zTerm = (char*)sqlite3_malloc((nTerm+1)*2); | ||||
|           pReader->zTerm = (char*)sqlite3_malloc64(((i64)nTerm+1)*2); | ||||
|           if( !pReader->zTerm ) return SQLITE_NOMEM; | ||||
|           pReader->nTermAlloc = (nTerm+1)*2; | ||||
|         } | ||||
| @@ -193746,7 +193840,7 @@ static int fts3SegReaderNext( | ||||
|         pReader->zTerm[nTerm] = '\0'; | ||||
|         pReader->nTerm = nTerm; | ||||
| 
 | ||||
|         aCopy = (char*)sqlite3_malloc(nCopy); | ||||
|         aCopy = (char*)sqlite3_malloc64(nCopy); | ||||
|         if( !aCopy ) return SQLITE_NOMEM; | ||||
|         memcpy(aCopy, pList->aData, nCopy); | ||||
|         pReader->nNode = pReader->nDoclist = nCopy; | ||||
| @@ -194033,7 +194127,7 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderNew( | ||||
|     nExtra = nRoot + FTS3_NODE_PADDING; | ||||
|   } | ||||
| 
 | ||||
|   pReader = (Fts3SegReader *)sqlite3_malloc(sizeof(Fts3SegReader) + nExtra); | ||||
|   pReader = (Fts3SegReader *)sqlite3_malloc64(sizeof(Fts3SegReader) + nExtra); | ||||
|   if( !pReader ){ | ||||
|     return SQLITE_NOMEM; | ||||
|   } | ||||
| @@ -194125,7 +194219,7 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderPending( | ||||
|         if( nElem==nAlloc ){ | ||||
|           Fts3HashElem **aElem2; | ||||
|           nAlloc += 16; | ||||
|           aElem2 = (Fts3HashElem **)sqlite3_realloc( | ||||
|           aElem2 = (Fts3HashElem **)sqlite3_realloc64( | ||||
|               aElem, nAlloc*sizeof(Fts3HashElem *) | ||||
|           ); | ||||
|           if( !aElem2 ){ | ||||
| @@ -194459,7 +194553,7 @@ static int fts3NodeAddTerm( | ||||
|         ** this is not expected to be a serious problem. | ||||
|         */ | ||||
|         assert( pTree->aData==(char *)&pTree[1] ); | ||||
|         pTree->aData = (char *)sqlite3_malloc(nReq); | ||||
|         pTree->aData = (char *)sqlite3_malloc64(nReq); | ||||
|         if( !pTree->aData ){ | ||||
|           return SQLITE_NOMEM; | ||||
|         } | ||||
| @@ -194477,7 +194571,7 @@ static int fts3NodeAddTerm( | ||||
| 
 | ||||
|       if( isCopyTerm ){ | ||||
|         if( pTree->nMalloc<nTerm ){ | ||||
|           char *zNew = sqlite3_realloc(pTree->zMalloc, nTerm*2); | ||||
|           char *zNew = sqlite3_realloc64(pTree->zMalloc, (i64)nTerm*2); | ||||
|           if( !zNew ){ | ||||
|             return SQLITE_NOMEM; | ||||
|           } | ||||
| @@ -194503,7 +194597,7 @@ static int fts3NodeAddTerm( | ||||
|   ** now. Instead, the term is inserted into the parent of pTree. If pTree | ||||
|   ** has no parent, one is created here. | ||||
|   */ | ||||
|   pNew = (SegmentNode *)sqlite3_malloc(sizeof(SegmentNode) + p->nNodeSize); | ||||
|   pNew = (SegmentNode *)sqlite3_malloc64(sizeof(SegmentNode) + p->nNodeSize); | ||||
|   if( !pNew ){ | ||||
|     return SQLITE_NOMEM; | ||||
|   } | ||||
| @@ -194641,7 +194735,7 @@ static int fts3SegWriterAdd( | ||||
| ){ | ||||
|   int nPrefix;                    /* Size of term prefix in bytes */ | ||||
|   int nSuffix;                    /* Size of term suffix in bytes */ | ||||
|   int nReq;                       /* Number of bytes required on leaf page */ | ||||
|   i64 nReq;                       /* Number of bytes required on leaf page */ | ||||
|   int nData; | ||||
|   SegmentWriter *pWriter = *ppWriter; | ||||
| 
 | ||||
| @@ -194650,13 +194744,13 @@ static int fts3SegWriterAdd( | ||||
|     sqlite3_stmt *pStmt; | ||||
| 
 | ||||
|     /* Allocate the SegmentWriter structure */ | ||||
|     pWriter = (SegmentWriter *)sqlite3_malloc(sizeof(SegmentWriter)); | ||||
|     pWriter = (SegmentWriter *)sqlite3_malloc64(sizeof(SegmentWriter)); | ||||
|     if( !pWriter ) return SQLITE_NOMEM; | ||||
|     memset(pWriter, 0, sizeof(SegmentWriter)); | ||||
|     *ppWriter = pWriter; | ||||
| 
 | ||||
|     /* Allocate a buffer in which to accumulate data */ | ||||
|     pWriter->aData = (char *)sqlite3_malloc(p->nNodeSize); | ||||
|     pWriter->aData = (char *)sqlite3_malloc64(p->nNodeSize); | ||||
|     if( !pWriter->aData ) return SQLITE_NOMEM; | ||||
|     pWriter->nSize = p->nNodeSize; | ||||
| 
 | ||||
| @@ -194731,7 +194825,7 @@ static int fts3SegWriterAdd( | ||||
|   ** the buffer to make it large enough. | ||||
|   */ | ||||
|   if( nReq>pWriter->nSize ){ | ||||
|     char *aNew = sqlite3_realloc(pWriter->aData, nReq); | ||||
|     char *aNew = sqlite3_realloc64(pWriter->aData, nReq); | ||||
|     if( !aNew ) return SQLITE_NOMEM; | ||||
|     pWriter->aData = aNew; | ||||
|     pWriter->nSize = nReq; | ||||
| @@ -194756,7 +194850,7 @@ static int fts3SegWriterAdd( | ||||
|   */ | ||||
|   if( isCopyTerm ){ | ||||
|     if( nTerm>pWriter->nMalloc ){ | ||||
|       char *zNew = sqlite3_realloc(pWriter->zMalloc, nTerm*2); | ||||
|       char *zNew = sqlite3_realloc64(pWriter->zMalloc, (i64)nTerm*2); | ||||
|       if( !zNew ){ | ||||
|         return SQLITE_NOMEM; | ||||
|       } | ||||
| @@ -195064,12 +195158,12 @@ static void fts3ColumnFilter( | ||||
| static int fts3MsrBufferData( | ||||
|   Fts3MultiSegReader *pMsr,       /* Multi-segment-reader handle */ | ||||
|   char *pList, | ||||
|   int nList | ||||
|   i64 nList | ||||
| ){ | ||||
|   if( nList>pMsr->nBuffer ){ | ||||
|     char *pNew; | ||||
|     pMsr->nBuffer = nList*2; | ||||
|     pNew = (char *)sqlite3_realloc(pMsr->aBuffer, pMsr->nBuffer); | ||||
|     pNew = (char *)sqlite3_realloc64(pMsr->aBuffer, pMsr->nBuffer); | ||||
|     if( !pNew ) return SQLITE_NOMEM; | ||||
|     pMsr->aBuffer = pNew; | ||||
|   } | ||||
| @@ -195125,7 +195219,7 @@ SQLITE_PRIVATE int sqlite3Fts3MsrIncrNext( | ||||
|       fts3SegReaderSort(pMsr->apSegment, nMerge, j, xCmp); | ||||
| 
 | ||||
|       if( nList>0 && fts3SegReaderIsPending(apSegment[0]) ){ | ||||
|         rc = fts3MsrBufferData(pMsr, pList, nList+1); | ||||
|         rc = fts3MsrBufferData(pMsr, pList, (i64)nList+1); | ||||
|         if( rc!=SQLITE_OK ) return rc; | ||||
|         assert( (pMsr->aBuffer[nList] & 0xFE)==0x00 ); | ||||
|         pList = pMsr->aBuffer; | ||||
| @@ -195262,11 +195356,11 @@ SQLITE_PRIVATE int sqlite3Fts3MsrIncrRestart(Fts3MultiSegReader *pCsr){ | ||||
|   return SQLITE_OK; | ||||
| } | ||||
| 
 | ||||
| static int fts3GrowSegReaderBuffer(Fts3MultiSegReader *pCsr, int nReq){ | ||||
| static int fts3GrowSegReaderBuffer(Fts3MultiSegReader *pCsr, i64 nReq){ | ||||
|   if( nReq>pCsr->nBuffer ){ | ||||
|     char *aNew; | ||||
|     pCsr->nBuffer = nReq*2; | ||||
|     aNew = sqlite3_realloc(pCsr->aBuffer, pCsr->nBuffer); | ||||
|     aNew = sqlite3_realloc64(pCsr->aBuffer, pCsr->nBuffer); | ||||
|     if( !aNew ){ | ||||
|       return SQLITE_NOMEM; | ||||
|     } | ||||
| @@ -195357,7 +195451,8 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderStep( | ||||
|     ){ | ||||
|       pCsr->nDoclist = apSegment[0]->nDoclist; | ||||
|       if( fts3SegReaderIsPending(apSegment[0]) ){ | ||||
|         rc = fts3MsrBufferData(pCsr, apSegment[0]->aDoclist, pCsr->nDoclist); | ||||
|         rc = fts3MsrBufferData(pCsr, apSegment[0]->aDoclist, | ||||
|                                (i64)pCsr->nDoclist); | ||||
|         pCsr->aDoclist = pCsr->aBuffer; | ||||
|       }else{ | ||||
|         pCsr->aDoclist = apSegment[0]->aDoclist; | ||||
| @@ -195410,7 +195505,8 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderStep( | ||||
| 
 | ||||
|           nByte = sqlite3Fts3VarintLen(iDelta) + (isRequirePos?nList+1:0); | ||||
| 
 | ||||
|           rc = fts3GrowSegReaderBuffer(pCsr, nByte+nDoclist+FTS3_NODE_PADDING); | ||||
|           rc = fts3GrowSegReaderBuffer(pCsr, | ||||
|                                    (i64)nByte+nDoclist+FTS3_NODE_PADDING); | ||||
|           if( rc ) return rc; | ||||
| 
 | ||||
|           if( isFirst ){ | ||||
| @@ -195436,7 +195532,7 @@ SQLITE_PRIVATE int sqlite3Fts3SegReaderStep( | ||||
|         fts3SegReaderSort(apSegment, nMerge, j, xCmp); | ||||
|       } | ||||
|       if( nDoclist>0 ){ | ||||
|         rc = fts3GrowSegReaderBuffer(pCsr, nDoclist+FTS3_NODE_PADDING); | ||||
|         rc = fts3GrowSegReaderBuffer(pCsr, (i64)nDoclist+FTS3_NODE_PADDING); | ||||
|         if( rc ) return rc; | ||||
|         memset(&pCsr->aBuffer[nDoclist], 0, FTS3_NODE_PADDING); | ||||
|         pCsr->aDoclist = pCsr->aBuffer; | ||||
| @@ -196149,7 +196245,7 @@ struct NodeReader { | ||||
| static void blobGrowBuffer(Blob *pBlob, int nMin, int *pRc){ | ||||
|   if( *pRc==SQLITE_OK && nMin>pBlob->nAlloc ){ | ||||
|     int nAlloc = nMin; | ||||
|     char *a = (char *)sqlite3_realloc(pBlob->a, nAlloc); | ||||
|     char *a = (char *)sqlite3_realloc64(pBlob->a, nAlloc); | ||||
|     if( a ){ | ||||
|       pBlob->nAlloc = nAlloc; | ||||
|       pBlob->a = a; | ||||
| @@ -196946,7 +197042,7 @@ static int fts3RepackSegdirLevel( | ||||
|       if( nIdx>=nAlloc ){ | ||||
|         int *aNew; | ||||
|         nAlloc += 16; | ||||
|         aNew = sqlite3_realloc(aIdx, nAlloc*sizeof(int)); | ||||
|         aNew = sqlite3_realloc64(aIdx, nAlloc*sizeof(int)); | ||||
|         if( !aNew ){ | ||||
|           rc = SQLITE_NOMEM; | ||||
|           break; | ||||
| @@ -197320,7 +197416,7 @@ SQLITE_PRIVATE int sqlite3Fts3Incrmerge(Fts3Table *p, int nMerge, int nMin){ | ||||
| 
 | ||||
|   /* Allocate space for the cursor, filter and writer objects */ | ||||
|   const int nAlloc = sizeof(*pCsr) + sizeof(*pFilter) + sizeof(*pWriter); | ||||
|   pWriter = (IncrmergeWriter *)sqlite3_malloc(nAlloc); | ||||
|   pWriter = (IncrmergeWriter *)sqlite3_malloc64(nAlloc); | ||||
|   if( !pWriter ) return SQLITE_NOMEM; | ||||
|   pFilter = (Fts3SegFilter *)&pWriter[1]; | ||||
|   pCsr = (Fts3MultiSegReader *)&pFilter[1]; | ||||
| @@ -197956,7 +198052,7 @@ SQLITE_PRIVATE int sqlite3Fts3DeferredTokenList( | ||||
|     return SQLITE_OK; | ||||
|   } | ||||
| 
 | ||||
|   pRet = (char *)sqlite3_malloc(p->pList->nData); | ||||
|   pRet = (char *)sqlite3_malloc64(p->pList->nData); | ||||
|   if( !pRet ) return SQLITE_NOMEM; | ||||
| 
 | ||||
|   nSkip = sqlite3Fts3GetVarint(p->pList->aData, &dummy); | ||||
| @@ -197976,7 +198072,7 @@ SQLITE_PRIVATE int sqlite3Fts3DeferToken( | ||||
|   int iCol                        /* Column that token must appear in (or -1) */ | ||||
| ){ | ||||
|   Fts3DeferredToken *pDeferred; | ||||
|   pDeferred = sqlite3_malloc(sizeof(*pDeferred)); | ||||
|   pDeferred = sqlite3_malloc64(sizeof(*pDeferred)); | ||||
|   if( !pDeferred ){ | ||||
|     return SQLITE_NOMEM; | ||||
|   } | ||||
| @@ -209555,7 +209651,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]); | ||||
|     } | ||||
| @@ -210158,8 +210254,9 @@ static void icuRegexpFunc(sqlite3_context *p, int nArg, sqlite3_value **apArg){ | ||||
| 
 | ||||
|     if( U_SUCCESS(status) ){ | ||||
|       sqlite3_set_auxdata(p, 0, pExpr, icuRegexpDelete); | ||||
|     }else{ | ||||
|       assert(!pExpr); | ||||
|       pExpr = sqlite3_get_auxdata(p, 0); | ||||
|     } | ||||
|     if( !pExpr ){ | ||||
|       icuFunctionError(p, "uregex_open", status); | ||||
|       return; | ||||
|     } | ||||
| @@ -242045,7 +242142,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-29 15:55:41 a29f9949895322123f7c38fbe94c649a9d6e6c9cd0c3b41c96d694552f26b309", -1, SQLITE_TRANSIENT); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|   | ||||
							
								
								
									
										6
									
								
								libsqlite3-sys/sqlcipher/sqlite3.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								libsqlite3-sys/sqlcipher/sqlite3.h
									
									
									
									
										vendored
									
									
								
							| @@ -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 698edb77537b67c41adc68f9b892db56bcf9a55e00371a61420f3ddd668ealt1" | ||||
| #define SQLITE_VERSION        "3.39.4" | ||||
| #define SQLITE_VERSION_NUMBER 3039004 | ||||
| #define SQLITE_SOURCE_ID      "2022-09-29 15:55:41 a29f9949895322123f7c38fbe94c649a9d6e6c9cd0c3b41c96d694552f26alt1" | ||||
|  | ||||
| /* | ||||
| ** CAPI3REF: Run-Time Library Version Numbers | ||||
|   | ||||
| @@ -8,7 +8,7 @@ mkdir -p "$SCRIPT_DIR/../target" "$SCRIPT_DIR/sqlcipher" | ||||
| export SQLCIPHER_LIB_DIR="$SCRIPT_DIR/sqlcipher" | ||||
| export SQLCIPHER_INCLUDE_DIR="$SQLCIPHER_LIB_DIR" | ||||
|  | ||||
| SQLCIPHER_VERSION="4.5.2" | ||||
| SQLCIPHER_VERSION="4.5.3" | ||||
| # Download and generate sqlcipher amalgamation | ||||
| mkdir -p $SCRIPT_DIR/sqlcipher.src | ||||
| [ -e "v${SQLCIPHER_VERSION}.tar.gz" ] || curl -sfL -O "https://github.com/sqlcipher/sqlcipher/archive/v${SQLCIPHER_VERSION}.tar.gz" | ||||
|   | ||||
		Reference in New Issue
	
	Block a user