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:
		
							
								
								
									
										1126
									
								
								deps/sqlite/shell.c
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1126
									
								
								deps/sqlite/shell.c
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										9359
									
								
								deps/sqlite/sqlite3.c
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										9359
									
								
								deps/sqlite/sqlite3.c
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										370
									
								
								deps/sqlite/sqlite3.h
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										370
									
								
								deps/sqlite/sqlite3.h
									
									
									
									
										vendored
									
									
								
							| @@ -146,9 +146,9 @@ extern "C" { | ||||
| ** [sqlite3_libversion_number()], [sqlite3_sourceid()], | ||||
| ** [sqlite_version()] and [sqlite_source_id()]. | ||||
| */ | ||||
| #define SQLITE_VERSION        "3.37.2" | ||||
| #define SQLITE_VERSION_NUMBER 3037002 | ||||
| #define SQLITE_SOURCE_ID      "2022-01-06 13:25:41 872ba256cbf61d9290b571c0e6d82a20c224ca3ad82971edc46b29818d5d17a0" | ||||
| #define SQLITE_VERSION        "3.38.0" | ||||
| #define SQLITE_VERSION_NUMBER 3038000 | ||||
| #define SQLITE_SOURCE_ID      "2022-02-22 18:58:40 40fa792d359f84c3b9e9d6623743e1a59826274e221df1bde8f47086968a1bab" | ||||
|  | ||||
| /* | ||||
| ** 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_AUTH_USER               (SQLITE_AUTH | (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 | ||||
| @@ -3824,13 +3824,14 @@ SQLITE_API void sqlite3_free_filename(char*); | ||||
| ** sqlite3_extended_errcode() might change with each API call. | ||||
| ** Except, there are some interfaces that are guaranteed to never | ||||
| ** change the value of the error code.  The error-code preserving | ||||
| ** interfaces are: | ||||
| ** interfaces include the following: | ||||
| ** | ||||
| ** <ul> | ||||
| ** <li> sqlite3_errcode() | ||||
| ** <li> sqlite3_extended_errcode() | ||||
| ** <li> sqlite3_errmsg() | ||||
| ** <li> sqlite3_errmsg16() | ||||
| ** <li> sqlite3_error_offset() | ||||
| ** </ul> | ||||
| ** | ||||
| ** ^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 | ||||
| ** 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 | ||||
| ** case that a second error occurs on a separate thread in between | ||||
| ** 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 void *sqlite3_errmsg16(sqlite3*); | ||||
| SQLITE_API const char *sqlite3_errstr(int); | ||||
| SQLITE_API int sqlite3_error_offset(sqlite3 *db); | ||||
|  | ||||
| /* | ||||
| ** 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 | ||||
| ** read-only no-op if the table already exists, but | ||||
| ** 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); | ||||
|  | ||||
| @@ -4343,6 +4356,8 @@ SQLITE_API int sqlite3_stmt_busy(sqlite3_stmt*); | ||||
| ** | ||||
| ** ^The sqlite3_value objects that are passed as parameters into the | ||||
| ** 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 | ||||
| ** [sqlite3_column_value()] is unprotected. | ||||
| ** Unprotected sqlite3_value objects may only be used as arguments | ||||
| @@ -7122,24 +7137,56 @@ struct sqlite3_index_info { | ||||
| ** | ||||
| ** These macros define the allowed values for the | ||||
| ** [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]. | ||||
| ** | ||||
| ** ^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_GT         4 | ||||
| #define SQLITE_INDEX_CONSTRAINT_LE         8 | ||||
| #define SQLITE_INDEX_CONSTRAINT_LT        16 | ||||
| #define SQLITE_INDEX_CONSTRAINT_GE        32 | ||||
| #define SQLITE_INDEX_CONSTRAINT_MATCH     64 | ||||
| #define SQLITE_INDEX_CONSTRAINT_LIKE      65 | ||||
| #define SQLITE_INDEX_CONSTRAINT_GLOB      66 | ||||
| #define SQLITE_INDEX_CONSTRAINT_REGEXP    67 | ||||
| #define SQLITE_INDEX_CONSTRAINT_NE        68 | ||||
| #define SQLITE_INDEX_CONSTRAINT_ISNOT     69 | ||||
| #define SQLITE_INDEX_CONSTRAINT_ISNOTNULL 70 | ||||
| #define SQLITE_INDEX_CONSTRAINT_ISNULL    71 | ||||
| #define SQLITE_INDEX_CONSTRAINT_IS        72 | ||||
| #define SQLITE_INDEX_CONSTRAINT_FUNCTION 150 | ||||
| #define SQLITE_INDEX_CONSTRAINT_EQ          2 | ||||
| #define SQLITE_INDEX_CONSTRAINT_GT          4 | ||||
| #define SQLITE_INDEX_CONSTRAINT_LE          8 | ||||
| #define SQLITE_INDEX_CONSTRAINT_LT         16 | ||||
| #define SQLITE_INDEX_CONSTRAINT_GE         32 | ||||
| #define SQLITE_INDEX_CONSTRAINT_MATCH      64 | ||||
| #define SQLITE_INDEX_CONSTRAINT_LIKE       65 | ||||
| #define SQLITE_INDEX_CONSTRAINT_GLOB       66 | ||||
| #define SQLITE_INDEX_CONSTRAINT_REGEXP     67 | ||||
| #define SQLITE_INDEX_CONSTRAINT_NE         68 | ||||
| #define SQLITE_INDEX_CONSTRAINT_ISNOT      69 | ||||
| #define SQLITE_INDEX_CONSTRAINT_ISNOTNULL  70 | ||||
| #define SQLITE_INDEX_CONSTRAINT_ISNULL     71 | ||||
| #define SQLITE_INDEX_CONSTRAINT_IS         72 | ||||
| #define SQLITE_INDEX_CONSTRAINT_LIMIT      73 | ||||
| #define SQLITE_INDEX_CONSTRAINT_OFFSET     74 | ||||
| #define SQLITE_INDEX_CONSTRAINT_FUNCTION  150 | ||||
|  | ||||
| /* | ||||
| ** CAPI3REF: Register A Virtual Table Implementation | ||||
| @@ -7168,7 +7215,7 @@ struct sqlite3_index_info { | ||||
| ** destructor. | ||||
| ** | ||||
| ** ^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. | ||||
| ** | ||||
| ** 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_TRACEFLAGS              31 | ||||
| #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 | ||||
| @@ -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 | ||||
| ** 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> | ||||
| ** <dd>^This is the approximate number of bytes of heap memory | ||||
| ** 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_REPREPARE         5 | ||||
| #define SQLITE_STMTSTATUS_RUN               6 | ||||
| #define SQLITE_STMTSTATUS_FILTER_MISS       7 | ||||
| #define SQLITE_STMTSTATUS_FILTER_HIT        8 | ||||
| #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 | ||||
| ** METHOD: sqlite3_index_info | ||||
| ** | ||||
| ** 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 | ||||
| ** first parameter to the xBestIndex() method. The second argument must be | ||||
| ** an index into the aConstraint[] array belonging to the sqlite3_index_info | ||||
| ** structure passed to xBestIndex. This function returns a pointer to a buffer | ||||
| ** containing the name of the collation sequence for the corresponding | ||||
| ** constraint. | ||||
| ** The first argument must be the pointer to the [sqlite3_index_info] object | ||||
| ** that is the first parameter to the xBestIndex() method. The second argument | ||||
| ** must be an index into the aConstraint[] array belonging to the | ||||
| ** sqlite3_index_info structure passed to xBestIndex. | ||||
| ** | ||||
| ** 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); | ||||
|  | ||||
| /* | ||||
| ** 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 | ||||
| ** 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*, | ||||
|      unsigned int(*)(void*,const char*,unsigned int,unsigned int,unsigned int), | ||||
|      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 | ||||
| /* Version 3.37.0 and later */ | ||||
| #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) */ | ||||
|  | ||||
| #if !defined(SQLITE_CORE) && !defined(SQLITE_OMIT_LOAD_EXTENSION) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user