extralite-bundle 2.2 → 2.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.editorconfig +6 -0
- data/.github/workflows/test.yml +15 -1
- data/.gitignore +3 -0
- data/CHANGELOG.md +16 -0
- data/Gemfile-bundle +5 -0
- data/Gemfile.lock +4 -4
- data/README.md +69 -10
- data/bin/update_sqlite_source +10 -3
- data/ext/extralite/common.c +67 -23
- data/ext/extralite/database.c +74 -26
- data/ext/extralite/extralite.h +15 -8
- data/ext/extralite/iterator.c +5 -5
- data/ext/extralite/query.c +37 -29
- data/ext/sqlite3/sqlite3.c +8945 -3857
- data/ext/sqlite3/sqlite3.h +293 -61
- data/lib/extralite/version.rb +1 -1
- data/lib/extralite.rb +27 -0
- data/test/fixtures/image.png +0 -0
- data/test/helper.rb +2 -0
- data/test/issue-38.rb +80 -0
- data/test/perf_ary.rb +6 -3
- data/test/perf_hash.rb +7 -4
- data/test/test_database.rb +256 -4
- data/test/test_iterator.rb +2 -1
- data/test/test_query.rb +40 -4
- metadata +6 -2
data/ext/sqlite3/sqlite3.h
CHANGED
@@ -146,9 +146,9 @@ extern "C" {
|
|
146
146
|
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
|
147
147
|
** [sqlite_version()] and [sqlite_source_id()].
|
148
148
|
*/
|
149
|
-
#define SQLITE_VERSION "3.
|
150
|
-
#define SQLITE_VERSION_NUMBER
|
151
|
-
#define SQLITE_SOURCE_ID "2023-
|
149
|
+
#define SQLITE_VERSION "3.44.2"
|
150
|
+
#define SQLITE_VERSION_NUMBER 3044002
|
151
|
+
#define SQLITE_SOURCE_ID "2023-11-24 11:41:44 ebead0e7230cd33bcec9f95d2183069565b9e709bf745c9b5db65cc0cbf92c0f"
|
152
152
|
|
153
153
|
/*
|
154
154
|
** CAPI3REF: Run-Time Library Version Numbers
|
@@ -528,6 +528,7 @@ SQLITE_API int sqlite3_exec(
|
|
528
528
|
#define SQLITE_IOERR_ROLLBACK_ATOMIC (SQLITE_IOERR | (31<<8))
|
529
529
|
#define SQLITE_IOERR_DATA (SQLITE_IOERR | (32<<8))
|
530
530
|
#define SQLITE_IOERR_CORRUPTFS (SQLITE_IOERR | (33<<8))
|
531
|
+
#define SQLITE_IOERR_IN_PAGE (SQLITE_IOERR | (34<<8))
|
531
532
|
#define SQLITE_LOCKED_SHAREDCACHE (SQLITE_LOCKED | (1<<8))
|
532
533
|
#define SQLITE_LOCKED_VTAB (SQLITE_LOCKED | (2<<8))
|
533
534
|
#define SQLITE_BUSY_RECOVERY (SQLITE_BUSY | (1<<8))
|
@@ -1190,7 +1191,7 @@ struct sqlite3_io_methods {
|
|
1190
1191
|
** by clients within the current process, only within other processes.
|
1191
1192
|
**
|
1192
1193
|
** <li>[[SQLITE_FCNTL_CKSM_FILE]]
|
1193
|
-
** The [SQLITE_FCNTL_CKSM_FILE] opcode is for use
|
1194
|
+
** The [SQLITE_FCNTL_CKSM_FILE] opcode is for use internally by the
|
1194
1195
|
** [checksum VFS shim] only.
|
1195
1196
|
**
|
1196
1197
|
** <li>[[SQLITE_FCNTL_RESET_CACHE]]
|
@@ -2126,7 +2127,7 @@ struct sqlite3_mem_methods {
|
|
2126
2127
|
** is stored in each sorted record and the required column values loaded
|
2127
2128
|
** from the database as records are returned in sorted order. The default
|
2128
2129
|
** value for this option is to never use this optimization. Specifying a
|
2129
|
-
** negative value for this option restores the default
|
2130
|
+
** negative value for this option restores the default behavior.
|
2130
2131
|
** This option is only available if SQLite is compiled with the
|
2131
2132
|
** [SQLITE_ENABLE_SORTER_REFERENCES] compile-time option.
|
2132
2133
|
**
|
@@ -2301,7 +2302,7 @@ struct sqlite3_mem_methods {
|
|
2301
2302
|
** database handle, SQLite checks if this will mean that there are now no
|
2302
2303
|
** connections at all to the database. If so, it performs a checkpoint
|
2303
2304
|
** operation before closing the connection. This option may be used to
|
2304
|
-
** override this
|
2305
|
+
** override this behavior. The first parameter passed to this operation
|
2305
2306
|
** is an integer - positive to disable checkpoints-on-close, or zero (the
|
2306
2307
|
** default) to enable them, and negative to leave the setting unchanged.
|
2307
2308
|
** The second parameter is a pointer to an integer
|
@@ -2454,7 +2455,7 @@ struct sqlite3_mem_methods {
|
|
2454
2455
|
** the [VACUUM] command will fail with an obscure error when attempting to
|
2455
2456
|
** process a table with generated columns and a descending index. This is
|
2456
2457
|
** not considered a bug since SQLite versions 3.3.0 and earlier do not support
|
2457
|
-
** either generated columns or
|
2458
|
+
** either generated columns or descending indexes.
|
2458
2459
|
** </dd>
|
2459
2460
|
**
|
2460
2461
|
** [[SQLITE_DBCONFIG_STMT_SCANSTATUS]]
|
@@ -2735,6 +2736,7 @@ SQLITE_API sqlite3_int64 sqlite3_total_changes64(sqlite3*);
|
|
2735
2736
|
**
|
2736
2737
|
** ^The [sqlite3_is_interrupted(D)] interface can be used to determine whether
|
2737
2738
|
** or not an interrupt is currently in effect for [database connection] D.
|
2739
|
+
** It returns 1 if an interrupt is currently in effect, or 0 otherwise.
|
2738
2740
|
*/
|
2739
2741
|
SQLITE_API void sqlite3_interrupt(sqlite3*);
|
2740
2742
|
SQLITE_API int sqlite3_is_interrupted(sqlite3*);
|
@@ -3388,8 +3390,10 @@ SQLITE_API SQLITE_DEPRECATED void *sqlite3_profile(sqlite3*,
|
|
3388
3390
|
** M argument should be the bitwise OR-ed combination of
|
3389
3391
|
** zero or more [SQLITE_TRACE] constants.
|
3390
3392
|
**
|
3391
|
-
** ^Each call to either sqlite3_trace() or sqlite3_trace_v2()
|
3392
|
-
** (cancels)
|
3393
|
+
** ^Each call to either sqlite3_trace(D,X,P) or sqlite3_trace_v2(D,M,X,P)
|
3394
|
+
** overrides (cancels) all prior calls to sqlite3_trace(D,X,P) or
|
3395
|
+
** sqlite3_trace_v2(D,M,X,P) for the [database connection] D. Each
|
3396
|
+
** database connection may have at most one trace callback.
|
3393
3397
|
**
|
3394
3398
|
** ^The X callback is invoked whenever any of the events identified by
|
3395
3399
|
** mask M occur. ^The integer return value from the callback is currently
|
@@ -3758,7 +3762,7 @@ SQLITE_API int sqlite3_open_v2(
|
|
3758
3762
|
** as F) must be one of:
|
3759
3763
|
** <ul>
|
3760
3764
|
** <li> A database filename pointer created by the SQLite core and
|
3761
|
-
** passed into the xOpen() method of a VFS
|
3765
|
+
** passed into the xOpen() method of a VFS implementation, or
|
3762
3766
|
** <li> A filename obtained from [sqlite3_db_filename()], or
|
3763
3767
|
** <li> A new filename constructed using [sqlite3_create_filename()].
|
3764
3768
|
** </ul>
|
@@ -3871,7 +3875,7 @@ SQLITE_API sqlite3_file *sqlite3_database_file_object(const char*);
|
|
3871
3875
|
/*
|
3872
3876
|
** CAPI3REF: Create and Destroy VFS Filenames
|
3873
3877
|
**
|
3874
|
-
** These
|
3878
|
+
** These interfaces are provided for use by [VFS shim] implementations and
|
3875
3879
|
** are not useful outside of that context.
|
3876
3880
|
**
|
3877
3881
|
** The sqlite3_create_filename(D,J,W,N,P) allocates memory to hold a version of
|
@@ -3951,6 +3955,7 @@ SQLITE_API void sqlite3_free_filename(sqlite3_filename);
|
|
3951
3955
|
**
|
3952
3956
|
** ^The sqlite3_errmsg() and sqlite3_errmsg16() return English-language
|
3953
3957
|
** text that describes the error, as either UTF-8 or UTF-16 respectively.
|
3958
|
+
** (See how SQLite handles [invalid UTF] for exceptions to this rule.)
|
3954
3959
|
** ^(Memory to hold the error message string is managed internally.
|
3955
3960
|
** The application does not need to worry about freeing the result.
|
3956
3961
|
** However, the error string might be overwritten or deallocated by
|
@@ -4418,6 +4423,41 @@ SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt);
|
|
4418
4423
|
*/
|
4419
4424
|
SQLITE_API int sqlite3_stmt_isexplain(sqlite3_stmt *pStmt);
|
4420
4425
|
|
4426
|
+
/*
|
4427
|
+
** CAPI3REF: Change The EXPLAIN Setting For A Prepared Statement
|
4428
|
+
** METHOD: sqlite3_stmt
|
4429
|
+
**
|
4430
|
+
** The sqlite3_stmt_explain(S,E) interface changes the EXPLAIN
|
4431
|
+
** setting for [prepared statement] S. If E is zero, then S becomes
|
4432
|
+
** a normal prepared statement. If E is 1, then S behaves as if
|
4433
|
+
** its SQL text began with "[EXPLAIN]". If E is 2, then S behaves as if
|
4434
|
+
** its SQL text began with "[EXPLAIN QUERY PLAN]".
|
4435
|
+
**
|
4436
|
+
** Calling sqlite3_stmt_explain(S,E) might cause S to be reprepared.
|
4437
|
+
** SQLite tries to avoid a reprepare, but a reprepare might be necessary
|
4438
|
+
** on the first transition into EXPLAIN or EXPLAIN QUERY PLAN mode.
|
4439
|
+
**
|
4440
|
+
** Because of the potential need to reprepare, a call to
|
4441
|
+
** sqlite3_stmt_explain(S,E) will fail with SQLITE_ERROR if S cannot be
|
4442
|
+
** reprepared because it was created using [sqlite3_prepare()] instead of
|
4443
|
+
** the newer [sqlite3_prepare_v2()] or [sqlite3_prepare_v3()] interfaces and
|
4444
|
+
** hence has no saved SQL text with which to reprepare.
|
4445
|
+
**
|
4446
|
+
** Changing the explain setting for a prepared statement does not change
|
4447
|
+
** the original SQL text for the statement. Hence, if the SQL text originally
|
4448
|
+
** began with EXPLAIN or EXPLAIN QUERY PLAN, but sqlite3_stmt_explain(S,0)
|
4449
|
+
** is called to convert the statement into an ordinary statement, the EXPLAIN
|
4450
|
+
** or EXPLAIN QUERY PLAN keywords will still appear in the sqlite3_sql(S)
|
4451
|
+
** output, even though the statement now acts like a normal SQL statement.
|
4452
|
+
**
|
4453
|
+
** This routine returns SQLITE_OK if the explain mode is successfully
|
4454
|
+
** changed, or an error code if the explain mode could not be changed.
|
4455
|
+
** The explain mode cannot be changed while a statement is active.
|
4456
|
+
** Hence, it is good practice to call [sqlite3_reset(S)]
|
4457
|
+
** immediately prior to calling sqlite3_stmt_explain(S,E).
|
4458
|
+
*/
|
4459
|
+
SQLITE_API int sqlite3_stmt_explain(sqlite3_stmt *pStmt, int eMode);
|
4460
|
+
|
4421
4461
|
/*
|
4422
4462
|
** CAPI3REF: Determine If A Prepared Statement Has Been Reset
|
4423
4463
|
** METHOD: sqlite3_stmt
|
@@ -4581,7 +4621,7 @@ typedef struct sqlite3_context sqlite3_context;
|
|
4581
4621
|
** with it may be passed. ^It is called to dispose of the BLOB or string even
|
4582
4622
|
** if the call to the bind API fails, except the destructor is not called if
|
4583
4623
|
** the third parameter is a NULL pointer or the fourth parameter is negative.
|
4584
|
-
** ^ (2) The special constant, [SQLITE_STATIC], may be
|
4624
|
+
** ^ (2) The special constant, [SQLITE_STATIC], may be passed to indicate that
|
4585
4625
|
** the application remains responsible for disposing of the object. ^In this
|
4586
4626
|
** case, the object and the provided pointer to it must remain valid until
|
4587
4627
|
** either the prepared statement is finalized or the same SQL parameter is
|
@@ -5260,20 +5300,33 @@ SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt);
|
|
5260
5300
|
** ^The [sqlite3_reset(S)] interface resets the [prepared statement] S
|
5261
5301
|
** back to the beginning of its program.
|
5262
5302
|
**
|
5263
|
-
** ^
|
5264
|
-
**
|
5265
|
-
**
|
5266
|
-
**
|
5303
|
+
** ^The return code from [sqlite3_reset(S)] indicates whether or not
|
5304
|
+
** the previous evaluation of prepared statement S completed successfully.
|
5305
|
+
** ^If [sqlite3_step(S)] has never before been called on S or if
|
5306
|
+
** [sqlite3_step(S)] has not been called since the previous call
|
5307
|
+
** to [sqlite3_reset(S)], then [sqlite3_reset(S)] will return
|
5308
|
+
** [SQLITE_OK].
|
5267
5309
|
**
|
5268
5310
|
** ^If the most recent call to [sqlite3_step(S)] for the
|
5269
5311
|
** [prepared statement] S indicated an error, then
|
5270
5312
|
** [sqlite3_reset(S)] returns an appropriate [error code].
|
5313
|
+
** ^The [sqlite3_reset(S)] interface might also return an [error code]
|
5314
|
+
** if there were no prior errors but the process of resetting
|
5315
|
+
** the prepared statement caused a new error. ^For example, if an
|
5316
|
+
** [INSERT] statement with a [RETURNING] clause is only stepped one time,
|
5317
|
+
** that one call to [sqlite3_step(S)] might return SQLITE_ROW but
|
5318
|
+
** the overall statement might still fail and the [sqlite3_reset(S)] call
|
5319
|
+
** might return SQLITE_BUSY if locking constraints prevent the
|
5320
|
+
** database change from committing. Therefore, it is important that
|
5321
|
+
** applications check the return code from [sqlite3_reset(S)] even if
|
5322
|
+
** no prior call to [sqlite3_step(S)] indicated a problem.
|
5271
5323
|
**
|
5272
5324
|
** ^The [sqlite3_reset(S)] interface does not change the values
|
5273
5325
|
** of any [sqlite3_bind_blob|bindings] on the [prepared statement] S.
|
5274
5326
|
*/
|
5275
5327
|
SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt);
|
5276
5328
|
|
5329
|
+
|
5277
5330
|
/*
|
5278
5331
|
** CAPI3REF: Create Or Redefine SQL Functions
|
5279
5332
|
** KEYWORDS: {function creation routines}
|
@@ -5484,7 +5537,7 @@ SQLITE_API int sqlite3_create_window_function(
|
|
5484
5537
|
** [application-defined SQL function]
|
5485
5538
|
** that has side-effects or that could potentially leak sensitive information.
|
5486
5539
|
** This will prevent attacks in which an application is tricked
|
5487
|
-
** into using a database file that has had its schema
|
5540
|
+
** into using a database file that has had its schema surreptitiously
|
5488
5541
|
** modified to invoke the application-defined function in ways that are
|
5489
5542
|
** harmful.
|
5490
5543
|
** <p>
|
@@ -5520,13 +5573,27 @@ SQLITE_API int sqlite3_create_window_function(
|
|
5520
5573
|
** </dd>
|
5521
5574
|
**
|
5522
5575
|
** [[SQLITE_SUBTYPE]] <dt>SQLITE_SUBTYPE</dt><dd>
|
5523
|
-
** The SQLITE_SUBTYPE flag indicates to SQLite that a function
|
5576
|
+
** The SQLITE_SUBTYPE flag indicates to SQLite that a function might call
|
5524
5577
|
** [sqlite3_value_subtype()] to inspect the sub-types of its arguments.
|
5525
|
-
**
|
5526
|
-
**
|
5527
|
-
**
|
5528
|
-
**
|
5529
|
-
**
|
5578
|
+
** This flag instructs SQLite to omit some corner-case optimizations that
|
5579
|
+
** might disrupt the operation of the [sqlite3_value_subtype()] function,
|
5580
|
+
** causing it to return zero rather than the correct subtype().
|
5581
|
+
** SQL functions that invokes [sqlite3_value_subtype()] should have this
|
5582
|
+
** property. If the SQLITE_SUBTYPE property is omitted, then the return
|
5583
|
+
** value from [sqlite3_value_subtype()] might sometimes be zero even though
|
5584
|
+
** a non-zero subtype was specified by the function argument expression.
|
5585
|
+
**
|
5586
|
+
** [[SQLITE_RESULT_SUBTYPE]] <dt>SQLITE_RESULT_SUBTYPE</dt><dd>
|
5587
|
+
** The SQLITE_RESULT_SUBTYPE flag indicates to SQLite that a function might call
|
5588
|
+
** [sqlite3_result_subtype()] to cause a sub-type to be associated with its
|
5589
|
+
** result.
|
5590
|
+
** Every function that invokes [sqlite3_result_subtype()] should have this
|
5591
|
+
** property. If it does not, then the call to [sqlite3_result_subtype()]
|
5592
|
+
** might become a no-op if the function is used as term in an
|
5593
|
+
** [expression index]. On the other hand, SQL functions that never invoke
|
5594
|
+
** [sqlite3_result_subtype()] should avoid setting this property, as the
|
5595
|
+
** purpose of this property is to disable certain optimizations that are
|
5596
|
+
** incompatible with subtypes.
|
5530
5597
|
** </dd>
|
5531
5598
|
** </dl>
|
5532
5599
|
*/
|
@@ -5534,6 +5601,7 @@ SQLITE_API int sqlite3_create_window_function(
|
|
5534
5601
|
#define SQLITE_DIRECTONLY 0x000080000
|
5535
5602
|
#define SQLITE_SUBTYPE 0x000100000
|
5536
5603
|
#define SQLITE_INNOCUOUS 0x000200000
|
5604
|
+
#define SQLITE_RESULT_SUBTYPE 0x001000000
|
5537
5605
|
|
5538
5606
|
/*
|
5539
5607
|
** CAPI3REF: Deprecated Functions
|
@@ -5730,6 +5798,12 @@ SQLITE_API int sqlite3_value_encoding(sqlite3_value*);
|
|
5730
5798
|
** information can be used to pass a limited amount of context from
|
5731
5799
|
** one SQL function to another. Use the [sqlite3_result_subtype()]
|
5732
5800
|
** routine to set the subtype for the return value of an SQL function.
|
5801
|
+
**
|
5802
|
+
** Every [application-defined SQL function] that invoke this interface
|
5803
|
+
** should include the [SQLITE_SUBTYPE] property in the text
|
5804
|
+
** encoding argument when the function is [sqlite3_create_function|registered].
|
5805
|
+
** If the [SQLITE_SUBTYPE] property is omitted, then sqlite3_value_subtype()
|
5806
|
+
** might return zero instead of the upstream subtype in some corner cases.
|
5733
5807
|
*/
|
5734
5808
|
SQLITE_API unsigned int sqlite3_value_subtype(sqlite3_value*);
|
5735
5809
|
|
@@ -5828,48 +5902,56 @@ SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*);
|
|
5828
5902
|
** METHOD: sqlite3_context
|
5829
5903
|
**
|
5830
5904
|
** These functions may be used by (non-aggregate) SQL functions to
|
5831
|
-
** associate
|
5832
|
-
** multiple invocations of the same SQL function during
|
5833
|
-
** some circumstances the associated
|
5834
|
-
** of where this might be useful is in a
|
5835
|
-
** function. The compiled version of the regular
|
5836
|
-
**
|
5905
|
+
** associate auxiliary data with argument values. If the same argument
|
5906
|
+
** value is passed to multiple invocations of the same SQL function during
|
5907
|
+
** query execution, under some circumstances the associated auxiliary data
|
5908
|
+
** might be preserved. An example of where this might be useful is in a
|
5909
|
+
** regular-expression matching function. The compiled version of the regular
|
5910
|
+
** expression can be stored as auxiliary data associated with the pattern string.
|
5837
5911
|
** Then as long as the pattern string remains the same,
|
5838
5912
|
** the compiled regular expression can be reused on multiple
|
5839
5913
|
** invocations of the same function.
|
5840
5914
|
**
|
5841
|
-
** ^The sqlite3_get_auxdata(C,N) interface returns a pointer to the
|
5915
|
+
** ^The sqlite3_get_auxdata(C,N) interface returns a pointer to the auxiliary data
|
5842
5916
|
** associated by the sqlite3_set_auxdata(C,N,P,X) function with the Nth argument
|
5843
5917
|
** value to the application-defined function. ^N is zero for the left-most
|
5844
|
-
** function argument. ^If there is no
|
5918
|
+
** function argument. ^If there is no auxiliary data
|
5845
5919
|
** associated with the function argument, the sqlite3_get_auxdata(C,N) interface
|
5846
5920
|
** returns a NULL pointer.
|
5847
5921
|
**
|
5848
|
-
** ^The sqlite3_set_auxdata(C,N,P,X) interface saves P as
|
5849
|
-
** argument of the application-defined function. ^Subsequent
|
5922
|
+
** ^The sqlite3_set_auxdata(C,N,P,X) interface saves P as auxiliary data for the
|
5923
|
+
** N-th argument of the application-defined function. ^Subsequent
|
5850
5924
|
** calls to sqlite3_get_auxdata(C,N) return P from the most recent
|
5851
|
-
** sqlite3_set_auxdata(C,N,P,X) call if the
|
5852
|
-
** NULL if the
|
5925
|
+
** sqlite3_set_auxdata(C,N,P,X) call if the auxiliary data is still valid or
|
5926
|
+
** NULL if the auxiliary data has been discarded.
|
5853
5927
|
** ^After each call to sqlite3_set_auxdata(C,N,P,X) where X is not NULL,
|
5854
5928
|
** SQLite will invoke the destructor function X with parameter P exactly
|
5855
|
-
** once, when the
|
5856
|
-
** SQLite is free to discard the
|
5929
|
+
** once, when the auxiliary data is discarded.
|
5930
|
+
** SQLite is free to discard the auxiliary data at any time, including: <ul>
|
5857
5931
|
** <li> ^(when the corresponding function parameter changes)^, or
|
5858
5932
|
** <li> ^(when [sqlite3_reset()] or [sqlite3_finalize()] is called for the
|
5859
5933
|
** SQL statement)^, or
|
5860
5934
|
** <li> ^(when sqlite3_set_auxdata() is invoked again on the same
|
5861
5935
|
** parameter)^, or
|
5862
5936
|
** <li> ^(during the original sqlite3_set_auxdata() call when a memory
|
5863
|
-
** allocation error occurs.)^
|
5937
|
+
** allocation error occurs.)^
|
5938
|
+
** <li> ^(during the original sqlite3_set_auxdata() call if the function
|
5939
|
+
** is evaluated during query planning instead of during query execution,
|
5940
|
+
** as sometimes happens with [SQLITE_ENABLE_STAT4].)^ </ul>
|
5864
5941
|
**
|
5865
|
-
** Note the last
|
5942
|
+
** Note the last two bullets in particular. The destructor X in
|
5866
5943
|
** sqlite3_set_auxdata(C,N,P,X) might be called immediately, before the
|
5867
5944
|
** sqlite3_set_auxdata() interface even returns. Hence sqlite3_set_auxdata()
|
5868
5945
|
** should be called near the end of the function implementation and the
|
5869
5946
|
** function implementation should not make any use of P after
|
5870
|
-
** sqlite3_set_auxdata() has been called.
|
5871
|
-
**
|
5872
|
-
**
|
5947
|
+
** sqlite3_set_auxdata() has been called. Furthermore, a call to
|
5948
|
+
** sqlite3_get_auxdata() that occurs immediately after a corresponding call
|
5949
|
+
** to sqlite3_set_auxdata() might still return NULL if an out-of-memory
|
5950
|
+
** condition occurred during the sqlite3_set_auxdata() call or if the
|
5951
|
+
** function is being evaluated during query planning rather than during
|
5952
|
+
** query execution.
|
5953
|
+
**
|
5954
|
+
** ^(In practice, auxiliary data is preserved between function calls for
|
5873
5955
|
** function parameters that are compile-time constants, including literal
|
5874
5956
|
** values and [parameters] and expressions composed from the same.)^
|
5875
5957
|
**
|
@@ -5879,10 +5961,67 @@ SQLITE_API sqlite3 *sqlite3_context_db_handle(sqlite3_context*);
|
|
5879
5961
|
**
|
5880
5962
|
** These routines must be called from the same thread in which
|
5881
5963
|
** the SQL function is running.
|
5964
|
+
**
|
5965
|
+
** See also: [sqlite3_get_clientdata()] and [sqlite3_set_clientdata()].
|
5882
5966
|
*/
|
5883
5967
|
SQLITE_API void *sqlite3_get_auxdata(sqlite3_context*, int N);
|
5884
5968
|
SQLITE_API void sqlite3_set_auxdata(sqlite3_context*, int N, void*, void (*)(void*));
|
5885
5969
|
|
5970
|
+
/*
|
5971
|
+
** CAPI3REF: Database Connection Client Data
|
5972
|
+
** METHOD: sqlite3
|
5973
|
+
**
|
5974
|
+
** These functions are used to associate one or more named pointers
|
5975
|
+
** with a [database connection].
|
5976
|
+
** A call to sqlite3_set_clientdata(D,N,P,X) causes the pointer P
|
5977
|
+
** to be attached to [database connection] D using name N. Subsequent
|
5978
|
+
** calls to sqlite3_get_clientdata(D,N) will return a copy of pointer P
|
5979
|
+
** or a NULL pointer if there were no prior calls to
|
5980
|
+
** sqlite3_set_clientdata() with the same values of D and N.
|
5981
|
+
** Names are compared using strcmp() and are thus case sensitive.
|
5982
|
+
**
|
5983
|
+
** If P and X are both non-NULL, then the destructor X is invoked with
|
5984
|
+
** argument P on the first of the following occurrences:
|
5985
|
+
** <ul>
|
5986
|
+
** <li> An out-of-memory error occurs during the call to
|
5987
|
+
** sqlite3_set_clientdata() which attempts to register pointer P.
|
5988
|
+
** <li> A subsequent call to sqlite3_set_clientdata(D,N,P,X) is made
|
5989
|
+
** with the same D and N parameters.
|
5990
|
+
** <li> The database connection closes. SQLite does not make any guarantees
|
5991
|
+
** about the order in which destructors are called, only that all
|
5992
|
+
** destructors will be called exactly once at some point during the
|
5993
|
+
** database connection closing process.
|
5994
|
+
** </ul>
|
5995
|
+
**
|
5996
|
+
** SQLite does not do anything with client data other than invoke
|
5997
|
+
** destructors on the client data at the appropriate time. The intended
|
5998
|
+
** use for client data is to provide a mechanism for wrapper libraries
|
5999
|
+
** to store additional information about an SQLite database connection.
|
6000
|
+
**
|
6001
|
+
** There is no limit (other than available memory) on the number of different
|
6002
|
+
** client data pointers (with different names) that can be attached to a
|
6003
|
+
** single database connection. However, the implementation is optimized
|
6004
|
+
** for the case of having only one or two different client data names.
|
6005
|
+
** Applications and wrapper libraries are discouraged from using more than
|
6006
|
+
** one client data name each.
|
6007
|
+
**
|
6008
|
+
** There is no way to enumerate the client data pointers
|
6009
|
+
** associated with a database connection. The N parameter can be thought
|
6010
|
+
** of as a secret key such that only code that knows the secret key is able
|
6011
|
+
** to access the associated data.
|
6012
|
+
**
|
6013
|
+
** Security Warning: These interfaces should not be exposed in scripting
|
6014
|
+
** languages or in other circumstances where it might be possible for an
|
6015
|
+
** an attacker to invoke them. Any agent that can invoke these interfaces
|
6016
|
+
** can probably also take control of the process.
|
6017
|
+
**
|
6018
|
+
** Database connection client data is only available for SQLite
|
6019
|
+
** version 3.44.0 ([dateof:3.44.0]) and later.
|
6020
|
+
**
|
6021
|
+
** See also: [sqlite3_set_auxdata()] and [sqlite3_get_auxdata()].
|
6022
|
+
*/
|
6023
|
+
SQLITE_API void *sqlite3_get_clientdata(sqlite3*,const char*);
|
6024
|
+
SQLITE_API int sqlite3_set_clientdata(sqlite3*, const char*, void*, void(*)(void*));
|
5886
6025
|
|
5887
6026
|
/*
|
5888
6027
|
** CAPI3REF: Constants Defining Special Destructor Behavior
|
@@ -6084,6 +6223,20 @@ SQLITE_API int sqlite3_result_zeroblob64(sqlite3_context*, sqlite3_uint64 n);
|
|
6084
6223
|
** higher order bits are discarded.
|
6085
6224
|
** The number of subtype bytes preserved by SQLite might increase
|
6086
6225
|
** in future releases of SQLite.
|
6226
|
+
**
|
6227
|
+
** Every [application-defined SQL function] that invokes this interface
|
6228
|
+
** should include the [SQLITE_RESULT_SUBTYPE] property in its
|
6229
|
+
** text encoding argument when the SQL function is
|
6230
|
+
** [sqlite3_create_function|registered]. If the [SQLITE_RESULT_SUBTYPE]
|
6231
|
+
** property is omitted from the function that invokes sqlite3_result_subtype(),
|
6232
|
+
** then in some cases the sqlite3_result_subtype() might fail to set
|
6233
|
+
** the result subtype.
|
6234
|
+
**
|
6235
|
+
** If SQLite is compiled with -DSQLITE_STRICT_SUBTYPE=1, then any
|
6236
|
+
** SQL function that invokes the sqlite3_result_subtype() interface
|
6237
|
+
** and that does not have the SQLITE_RESULT_SUBTYPE property will raise
|
6238
|
+
** an error. Future versions of SQLite might enable -DSQLITE_STRICT_SUBTYPE=1
|
6239
|
+
** by default.
|
6087
6240
|
*/
|
6088
6241
|
SQLITE_API void sqlite3_result_subtype(sqlite3_context*,unsigned int);
|
6089
6242
|
|
@@ -6515,7 +6668,7 @@ SQLITE_API int sqlite3_db_readonly(sqlite3 *db, const char *zDbName);
|
|
6515
6668
|
SQLITE_API int sqlite3_txn_state(sqlite3*,const char *zSchema);
|
6516
6669
|
|
6517
6670
|
/*
|
6518
|
-
** CAPI3REF: Allowed return values from
|
6671
|
+
** CAPI3REF: Allowed return values from sqlite3_txn_state()
|
6519
6672
|
** KEYWORDS: {transaction state}
|
6520
6673
|
**
|
6521
6674
|
** These constants define the current transaction state of a database file.
|
@@ -6647,7 +6800,7 @@ SQLITE_API void *sqlite3_rollback_hook(sqlite3*, void(*)(void *), void*);
|
|
6647
6800
|
** ^Each call to the sqlite3_autovacuum_pages() interface overrides all
|
6648
6801
|
** previous invocations for that database connection. ^If the callback
|
6649
6802
|
** argument (C) to sqlite3_autovacuum_pages(D,C,P,X) is a NULL pointer,
|
6650
|
-
** then the autovacuum steps callback is
|
6803
|
+
** then the autovacuum steps callback is canceled. The return value
|
6651
6804
|
** from sqlite3_autovacuum_pages() is normally SQLITE_OK, but might
|
6652
6805
|
** be some other error code if something goes wrong. The current
|
6653
6806
|
** implementation will only return SQLITE_OK or SQLITE_MISUSE, but other
|
@@ -7166,6 +7319,10 @@ struct sqlite3_module {
|
|
7166
7319
|
/* The methods above are in versions 1 and 2 of the sqlite_module object.
|
7167
7320
|
** Those below are for version 3 and greater. */
|
7168
7321
|
int (*xShadowName)(const char*);
|
7322
|
+
/* The methods above are in versions 1 through 3 of the sqlite_module object.
|
7323
|
+
** Those below are for version 4 and greater. */
|
7324
|
+
int (*xIntegrity)(sqlite3_vtab *pVTab, const char *zSchema,
|
7325
|
+
const char *zTabName, int mFlags, char **pzErr);
|
7169
7326
|
};
|
7170
7327
|
|
7171
7328
|
/*
|
@@ -7653,7 +7810,7 @@ SQLITE_API int sqlite3_blob_reopen(sqlite3_blob *, sqlite3_int64);
|
|
7653
7810
|
** code is returned and the transaction rolled back.
|
7654
7811
|
**
|
7655
7812
|
** Calling this function with an argument that is not a NULL pointer or an
|
7656
|
-
** open blob handle results in undefined
|
7813
|
+
** open blob handle results in undefined behavior. ^Calling this routine
|
7657
7814
|
** with a null pointer (such as would be returned by a failed call to
|
7658
7815
|
** [sqlite3_blob_open()]) is a harmless no-op. ^Otherwise, if this function
|
7659
7816
|
** is passed a valid open blob handle, the values returned by the
|
@@ -8133,6 +8290,7 @@ SQLITE_API int sqlite3_test_control(int op, ...);
|
|
8133
8290
|
#define SQLITE_TESTCTRL_PRNG_SAVE 5
|
8134
8291
|
#define SQLITE_TESTCTRL_PRNG_RESTORE 6
|
8135
8292
|
#define SQLITE_TESTCTRL_PRNG_RESET 7 /* NOT USED */
|
8293
|
+
#define SQLITE_TESTCTRL_FK_NO_ACTION 7
|
8136
8294
|
#define SQLITE_TESTCTRL_BITVEC_TEST 8
|
8137
8295
|
#define SQLITE_TESTCTRL_FAULT_INSTALL 9
|
8138
8296
|
#define SQLITE_TESTCTRL_BENIGN_MALLOC_HOOKS 10
|
@@ -8161,7 +8319,8 @@ SQLITE_API int sqlite3_test_control(int op, ...);
|
|
8161
8319
|
#define SQLITE_TESTCTRL_TRACEFLAGS 31
|
8162
8320
|
#define SQLITE_TESTCTRL_TUNE 32
|
8163
8321
|
#define SQLITE_TESTCTRL_LOGEST 33
|
8164
|
-
#define
|
8322
|
+
#define SQLITE_TESTCTRL_USELONGDOUBLE 34
|
8323
|
+
#define SQLITE_TESTCTRL_LAST 34 /* Largest TESTCTRL */
|
8165
8324
|
|
8166
8325
|
/*
|
8167
8326
|
** CAPI3REF: SQL Keyword Checking
|
@@ -9617,7 +9776,7 @@ SQLITE_API int sqlite3_vtab_config(sqlite3*, int op, ...);
|
|
9617
9776
|
** [[SQLITE_VTAB_DIRECTONLY]]<dt>SQLITE_VTAB_DIRECTONLY</dt>
|
9618
9777
|
** <dd>Calls of the form
|
9619
9778
|
** [sqlite3_vtab_config](db,SQLITE_VTAB_DIRECTONLY) from within the
|
9620
|
-
** the [xConnect] or [xCreate] methods of a [virtual table]
|
9779
|
+
** the [xConnect] or [xCreate] methods of a [virtual table] implementation
|
9621
9780
|
** prohibits that virtual table from being used from within triggers and
|
9622
9781
|
** views.
|
9623
9782
|
** </dd>
|
@@ -9807,7 +9966,7 @@ SQLITE_API int sqlite3_vtab_distinct(sqlite3_index_info*);
|
|
9807
9966
|
** communicated to the xBestIndex method as a
|
9808
9967
|
** [SQLITE_INDEX_CONSTRAINT_EQ] constraint.)^ If xBestIndex wants to use
|
9809
9968
|
** this constraint, it must set the corresponding
|
9810
|
-
** aConstraintUsage[].argvIndex to a
|
9969
|
+
** aConstraintUsage[].argvIndex to a positive integer. ^(Then, under
|
9811
9970
|
** the usual mode of handling IN operators, SQLite generates [bytecode]
|
9812
9971
|
** that invokes the [xFilter|xFilter() method] once for each value
|
9813
9972
|
** on the right-hand side of the IN operator.)^ Thus the virtual table
|
@@ -10236,7 +10395,7 @@ SQLITE_API int sqlite3_db_cacheflush(sqlite3*);
|
|
10236
10395
|
** When the [sqlite3_blob_write()] API is used to update a blob column,
|
10237
10396
|
** the pre-update hook is invoked with SQLITE_DELETE. This is because the
|
10238
10397
|
** in this case the new values are not available. In this case, when a
|
10239
|
-
** callback made with op==SQLITE_DELETE is
|
10398
|
+
** callback made with op==SQLITE_DELETE is actually a write using the
|
10240
10399
|
** sqlite3_blob_write() API, the [sqlite3_preupdate_blobwrite()] returns
|
10241
10400
|
** the index of the column being written. In other cases, where the
|
10242
10401
|
** pre-update hook is being invoked for some other reason, including a
|
@@ -10497,6 +10656,13 @@ SQLITE_API SQLITE_EXPERIMENTAL int sqlite3_snapshot_recover(sqlite3 *db, const c
|
|
10497
10656
|
** SQLITE_SERIALIZE_NOCOPY bit is set but no contiguous copy
|
10498
10657
|
** of the database exists.
|
10499
10658
|
**
|
10659
|
+
** After the call, if the SQLITE_SERIALIZE_NOCOPY bit had been set,
|
10660
|
+
** the returned buffer content will remain accessible and unchanged
|
10661
|
+
** until either the next write operation on the connection or when
|
10662
|
+
** the connection is closed, and applications must not modify the
|
10663
|
+
** buffer. If the bit had been clear, the returned buffer will not
|
10664
|
+
** be accessed by SQLite after the call.
|
10665
|
+
**
|
10500
10666
|
** A call to sqlite3_serialize(D,S,P,F) might return NULL even if the
|
10501
10667
|
** SQLITE_SERIALIZE_NOCOPY bit is omitted from argument F if a memory
|
10502
10668
|
** allocation error occurs.
|
@@ -10545,6 +10711,9 @@ SQLITE_API unsigned char *sqlite3_serialize(
|
|
10545
10711
|
** SQLite will try to increase the buffer size using sqlite3_realloc64()
|
10546
10712
|
** if writes on the database cause it to grow larger than M bytes.
|
10547
10713
|
**
|
10714
|
+
** Applications must not modify the buffer P or invalidate it before
|
10715
|
+
** the database connection D is closed.
|
10716
|
+
**
|
10548
10717
|
** The sqlite3_deserialize() interface will fail with SQLITE_BUSY if the
|
10549
10718
|
** database is currently in a read transaction or is involved in a backup
|
10550
10719
|
** operation.
|
@@ -10553,6 +10722,13 @@ SQLITE_API unsigned char *sqlite3_serialize(
|
|
10553
10722
|
** S argument to sqlite3_deserialize(D,S,P,N,M,F) is "temp" then the
|
10554
10723
|
** function returns SQLITE_ERROR.
|
10555
10724
|
**
|
10725
|
+
** The deserialized database should not be in [WAL mode]. If the database
|
10726
|
+
** is in WAL mode, then any attempt to use the database file will result
|
10727
|
+
** in an [SQLITE_CANTOPEN] error. The application can set the
|
10728
|
+
** [file format version numbers] (bytes 18 and 19) of the input database P
|
10729
|
+
** to 0x01 prior to invoking sqlite3_deserialize(D,S,P,N,M,F) to force the
|
10730
|
+
** database file into rollback mode and work around this limitation.
|
10731
|
+
**
|
10556
10732
|
** If sqlite3_deserialize(D,S,P,N,M,F) fails for any reason and if the
|
10557
10733
|
** SQLITE_DESERIALIZE_FREEONCLOSE bit is set in argument F, then
|
10558
10734
|
** [sqlite3_free()] is invoked on argument P prior to returning.
|
@@ -11625,6 +11801,18 @@ SQLITE_API int sqlite3changeset_concat(
|
|
11625
11801
|
);
|
11626
11802
|
|
11627
11803
|
|
11804
|
+
/*
|
11805
|
+
** CAPI3REF: Upgrade the Schema of a Changeset/Patchset
|
11806
|
+
*/
|
11807
|
+
SQLITE_API int sqlite3changeset_upgrade(
|
11808
|
+
sqlite3 *db,
|
11809
|
+
const char *zDb,
|
11810
|
+
int nIn, const void *pIn, /* Input changeset */
|
11811
|
+
int *pnOut, void **ppOut /* OUT: Inverse of input */
|
11812
|
+
);
|
11813
|
+
|
11814
|
+
|
11815
|
+
|
11628
11816
|
/*
|
11629
11817
|
** CAPI3REF: Changegroup Handle
|
11630
11818
|
**
|
@@ -11671,6 +11859,38 @@ typedef struct sqlite3_changegroup sqlite3_changegroup;
|
|
11671
11859
|
*/
|
11672
11860
|
SQLITE_API int sqlite3changegroup_new(sqlite3_changegroup **pp);
|
11673
11861
|
|
11862
|
+
/*
|
11863
|
+
** CAPI3REF: Add a Schema to a Changegroup
|
11864
|
+
** METHOD: sqlite3_changegroup_schema
|
11865
|
+
**
|
11866
|
+
** This method may be used to optionally enforce the rule that the changesets
|
11867
|
+
** added to the changegroup handle must match the schema of database zDb
|
11868
|
+
** ("main", "temp", or the name of an attached database). If
|
11869
|
+
** sqlite3changegroup_add() is called to add a changeset that is not compatible
|
11870
|
+
** with the configured schema, SQLITE_SCHEMA is returned and the changegroup
|
11871
|
+
** object is left in an undefined state.
|
11872
|
+
**
|
11873
|
+
** A changeset schema is considered compatible with the database schema in
|
11874
|
+
** the same way as for sqlite3changeset_apply(). Specifically, for each
|
11875
|
+
** table in the changeset, there exists a database table with:
|
11876
|
+
**
|
11877
|
+
** <ul>
|
11878
|
+
** <li> The name identified by the changeset, and
|
11879
|
+
** <li> at least as many columns as recorded in the changeset, and
|
11880
|
+
** <li> the primary key columns in the same position as recorded in
|
11881
|
+
** the changeset.
|
11882
|
+
** </ul>
|
11883
|
+
**
|
11884
|
+
** The output of the changegroup object always has the same schema as the
|
11885
|
+
** database nominated using this function. In cases where changesets passed
|
11886
|
+
** to sqlite3changegroup_add() have fewer columns than the corresponding table
|
11887
|
+
** in the database schema, these are filled in using the default column
|
11888
|
+
** values from the database schema. This makes it possible to combined
|
11889
|
+
** changesets that have different numbers of columns for a single table
|
11890
|
+
** within a changegroup, provided that they are otherwise compatible.
|
11891
|
+
*/
|
11892
|
+
SQLITE_API int sqlite3changegroup_schema(sqlite3_changegroup*, sqlite3*, const char *zDb);
|
11893
|
+
|
11674
11894
|
/*
|
11675
11895
|
** CAPI3REF: Add A Changeset To A Changegroup
|
11676
11896
|
** METHOD: sqlite3_changegroup
|
@@ -11739,13 +11959,18 @@ SQLITE_API int sqlite3changegroup_new(sqlite3_changegroup **pp);
|
|
11739
11959
|
** If the new changeset contains changes to a table that is already present
|
11740
11960
|
** in the changegroup, then the number of columns and the position of the
|
11741
11961
|
** primary key columns for the table must be consistent. If this is not the
|
11742
|
-
** case, this function fails with SQLITE_SCHEMA.
|
11743
|
-
**
|
11744
|
-
**
|
11745
|
-
**
|
11746
|
-
**
|
11962
|
+
** case, this function fails with SQLITE_SCHEMA. Except, if the changegroup
|
11963
|
+
** object has been configured with a database schema using the
|
11964
|
+
** sqlite3changegroup_schema() API, then it is possible to combine changesets
|
11965
|
+
** with different numbers of columns for a single table, provided that
|
11966
|
+
** they are otherwise compatible.
|
11747
11967
|
**
|
11748
|
-
** If
|
11968
|
+
** If the input changeset appears to be corrupt and the corruption is
|
11969
|
+
** detected, SQLITE_CORRUPT is returned. Or, if an out-of-memory condition
|
11970
|
+
** occurs during processing, this function returns SQLITE_NOMEM.
|
11971
|
+
**
|
11972
|
+
** In all cases, if an error occurs the state of the final contents of the
|
11973
|
+
** changegroup is undefined. If no error occurs, SQLITE_OK is returned.
|
11749
11974
|
*/
|
11750
11975
|
SQLITE_API int sqlite3changegroup_add(sqlite3_changegroup*, int nData, void *pData);
|
11751
11976
|
|
@@ -12010,10 +12235,17 @@ SQLITE_API int sqlite3changeset_apply_v2(
|
|
12010
12235
|
** <li>an insert change if all fields of the conflicting row match
|
12011
12236
|
** the row being inserted.
|
12012
12237
|
** </ul>
|
12238
|
+
**
|
12239
|
+
** <dt>SQLITE_CHANGESETAPPLY_FKNOACTION <dd>
|
12240
|
+
** If this flag it set, then all foreign key constraints in the target
|
12241
|
+
** database behave as if they were declared with "ON UPDATE NO ACTION ON
|
12242
|
+
** DELETE NO ACTION", even if they are actually CASCADE, RESTRICT, SET NULL
|
12243
|
+
** or SET DEFAULT.
|
12013
12244
|
*/
|
12014
12245
|
#define SQLITE_CHANGESETAPPLY_NOSAVEPOINT 0x0001
|
12015
12246
|
#define SQLITE_CHANGESETAPPLY_INVERT 0x0002
|
12016
12247
|
#define SQLITE_CHANGESETAPPLY_IGNORENOOP 0x0004
|
12248
|
+
#define SQLITE_CHANGESETAPPLY_FKNOACTION 0x0008
|
12017
12249
|
|
12018
12250
|
/*
|
12019
12251
|
** CAPI3REF: Constants Passed To The Conflict Handler
|
@@ -12754,7 +12986,7 @@ struct Fts5PhraseIter {
|
|
12754
12986
|
** See xPhraseFirstColumn above.
|
12755
12987
|
*/
|
12756
12988
|
struct Fts5ExtensionApi {
|
12757
|
-
int iVersion; /* Currently always set to
|
12989
|
+
int iVersion; /* Currently always set to 2 */
|
12758
12990
|
|
12759
12991
|
void *(*xUserData)(Fts5Context*);
|
12760
12992
|
|
@@ -12983,8 +13215,8 @@ struct Fts5ExtensionApi {
|
|
12983
13215
|
** as separate queries of the FTS index are required for each synonym.
|
12984
13216
|
**
|
12985
13217
|
** When using methods (2) or (3), it is important that the tokenizer only
|
12986
|
-
** provide synonyms when tokenizing document text (method (
|
12987
|
-
** text (method (
|
13218
|
+
** provide synonyms when tokenizing document text (method (3)) or query
|
13219
|
+
** text (method (2)), not both. Doing so will not cause any errors, but is
|
12988
13220
|
** inefficient.
|
12989
13221
|
*/
|
12990
13222
|
typedef struct Fts5Tokenizer Fts5Tokenizer;
|
@@ -13032,7 +13264,7 @@ struct fts5_api {
|
|
13032
13264
|
int (*xCreateTokenizer)(
|
13033
13265
|
fts5_api *pApi,
|
13034
13266
|
const char *zName,
|
13035
|
-
void *
|
13267
|
+
void *pUserData,
|
13036
13268
|
fts5_tokenizer *pTokenizer,
|
13037
13269
|
void (*xDestroy)(void*)
|
13038
13270
|
);
|
@@ -13041,7 +13273,7 @@ struct fts5_api {
|
|
13041
13273
|
int (*xFindTokenizer)(
|
13042
13274
|
fts5_api *pApi,
|
13043
13275
|
const char *zName,
|
13044
|
-
void **
|
13276
|
+
void **ppUserData,
|
13045
13277
|
fts5_tokenizer *pTokenizer
|
13046
13278
|
);
|
13047
13279
|
|
@@ -13049,7 +13281,7 @@ struct fts5_api {
|
|
13049
13281
|
int (*xCreateFunction)(
|
13050
13282
|
fts5_api *pApi,
|
13051
13283
|
const char *zName,
|
13052
|
-
void *
|
13284
|
+
void *pUserData,
|
13053
13285
|
fts5_extension_function xFunction,
|
13054
13286
|
void (*xDestroy)(void*)
|
13055
13287
|
);
|