From c5b63f67f094e1f631e5a6791333ee364b1fc065 Mon Sep 17 00:00:00 2001 From: gwenn Date: Mon, 12 Sep 2022 16:48:20 +0000 Subject: [PATCH] Upgrade SQLite bundled version to 3.39.3 --- .../sqlite3/bindgen_bundled_version.rs | 538 +++++++++++++++++- libsqlite3-sys/sqlite3/sqlite3.c | 126 +++- libsqlite3-sys/sqlite3/sqlite3.h | 6 +- libsqlite3-sys/upgrade.sh | 2 +- 4 files changed, 636 insertions(+), 36 deletions(-) diff --git a/libsqlite3-sys/sqlite3/bindgen_bundled_version.rs b/libsqlite3-sys/sqlite3/bindgen_bundled_version.rs index 3fc406c..65ec9fe 100644 --- a/libsqlite3-sys/sqlite3/bindgen_bundled_version.rs +++ b/libsqlite3-sys/sqlite3/bindgen_bundled_version.rs @@ -1,9 +1,9 @@ /* automatically generated by rust-bindgen 0.60.1 */ -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.3\0"; +pub const SQLITE_VERSION_NUMBER: i32 = 3039003; pub const SQLITE_SOURCE_ID: &[u8; 85usize] = - b"2022-07-21 15:24:47 698edb77537b67c41adc68f9b892db56bcf9a55e00371a61420f3ddd668e6603\0"; + b"2022-09-05 11:02:23 4635f4a69c8c2a8df242b384a992aea71224e39a2ccab42d8c0b0602f1e826e8\0"; pub const SQLITE_OK: i32 = 0; pub const SQLITE_ERROR: i32 = 1; pub const SQLITE_INTERNAL: i32 = 2; @@ -454,6 +454,20 @@ pub const SQLITE_DESERIALIZE_READONLY: i32 = 4; pub const NOT_WITHIN: i32 = 0; pub const PARTLY_WITHIN: i32 = 1; pub const FULLY_WITHIN: i32 = 2; +pub const __SQLITESESSION_H_: i32 = 1; +pub const SQLITE_SESSION_OBJCONFIG_SIZE: i32 = 1; +pub const SQLITE_CHANGESETSTART_INVERT: i32 = 2; +pub const SQLITE_CHANGESETAPPLY_NOSAVEPOINT: i32 = 1; +pub const SQLITE_CHANGESETAPPLY_INVERT: i32 = 2; +pub const SQLITE_CHANGESET_DATA: i32 = 1; +pub const SQLITE_CHANGESET_NOTFOUND: i32 = 2; +pub const SQLITE_CHANGESET_CONFLICT: i32 = 3; +pub const SQLITE_CHANGESET_CONSTRAINT: i32 = 4; +pub const SQLITE_CHANGESET_FOREIGN_KEY: i32 = 5; +pub const SQLITE_CHANGESET_OMIT: i32 = 0; +pub const SQLITE_CHANGESET_REPLACE: i32 = 1; +pub const SQLITE_CHANGESET_ABORT: i32 = 2; +pub const SQLITE_SESSION_CONFIG_STRMSIZE: i32 = 1; pub const FTS5_TOKENIZE_QUERY: i32 = 1; pub const FTS5_TOKENIZE_PREFIX: i32 = 2; pub const FTS5_TOKENIZE_DOCUMENT: i32 = 4; @@ -2704,6 +2718,46 @@ extern "C" { extern "C" { pub fn sqlite3_db_cacheflush(arg1: *mut sqlite3) -> ::std::os::raw::c_int; } +extern "C" { + pub fn sqlite3_preupdate_hook( + db: *mut sqlite3, + xPreUpdate: ::std::option::Option< + unsafe extern "C" fn( + pCtx: *mut ::std::os::raw::c_void, + db: *mut sqlite3, + op: ::std::os::raw::c_int, + zDb: *const ::std::os::raw::c_char, + zName: *const ::std::os::raw::c_char, + iKey1: sqlite3_int64, + iKey2: sqlite3_int64, + ), + >, + arg1: *mut ::std::os::raw::c_void, + ) -> *mut ::std::os::raw::c_void; +} +extern "C" { + pub fn sqlite3_preupdate_old( + arg1: *mut sqlite3, + arg2: ::std::os::raw::c_int, + arg3: *mut *mut sqlite3_value, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3_preupdate_count(arg1: *mut sqlite3) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3_preupdate_depth(arg1: *mut sqlite3) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3_preupdate_new( + arg1: *mut sqlite3, + arg2: ::std::os::raw::c_int, + arg3: *mut *mut sqlite3_value, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3_preupdate_blobwrite(arg1: *mut sqlite3) -> ::std::os::raw::c_int; +} extern "C" { pub fn sqlite3_system_errno(arg1: *mut sqlite3) -> ::std::os::raw::c_int; } @@ -2817,6 +2871,484 @@ pub struct sqlite3_rtree_query_info { } #[repr(C)] #[derive(Debug, Copy, Clone)] +pub struct sqlite3_session { + _unused: [u8; 0], +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct sqlite3_changeset_iter { + _unused: [u8; 0], +} +extern "C" { + pub fn sqlite3session_create( + db: *mut sqlite3, + zDb: *const ::std::os::raw::c_char, + ppSession: *mut *mut sqlite3_session, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3session_delete(pSession: *mut sqlite3_session); +} +extern "C" { + pub fn sqlite3session_object_config( + arg1: *mut sqlite3_session, + op: ::std::os::raw::c_int, + pArg: *mut ::std::os::raw::c_void, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3session_enable( + pSession: *mut sqlite3_session, + bEnable: ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3session_indirect( + pSession: *mut sqlite3_session, + bIndirect: ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3session_attach( + pSession: *mut sqlite3_session, + zTab: *const ::std::os::raw::c_char, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3session_table_filter( + pSession: *mut sqlite3_session, + xFilter: ::std::option::Option< + unsafe extern "C" fn( + pCtx: *mut ::std::os::raw::c_void, + zTab: *const ::std::os::raw::c_char, + ) -> ::std::os::raw::c_int, + >, + pCtx: *mut ::std::os::raw::c_void, + ); +} +extern "C" { + pub fn sqlite3session_changeset( + pSession: *mut sqlite3_session, + pnChangeset: *mut ::std::os::raw::c_int, + ppChangeset: *mut *mut ::std::os::raw::c_void, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3session_changeset_size(pSession: *mut sqlite3_session) -> sqlite3_int64; +} +extern "C" { + pub fn sqlite3session_diff( + pSession: *mut sqlite3_session, + zFromDb: *const ::std::os::raw::c_char, + zTbl: *const ::std::os::raw::c_char, + pzErrMsg: *mut *mut ::std::os::raw::c_char, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3session_patchset( + pSession: *mut sqlite3_session, + pnPatchset: *mut ::std::os::raw::c_int, + ppPatchset: *mut *mut ::std::os::raw::c_void, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3session_isempty(pSession: *mut sqlite3_session) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3session_memory_used(pSession: *mut sqlite3_session) -> sqlite3_int64; +} +extern "C" { + pub fn sqlite3changeset_start( + pp: *mut *mut sqlite3_changeset_iter, + nChangeset: ::std::os::raw::c_int, + pChangeset: *mut ::std::os::raw::c_void, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3changeset_start_v2( + pp: *mut *mut sqlite3_changeset_iter, + nChangeset: ::std::os::raw::c_int, + pChangeset: *mut ::std::os::raw::c_void, + flags: ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3changeset_next(pIter: *mut sqlite3_changeset_iter) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3changeset_op( + pIter: *mut sqlite3_changeset_iter, + pzTab: *mut *const ::std::os::raw::c_char, + pnCol: *mut ::std::os::raw::c_int, + pOp: *mut ::std::os::raw::c_int, + pbIndirect: *mut ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3changeset_pk( + pIter: *mut sqlite3_changeset_iter, + pabPK: *mut *mut ::std::os::raw::c_uchar, + pnCol: *mut ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3changeset_old( + pIter: *mut sqlite3_changeset_iter, + iVal: ::std::os::raw::c_int, + ppValue: *mut *mut sqlite3_value, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3changeset_new( + pIter: *mut sqlite3_changeset_iter, + iVal: ::std::os::raw::c_int, + ppValue: *mut *mut sqlite3_value, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3changeset_conflict( + pIter: *mut sqlite3_changeset_iter, + iVal: ::std::os::raw::c_int, + ppValue: *mut *mut sqlite3_value, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3changeset_fk_conflicts( + pIter: *mut sqlite3_changeset_iter, + pnOut: *mut ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3changeset_finalize(pIter: *mut sqlite3_changeset_iter) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3changeset_invert( + nIn: ::std::os::raw::c_int, + pIn: *const ::std::os::raw::c_void, + pnOut: *mut ::std::os::raw::c_int, + ppOut: *mut *mut ::std::os::raw::c_void, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3changeset_concat( + nA: ::std::os::raw::c_int, + pA: *mut ::std::os::raw::c_void, + nB: ::std::os::raw::c_int, + pB: *mut ::std::os::raw::c_void, + pnOut: *mut ::std::os::raw::c_int, + ppOut: *mut *mut ::std::os::raw::c_void, + ) -> ::std::os::raw::c_int; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct sqlite3_changegroup { + _unused: [u8; 0], +} +extern "C" { + pub fn sqlite3changegroup_new(pp: *mut *mut sqlite3_changegroup) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3changegroup_add( + arg1: *mut sqlite3_changegroup, + nData: ::std::os::raw::c_int, + pData: *mut ::std::os::raw::c_void, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3changegroup_output( + arg1: *mut sqlite3_changegroup, + pnData: *mut ::std::os::raw::c_int, + ppData: *mut *mut ::std::os::raw::c_void, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3changegroup_delete(arg1: *mut sqlite3_changegroup); +} +extern "C" { + pub fn sqlite3changeset_apply( + db: *mut sqlite3, + nChangeset: ::std::os::raw::c_int, + pChangeset: *mut ::std::os::raw::c_void, + xFilter: ::std::option::Option< + unsafe extern "C" fn( + pCtx: *mut ::std::os::raw::c_void, + zTab: *const ::std::os::raw::c_char, + ) -> ::std::os::raw::c_int, + >, + xConflict: ::std::option::Option< + unsafe extern "C" fn( + pCtx: *mut ::std::os::raw::c_void, + eConflict: ::std::os::raw::c_int, + p: *mut sqlite3_changeset_iter, + ) -> ::std::os::raw::c_int, + >, + pCtx: *mut ::std::os::raw::c_void, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3changeset_apply_v2( + db: *mut sqlite3, + nChangeset: ::std::os::raw::c_int, + pChangeset: *mut ::std::os::raw::c_void, + xFilter: ::std::option::Option< + unsafe extern "C" fn( + pCtx: *mut ::std::os::raw::c_void, + zTab: *const ::std::os::raw::c_char, + ) -> ::std::os::raw::c_int, + >, + xConflict: ::std::option::Option< + unsafe extern "C" fn( + pCtx: *mut ::std::os::raw::c_void, + eConflict: ::std::os::raw::c_int, + p: *mut sqlite3_changeset_iter, + ) -> ::std::os::raw::c_int, + >, + pCtx: *mut ::std::os::raw::c_void, + ppRebase: *mut *mut ::std::os::raw::c_void, + pnRebase: *mut ::std::os::raw::c_int, + flags: ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] +pub struct sqlite3_rebaser { + _unused: [u8; 0], +} +extern "C" { + pub fn sqlite3rebaser_create(ppNew: *mut *mut sqlite3_rebaser) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3rebaser_configure( + arg1: *mut sqlite3_rebaser, + nRebase: ::std::os::raw::c_int, + pRebase: *const ::std::os::raw::c_void, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3rebaser_rebase( + arg1: *mut sqlite3_rebaser, + nIn: ::std::os::raw::c_int, + pIn: *const ::std::os::raw::c_void, + pnOut: *mut ::std::os::raw::c_int, + ppOut: *mut *mut ::std::os::raw::c_void, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3rebaser_delete(p: *mut sqlite3_rebaser); +} +extern "C" { + pub fn sqlite3changeset_apply_strm( + db: *mut sqlite3, + xInput: ::std::option::Option< + unsafe extern "C" fn( + pIn: *mut ::std::os::raw::c_void, + pData: *mut ::std::os::raw::c_void, + pnData: *mut ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int, + >, + pIn: *mut ::std::os::raw::c_void, + xFilter: ::std::option::Option< + unsafe extern "C" fn( + pCtx: *mut ::std::os::raw::c_void, + zTab: *const ::std::os::raw::c_char, + ) -> ::std::os::raw::c_int, + >, + xConflict: ::std::option::Option< + unsafe extern "C" fn( + pCtx: *mut ::std::os::raw::c_void, + eConflict: ::std::os::raw::c_int, + p: *mut sqlite3_changeset_iter, + ) -> ::std::os::raw::c_int, + >, + pCtx: *mut ::std::os::raw::c_void, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3changeset_apply_v2_strm( + db: *mut sqlite3, + xInput: ::std::option::Option< + unsafe extern "C" fn( + pIn: *mut ::std::os::raw::c_void, + pData: *mut ::std::os::raw::c_void, + pnData: *mut ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int, + >, + pIn: *mut ::std::os::raw::c_void, + xFilter: ::std::option::Option< + unsafe extern "C" fn( + pCtx: *mut ::std::os::raw::c_void, + zTab: *const ::std::os::raw::c_char, + ) -> ::std::os::raw::c_int, + >, + xConflict: ::std::option::Option< + unsafe extern "C" fn( + pCtx: *mut ::std::os::raw::c_void, + eConflict: ::std::os::raw::c_int, + p: *mut sqlite3_changeset_iter, + ) -> ::std::os::raw::c_int, + >, + pCtx: *mut ::std::os::raw::c_void, + ppRebase: *mut *mut ::std::os::raw::c_void, + pnRebase: *mut ::std::os::raw::c_int, + flags: ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3changeset_concat_strm( + xInputA: ::std::option::Option< + unsafe extern "C" fn( + pIn: *mut ::std::os::raw::c_void, + pData: *mut ::std::os::raw::c_void, + pnData: *mut ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int, + >, + pInA: *mut ::std::os::raw::c_void, + xInputB: ::std::option::Option< + unsafe extern "C" fn( + pIn: *mut ::std::os::raw::c_void, + pData: *mut ::std::os::raw::c_void, + pnData: *mut ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int, + >, + pInB: *mut ::std::os::raw::c_void, + xOutput: ::std::option::Option< + unsafe extern "C" fn( + pOut: *mut ::std::os::raw::c_void, + pData: *const ::std::os::raw::c_void, + nData: ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int, + >, + pOut: *mut ::std::os::raw::c_void, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3changeset_invert_strm( + xInput: ::std::option::Option< + unsafe extern "C" fn( + pIn: *mut ::std::os::raw::c_void, + pData: *mut ::std::os::raw::c_void, + pnData: *mut ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int, + >, + pIn: *mut ::std::os::raw::c_void, + xOutput: ::std::option::Option< + unsafe extern "C" fn( + pOut: *mut ::std::os::raw::c_void, + pData: *const ::std::os::raw::c_void, + nData: ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int, + >, + pOut: *mut ::std::os::raw::c_void, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3changeset_start_strm( + pp: *mut *mut sqlite3_changeset_iter, + xInput: ::std::option::Option< + unsafe extern "C" fn( + pIn: *mut ::std::os::raw::c_void, + pData: *mut ::std::os::raw::c_void, + pnData: *mut ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int, + >, + pIn: *mut ::std::os::raw::c_void, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3changeset_start_v2_strm( + pp: *mut *mut sqlite3_changeset_iter, + xInput: ::std::option::Option< + unsafe extern "C" fn( + pIn: *mut ::std::os::raw::c_void, + pData: *mut ::std::os::raw::c_void, + pnData: *mut ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int, + >, + pIn: *mut ::std::os::raw::c_void, + flags: ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3session_changeset_strm( + pSession: *mut sqlite3_session, + xOutput: ::std::option::Option< + unsafe extern "C" fn( + pOut: *mut ::std::os::raw::c_void, + pData: *const ::std::os::raw::c_void, + nData: ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int, + >, + pOut: *mut ::std::os::raw::c_void, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3session_patchset_strm( + pSession: *mut sqlite3_session, + xOutput: ::std::option::Option< + unsafe extern "C" fn( + pOut: *mut ::std::os::raw::c_void, + pData: *const ::std::os::raw::c_void, + nData: ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int, + >, + pOut: *mut ::std::os::raw::c_void, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3changegroup_add_strm( + arg1: *mut sqlite3_changegroup, + xInput: ::std::option::Option< + unsafe extern "C" fn( + pIn: *mut ::std::os::raw::c_void, + pData: *mut ::std::os::raw::c_void, + pnData: *mut ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int, + >, + pIn: *mut ::std::os::raw::c_void, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3changegroup_output_strm( + arg1: *mut sqlite3_changegroup, + xOutput: ::std::option::Option< + unsafe extern "C" fn( + pOut: *mut ::std::os::raw::c_void, + pData: *const ::std::os::raw::c_void, + nData: ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int, + >, + pOut: *mut ::std::os::raw::c_void, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3rebaser_rebase_strm( + pRebaser: *mut sqlite3_rebaser, + xInput: ::std::option::Option< + unsafe extern "C" fn( + pIn: *mut ::std::os::raw::c_void, + pData: *mut ::std::os::raw::c_void, + pnData: *mut ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int, + >, + pIn: *mut ::std::os::raw::c_void, + xOutput: ::std::option::Option< + unsafe extern "C" fn( + pOut: *mut ::std::os::raw::c_void, + pData: *const ::std::os::raw::c_void, + nData: ::std::os::raw::c_int, + ) -> ::std::os::raw::c_int, + >, + pOut: *mut ::std::os::raw::c_void, + ) -> ::std::os::raw::c_int; +} +extern "C" { + pub fn sqlite3session_config( + op: ::std::os::raw::c_int, + pArg: *mut ::std::os::raw::c_void, + ) -> ::std::os::raw::c_int; +} +#[repr(C)] +#[derive(Debug, Copy, Clone)] pub struct Fts5Context { _unused: [u8; 0], } diff --git a/libsqlite3-sys/sqlite3/sqlite3.c b/libsqlite3-sys/sqlite3/sqlite3.c index b8f98c7..451ca8e 100644 --- a/libsqlite3-sys/sqlite3/sqlite3.c +++ b/libsqlite3-sys/sqlite3/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 @@ -13144,6 +13144,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 @@ -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; } /* @@ -48277,6 +48302,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(). @@ -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; ipPrior ){ - 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; jjnAux; jj++){ + for(jj=1; jj "$SQLITE3_LIB_DIR/sqlite3.c" unzip -p "$SQLITE.zip" "$SQLITE/sqlite3.h" > "$SQLITE3_LIB_DIR/sqlite3.h"