forked from cory/tildefriends
		
	sqlite-amalgamation-3380000.zip
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3853 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
		
							
								
								
									
										1076
									
								
								deps/sqlite/shell.c
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1076
									
								
								deps/sqlite/shell.c
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										9167
									
								
								deps/sqlite/sqlite3.c
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										9167
									
								
								deps/sqlite/sqlite3.c
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										340
									
								
								deps/sqlite/sqlite3.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										340
									
								
								deps/sqlite/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.37.2" | #define SQLITE_VERSION        "3.38.0" | ||||||
| #define SQLITE_VERSION_NUMBER 3037002 | #define SQLITE_VERSION_NUMBER 3038000 | ||||||
| #define SQLITE_SOURCE_ID      "2022-01-06 13:25:41 872ba256cbf61d9290b571c0e6d82a20c224ca3ad82971edc46b29818d5d17a0" | #define SQLITE_SOURCE_ID      "2022-02-22 18:58:40 40fa792d359f84c3b9e9d6623743e1a59826274e221df1bde8f47086968a1bab" | ||||||
|  |  | ||||||
| /* | /* | ||||||
| ** CAPI3REF: Run-Time Library Version Numbers | ** CAPI3REF: Run-Time Library Version Numbers | ||||||
| @@ -566,7 +566,7 @@ SQLITE_API int sqlite3_exec( | |||||||
| #define SQLITE_WARNING_AUTOINDEX       (SQLITE_WARNING | (1<<8)) | #define SQLITE_WARNING_AUTOINDEX       (SQLITE_WARNING | (1<<8)) | ||||||
| #define SQLITE_AUTH_USER               (SQLITE_AUTH | (1<<8)) | #define SQLITE_AUTH_USER               (SQLITE_AUTH | (1<<8)) | ||||||
| #define SQLITE_OK_LOAD_PERMANENTLY     (SQLITE_OK | (1<<8)) | #define SQLITE_OK_LOAD_PERMANENTLY     (SQLITE_OK | (1<<8)) | ||||||
| #define SQLITE_OK_SYMLINK              (SQLITE_OK | (2<<8)) | #define SQLITE_OK_SYMLINK              (SQLITE_OK | (2<<8)) /* internal use only */ | ||||||
|  |  | ||||||
| /* | /* | ||||||
| ** CAPI3REF: Flags For File Open Operations | ** CAPI3REF: Flags For File Open Operations | ||||||
| @@ -3824,13 +3824,14 @@ SQLITE_API void sqlite3_free_filename(char*); | |||||||
| ** sqlite3_extended_errcode() might change with each API call. | ** sqlite3_extended_errcode() might change with each API call. | ||||||
| ** Except, there are some interfaces that are guaranteed to never | ** Except, there are some interfaces that are guaranteed to never | ||||||
| ** change the value of the error code.  The error-code preserving | ** change the value of the error code.  The error-code preserving | ||||||
| ** interfaces are: | ** interfaces include the following: | ||||||
| ** | ** | ||||||
| ** <ul> | ** <ul> | ||||||
| ** <li> sqlite3_errcode() | ** <li> sqlite3_errcode() | ||||||
| ** <li> sqlite3_extended_errcode() | ** <li> sqlite3_extended_errcode() | ||||||
| ** <li> sqlite3_errmsg() | ** <li> sqlite3_errmsg() | ||||||
| ** <li> sqlite3_errmsg16() | ** <li> sqlite3_errmsg16() | ||||||
|  | ** <li> sqlite3_error_offset() | ||||||
| ** </ul> | ** </ul> | ||||||
| ** | ** | ||||||
| ** ^The sqlite3_errmsg() and sqlite3_errmsg16() return English-language | ** ^The sqlite3_errmsg() and sqlite3_errmsg16() return English-language | ||||||
| @@ -3845,6 +3846,13 @@ SQLITE_API void sqlite3_free_filename(char*); | |||||||
| ** ^(Memory to hold the error message string is managed internally | ** ^(Memory to hold the error message string is managed internally | ||||||
| ** and must not be freed by the application)^. | ** and must not be freed by the application)^. | ||||||
| ** | ** | ||||||
|  | ** ^If the most recent error references a specific token in the input | ||||||
|  | ** SQL, the sqlite3_error_offset() interface returns the byte offset | ||||||
|  | ** of the start of that token.  ^The byte offset returned by | ||||||
|  | ** sqlite3_error_offset() assumes that the input SQL is UTF8. | ||||||
|  | ** ^If the most recent error does not reference a specific token in the input | ||||||
|  | ** SQL, then the sqlite3_error_offset() function returns -1. | ||||||
|  | ** | ||||||
| ** When the serialized [threading mode] is in use, it might be the | ** When the serialized [threading mode] is in use, it might be the | ||||||
| ** case that a second error occurs on a separate thread in between | ** case that a second error occurs on a separate thread in between | ||||||
| ** the time of the first error and the call to these interfaces. | ** the time of the first error and the call to these interfaces. | ||||||
| @@ -3864,6 +3872,7 @@ SQLITE_API int sqlite3_extended_errcode(sqlite3 *db); | |||||||
| SQLITE_API const char *sqlite3_errmsg(sqlite3*); | SQLITE_API const char *sqlite3_errmsg(sqlite3*); | ||||||
| SQLITE_API const void *sqlite3_errmsg16(sqlite3*); | SQLITE_API const void *sqlite3_errmsg16(sqlite3*); | ||||||
| SQLITE_API const char *sqlite3_errstr(int); | SQLITE_API const char *sqlite3_errstr(int); | ||||||
|  | SQLITE_API int sqlite3_error_offset(sqlite3 *db); | ||||||
|  |  | ||||||
| /* | /* | ||||||
| ** CAPI3REF: Prepared Statement Object | ** CAPI3REF: Prepared Statement Object | ||||||
| @@ -4275,6 +4284,10 @@ SQLITE_API const char *sqlite3_normalized_sql(sqlite3_stmt *pStmt); | |||||||
| ** be false.  ^Similarly, a CREATE TABLE IF NOT EXISTS statement is a | ** be false.  ^Similarly, a CREATE TABLE IF NOT EXISTS statement is a | ||||||
| ** read-only no-op if the table already exists, but | ** read-only no-op if the table already exists, but | ||||||
| ** sqlite3_stmt_readonly() still returns false for such a statement. | ** sqlite3_stmt_readonly() still returns false for such a statement. | ||||||
|  | ** | ||||||
|  | ** ^If prepared statement X is an [EXPLAIN] or [EXPLAIN QUERY PLAN] | ||||||
|  | ** statement, then sqlite3_stmt_readonly(X) returns the same value as | ||||||
|  | ** if the EXPLAIN or EXPLAIN QUERY PLAN prefix were omitted. | ||||||
| */ | */ | ||||||
| SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt); | SQLITE_API int sqlite3_stmt_readonly(sqlite3_stmt *pStmt); | ||||||
|  |  | ||||||
| @@ -4343,6 +4356,8 @@ SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt*); | |||||||
| ** | ** | ||||||
| ** ^The sqlite3_value objects that are passed as parameters into the | ** ^The sqlite3_value objects that are passed as parameters into the | ||||||
| ** implementation of [application-defined SQL functions] are protected. | ** implementation of [application-defined SQL functions] are protected. | ||||||
|  | ** ^The sqlite3_value objects returned by [sqlite3_vtab_rhs_value()] | ||||||
|  | ** are protected. | ||||||
| ** ^The sqlite3_value object returned by | ** ^The sqlite3_value object returned by | ||||||
| ** [sqlite3_column_value()] is unprotected. | ** [sqlite3_column_value()] is unprotected. | ||||||
| ** Unprotected sqlite3_value objects may only be used as arguments | ** Unprotected sqlite3_value objects may only be used as arguments | ||||||
| @@ -7122,8 +7137,38 @@ struct sqlite3_index_info { | |||||||
| ** | ** | ||||||
| ** These macros define the allowed values for the | ** These macros define the allowed values for the | ||||||
| ** [sqlite3_index_info].aConstraint[].op field.  Each value represents | ** [sqlite3_index_info].aConstraint[].op field.  Each value represents | ||||||
| ** an operator that is part of a constraint term in the wHERE clause of | ** an operator that is part of a constraint term in the WHERE clause of | ||||||
| ** a query that uses a [virtual table]. | ** a query that uses a [virtual table]. | ||||||
|  | ** | ||||||
|  | ** ^The left-hand operand of the operator is given by the corresponding | ||||||
|  | ** aConstraint[].iColumn field.  ^An iColumn of -1 indicates the left-hand | ||||||
|  | ** operand is the rowid. | ||||||
|  | ** The SQLITE_INDEX_CONSTRAINT_LIMIT and SQLITE_INDEX_CONSTRAINT_OFFSET | ||||||
|  | ** operators have no left-hand operand, and so for those operators the | ||||||
|  | ** corresponding aConstraint[].iColumn is meaningless and should not be | ||||||
|  | ** used. | ||||||
|  | ** | ||||||
|  | ** All operator values from SQLITE_INDEX_CONSTRAINT_FUNCTION through | ||||||
|  | ** value 255 are reserved to represent functions that are overloaded | ||||||
|  | ** by the [xFindFunction|xFindFunction method] of the virtual table | ||||||
|  | ** implementation. | ||||||
|  | ** | ||||||
|  | ** The right-hand operands for each constraint might be accessible using | ||||||
|  | ** the [sqlite3_vtab_rhs_value()] interface.  Usually the right-hand | ||||||
|  | ** operand is only available if it appears as a single constant literal | ||||||
|  | ** in the input SQL.  If the right-hand operand is another column or an | ||||||
|  | ** expression (even a constant expression) or a parameter, then the | ||||||
|  | ** sqlite3_vtab_rhs_value() probably will not be able to extract it. | ||||||
|  | ** ^The SQLITE_INDEX_CONSTRAINT_ISNULL and | ||||||
|  | ** SQLITE_INDEX_CONSTRAINT_ISNOTNULL operators have no right-hand operand | ||||||
|  | ** and hence calls to sqlite3_vtab_rhs_value() for those operators will | ||||||
|  | ** always return SQLITE_NOTFOUND. | ||||||
|  | ** | ||||||
|  | ** The collating sequence to be used for comparison can be found using | ||||||
|  | ** the [sqlite3_vtab_collation()] interface.  For most real-world virtual | ||||||
|  | ** tables, the collating sequence of constraints does not matter (for example | ||||||
|  | ** because the constraints are numeric) and so the sqlite3_vtab_collation() | ||||||
|  | ** interface is no commonly needed. | ||||||
| */ | */ | ||||||
| #define SQLITE_INDEX_CONSTRAINT_EQ          2 | #define SQLITE_INDEX_CONSTRAINT_EQ          2 | ||||||
| #define SQLITE_INDEX_CONSTRAINT_GT          4 | #define SQLITE_INDEX_CONSTRAINT_GT          4 | ||||||
| @@ -7139,6 +7184,8 @@ struct sqlite3_index_info { | |||||||
| #define SQLITE_INDEX_CONSTRAINT_ISNOTNULL  70 | #define SQLITE_INDEX_CONSTRAINT_ISNOTNULL  70 | ||||||
| #define SQLITE_INDEX_CONSTRAINT_ISNULL     71 | #define SQLITE_INDEX_CONSTRAINT_ISNULL     71 | ||||||
| #define SQLITE_INDEX_CONSTRAINT_IS         72 | #define SQLITE_INDEX_CONSTRAINT_IS         72 | ||||||
|  | #define SQLITE_INDEX_CONSTRAINT_LIMIT      73 | ||||||
|  | #define SQLITE_INDEX_CONSTRAINT_OFFSET     74 | ||||||
| #define SQLITE_INDEX_CONSTRAINT_FUNCTION  150 | #define SQLITE_INDEX_CONSTRAINT_FUNCTION  150 | ||||||
|  |  | ||||||
| /* | /* | ||||||
| @@ -7168,7 +7215,7 @@ struct sqlite3_index_info { | |||||||
| ** destructor. | ** destructor. | ||||||
| ** | ** | ||||||
| ** ^If the third parameter (the pointer to the sqlite3_module object) is | ** ^If the third parameter (the pointer to the sqlite3_module object) is | ||||||
| ** NULL then no new module is create and any existing modules with the | ** NULL then no new module is created and any existing modules with the | ||||||
| ** same name are dropped. | ** same name are dropped. | ||||||
| ** | ** | ||||||
| ** See also: [sqlite3_drop_modules()] | ** See also: [sqlite3_drop_modules()] | ||||||
| @@ -7944,7 +7991,8 @@ SQLITE_API int sqlite3_test_control(int op, ...); | |||||||
| #define SQLITE_TESTCTRL_SEEK_COUNT              30 | #define SQLITE_TESTCTRL_SEEK_COUNT              30 | ||||||
| #define SQLITE_TESTCTRL_TRACEFLAGS              31 | #define SQLITE_TESTCTRL_TRACEFLAGS              31 | ||||||
| #define SQLITE_TESTCTRL_TUNE                    32 | #define SQLITE_TESTCTRL_TUNE                    32 | ||||||
| #define SQLITE_TESTCTRL_LAST                    32  /* Largest TESTCTRL */ | #define SQLITE_TESTCTRL_LOGEST                  33 | ||||||
|  | #define SQLITE_TESTCTRL_LAST                    33  /* Largest TESTCTRL */ | ||||||
|  |  | ||||||
| /* | /* | ||||||
| ** CAPI3REF: SQL Keyword Checking | ** CAPI3REF: SQL Keyword Checking | ||||||
| @@ -8467,6 +8515,16 @@ SQLITE_API int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg); | |||||||
| ** The counter is incremented on the first [sqlite3_step()] call of each | ** The counter is incremented on the first [sqlite3_step()] call of each | ||||||
| ** cycle. | ** cycle. | ||||||
| ** | ** | ||||||
|  | ** [[SQLITE_STMTSTATUS_FILTER_MISS]] | ||||||
|  | ** [[SQLITE_STMTSTATUS_FILTER HIT]] | ||||||
|  | ** <dt>SQLITE_STMTSTATUS_FILTER_HIT<br> | ||||||
|  | ** SQLITE_STMTSTATUS_FILTER_MISS</dt> | ||||||
|  | ** <dd>^SQLITE_STMTSTATUS_FILTER_HIT is the number of times that a join | ||||||
|  | ** step was bypassed because a Bloom filter returned not-found.  The | ||||||
|  | ** corresponding SQLITE_STMTSTATUS_FILTER_MISS value is the number of | ||||||
|  | ** times that the Bloom filter returned a find, and thus the join step | ||||||
|  | ** had to be processed as normal. | ||||||
|  | ** | ||||||
| ** [[SQLITE_STMTSTATUS_MEMUSED]] <dt>SQLITE_STMTSTATUS_MEMUSED</dt> | ** [[SQLITE_STMTSTATUS_MEMUSED]] <dt>SQLITE_STMTSTATUS_MEMUSED</dt> | ||||||
| ** <dd>^This is the approximate number of bytes of heap memory | ** <dd>^This is the approximate number of bytes of heap memory | ||||||
| ** used to store the prepared statement.  ^This value is not actually | ** used to store the prepared statement.  ^This value is not actually | ||||||
| @@ -8481,6 +8539,8 @@ SQLITE_API int sqlite3_stmt_status(sqlite3_stmt*, int op,int resetFlg); | |||||||
| #define SQLITE_STMTSTATUS_VM_STEP           4 | #define SQLITE_STMTSTATUS_VM_STEP           4 | ||||||
| #define SQLITE_STMTSTATUS_REPREPARE         5 | #define SQLITE_STMTSTATUS_REPREPARE         5 | ||||||
| #define SQLITE_STMTSTATUS_RUN               6 | #define SQLITE_STMTSTATUS_RUN               6 | ||||||
|  | #define SQLITE_STMTSTATUS_FILTER_MISS       7 | ||||||
|  | #define SQLITE_STMTSTATUS_FILTER_HIT        8 | ||||||
| #define SQLITE_STMTSTATUS_MEMUSED           99 | #define SQLITE_STMTSTATUS_MEMUSED           99 | ||||||
|  |  | ||||||
| /* | /* | ||||||
| @@ -9449,19 +9509,269 @@ SQLITE_API int sqlite3_vtab_nochange(sqlite3_context*); | |||||||
|  |  | ||||||
| /* | /* | ||||||
| ** CAPI3REF: Determine The Collation For a Virtual Table Constraint | ** CAPI3REF: Determine The Collation For a Virtual Table Constraint | ||||||
|  | ** METHOD: sqlite3_index_info | ||||||
| ** | ** | ||||||
| ** This function may only be called from within a call to the [xBestIndex] | ** This function may only be called from within a call to the [xBestIndex] | ||||||
| ** method of a [virtual table]. | ** method of a [virtual table].  This function returns a pointer to a string | ||||||
|  | ** that is the name of the appropriate collation sequence to use for text | ||||||
|  | ** comparisons on the constraint identified by its arguments. | ||||||
| ** | ** | ||||||
| ** The first argument must be the sqlite3_index_info object that is the | ** The first argument must be the pointer to the [sqlite3_index_info] object | ||||||
| ** first parameter to the xBestIndex() method. The second argument must be | ** that is the first parameter to the xBestIndex() method. The second argument | ||||||
| ** an index into the aConstraint[] array belonging to the sqlite3_index_info | ** must be an index into the aConstraint[] array belonging to the | ||||||
| ** structure passed to xBestIndex. This function returns a pointer to a buffer | ** sqlite3_index_info structure passed to xBestIndex. | ||||||
| ** containing the name of the collation sequence for the corresponding | ** | ||||||
| ** constraint. | ** Important: | ||||||
|  | ** The first parameter must be the same pointer that is passed into the | ||||||
|  | ** xBestMethod() method.  The first parameter may not be a pointer to a | ||||||
|  | ** different [sqlite3_index_info] object, even an exact copy. | ||||||
|  | ** | ||||||
|  | ** The return value is computed as follows: | ||||||
|  | ** | ||||||
|  | ** <ol> | ||||||
|  | ** <li><p> If the constraint comes from a WHERE clause expression that contains | ||||||
|  | **         a [COLLATE operator], then the name of the collation specified by | ||||||
|  | **         that COLLATE operator is returned. | ||||||
|  | ** <li><p> If there is no COLLATE operator, but the column that is the subject | ||||||
|  | **         of the constraint specifies an alternative collating sequence via | ||||||
|  | **         a [COLLATE clause] on the column definition within the CREATE TABLE | ||||||
|  | **         statement that was passed into [sqlite3_declare_vtab()], then the | ||||||
|  | **         name of that alternative collating sequence is returned. | ||||||
|  | ** <li><p> Otherwise, "BINARY" is returned. | ||||||
|  | ** </ol> | ||||||
| */ | */ | ||||||
| SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_info*,int); | SQLITE_API SQLITE_EXPERIMENTAL const char *sqlite3_vtab_collation(sqlite3_index_info*,int); | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | ** CAPI3REF: Determine if a virtual table query is DISTINCT | ||||||
|  | ** METHOD: sqlite3_index_info | ||||||
|  | ** | ||||||
|  | ** This API may only be used from within an [xBestIndex|xBestIndex method] | ||||||
|  | ** of a [virtual table] implementation. The result of calling this | ||||||
|  | ** interface from outside of xBestIndex() is undefined and probably harmful. | ||||||
|  | ** | ||||||
|  | ** ^The sqlite3_vtab_distinct() interface returns an integer that is | ||||||
|  | ** either 0, 1, or 2.  The integer returned by sqlite3_vtab_distinct() | ||||||
|  | ** gives the virtual table additional information about how the query | ||||||
|  | ** planner wants the output to be ordered. As long as the virtual table | ||||||
|  | ** can meet the ordering requirements of the query planner, it may set | ||||||
|  | ** the "orderByConsumed" flag. | ||||||
|  | ** | ||||||
|  | ** <ol><li value="0"><p> | ||||||
|  | ** ^If the sqlite3_vtab_distinct() interface returns 0, that means | ||||||
|  | ** that the query planner needs the virtual table to return all rows in the | ||||||
|  | ** sort order defined by the "nOrderBy" and "aOrderBy" fields of the | ||||||
|  | ** [sqlite3_index_info] object.  This is the default expectation.  If the | ||||||
|  | ** virtual table outputs all rows in sorted order, then it is always safe for | ||||||
|  | ** the xBestIndex method to set the "orderByConsumed" flag, regardless of | ||||||
|  | ** the return value from sqlite3_vtab_distinct(). | ||||||
|  | ** <li value="1"><p> | ||||||
|  | ** ^(If the sqlite3_vtab_distinct() interface returns 1, that means | ||||||
|  | ** that the query planner does not need the rows to be returned in sorted order | ||||||
|  | ** as long as all rows with the same values in all columns identified by the | ||||||
|  | ** "aOrderBy" field are adjacent.)^  This mode is used when the query planner | ||||||
|  | ** is doing a GROUP BY. | ||||||
|  | ** <li value="2"><p> | ||||||
|  | ** ^(If the sqlite3_vtab_distinct() interface returns 2, that means | ||||||
|  | ** that the query planner does not need the rows returned in any particular | ||||||
|  | ** order, as long as rows with the same values in all "aOrderBy" columns | ||||||
|  | ** are adjacent.)^  ^(Furthermore, only a single row for each particular | ||||||
|  | ** combination of values in the columns identified by the "aOrderBy" field | ||||||
|  | ** needs to be returned.)^  ^It is always ok for two or more rows with the same | ||||||
|  | ** values in all "aOrderBy" columns to be returned, as long as all such rows | ||||||
|  | ** are adjacent.  ^The virtual table may, if it chooses, omit extra rows | ||||||
|  | ** that have the same value for all columns identified by "aOrderBy". | ||||||
|  | ** ^However omitting the extra rows is optional. | ||||||
|  | ** This mode is used for a DISTINCT query. | ||||||
|  | ** </ol> | ||||||
|  | ** | ||||||
|  | ** ^For the purposes of comparing virtual table output values to see if the | ||||||
|  | ** values are same value for sorting purposes, two NULL values are considered | ||||||
|  | ** to be the same.  In other words, the comparison operator is "IS" | ||||||
|  | ** (or "IS NOT DISTINCT FROM") and not "==". | ||||||
|  | ** | ||||||
|  | ** If a virtual table implementation is unable to meet the requirements | ||||||
|  | ** specified above, then it must not set the "orderByConsumed" flag in the | ||||||
|  | ** [sqlite3_index_info] object or an incorrect answer may result. | ||||||
|  | ** | ||||||
|  | ** ^A virtual table implementation is always free to return rows in any order | ||||||
|  | ** it wants, as long as the "orderByConsumed" flag is not set.  ^When the | ||||||
|  | ** the "orderByConsumed" flag is unset, the query planner will add extra | ||||||
|  | ** [bytecode] to ensure that the final results returned by the SQL query are | ||||||
|  | ** ordered correctly.  The use of the "orderByConsumed" flag and the | ||||||
|  | ** sqlite3_vtab_distinct() interface is merely an optimization.  ^Careful | ||||||
|  | ** use of the sqlite3_vtab_distinct() interface and the "orderByConsumed" | ||||||
|  | ** flag might help queries against a virtual table to run faster.  Being | ||||||
|  | ** overly aggressive and setting the "orderByConsumed" flag when it is not | ||||||
|  | ** valid to do so, on the other hand, might cause SQLite to return incorrect | ||||||
|  | ** results. | ||||||
|  | */ | ||||||
|  | SQLITE_API int sqlite3_vtab_distinct(sqlite3_index_info*); | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | ** CAPI3REF: Identify and handle IN constraints in xBestIndex | ||||||
|  | ** | ||||||
|  | ** This interface may only be used from within an | ||||||
|  | ** [xBestIndex|xBestIndex() method] of a [virtual table] implementation. | ||||||
|  | ** The result of invoking this interface from any other context is | ||||||
|  | ** undefined and probably harmful. | ||||||
|  | ** | ||||||
|  | ** ^(A constraint on a virtual table of the form | ||||||
|  | ** "[IN operator|column IN (...)]" is | ||||||
|  | ** communicated to the xBestIndex method as a | ||||||
|  | ** [SQLITE_INDEX_CONSTRAINT_EQ] constraint.)^  If xBestIndex wants to use | ||||||
|  | ** this constraint, it must set the corresponding | ||||||
|  | ** aConstraintUsage[].argvIndex to a postive integer.  ^(Then, under | ||||||
|  | ** the usual mode of handling IN operators, SQLite generates [bytecode] | ||||||
|  | ** that invokes the [xFilter|xFilter() method] once for each value | ||||||
|  | ** on the right-hand side of the IN operator.)^  Thus the virtual table | ||||||
|  | ** only sees a single value from the right-hand side of the IN operator | ||||||
|  | ** at a time. | ||||||
|  | ** | ||||||
|  | ** In some cases, however, it would be advantageous for the virtual | ||||||
|  | ** table to see all values on the right-hand of the IN operator all at | ||||||
|  | ** once.  The sqlite3_vtab_in() interfaces facilitates this in two ways: | ||||||
|  | ** | ||||||
|  | ** <ol> | ||||||
|  | ** <li><p> | ||||||
|  | **   ^A call to sqlite3_vtab_in(P,N,-1) will return true (non-zero) | ||||||
|  | **   if and only if the [sqlite3_index_info|P->aConstraint][N] constraint | ||||||
|  | **   is an [IN operator] that can be processed all at once.  ^In other words, | ||||||
|  | **   sqlite3_vtab_in() with -1 in the third argument is a mechanism | ||||||
|  | **   by which the virtual table can ask SQLite if all-at-once processing | ||||||
|  | **   of the IN operator is even possible. | ||||||
|  | ** | ||||||
|  | ** <li><p> | ||||||
|  | **   ^A call to sqlite3_vtab_in(P,N,F) with F==1 or F==0 indicates | ||||||
|  | **   to SQLite that the virtual table does or does not want to process | ||||||
|  | **   the IN operator all-at-once, respectively.  ^Thus when the third | ||||||
|  | **   parameter (F) is non-negative, this interface is the mechanism by | ||||||
|  | **   which the virtual table tells SQLite how it wants to process the | ||||||
|  | **   IN operator. | ||||||
|  | ** </ol> | ||||||
|  | ** | ||||||
|  | ** ^The sqlite3_vtab_in(P,N,F) interface can be invoked multiple times | ||||||
|  | ** within the same xBestIndex method call.  ^For any given P,N pair, | ||||||
|  | ** the return value from sqlite3_vtab_in(P,N,F) will always be the same | ||||||
|  | ** within the same xBestIndex call.  ^If the interface returns true | ||||||
|  | ** (non-zero), that means that the constraint is an IN operator | ||||||
|  | ** that can be processed all-at-once.  ^If the constraint is not an IN | ||||||
|  | ** operator or cannot be processed all-at-once, then the interface returns | ||||||
|  | ** false. | ||||||
|  | ** | ||||||
|  | ** ^(All-at-once processing of the IN operator is selected if both of the | ||||||
|  | ** following conditions are met: | ||||||
|  | ** | ||||||
|  | ** <ol> | ||||||
|  | ** <li><p> The P->aConstraintUsage[N].argvIndex value is set to a positive | ||||||
|  | ** integer.  This is how the virtual table tells SQLite that it wants to | ||||||
|  | ** use the N-th constraint. | ||||||
|  | ** | ||||||
|  | ** <li><p> The last call to sqlite3_vtab_in(P,N,F) for which F was | ||||||
|  | ** non-negative had F>=1. | ||||||
|  | ** </ol>)^ | ||||||
|  | ** | ||||||
|  | ** ^If either or both of the conditions above are false, then SQLite uses | ||||||
|  | ** the traditional one-at-a-time processing strategy for the IN constraint. | ||||||
|  | ** ^If both conditions are true, then the argvIndex-th parameter to the | ||||||
|  | ** xFilter method will be an [sqlite3_value] that appears to be NULL, | ||||||
|  | ** but which can be passed to [sqlite3_vtab_in_first()] and | ||||||
|  | ** [sqlite3_vtab_in_next()] to find all values on the right-hand side | ||||||
|  | ** of the IN constraint. | ||||||
|  | */ | ||||||
|  | SQLITE_API int sqlite3_vtab_in(sqlite3_index_info*, int iCons, int bHandle); | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | ** CAPI3REF: Find all elements on the right-hand side of an IN constraint. | ||||||
|  | ** | ||||||
|  | ** These interfaces are only useful from within the | ||||||
|  | ** [xFilter|xFilter() method] of a [virtual table] implementation. | ||||||
|  | ** The result of invoking these interfaces from any other context | ||||||
|  | ** is undefined and probably harmful. | ||||||
|  | ** | ||||||
|  | ** The X parameter in a call to sqlite3_vtab_in_first(X,P) or | ||||||
|  | ** sqlite3_vtab_in_next(X,P) must be one of the parameters to the | ||||||
|  | ** xFilter method which invokes these routines, and specifically | ||||||
|  | ** a parameter that was previously selected for all-at-once IN constraint | ||||||
|  | ** processing use the [sqlite3_vtab_in()] interface in the | ||||||
|  | ** [xBestIndex|xBestIndex method].  ^(If the X parameter is not | ||||||
|  | ** an xFilter argument that was selected for all-at-once IN constraint | ||||||
|  | ** processing, then these routines return [SQLITE_MISUSE])^ or perhaps | ||||||
|  | ** exhibit some other undefined or harmful behavior. | ||||||
|  | ** | ||||||
|  | ** ^(Use these routines to access all values on the right-hand side | ||||||
|  | ** of the IN constraint using code like the following: | ||||||
|  | ** | ||||||
|  | ** <blockquote><pre> | ||||||
|  | **    for(rc=sqlite3_vtab_in_first(pList, &pVal); | ||||||
|  | **        rc==SQLITE_OK && pVal | ||||||
|  | **        rc=sqlite3_vtab_in_next(pList, &pVal) | ||||||
|  | **    ){ | ||||||
|  | **      // do something with pVal | ||||||
|  | **    } | ||||||
|  | **    if( rc!=SQLITE_OK ){ | ||||||
|  | **      // an error has occurred | ||||||
|  | **    } | ||||||
|  | ** </pre></blockquote>)^ | ||||||
|  | ** | ||||||
|  | ** ^On success, the sqlite3_vtab_in_first(X,P) and sqlite3_vtab_in_next(X,P) | ||||||
|  | ** routines return SQLITE_OK and set *P to point to the first or next value | ||||||
|  | ** on the RHS of the IN constraint.  ^If there are no more values on the | ||||||
|  | ** right hand side of the IN constraint, then *P is set to NULL and these | ||||||
|  | ** routines return [SQLITE_DONE].  ^The return value might be | ||||||
|  | ** some other value, such as SQLITE_NOMEM, in the event of a malfunction. | ||||||
|  | ** | ||||||
|  | ** The *ppOut values returned by these routines are only valid until the | ||||||
|  | ** next call to either of these routines or until the end of the xFilter | ||||||
|  | ** method from which these routines were called.  If the virtual table | ||||||
|  | ** implementation needs to retain the *ppOut values for longer, it must make | ||||||
|  | ** copies.  The *ppOut values are [protected sqlite3_value|protected]. | ||||||
|  | */ | ||||||
|  | SQLITE_API int sqlite3_vtab_in_first(sqlite3_value *pVal, sqlite3_value **ppOut); | ||||||
|  | SQLITE_API int sqlite3_vtab_in_next(sqlite3_value *pVal, sqlite3_value **ppOut); | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | ** CAPI3REF: Constraint values in xBestIndex() | ||||||
|  | ** METHOD: sqlite3_index_info | ||||||
|  | ** | ||||||
|  | ** This API may only be used from within the [xBestIndex|xBestIndex method] | ||||||
|  | ** of a [virtual table] implementation. The result of calling this interface | ||||||
|  | ** from outside of an xBestIndex method are undefined and probably harmful. | ||||||
|  | ** | ||||||
|  | ** ^When the sqlite3_vtab_rhs_value(P,J,V) interface is invoked from within | ||||||
|  | ** the [xBestIndex] method of a [virtual table] implementation, with P being | ||||||
|  | ** a copy of the [sqlite3_index_info] object pointer passed into xBestIndex and | ||||||
|  | ** J being a 0-based index into P->aConstraint[], then this routine | ||||||
|  | ** attempts to set *V to the value of the right-hand operand of | ||||||
|  | ** that constraint if the right-hand operand is known.  ^If the | ||||||
|  | ** right-hand operand is not known, then *V is set to a NULL pointer. | ||||||
|  | ** ^The sqlite3_vtab_rhs_value(P,J,V) interface returns SQLITE_OK if | ||||||
|  | ** and only if *V is set to a value.  ^The sqlite3_vtab_rhs_value(P,J,V) | ||||||
|  | ** inteface returns SQLITE_NOTFOUND if the right-hand side of the J-th | ||||||
|  | ** constraint is not available.  ^The sqlite3_vtab_rhs_value() interface | ||||||
|  | ** can return an result code other than SQLITE_OK or SQLITE_NOTFOUND if | ||||||
|  | ** something goes wrong. | ||||||
|  | ** | ||||||
|  | ** The sqlite3_vtab_rhs_value() interface is usually only successful if | ||||||
|  | ** the right-hand operand of a constraint is a literal value in the original | ||||||
|  | ** SQL statement.  If the right-hand operand is an expression or a reference | ||||||
|  | ** to some other column or a [host parameter], then sqlite3_vtab_rhs_value() | ||||||
|  | ** will probably return [SQLITE_NOTFOUND]. | ||||||
|  | ** | ||||||
|  | ** ^(Some constraints, such as [SQLITE_INDEX_CONSTRAINT_ISNULL] and | ||||||
|  | ** [SQLITE_INDEX_CONSTRAINT_ISNOTNULL], have no right-hand operand.  For such | ||||||
|  | ** constraints, sqlite3_vtab_rhs_value() always returns SQLITE_NOTFOUND.)^ | ||||||
|  | ** | ||||||
|  | ** ^The [sqlite3_value] object returned in *V is a protected sqlite3_value | ||||||
|  | ** and remains valid for the duration of the xBestIndex method call. | ||||||
|  | ** ^When xBestIndex returns, the sqlite3_value object returned by | ||||||
|  | ** sqlite3_vtab_rhs_value() is automatically deallocated. | ||||||
|  | ** | ||||||
|  | ** The "_rhs_" in the name of this routine is an appreviation for | ||||||
|  | ** "Right-Hand Side". | ||||||
|  | */ | ||||||
|  | SQLITE_API int sqlite3_vtab_rhs_value(sqlite3_index_info*, int, sqlite3_value **ppVal); | ||||||
|  |  | ||||||
| /* | /* | ||||||
| ** CAPI3REF: Conflict resolution modes | ** CAPI3REF: Conflict resolution modes | ||||||
| ** KEYWORDS: {conflict resolution mode} | ** KEYWORDS: {conflict resolution mode} | ||||||
|   | |||||||
							
								
								
									
										14
									
								
								deps/sqlite/sqlite3ext.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								deps/sqlite/sqlite3ext.h
									
									
									
									
										vendored
									
									
								
							| @@ -344,6 +344,13 @@ struct sqlite3_api_routines { | |||||||
|   int (*autovacuum_pages)(sqlite3*, |   int (*autovacuum_pages)(sqlite3*, | ||||||
|      unsigned int(*)(void*,const char*,unsigned int,unsigned int,unsigned int), |      unsigned int(*)(void*,const char*,unsigned int,unsigned int,unsigned int), | ||||||
|      void*, void(*)(void*)); |      void*, void(*)(void*)); | ||||||
|  |   /* Version 3.38.0 and later */ | ||||||
|  |   int (*error_offset)(sqlite3*); | ||||||
|  |   int (*vtab_rhs_value)(sqlite3_index_info*,int,sqlite3_value**); | ||||||
|  |   int (*vtab_distinct)(sqlite3_index_info*); | ||||||
|  |   int (*vtab_in)(sqlite3_index_info*,int,int); | ||||||
|  |   int (*vtab_in_first)(sqlite3_value*,sqlite3_value**); | ||||||
|  |   int (*vtab_in_next)(sqlite3_value*,sqlite3_value**); | ||||||
| }; | }; | ||||||
|  |  | ||||||
| /* | /* | ||||||
| @@ -655,6 +662,13 @@ typedef int (*sqlite3_loadext_entry)( | |||||||
| #define sqlite3_total_changes64        sqlite3_api->total_changes64 | #define sqlite3_total_changes64        sqlite3_api->total_changes64 | ||||||
| /* Version 3.37.0 and later */ | /* Version 3.37.0 and later */ | ||||||
| #define sqlite3_autovacuum_pages       sqlite3_api->autovacuum_pages | #define sqlite3_autovacuum_pages       sqlite3_api->autovacuum_pages | ||||||
|  | /* Version 3.38.0 and later */ | ||||||
|  | #define sqlite3_error_offset           sqlite3_api->error_offset | ||||||
|  | #define sqlite3_vtab_rhs_value         sqlite3_api->vtab_rhs_value | ||||||
|  | #define sqlite3_vtab_distinct          sqlite3_api->vtab_distinct | ||||||
|  | #define sqlite3_vtab_in                sqlite3_api->vtab_in | ||||||
|  | #define sqlite3_vtab_in_first          sqlite3_api->vtab_in_first | ||||||
|  | #define sqlite3_vtab_in_next           sqlite3_api->vtab_in_next | ||||||
| #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) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user