mirror of
				https://github.com/isar/rusqlite.git
				synced 2025-10-31 05:48:56 +08:00 
			
		
		
		
	Merge remote-tracking branch 'origin/master' into loadable_extension
This commit is contained in:
		| @@ -46,7 +46,7 @@ openssl-sys = { version = "0.9", optional = true } | |||||||
| atomic = { version = "0.5", optional = true } | atomic = { version = "0.5", optional = true } | ||||||
|  |  | ||||||
| [build-dependencies] | [build-dependencies] | ||||||
| bindgen = { version = "0.68", optional = true, default-features = false, features = ["runtime"] } | bindgen = { version = "0.69", optional = true, default-features = false, features = ["runtime"] } | ||||||
| pkg-config = { version = "0.3.19", optional = true } | pkg-config = { version = "0.3.19", optional = true } | ||||||
| cc = { version = "1.0", optional = true } | cc = { version = "1.0", optional = true } | ||||||
| vcpkg = { version = "0.2", optional = true } | vcpkg = { version = "0.2", optional = true } | ||||||
|   | |||||||
| @@ -23,10 +23,10 @@ extern "C" { | |||||||
|     ) -> ::std::os::raw::c_int; |     ) -> ::std::os::raw::c_int; | ||||||
| } | } | ||||||
|  |  | ||||||
| pub const SQLITE_VERSION: &[u8; 7] = b"3.43.2\0"; | pub const SQLITE_VERSION: &[u8; 7] = b"3.44.0\0"; | ||||||
| pub const SQLITE_VERSION_NUMBER: i32 = 3043002; | pub const SQLITE_VERSION_NUMBER: i32 = 3044000; | ||||||
| pub const SQLITE_SOURCE_ID: &[u8; 85] = | pub const SQLITE_SOURCE_ID: &[u8; 85] = | ||||||
|     b"2023-10-10 12:14:04 4310099cce5a487035fa535dd3002c59ac7f1d1bec68d7cf317fd3e769484790\0"; |     b"2023-11-01 11:23:50 17129ba1ff7f0daf37100ee82d507aef7827cf38de1866e2633096ae6ad81301\0"; | ||||||
| pub const SQLITE_OK: i32 = 0; | pub const SQLITE_OK: i32 = 0; | ||||||
| pub const SQLITE_ERROR: i32 = 1; | pub const SQLITE_ERROR: i32 = 1; | ||||||
| pub const SQLITE_INTERNAL: i32 = 2; | pub const SQLITE_INTERNAL: i32 = 2; | ||||||
| @@ -397,6 +397,7 @@ pub const SQLITE_TESTCTRL_FIRST: i32 = 5; | |||||||
| pub const SQLITE_TESTCTRL_PRNG_SAVE: i32 = 5; | pub const SQLITE_TESTCTRL_PRNG_SAVE: i32 = 5; | ||||||
| pub const SQLITE_TESTCTRL_PRNG_RESTORE: i32 = 6; | pub const SQLITE_TESTCTRL_PRNG_RESTORE: i32 = 6; | ||||||
| pub const SQLITE_TESTCTRL_PRNG_RESET: i32 = 7; | pub const SQLITE_TESTCTRL_PRNG_RESET: i32 = 7; | ||||||
|  | pub const SQLITE_TESTCTRL_FK_NO_ACTION: i32 = 7; | ||||||
| pub const SQLITE_TESTCTRL_BITVEC_TEST: i32 = 8; | pub const SQLITE_TESTCTRL_BITVEC_TEST: i32 = 8; | ||||||
| pub const SQLITE_TESTCTRL_FAULT_INSTALL: i32 = 9; | pub const SQLITE_TESTCTRL_FAULT_INSTALL: i32 = 9; | ||||||
| pub const SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS: i32 = 10; | pub const SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS: i32 = 10; | ||||||
| @@ -493,6 +494,7 @@ pub const SQLITE_CHANGESETSTART_INVERT: i32 = 2; | |||||||
| pub const SQLITE_CHANGESETAPPLY_NOSAVEPOINT: i32 = 1; | pub const SQLITE_CHANGESETAPPLY_NOSAVEPOINT: i32 = 1; | ||||||
| pub const SQLITE_CHANGESETAPPLY_INVERT: i32 = 2; | pub const SQLITE_CHANGESETAPPLY_INVERT: i32 = 2; | ||||||
| pub const SQLITE_CHANGESETAPPLY_IGNORENOOP: i32 = 4; | pub const SQLITE_CHANGESETAPPLY_IGNORENOOP: i32 = 4; | ||||||
|  | pub const SQLITE_CHANGESETAPPLY_FKNOACTION: i32 = 8; | ||||||
| pub const SQLITE_CHANGESET_DATA: i32 = 1; | pub const SQLITE_CHANGESET_DATA: i32 = 1; | ||||||
| pub const SQLITE_CHANGESET_NOTFOUND: i32 = 2; | pub const SQLITE_CHANGESET_NOTFOUND: i32 = 2; | ||||||
| pub const SQLITE_CHANGESET_CONFLICT: i32 = 3; | pub const SQLITE_CHANGESET_CONFLICT: i32 = 3; | ||||||
| @@ -1695,6 +1697,20 @@ extern "C" { | |||||||
|         arg3: ::std::option::Option<unsafe extern "C" fn(arg1: *mut ::std::os::raw::c_void)>, |         arg3: ::std::option::Option<unsafe extern "C" fn(arg1: *mut ::std::os::raw::c_void)>, | ||||||
|     ); |     ); | ||||||
| } | } | ||||||
|  | extern "C" { | ||||||
|  |     pub fn sqlite3_get_clientdata( | ||||||
|  |         arg1: *mut sqlite3, | ||||||
|  |         arg2: *const ::std::os::raw::c_char, | ||||||
|  |     ) -> *mut ::std::os::raw::c_void; | ||||||
|  | } | ||||||
|  | extern "C" { | ||||||
|  |     pub fn sqlite3_set_clientdata( | ||||||
|  |         arg1: *mut sqlite3, | ||||||
|  |         arg2: *const ::std::os::raw::c_char, | ||||||
|  |         arg3: *mut ::std::os::raw::c_void, | ||||||
|  |         arg4: ::std::option::Option<unsafe extern "C" fn(arg1: *mut ::std::os::raw::c_void)>, | ||||||
|  |     ) -> ::std::os::raw::c_int; | ||||||
|  | } | ||||||
| pub type sqlite3_destructor_type = | pub type sqlite3_destructor_type = | ||||||
|     ::std::option::Option<unsafe extern "C" fn(arg1: *mut ::std::os::raw::c_void)>; |     ::std::option::Option<unsafe extern "C" fn(arg1: *mut ::std::os::raw::c_void)>; | ||||||
| extern "C" { | extern "C" { | ||||||
| @@ -2182,6 +2198,15 @@ pub struct sqlite3_module { | |||||||
|     pub xShadowName: ::std::option::Option< |     pub xShadowName: ::std::option::Option< | ||||||
|         unsafe extern "C" fn(arg1: *const ::std::os::raw::c_char) -> ::std::os::raw::c_int, |         unsafe extern "C" fn(arg1: *const ::std::os::raw::c_char) -> ::std::os::raw::c_int, | ||||||
|     >, |     >, | ||||||
|  |     pub xIntegrity: ::std::option::Option< | ||||||
|  |         unsafe extern "C" fn( | ||||||
|  |             pVTab: *mut sqlite3_vtab, | ||||||
|  |             zSchema: *const ::std::os::raw::c_char, | ||||||
|  |             zTabName: *const ::std::os::raw::c_char, | ||||||
|  |             mFlags: ::std::os::raw::c_int, | ||||||
|  |             pzErr: *mut *mut ::std::os::raw::c_char, | ||||||
|  |         ) -> ::std::os::raw::c_int, | ||||||
|  |     >, | ||||||
| } | } | ||||||
| #[repr(C)] | #[repr(C)] | ||||||
| #[derive(Debug, Copy, Clone)] | #[derive(Debug, Copy, Clone)] | ||||||
| @@ -3079,6 +3104,16 @@ extern "C" { | |||||||
|         ppOut: *mut *mut ::std::os::raw::c_void, |         ppOut: *mut *mut ::std::os::raw::c_void, | ||||||
|     ) -> ::std::os::raw::c_int; |     ) -> ::std::os::raw::c_int; | ||||||
| } | } | ||||||
|  | extern "C" { | ||||||
|  |     pub fn sqlite3changeset_upgrade( | ||||||
|  |         db: *mut sqlite3, | ||||||
|  |         zDb: *const ::std::os::raw::c_char, | ||||||
|  |         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; | ||||||
|  | } | ||||||
| #[repr(C)] | #[repr(C)] | ||||||
| #[derive(Debug, Copy, Clone)] | #[derive(Debug, Copy, Clone)] | ||||||
| pub struct sqlite3_changegroup { | pub struct sqlite3_changegroup { | ||||||
| @@ -3087,6 +3122,13 @@ pub struct sqlite3_changegroup { | |||||||
| extern "C" { | extern "C" { | ||||||
|     pub fn sqlite3changegroup_new(pp: *mut *mut sqlite3_changegroup) -> ::std::os::raw::c_int; |     pub fn sqlite3changegroup_new(pp: *mut *mut sqlite3_changegroup) -> ::std::os::raw::c_int; | ||||||
| } | } | ||||||
|  | extern "C" { | ||||||
|  |     pub fn sqlite3changegroup_schema( | ||||||
|  |         arg1: *mut sqlite3_changegroup, | ||||||
|  |         arg2: *mut sqlite3, | ||||||
|  |         zDb: *const ::std::os::raw::c_char, | ||||||
|  |     ) -> ::std::os::raw::c_int; | ||||||
|  | } | ||||||
| extern "C" { | extern "C" { | ||||||
|     pub fn sqlite3changegroup_add( |     pub fn sqlite3changegroup_add( | ||||||
|         arg1: *mut sqlite3_changegroup, |         arg1: *mut sqlite3_changegroup, | ||||||
|   | |||||||
							
								
								
									
										6244
									
								
								libsqlite3-sys/sqlite3/sqlite3.c
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6244
									
								
								libsqlite3-sys/sqlite3/sqlite3.c
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										199
									
								
								libsqlite3-sys/sqlite3/sqlite3.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										199
									
								
								libsqlite3-sys/sqlite3/sqlite3.h
									
									
									
									
										vendored
									
									
								
							| @@ -146,9 +146,9 @@ extern "C" { | |||||||
| ** [sqlite3_libversion_number()], [sqlite3_sourceid()], | ** [sqlite3_libversion_number()], [sqlite3_sourceid()], | ||||||
| ** [sqlite_version()] and [sqlite_source_id()]. | ** [sqlite_version()] and [sqlite_source_id()]. | ||||||
| */ | */ | ||||||
| #define SQLITE_VERSION        "3.43.2" | #define SQLITE_VERSION        "3.44.0" | ||||||
| #define SQLITE_VERSION_NUMBER 3043002 | #define SQLITE_VERSION_NUMBER 3044000 | ||||||
| #define SQLITE_SOURCE_ID      "2023-10-10 12:14:04 4310099cce5a487035fa535dd3002c59ac7f1d1bec68d7cf317fd3e769484790" | #define SQLITE_SOURCE_ID      "2023-11-01 11:23:50 17129ba1ff7f0daf37100ee82d507aef7827cf38de1866e2633096ae6ad81301" | ||||||
|  |  | ||||||
| /* | /* | ||||||
| ** CAPI3REF: Run-Time Library Version Numbers | ** CAPI3REF: Run-Time Library Version Numbers | ||||||
| @@ -2127,7 +2127,7 @@ struct sqlite3_mem_methods { | |||||||
| ** is stored in each sorted record and the required column values loaded | ** is stored in each sorted record and the required column values loaded | ||||||
| ** from the database as records are returned in sorted order. The default | ** from the database as records are returned in sorted order. The default | ||||||
| ** value for this option is to never use this optimization. Specifying a | ** value for this option is to never use this optimization. Specifying a | ||||||
| ** negative value for this option restores the default behaviour. | ** negative value for this option restores the default behavior. | ||||||
| ** This option is only available if SQLite is compiled with the | ** This option is only available if SQLite is compiled with the | ||||||
| ** [SQLITE_ENABLE_SORTER_REFERENCES] compile-time option. | ** [SQLITE_ENABLE_SORTER_REFERENCES] compile-time option. | ||||||
| ** | ** | ||||||
| @@ -2302,7 +2302,7 @@ struct sqlite3_mem_methods { | |||||||
| ** database handle, SQLite checks if this will mean that there are now no | ** database handle, SQLite checks if this will mean that there are now no | ||||||
| ** connections at all to the database. If so, it performs a checkpoint | ** connections at all to the database. If so, it performs a checkpoint | ||||||
| ** operation before closing the connection. This option may be used to | ** operation before closing the connection. This option may be used to | ||||||
| ** override this behaviour. The first parameter passed to this operation | ** override this behavior. The first parameter passed to this operation | ||||||
| ** is an integer - positive to disable checkpoints-on-close, or zero (the | ** is an integer - positive to disable checkpoints-on-close, or zero (the | ||||||
| ** default) to enable them, and negative to leave the setting unchanged. | ** default) to enable them, and negative to leave the setting unchanged. | ||||||
| ** The second parameter is a pointer to an integer | ** The second parameter is a pointer to an integer | ||||||
| @@ -3955,6 +3955,7 @@ SQLITE_API void sqlite3_free_filename(sqlite3_filename); | |||||||
| ** | ** | ||||||
| ** ^The sqlite3_errmsg() and sqlite3_errmsg16() return English-language | ** ^The sqlite3_errmsg() and sqlite3_errmsg16() return English-language | ||||||
| ** text that describes the error, as either UTF-8 or UTF-16 respectively. | ** text that describes the error, as either UTF-8 or UTF-16 respectively. | ||||||
|  | ** (See how SQLite handles [invalid UTF] for exceptions to this rule.) | ||||||
| ** ^(Memory to hold the error message string is managed internally. | ** ^(Memory to hold the error message string is managed internally. | ||||||
| ** The application does not need to worry about freeing the result. | ** The application does not need to worry about freeing the result. | ||||||
| ** However, the error string might be overwritten or deallocated by | ** However, the error string might be overwritten or deallocated by | ||||||
| @@ -5325,6 +5326,7 @@ SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt); | |||||||
| */ | */ | ||||||
| SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt); | SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt); | ||||||
|  |  | ||||||
|  |  | ||||||
| /* | /* | ||||||
| ** CAPI3REF: Create Or Redefine SQL Functions | ** CAPI3REF: Create Or Redefine SQL Functions | ||||||
| ** KEYWORDS: {function creation routines} | ** KEYWORDS: {function creation routines} | ||||||
| @@ -5879,32 +5881,32 @@ SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*); | |||||||
| ** METHOD: sqlite3_context | ** METHOD: sqlite3_context | ||||||
| ** | ** | ||||||
| ** These functions may be used by (non-aggregate) SQL functions to | ** These functions may be used by (non-aggregate) SQL functions to | ||||||
| ** associate metadata with argument values. If the same value is passed to | ** associate auxiliary data with argument values. If the same argument | ||||||
| ** multiple invocations of the same SQL function during query execution, under | ** value is passed to multiple invocations of the same SQL function during | ||||||
| ** some circumstances the associated metadata may be preserved.  An example | ** query execution, under some circumstances the associated auxiliary data | ||||||
| ** of where this might be useful is in a regular-expression matching | ** might be preserved.  An example of where this might be useful is in a | ||||||
| ** function. The compiled version of the regular expression can be stored as | ** regular-expression matching function. The compiled version of the regular | ||||||
| ** metadata associated with the pattern string. | ** expression can be stored as auxiliary data associated with the pattern string. | ||||||
| ** Then as long as the pattern string remains the same, | ** Then as long as the pattern string remains the same, | ||||||
| ** the compiled regular expression can be reused on multiple | ** the compiled regular expression can be reused on multiple | ||||||
| ** invocations of the same function. | ** invocations of the same function. | ||||||
| ** | ** | ||||||
| ** ^The sqlite3_get_auxdata(C,N) interface returns a pointer to the metadata | ** ^The sqlite3_get_auxdata(C,N) interface returns a pointer to the auxiliary data | ||||||
| ** associated by the sqlite3_set_auxdata(C,N,P,X) function with the Nth argument | ** associated by the sqlite3_set_auxdata(C,N,P,X) function with the Nth argument | ||||||
| ** value to the application-defined function.  ^N is zero for the left-most | ** value to the application-defined function.  ^N is zero for the left-most | ||||||
| ** function argument.  ^If there is no metadata | ** function argument.  ^If there is no auxiliary data | ||||||
| ** associated with the function argument, the sqlite3_get_auxdata(C,N) interface | ** associated with the function argument, the sqlite3_get_auxdata(C,N) interface | ||||||
| ** returns a NULL pointer. | ** returns a NULL pointer. | ||||||
| ** | ** | ||||||
| ** ^The sqlite3_set_auxdata(C,N,P,X) interface saves P as metadata for the N-th | ** ^The sqlite3_set_auxdata(C,N,P,X) interface saves P as auxiliary data for the | ||||||
| ** argument of the application-defined function.  ^Subsequent | ** N-th argument of the application-defined function.  ^Subsequent | ||||||
| ** calls to sqlite3_get_auxdata(C,N) return P from the most recent | ** calls to sqlite3_get_auxdata(C,N) return P from the most recent | ||||||
| ** sqlite3_set_auxdata(C,N,P,X) call if the metadata is still valid or | ** sqlite3_set_auxdata(C,N,P,X) call if the auxiliary data is still valid or | ||||||
| ** NULL if the metadata has been discarded. | ** NULL if the auxiliary data has been discarded. | ||||||
| ** ^After each call to sqlite3_set_auxdata(C,N,P,X) where X is not NULL, | ** ^After each call to sqlite3_set_auxdata(C,N,P,X) where X is not NULL, | ||||||
| ** SQLite will invoke the destructor function X with parameter P exactly | ** SQLite will invoke the destructor function X with parameter P exactly | ||||||
| ** once, when the metadata is discarded. | ** once, when the auxiliary data is discarded. | ||||||
| ** SQLite is free to discard the metadata at any time, including: <ul> | ** SQLite is free to discard the auxiliary data at any time, including: <ul> | ||||||
| ** <li> ^(when the corresponding function parameter changes)^, or | ** <li> ^(when the corresponding function parameter changes)^, or | ||||||
| ** <li> ^(when [sqlite3_reset()] or [sqlite3_finalize()] is called for the | ** <li> ^(when [sqlite3_reset()] or [sqlite3_finalize()] is called for the | ||||||
| **      SQL statement)^, or | **      SQL statement)^, or | ||||||
| @@ -5920,7 +5922,7 @@ SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*); | |||||||
| ** function implementation should not make any use of P after | ** function implementation should not make any use of P after | ||||||
| ** sqlite3_set_auxdata() has been called. | ** sqlite3_set_auxdata() has been called. | ||||||
| ** | ** | ||||||
| ** ^(In practice, metadata is preserved between function calls for | ** ^(In practice, auxiliary data is preserved between function calls for | ||||||
| ** function parameters that are compile-time constants, including literal | ** function parameters that are compile-time constants, including literal | ||||||
| ** values and [parameters] and expressions composed from the same.)^ | ** values and [parameters] and expressions composed from the same.)^ | ||||||
| ** | ** | ||||||
| @@ -5930,10 +5932,67 @@ SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*); | |||||||
| ** | ** | ||||||
| ** These routines must be called from the same thread in which | ** These routines must be called from the same thread in which | ||||||
| ** the SQL function is running. | ** the SQL function is running. | ||||||
|  | ** | ||||||
|  | ** See also: [sqlite3_get_clientdata()] and [sqlite3_set_clientdata()]. | ||||||
| */ | */ | ||||||
| SQLITE_API void *sqlite3_get_auxdata(sqlite3_context*, int N); | SQLITE_API void *sqlite3_get_auxdata(sqlite3_context*, int N); | ||||||
| SQLITE_API void sqlite3_set_auxdata(sqlite3_context*, int N, void*, void (*)(void*)); | SQLITE_API void sqlite3_set_auxdata(sqlite3_context*, int N, void*, void (*)(void*)); | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | ** CAPI3REF: Database Connection Client Data | ||||||
|  | ** METHOD: sqlite3 | ||||||
|  | ** | ||||||
|  | ** These functions are used to associate one or more named pointers | ||||||
|  | ** with a [database connection]. | ||||||
|  | ** A call to sqlite3_set_clientdata(D,N,P,X) causes the pointer P | ||||||
|  | ** to be attached to [database connection] D using name N.  Subsequent | ||||||
|  | ** calls to sqlite3_get_clientdata(D,N) will return a copy of pointer P | ||||||
|  | ** or a NULL pointer if there were no prior calls to | ||||||
|  | ** sqlite3_set_clientdata() with the same values of D and N. | ||||||
|  | ** Names are compared using strcmp() and are thus case sensitive. | ||||||
|  | ** | ||||||
|  | ** If P and X are both non-NULL, then the destructor X is invoked with | ||||||
|  | ** argument P on the first of the following occurrences: | ||||||
|  | ** <ul> | ||||||
|  | ** <li> An out-of-memory error occurs during the call to | ||||||
|  | **      sqlite3_set_clientdata() which attempts to register pointer P. | ||||||
|  | ** <li> A subsequent call to sqlite3_set_clientdata(D,N,P,X) is made | ||||||
|  | **      with the same D and N parameters. | ||||||
|  | ** <li> The database connection closes.  SQLite does not make any guarantees | ||||||
|  | **      about the order in which destructors are called, only that all | ||||||
|  | **      destructors will be called exactly once at some point during the | ||||||
|  | **      database connection closing process. | ||||||
|  | ** </ul> | ||||||
|  | ** | ||||||
|  | ** SQLite does not do anything with client data other than invoke | ||||||
|  | ** destructors on the client data at the appropriate time.  The intended | ||||||
|  | ** use for client data is to provide a mechanism for wrapper libraries | ||||||
|  | ** to store additional information about an SQLite database connection. | ||||||
|  | ** | ||||||
|  | ** There is no limit (other than available memory) on the number of different | ||||||
|  | ** client data pointers (with different names) that can be attached to a | ||||||
|  | ** single database connection.  However, the implementation is optimized | ||||||
|  | ** for the case of having only one or two different client data names. | ||||||
|  | ** Applications and wrapper libraries are discouraged from using more than | ||||||
|  | ** one client data name each. | ||||||
|  | ** | ||||||
|  | ** There is no way to enumerate the client data pointers | ||||||
|  | ** associated with a database connection.  The N parameter can be thought | ||||||
|  | ** of as a secret key such that only code that knows the secret key is able | ||||||
|  | ** to access the associated data. | ||||||
|  | ** | ||||||
|  | ** Security Warning:  These interfaces should not be exposed in scripting | ||||||
|  | ** languages or in other circumstances where it might be possible for an | ||||||
|  | ** an attacker to invoke them.  Any agent that can invoke these interfaces | ||||||
|  | ** can probably also take control of the process. | ||||||
|  | ** | ||||||
|  | ** Database connection client data is only available for SQLite | ||||||
|  | ** version 3.44.0 ([dateof:3.44.0]) and later. | ||||||
|  | ** | ||||||
|  | ** See also: [sqlite3_set_auxdata()] and [sqlite3_get_auxdata()]. | ||||||
|  | */ | ||||||
|  | SQLITE_API void *sqlite3_get_clientdata(sqlite3*,const char*); | ||||||
|  | SQLITE_API int sqlite3_set_clientdata(sqlite3*, const char*, void*, void(*)(void*)); | ||||||
|  |  | ||||||
| /* | /* | ||||||
| ** CAPI3REF: Constants Defining Special Destructor Behavior | ** CAPI3REF: Constants Defining Special Destructor Behavior | ||||||
| @@ -6566,7 +6625,7 @@ SQLITE_API int sqlite3_db_readonly(sqlite3 *db, const char *zDbName); | |||||||
| SQLITE_API int sqlite3_txn_state(sqlite3*,const char *zSchema); | SQLITE_API int sqlite3_txn_state(sqlite3*,const char *zSchema); | ||||||
|  |  | ||||||
| /* | /* | ||||||
| ** CAPI3REF: Allowed return values from [sqlite3_txn_state()] | ** CAPI3REF: Allowed return values from sqlite3_txn_state() | ||||||
| ** KEYWORDS: {transaction state} | ** KEYWORDS: {transaction state} | ||||||
| ** | ** | ||||||
| ** These constants define the current transaction state of a database file. | ** These constants define the current transaction state of a database file. | ||||||
| @@ -6698,7 +6757,7 @@ SQLITE_API void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*); | |||||||
| ** ^Each call to the sqlite3_autovacuum_pages() interface overrides all | ** ^Each call to the sqlite3_autovacuum_pages() interface overrides all | ||||||
| ** previous invocations for that database connection.  ^If the callback | ** previous invocations for that database connection.  ^If the callback | ||||||
| ** argument (C) to sqlite3_autovacuum_pages(D,C,P,X) is a NULL pointer, | ** argument (C) to sqlite3_autovacuum_pages(D,C,P,X) is a NULL pointer, | ||||||
| ** then the autovacuum steps callback is cancelled.  The return value | ** then the autovacuum steps callback is canceled.  The return value | ||||||
| ** from sqlite3_autovacuum_pages() is normally SQLITE_OK, but might | ** from sqlite3_autovacuum_pages() is normally SQLITE_OK, but might | ||||||
| ** be some other error code if something goes wrong.  The current | ** be some other error code if something goes wrong.  The current | ||||||
| ** implementation will only return SQLITE_OK or SQLITE_MISUSE, but other | ** implementation will only return SQLITE_OK or SQLITE_MISUSE, but other | ||||||
| @@ -7217,6 +7276,10 @@ struct sqlite3_module { | |||||||
|   /* The methods above are in versions 1 and 2 of the sqlite_module object. |   /* The methods above are in versions 1 and 2 of the sqlite_module object. | ||||||
|   ** Those below are for version 3 and greater. */ |   ** Those below are for version 3 and greater. */ | ||||||
|   int (*xShadowName)(const char*); |   int (*xShadowName)(const char*); | ||||||
|  |   /* The methods above are in versions 1 through 3 of the sqlite_module object. | ||||||
|  |   ** Those below are for version 4 and greater. */ | ||||||
|  |   int (*xIntegrity)(sqlite3_vtab *pVTab, const char *zSchema, | ||||||
|  |                     const char *zTabName, int mFlags, char **pzErr); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| /* | /* | ||||||
| @@ -7704,7 +7767,7 @@ SQLITE_API int sqlite3_blob_reopen(sqlite3_blob *, sqlite3_int64); | |||||||
| ** code is returned and the transaction rolled back. | ** code is returned and the transaction rolled back. | ||||||
| ** | ** | ||||||
| ** Calling this function with an argument that is not a NULL pointer or an | ** Calling this function with an argument that is not a NULL pointer or an | ||||||
| ** open blob handle results in undefined behaviour. ^Calling this routine | ** open blob handle results in undefined behavior. ^Calling this routine | ||||||
| ** with a null pointer (such as would be returned by a failed call to | ** with a null pointer (such as would be returned by a failed call to | ||||||
| ** [sqlite3_blob_open()]) is a harmless no-op. ^Otherwise, if this function | ** [sqlite3_blob_open()]) is a harmless no-op. ^Otherwise, if this function | ||||||
| ** is passed a valid open blob handle, the values returned by the | ** is passed a valid open blob handle, the values returned by the | ||||||
| @@ -8184,6 +8247,7 @@ SQLITE_API int sqlite3_test_control(int op, ...); | |||||||
| #define SQLITE_TESTCTRL_PRNG_SAVE                5 | #define SQLITE_TESTCTRL_PRNG_SAVE                5 | ||||||
| #define SQLITE_TESTCTRL_PRNG_RESTORE             6 | #define SQLITE_TESTCTRL_PRNG_RESTORE             6 | ||||||
| #define SQLITE_TESTCTRL_PRNG_RESET               7  /* NOT USED */ | #define SQLITE_TESTCTRL_PRNG_RESET               7  /* NOT USED */ | ||||||
|  | #define SQLITE_TESTCTRL_FK_NO_ACTION             7 | ||||||
| #define SQLITE_TESTCTRL_BITVEC_TEST              8 | #define SQLITE_TESTCTRL_BITVEC_TEST              8 | ||||||
| #define SQLITE_TESTCTRL_FAULT_INSTALL            9 | #define SQLITE_TESTCTRL_FAULT_INSTALL            9 | ||||||
| #define SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS     10 | #define SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS     10 | ||||||
| @@ -9245,8 +9309,8 @@ SQLITE_API int sqlite3_backup_pagecount(sqlite3_backup *p); | |||||||
| ** blocked connection already has a registered unlock-notify callback, | ** blocked connection already has a registered unlock-notify callback, | ||||||
| ** then the new callback replaces the old.)^ ^If sqlite3_unlock_notify() is | ** then the new callback replaces the old.)^ ^If sqlite3_unlock_notify() is | ||||||
| ** called with a NULL pointer as its second argument, then any existing | ** called with a NULL pointer as its second argument, then any existing | ||||||
| ** unlock-notify callback is cancelled. ^The blocked connections | ** unlock-notify callback is canceled. ^The blocked connections | ||||||
| ** unlock-notify callback may also be cancelled by closing the blocked | ** unlock-notify callback may also be canceled by closing the blocked | ||||||
| ** connection using [sqlite3_close()]. | ** connection using [sqlite3_close()]. | ||||||
| ** | ** | ||||||
| ** The unlock-notify callback is not reentrant. If an application invokes | ** The unlock-notify callback is not reentrant. If an application invokes | ||||||
| @@ -10549,6 +10613,13 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_recover(sqlite3 *db, const c | |||||||
| ** SQLITE_SERIALIZE_NOCOPY bit is set but no contiguous copy | ** SQLITE_SERIALIZE_NOCOPY bit is set but no contiguous copy | ||||||
| ** of the database exists. | ** of the database exists. | ||||||
| ** | ** | ||||||
|  | ** After the call, if the SQLITE_SERIALIZE_NOCOPY bit had been set, | ||||||
|  | ** the returned buffer content will remain accessible and unchanged | ||||||
|  | ** until either the next write operation on the connection or when | ||||||
|  | ** the connection is closed, and applications must not modify the | ||||||
|  | ** buffer. If the bit had been clear, the returned buffer will not | ||||||
|  | ** be accessed by SQLite after the call. | ||||||
|  | ** | ||||||
| ** A call to sqlite3_serialize(D,S,P,F) might return NULL even if the | ** A call to sqlite3_serialize(D,S,P,F) might return NULL even if the | ||||||
| ** SQLITE_SERIALIZE_NOCOPY bit is omitted from argument F if a memory | ** SQLITE_SERIALIZE_NOCOPY bit is omitted from argument F if a memory | ||||||
| ** allocation error occurs. | ** allocation error occurs. | ||||||
| @@ -10597,6 +10668,9 @@ SQLITE_API unsigned char *sqlite3_serialize( | |||||||
| ** SQLite will try to increase the buffer size using sqlite3_realloc64() | ** SQLite will try to increase the buffer size using sqlite3_realloc64() | ||||||
| ** if writes on the database cause it to grow larger than M bytes. | ** if writes on the database cause it to grow larger than M bytes. | ||||||
| ** | ** | ||||||
|  | ** Applications must not modify the buffer P or invalidate it before | ||||||
|  | ** the database connection D is closed. | ||||||
|  | ** | ||||||
| ** The sqlite3_deserialize() interface will fail with SQLITE_BUSY if the | ** The sqlite3_deserialize() interface will fail with SQLITE_BUSY if the | ||||||
| ** database is currently in a read transaction or is involved in a backup | ** database is currently in a read transaction or is involved in a backup | ||||||
| ** operation. | ** operation. | ||||||
| @@ -10605,6 +10679,13 @@ SQLITE_API unsigned char *sqlite3_serialize( | |||||||
| ** S argument to sqlite3_deserialize(D,S,P,N,M,F) is "temp" then the | ** S argument to sqlite3_deserialize(D,S,P,N,M,F) is "temp" then the | ||||||
| ** function returns SQLITE_ERROR. | ** function returns SQLITE_ERROR. | ||||||
| ** | ** | ||||||
|  | ** The deserialized database should not be in [WAL mode].  If the database | ||||||
|  | ** is in WAL mode, then any attempt to use the database file will result | ||||||
|  | ** in an [SQLITE_CANTOPEN] error.  The application can set the | ||||||
|  | ** [file format version numbers] (bytes 18 and 19) of the input database P | ||||||
|  | ** to 0x01 prior to invoking sqlite3_deserialize(D,S,P,N,M,F) to force the | ||||||
|  | ** database file into rollback mode and work around this limitation. | ||||||
|  | ** | ||||||
| ** If sqlite3_deserialize(D,S,P,N,M,F) fails for any reason and if the | ** If sqlite3_deserialize(D,S,P,N,M,F) fails for any reason and if the | ||||||
| ** SQLITE_DESERIALIZE_FREEONCLOSE bit is set in argument F, then | ** SQLITE_DESERIALIZE_FREEONCLOSE bit is set in argument F, then | ||||||
| ** [sqlite3_free()] is invoked on argument P prior to returning. | ** [sqlite3_free()] is invoked on argument P prior to returning. | ||||||
| @@ -11677,6 +11758,18 @@ SQLITE_API int sqlite3changeset_concat( | |||||||
| ); | ); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | ** CAPI3REF: Upgrade the Schema of a Changeset/Patchset | ||||||
|  | */ | ||||||
|  | SQLITE_API int sqlite3changeset_upgrade( | ||||||
|  |   sqlite3 *db, | ||||||
|  |   const char *zDb, | ||||||
|  |   int nIn, const void *pIn,       /* Input changeset */ | ||||||
|  |   int *pnOut, void **ppOut        /* OUT: Inverse of input */ | ||||||
|  | ); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /* | /* | ||||||
| ** CAPI3REF: Changegroup Handle | ** CAPI3REF: Changegroup Handle | ||||||
| ** | ** | ||||||
| @@ -11723,6 +11816,38 @@ typedef struct sqlite3_changegroup sqlite3_changegroup; | |||||||
| */ | */ | ||||||
| SQLITE_API int sqlite3changegroup_new(sqlite3_changegroup **pp); | SQLITE_API int sqlite3changegroup_new(sqlite3_changegroup **pp); | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | ** CAPI3REF: Add a Schema to a Changegroup | ||||||
|  | ** METHOD: sqlite3_changegroup_schema | ||||||
|  | ** | ||||||
|  | ** This method may be used to optionally enforce the rule that the changesets | ||||||
|  | ** added to the changegroup handle must match the schema of database zDb | ||||||
|  | ** ("main", "temp", or the name of an attached database). If | ||||||
|  | ** sqlite3changegroup_add() is called to add a changeset that is not compatible | ||||||
|  | ** with the configured schema, SQLITE_SCHEMA is returned and the changegroup | ||||||
|  | ** object is left in an undefined state. | ||||||
|  | ** | ||||||
|  | ** A changeset schema is considered compatible with the database schema in | ||||||
|  | ** the same way as for sqlite3changeset_apply(). Specifically, for each | ||||||
|  | ** table in the changeset, there exists a database table with: | ||||||
|  | ** | ||||||
|  | ** <ul> | ||||||
|  | **   <li> The name identified by the changeset, and | ||||||
|  | **   <li> at least as many columns as recorded in the changeset, and | ||||||
|  | **   <li> the primary key columns in the same position as recorded in | ||||||
|  | **        the changeset. | ||||||
|  | ** </ul> | ||||||
|  | ** | ||||||
|  | ** The output of the changegroup object always has the same schema as the | ||||||
|  | ** database nominated using this function. In cases where changesets passed | ||||||
|  | ** to sqlite3changegroup_add() have fewer columns than the corresponding table | ||||||
|  | ** in the database schema, these are filled in using the default column | ||||||
|  | ** values from the database schema. This makes it possible to combined | ||||||
|  | ** changesets that have different numbers of columns for a single table | ||||||
|  | ** within a changegroup, provided that they are otherwise compatible. | ||||||
|  | */ | ||||||
|  | SQLITE_API int sqlite3changegroup_schema(sqlite3_changegroup*, sqlite3*, const char *zDb); | ||||||
|  |  | ||||||
| /* | /* | ||||||
| ** CAPI3REF: Add A Changeset To A Changegroup | ** CAPI3REF: Add A Changeset To A Changegroup | ||||||
| ** METHOD: sqlite3_changegroup | ** METHOD: sqlite3_changegroup | ||||||
| @@ -11791,13 +11916,18 @@ SQLITE_API int sqlite3changegroup_new(sqlite3_changegroup **pp); | |||||||
| ** If the new changeset contains changes to a table that is already present | ** If the new changeset contains changes to a table that is already present | ||||||
| ** in the changegroup, then the number of columns and the position of the | ** in the changegroup, then the number of columns and the position of the | ||||||
| ** primary key columns for the table must be consistent. If this is not the | ** primary key columns for the table must be consistent. If this is not the | ||||||
| ** case, this function fails with SQLITE_SCHEMA. If the input changeset | ** case, this function fails with SQLITE_SCHEMA. Except, if the changegroup | ||||||
| ** appears to be corrupt and the corruption is detected, SQLITE_CORRUPT is | ** object has been configured with a database schema using the | ||||||
| ** returned. Or, if an out-of-memory condition occurs during processing, this | ** sqlite3changegroup_schema() API, then it is possible to combine changesets | ||||||
| ** function returns SQLITE_NOMEM. In all cases, if an error occurs the state | ** with different numbers of columns for a single table, provided that | ||||||
| ** of the final contents of the changegroup is undefined. | ** they are otherwise compatible. | ||||||
| ** | ** | ||||||
| ** If no error occurs, SQLITE_OK is returned. | ** If the input changeset appears to be corrupt and the corruption is | ||||||
|  | ** detected, SQLITE_CORRUPT is returned. Or, if an out-of-memory condition | ||||||
|  | ** occurs during processing, this function returns SQLITE_NOMEM. | ||||||
|  | ** | ||||||
|  | ** In all cases, if an error occurs the state of the final contents of the | ||||||
|  | ** changegroup is undefined. If no error occurs, SQLITE_OK is returned. | ||||||
| */ | */ | ||||||
| SQLITE_API int sqlite3changegroup_add(sqlite3_changegroup*, int nData, void *pData); | SQLITE_API int sqlite3changegroup_add(sqlite3_changegroup*, int nData, void *pData); | ||||||
|  |  | ||||||
| @@ -12062,10 +12192,17 @@ SQLITE_API int sqlite3changeset_apply_v2( | |||||||
| **    <li>an insert change if all fields of the conflicting row match | **    <li>an insert change if all fields of the conflicting row match | ||||||
| **        the row being inserted. | **        the row being inserted. | ||||||
| **    </ul> | **    </ul> | ||||||
|  | ** | ||||||
|  | ** <dt>SQLITE_CHANGESETAPPLY_FKNOACTION <dd> | ||||||
|  | **   If this flag it set, then all foreign key constraints in the target | ||||||
|  | **   database behave as if they were declared with "ON UPDATE NO ACTION ON | ||||||
|  | **   DELETE NO ACTION", even if they are actually CASCADE, RESTRICT, SET NULL | ||||||
|  | **   or SET DEFAULT. | ||||||
| */ | */ | ||||||
| #define SQLITE_CHANGESETAPPLY_NOSAVEPOINT   0x0001 | #define SQLITE_CHANGESETAPPLY_NOSAVEPOINT   0x0001 | ||||||
| #define SQLITE_CHANGESETAPPLY_INVERT        0x0002 | #define SQLITE_CHANGESETAPPLY_INVERT        0x0002 | ||||||
| #define SQLITE_CHANGESETAPPLY_IGNORENOOP    0x0004 | #define SQLITE_CHANGESETAPPLY_IGNORENOOP    0x0004 | ||||||
|  | #define SQLITE_CHANGESETAPPLY_FKNOACTION    0x0008 | ||||||
|  |  | ||||||
| /* | /* | ||||||
| ** CAPI3REF: Constants Passed To The Conflict Handler | ** CAPI3REF: Constants Passed To The Conflict Handler | ||||||
|   | |||||||
							
								
								
									
										6
									
								
								libsqlite3-sys/sqlite3/sqlite3ext.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								libsqlite3-sys/sqlite3/sqlite3ext.h
									
									
									
									
										vendored
									
									
								
							| @@ -363,6 +363,9 @@ struct sqlite3_api_routines { | |||||||
|   int (*is_interrupted)(sqlite3*); |   int (*is_interrupted)(sqlite3*); | ||||||
|   /* Version 3.43.0 and later */ |   /* Version 3.43.0 and later */ | ||||||
|   int (*stmt_explain)(sqlite3_stmt*,int); |   int (*stmt_explain)(sqlite3_stmt*,int); | ||||||
|  |   /* Version 3.44.0 and later */ | ||||||
|  |   void *(*get_clientdata)(sqlite3*,const char*); | ||||||
|  |   int (*set_clientdata)(sqlite3*, const char*, void*, void(*)(void*)); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| /* | /* | ||||||
| @@ -693,6 +696,9 @@ typedef int (*sqlite3_loadext_entry)( | |||||||
| #define sqlite3_is_interrupted         sqlite3_api->is_interrupted | #define sqlite3_is_interrupted         sqlite3_api->is_interrupted | ||||||
| /* Version 3.43.0 and later */ | /* Version 3.43.0 and later */ | ||||||
| #define sqlite3_stmt_explain           sqlite3_api->stmt_explain | #define sqlite3_stmt_explain           sqlite3_api->stmt_explain | ||||||
|  | /* Version 3.44.0 and later */ | ||||||
|  | #define sqlite3_get_clientdata         sqlite3_api->get_clientdata | ||||||
|  | #define sqlite3_set_clientdata         sqlite3_api->set_clientdata | ||||||
| #endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ | #endif /* !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) */ | ||||||
|  |  | ||||||
| #if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) | #if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) | ||||||
|   | |||||||
| @@ -132,6 +132,8 @@ const SQLITE_IOERR_BEGIN_ATOMIC: c_int = super::SQLITE_IOERR | (29 << 8); | |||||||
| const SQLITE_IOERR_COMMIT_ATOMIC: c_int = super::SQLITE_IOERR | (30 << 8); | const SQLITE_IOERR_COMMIT_ATOMIC: c_int = super::SQLITE_IOERR | (30 << 8); | ||||||
| const SQLITE_IOERR_ROLLBACK_ATOMIC: c_int = super::SQLITE_IOERR | (31 << 8); | const SQLITE_IOERR_ROLLBACK_ATOMIC: c_int = super::SQLITE_IOERR | (31 << 8); | ||||||
| const SQLITE_IOERR_DATA: c_int = super::SQLITE_IOERR | (32 << 8); | const SQLITE_IOERR_DATA: c_int = super::SQLITE_IOERR | (32 << 8); | ||||||
|  | const SQLITE_IOERR_CORRUPTFS: c_int = super::SQLITE_IOERR | (33 << 8); | ||||||
|  | const SQLITE_IOERR_IN_PAGE: c_int = super::SQLITE_IOERR | (34 << 8); | ||||||
|  |  | ||||||
| const SQLITE_LOCKED_VTAB: c_int = super::SQLITE_LOCKED | (2 << 8); | const SQLITE_LOCKED_VTAB: c_int = super::SQLITE_LOCKED | (2 << 8); | ||||||
|  |  | ||||||
| @@ -219,6 +221,8 @@ pub fn code_to_str(code: c_int) -> &'static str { | |||||||
|         SQLITE_IOERR_COMMIT_ATOMIC     => "SQLITE_IOERR_COMMIT_ATOMIC", |         SQLITE_IOERR_COMMIT_ATOMIC     => "SQLITE_IOERR_COMMIT_ATOMIC", | ||||||
|         SQLITE_IOERR_ROLLBACK_ATOMIC   => "SQLITE_IOERR_ROLLBACK_ATOMIC", |         SQLITE_IOERR_ROLLBACK_ATOMIC   => "SQLITE_IOERR_ROLLBACK_ATOMIC", | ||||||
|         SQLITE_IOERR_DATA   => "SQLITE_IOERR_DATA", |         SQLITE_IOERR_DATA   => "SQLITE_IOERR_DATA", | ||||||
|  |         SQLITE_IOERR_CORRUPTFS   => "SQLITE_IOERR_CORRUPTFS", | ||||||
|  |         SQLITE_IOERR_IN_PAGE   => "SQLITE_IOERR_IN_PAGE", | ||||||
|  |  | ||||||
|         super::SQLITE_LOCKED_SHAREDCACHE      => "Locking conflict due to another connection with a shared cache", |         super::SQLITE_LOCKED_SHAREDCACHE      => "Locking conflict due to another connection with a shared cache", | ||||||
|         SQLITE_LOCKED_VTAB             => "SQLITE_LOCKED_VTAB", |         SQLITE_LOCKED_VTAB             => "SQLITE_LOCKED_VTAB", | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ export SQLITE3_LIB_DIR="$SCRIPT_DIR/sqlite3" | |||||||
| mkdir -p "$TARGET_DIR" "$SQLITE3_LIB_DIR" | mkdir -p "$TARGET_DIR" "$SQLITE3_LIB_DIR" | ||||||
|  |  | ||||||
| # Download and extract amalgamation | # Download and extract amalgamation | ||||||
| SQLITE=sqlite-amalgamation-3430200 | SQLITE=sqlite-amalgamation-3440000 | ||||||
| curl -O https://sqlite.org/2023/$SQLITE.zip | curl -O https://sqlite.org/2023/$SQLITE.zip | ||||||
| unzip -p "$SQLITE.zip" "$SQLITE/sqlite3.c" > "$SQLITE3_LIB_DIR/sqlite3.c" | unzip -p "$SQLITE.zip" "$SQLITE/sqlite3.c" > "$SQLITE3_LIB_DIR/sqlite3.c" | ||||||
| unzip -p "$SQLITE.zip" "$SQLITE/sqlite3.h" > "$SQLITE3_LIB_DIR/sqlite3.h" | unzip -p "$SQLITE.zip" "$SQLITE/sqlite3.h" > "$SQLITE3_LIB_DIR/sqlite3.h" | ||||||
|   | |||||||
| @@ -301,7 +301,7 @@ where | |||||||
| { | { | ||||||
|     /// Returns the current value of the aggregate. Unlike xFinal, the |     /// Returns the current value of the aggregate. Unlike xFinal, the | ||||||
|     /// implementation should not delete any context. |     /// implementation should not delete any context. | ||||||
|     fn value(&self, acc: Option<&A>) -> Result<T>; |     fn value(&self, acc: Option<&mut A>) -> Result<T>; | ||||||
|  |  | ||||||
|     /// Removes a row from the current window. |     /// Removes a row from the current window. | ||||||
|     fn inverse(&self, ctx: &mut Context<'_>, acc: &mut A) -> Result<()>; |     fn inverse(&self, ctx: &mut Context<'_>, acc: &mut A) -> Result<()>; | ||||||
| @@ -755,19 +755,10 @@ where | |||||||
| { | { | ||||||
|     // Within the xValue callback, it is customary to set N=0 in calls to |     // Within the xValue callback, it is customary to set N=0 in calls to | ||||||
|     // sqlite3_aggregate_context(C,N) so that no pointless memory allocations occur. |     // sqlite3_aggregate_context(C,N) so that no pointless memory allocations occur. | ||||||
|     let a: Option<&A> = match aggregate_context(ctx, 0) { |     let pac = aggregate_context(ctx, 0).filter(|&pac| { | ||||||
|         Some(pac) => |  | ||||||
|         { |  | ||||||
|         #[allow(clippy::unnecessary_cast)] |         #[allow(clippy::unnecessary_cast)] | ||||||
|             if (*pac as *mut A).is_null() { |         !(*pac as *mut A).is_null() | ||||||
|                 None |     }); | ||||||
|             } else { |  | ||||||
|                 let a = &**pac; |  | ||||||
|                 Some(a) |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         None => None, |  | ||||||
|     }; |  | ||||||
|  |  | ||||||
|     let r = catch_unwind(|| { |     let r = catch_unwind(|| { | ||||||
|         let boxed_aggr: *mut W = ffi::sqlite3_user_data(ctx).cast::<W>(); |         let boxed_aggr: *mut W = ffi::sqlite3_user_data(ctx).cast::<W>(); | ||||||
| @@ -775,7 +766,7 @@ where | |||||||
|             !boxed_aggr.is_null(), |             !boxed_aggr.is_null(), | ||||||
|             "Internal error - null aggregate pointer" |             "Internal error - null aggregate pointer" | ||||||
|         ); |         ); | ||||||
|         (*boxed_aggr).value(a) |         (*boxed_aggr).value(pac.map(|pac| &mut **pac)) | ||||||
|     }); |     }); | ||||||
|     let t = match r { |     let t = match r { | ||||||
|         Err(_) => { |         Err(_) => { | ||||||
| @@ -1030,7 +1021,7 @@ mod test { | |||||||
|             Ok(()) |             Ok(()) | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         fn value(&self, sum: Option<&i64>) -> Result<Option<i64>> { |         fn value(&self, sum: Option<&mut i64>) -> Result<Option<i64>> { | ||||||
|             Ok(sum.copied()) |             Ok(sum.copied()) | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user